找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3403|回复: 2
打印 上一主题 下一主题
收起左侧

Everlasting Time2 电子时钟全部制作资料【含源程序、电路图】欢迎仿制!!

[复制链接]
跳转到指定楼层
楼主
ID:127496 发表于 2016-6-20 23:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ET2          永恒时钟2

【本次功能更新】:
多方法闹钟(闹钟可设置 周一至周五 、周六周日、周六、周日、只响一次、天天响、关闭)
整点报时设置 (可设置整点报时和半点报时的时间范围。)


这是整点报时设置:↓


















这个作品里面饱含着欢笑与酸辛,甚至还有危险……
我原本打算用的是一块手机锂电池(捡的),不带保护板,我把电池芯给拆了出来。接着我用这个做电源,还给ET2背上安了2块太阳能板。当这个作品装成,我兴高采烈地拿到客厅。谁知,危险的事发生了,ET2开始冒“清”烟,这下了我一跳,浑身出冷汗,条件反射似的把电池直接拔了下来……后来检查电路时,发现电源没有问题,锂电池没烧坏,但是连接锂电池的导线居然烧糊了,导线的塑料壳都是又黑又“脆”的,一碰就“碎”,仔细检查,终于发现了问题:太阳能板上面的滤波电容的引脚掉了,造成短路……于是我换了一块电池,选用了18650电池(还是锂电池),装在1602后面,单片机下面,从正面看不到,保证了美观。
(在此提醒大家:玩锂电池的时候注意点,锂电池的输出能力特别强……这一点我是亲身体验过的……经常搞豆腐渣工程的人士们一定要
(像我一样……)注意啦!你可以选用镍氢电池或是带保护板的锂电池,短路是不会爆炸,不会冒烟的。)

【功能】:
温度显示,
16级背光设置,
自动调光,
9路闹钟,
4键调时设置,
整点报时,
半点报时,
39个公历节日提醒,
生日提醒,
日期及星期显示。
多方法闹钟(闹钟可设置 周一至周五 、周六周日、周六、周日、只响一次、天天响、关闭)
整点报时设置 (可设置整点报时和半点报时的时间范围。)


唉,废话少说,上图!
所需元器件很简单!液晶屏直接与单片机连接,无需电路板,无需走线。单片机产生时间,无需时钟芯片。四键调时并设置,按钮直接焊在单片机背部。并具有自动调光功能。
十分简单的设计,大家都可以做的。对了,我用的一节18650电池,无保护板。可以连接一片5V太阳能电池,这样就无需维护,充电。

做工不是很美观,献丑了。

所需元件列表:
锂电池*1
标准型1602液晶屏*1          (最好是蓝底白字的,蓝色有永恒的含义。)
STC12c5a56s2单片机*1      (可用stc12c5a08s2或stc12c5a16s2或stc12c5a32s2或stc12c5a56s2或stc12c5a60s2替换)
12M晶振*1
30P电容*2
5V太阳能板*2        (一片也可)
排针(圆孔)排孔(圆孔) *2       (16PIN)
微动开关
直径3mmLED*1
5v有源蜂鸣器*1

这么点东西可以做出时钟?是不是不信?爱动手的人士们快开电烙铁去吧~

提供电路原理图:(整整画了2个多小时啊……)

DIY牛人照着这个图可以拼出来。
电路非常简单,简洁!










以上图片均为第一硬件版本,给大家看看第二硬件版本吧(全新的):(做工相比之前好看多了):























图片看着不爽?没关系,有视频:(效果不好,请见谅。。。。)(此为硬件第一版本)



热烈热烈热烈欢迎提出批评表扬或任何建议!

纯属个人原创,希望大家支持!
版权“龟”我所有,转载请注明出处,谢谢!

源程序公开:
  1. /********************************************************************

  2. 编写人:谭泽睿

  3. ET2主程序

  4. 最后修改于2017年8月

  5. ********************************************************************/

  6. #include <stc12c5a60s2.h>

  7. #include <intrins.h>

  8. //#include <float.h>

  9. /********************************************************************************************/

  10. unsigned char code nums[12]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf7,0x00,0x02};

  11. typedef unsigned char      uint8;          // 无符号8位整型变量 //

  12. unsigned int code fs[39]={32,76,101,105,107,108,114,115,125,129,131,146,156,159,163,178,

  13. 187,191,209,218,228,249,/*260*/289,311,314,315,319,334,338,339,341,349,355,373,375,396,397,

  14. 403

  15. };

  16. unsigned int code tab[]={ //音阶表

  17. 63628,63835,64021,64103,64260,64400,64524,  //低音1-7

  18. 64580,64684,64777,64820,64898,64968,65030,//中音1-7

  19. 65058,65110,65157,65178,65217,65252,65283//高音1-7

  20. };

  21. unsigned int code br[3]={213,222,216};

  22. unsigned char alm[9][3]={{6,30,0},{7,30,0},{8,30,0},

  23. {0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}

  24. };//Hour Min Way

  25. //#defineLCM2402_DB0_DB7P0                                                                     

  26. sbit LCM2402_RS   = P2 ^ 3;

  27. sbit LCM2402_RW   = P2 ^ 4;

  28. sbit LCM2402_E    = P2 ^ 5;

  29. sbit LCM2402_Busy = P0 ^ 5;

  30. data unsigned char year,month,day,week,hour,min,sec;

  31. data bit db = 0;

  32. bit kj;

  33. bit rbit;

  34. unsigned char autolum;

  35. data unsigned char cou  = 0;

  36. unsigned char i,hh,ll;

  37. //unsigned char mh;

  38. //unsigned char ml;

  39. unsigned char set,aln,reps,repe;

  40. unsigned char mo;

  41. unsigned char p;

  42. unsigned char v;

  43. unsigned char ke;

  44. unsigned char mt;

  45. unsigned char menu;

  46. unsigned char RP;

  47. unsigned char dbs;

  48. unsigned char light;

  49. unsigned int beepc,C,D;

  50. #defineCMD_clear0x01             // 清除屏幕

  51. #defineCMD_back0x02             // DDRAM回零位

  52. #defineCMD_dec10x04             // 读入后AC(指针)减1,向左写

  53. #defineCMD_add10x06             // 读入后AC(指针)加1,向右写

  54. #defineCMD_dis_gb10x0f             // 开显示_开光标_开光标闪烁

  55. #defineCMD_dis_gb20x0e             // 开显示_开光标_关光标闪烁

  56. #defineCMD_dis_gb30x0c             // 开显示_关光标_关光标闪烁

  57. #defineCMD_OFF_dis0x08             // 关显示_关光标_关光标闪烁

  58. #defineCMD_set820x38             // 8位总线_2行显示

  59. #defineCMD_set810x30             // 8位总线_1行显示(上边行)

  60. #defineCMD_set420x28             // 4位总线_2行显示

  61. #defineCMD_set410x20             // 4位总线_1行显示(上边行)

  62. #definelin_10x80             // 4位总线_1行显示(上边行)

  63. #definelin_20xc0             // 4位总线_1行显示(上边行)

  64. #define bee beep=0;beepc=1

  65. #define lbee beep=0;beepc=10

  66. sbit vss = P2^0;

  67. sbit vdd = P2^1;

  68. sbit vo = P2^2;

  69. //sbit RS = P2^3;

  70. sbit db0 = P2^6;

  71. sbit db1 = P2^7;

  72. sbit db2 = P4^4;

  73. sbit db3 = P4^5;

  74. sbit db4 = P4^6;

  75. sbit db5 = P0^7;

  76. sbit db6 = P0^6;

  77. sbit db7 = P0^5;

  78. sbit blv=P0^4;

  79. sbit blg=P0^3;

  80. sbit KEYAG=P3^7;

  81. sbit KEYA=P3^5;

  82. sbit KEYBG=P3^4;

  83. sbit KEYB=P3^2;

  84. sbit KEYCG=P3^1;  

  85. sbit KEYC=P4^7;

  86. sbit KEYDG=P1^7;

  87. sbit KEYD=P1^5;

  88. sbit ka=P1^4;

  89. sbit RC=P1^1;

  90. sbit beep=P1^0;

  91. sbit ltv=P4^6;

  92. sbit lm35vcc=P1^1;

  93. sbit lm35gnd=P1^3;

  94. sbit rlv=P0^1;

  95. sbit rl=P0^0;

  96. void delay (unsigned int a){

  97.   unsigned int i;

  98.   while(a > 0){

  99.     a--;

  100.     for(i=0;i<600;i++);

  101.   }

  102. }


  103. void db07(unsigned char dbs){

  104. db0=dbs%2;

  105. db1=dbs/2%2;

  106. db2=dbs/4%2;

  107. db3=dbs/8%2;

  108. db4=dbs/16%2;

  109. db5=dbs/32%2;

  110. db6=dbs/64%2;

  111. db7=dbs/128%2;

  112. }

  113. /*********************************************************************************************

  114. 函数名:10位A/D转换初始化函数

  115. 调  用:Read_init (?);

  116. 参  数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)

  117. 返回值:无

  118. 结  果:开启ADC功能并设置ADC的输入端口

  119. 备  注:使用ADC功能时需要将对应的IO接口设置为高阻输入方式(例如:P1M1 = 0x01;)

  120. /**********************************************************************************************/

  121. void Read_init (unsigned char CHA){

  122. unsigned char AD_FIN=0; //存储A/D转换标志

  123.     CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)

  124.     ADC_CONTR = 0x40;//ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)

  125.     _nop_();

  126.     ADC_CONTR |= CHA;       //选择A/D当前通道

  127.     _nop_();

  128.     ADC_CONTR |= 0x80;      //启动A/D电源

  129.     delay(1);            //使输入电压达到稳定(1ms即可)

  130. }

  131. /**********************************************************************************************/

  132. /*********************************************************************************************

  133. 函数名:10位A/D转换函数

  134. 调  用:? = ADC_Read();

  135. 参  数:无

  136. 返回值:10位ADC数据高(从0到1023(十进制))

  137. 结  果:读出指定ADC接口的A/D转换值,并返回数值

  138. 备  注:适用于STC12C5A60S2系列单片机(必须使用STC12C5A60S2.h头文件)

  139. /**********************************************************************************************/

  140. unsigned int ADC_Read (void){

  141. unsigned char AD_FIN=0; //存储A/D转换标志

  142.     ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS = 1)

  143.     _nop_();

  144.     _nop_();

  145.     _nop_();

  146.     _nop_();

  147.     while (AD_FIN ==0){     //等待A/D转换结束

  148.         AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否

  149.     }

  150.     ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,

  151. return (ADC_RES*4+ADC_RESL);//返回A/D转换结果(10位ADC数据高8位在ADC_RES中,低2位在ADC_RESL中)

  152. }


  153. void LCM2402_TestBusy(void){

  154.    db07(0xff);//设备读状态

  155.    LCM2402_RS = 0;

  156.    LCM2402_RW = 1;

  157.    LCM2402_E = 1;

  158.    while(LCM2402_Busy);//等待LCM不忙

  159.    LCM2402_E = 0;//

  160. }

  161. /********************************************************************************************

  162. // 写指令程序 //

  163. // 向LCM2402写命令 本函数需要1个指令集的入口参数 //

  164. /********************************************************************************************/

  165. void LCM2402_WriteCMD(uint8 LCM2402_command) {

  166.   LCM2402_TestBusy();

  167.   db07(LCM2402_command);

  168.   LCM2402_RS = 0;

  169.   LCM2402_RW = 0;

  170.   LCM2402_E = 1;

  171.   LCM2402_E = 0;

  172. }

  173. void PWM_init (void){

  174. CMOD=0x00; //设置PCA定时器

  175. CL=0x00;

  176. CH=0x00;

  177. CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)

  178. CCAP0L=0x00; //设置PWM0初始值与CCAP0H相同

  179. CCAP0H=0x00; // PWM0初始时为0

  180. CR=1; //启动PCA定时器

  181. }

  182. /**********************************************************************************************/


  183. /*********************************************************************************************

  184. 函数名:PWM0占空比设置函数

  185. 调  用:PWM0_set();

  186. 参  数:0x00~0xFF(亦可用0~255)

  187. 返回值:无

  188. 结  果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平

  189. 备  注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可

  190. /**********************************************************************************************/

  191. void PWM0_set (unsigned char a){

  192. hh=a;

  193. ll=0xff-a;

  194. TR1=1;

  195. }

  196. /********************************************************************************************

  197. // 写数据程序 //

  198. // 向LCM2402写数据 //

  199. /********************************************************************************************/

  200. void LCM2402_WriteData(uint8 LCM2402_data){

  201.     LCM2402_TestBusy();

  202. db07(LCM2402_data);

  203.   LCM2402_RS = 1;

  204.   LCM2402_RW = 0;

  205.   LCM2402_E = 1;

  206.   LCM2402_E = 0;

  207. }

  208. /********************************************************************************************

  209. // 打印字符串程序 // (本函数调用指针函数)

  210. // 向LCM发送一个字符串,长度48字符之内

  211. // 第一行位置 0x00~0x17  第二行位置 0x40~0x57

  212. // 应用举例:print(0x80,"doyoung.net"); //在第一行第一位处从左向右打印doyoung.net字符串

  213. /********************************************************************************************/

  214. void print(uint8 a,uint8 *str){

  215. LCM2402_WriteCMD(a | 0x80);

  216. while(*str != '\0'){

  217. LCM2402_WriteData(*str++);

  218. }

  219. *str = 0;

  220. }

  221. /********************************************************************************************

  222. // 打印单字符程序 //

  223. // 第一行位置 0x00~0x17  第二行位置 0x40~0x57

  224. // 向LCM发送一个字符,以十六进制(0x00)表示

  225. // 应用举例:print(0xc0,0x30); //在第二行第一位处打印字符“0”

  226. /********************************************************************************************/

  227. void print2(uint8 a,uint8 t){

  228. LCM2402_WriteCMD(a | 0x80);

  229. LCM2402_WriteData(t+0x30);

  230. }

  231. void print3(uint8 a,uint8 t){

  232. LCM2402_WriteCMD(a | 0x80);

  233. LCM2402_WriteData(t);

  234. }

  235. /********************************************************************************************

  236. // 定义小汉字 //

  237. // 可写入8个自字义字符,写入后可用其CGRAM代码直接提取显示。

  238. // 字符定义方法请参考技术手册

  239. /********************************************************************************************/

  240. uint8 code Xword[]={

  241.     0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,        //上,代码 0x00

  242.     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,        //下,代码 0x01

  243.     0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,        //左,代码 0x02

  244.     0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,        //右,代码 0x03

  245.     0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,        //上下,代码 0x04

  246.     0x00,0x00,0x04,0x04,0x00,0x00,0x00,0x00,        //点上,代码 0x05

  247.     0x00,0x00,0x00,0x00,0x04,0x04,0x00,0x00,//点下,代码 0x06

  248. 0x00,0x01,0x00,0x1E,0x10,0x10,0x10,0x1E //度,代码 0x07

  249. /*0x00,0x1f,0x00,0x1f,0x10,0x1f,0x10,0x1f,//恒右上,代码 0x08

  250. 0x10,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,//恒右下,代码 0x09

  251. 0x10,0x18,0x00,0x10,0x10,0x10,0x10,0x10,//恒右上上,代码 0x0a

  252. 0x10,0x00,0x18,0x00,0x00,0x00,0x00,0x00,//恒右下下,代码 0x0b */

  253. };

  254. void CgramWrite(void) {// 装入CGRAM //

  255.     uint8 i;

  256. LCM2402_WriteCMD(0x06);// CGRAM地址自动加1

  257. LCM2402_WriteCMD(0x40);// CGRAM地址设为00处

  258.     for(i=0;i<8*8;i++) {

  259.     LCM2402_WriteData(Xword[i]);// 按数组写入数据

  260.     }

  261. }

  262. void LCM2402_Init(void){

  263.   LCM2402_WriteCMD(CMD_set82);//* 显示模式设置:显示2行,每个字符为5*7个像素

  264.   LCM2402_WriteCMD(CMD_clear);//  显示清屏

  265.   LCM2402_WriteCMD(CMD_back);//* 数据指针指向第1行第1个字符位置

  266.   LCM2402_WriteCMD(CMD_add1);//  显示光标移动设置:文字不动,光标右移

  267.   LCM2402_WriteCMD(CMD_dis_gb3); //  显示开及光标设置:显示开,光标开,闪烁开

  268. CgramWrite();//  向CGRAM写入自定义字符

  269. }

  270. bit IsLeapYear(void){    //计算本年是否是润年

  271. unsigned int a;

  272. a = 2000+year;//加2000表示成完整的年

  273. if((a%4==0 && a%100!=0)||(a%400==0)){ //润年的计算公式

  274. return 1;//是润年返回1

  275. }else{

  276. return 0;//不是润年返回0

  277. }

  278. }

  279. void month_day(void){  

  280. unsigned char mon_day[]={31,28,31,30,31,30,31,31,30,31,30,31};

  281. day++;

  282. week++;

  283. if(week>7){

  284. week=1;

  285. }

  286. if(day > mon_day[month-1]){

  287. if(IsLeapYear()&&month==2){  

  288. day = 29;

  289. }else{

  290. day = 1;

  291. month++;

  292. if(month > 12){

  293. month = 1;

  294. year++;

  295. }

  296. }

  297. }

  298. }

  299. void clear(void){

  300. print(0x80,"                ");

  301. print(0x40,"                ");

  302. }

  303. void change(void){

  304. bee;

  305. for(i=light;i>0;i--){

  306. PWM0_set(i);

  307. delay(2);

  308. }

  309. clear();

  310. for(i=0;i<0xff;i++){

  311. PWM0_set(i);

  312. delay(1);

  313. }

  314. for(i=0xff;i>light;i--){

  315. PWM0_set(i);

  316. delay(2);

  317. }

  318. }

  319. void jieri(void){

  320. v=0xff;

  321. for(i=0;i<38;i++){

  322. if(fs[i]/31==month && fs[i]%31==day){

  323. v=i;

  324. break;

  325. }

  326. }

  327. if(v==0){print(0x40,"Happy New Year! ");}

  328. if(v==1){print(0x40,"Valentine's Day ");}

  329. if(v==2){print(0x40," 38-Women's Day ");}

  330. if(v==3){print(0x40,"China Arbor Day ");}

  331. if(v==4){print(0x40," White Day ^-^  ");}

  332. if(v==5){print(0x40,"ConsumerRightDay");}

  333. if(v==6){print(0x40,"World Forest Day");}

  334. if(v==7){print(0x40,"World Water Day ");}

  335. if(v==8){print(0x40,"April Fools' Day");}

  336. if(v==9){print(0x40,"TombSweeping Day");}

  337. if(v==10){print(0x40,"World Health Day");}

  338. if(v==11){print(0x40,"World Earth Day ");}

  339. if(v==12){print(0x40,"5-1  Labour Day ");}

  340. if(v==13){print(0x40,"China Youth Day ");}

  341. if(v==14){print(0x40,"  Red-Cross Day ");}

  342. if(v==15){print(0x40,"  -Milk Day-    ");}

  343. if(v==16){print(0x40,"-Children's Day-");}

  344. if(v==17){print(0x40,"Environment Day ");}

  345. if(v==18){print(0x40,"  Olympic Day   ");}

  346. if(v==19){print(0x40,"Dang De Sheng Ri");}

  347. if(v==20){print(0x40," Population Day ");}

  348. if(v==21){print(0x40," the Army Day   ");}

  349. if(v==22){print(0x40,"ChinaTeachersDay");}

  350. if(v==23){print(0x40,"  National Day  ");}

  351. if(v==24){print(0x40,"World Animal Day");}

  352. if(v==25){print(0x40,"WorldTeachersDay");}

  353. if(v==26){print(0x40," World Post Day ");}

  354. if(v==27){print(0x40,"UnitedNationsDay");}

  355. if(v==28){print(0x40,"Mens Healthy Day");}

  356. if(v==29){print(0x40,"Biodiversity Day");}

  357. if(v==30){print(0x40,"   Halloween    ");}

  358. if(v==31){print(0x40,"ChinaReporterDay");}

  359. if(v==32){print(0x40,"WorldDiabetesDay");}

  360. if(v==33){print(0x40," World AIDS Day ");}

  361. if(v==34){print(0x40,"WorldDisabledDay");}

  362. if(v==35){print(0x40,"WorldFootballDay");}

  363. if(v==36){print(0x40,"Christmas Night ");}

  364. if(v==37){print(0x40," Christmas Day  ");}

  365. if(v==38){

  366. print(0x40," 20");

  367. print2(0x43,year/10);

  368. print2(0x44,year%10);

  369. print(0x45," Last Day  ");

  370. }

  371. if(v==0xff){

  372. print(0x40,"Good ");

  373. if(hour<11){print(0x45,"morning!^_^");

  374. }else if(hour<13){print(0x45,"noon!   ^_^");

  375. }else if(hour<18){print(0x45,"afternoon(:");

  376. }else if(hour<21){print(0x45,"evening!^-^");

  377. }else if(hour<24){print(0x45,"night!-_-zZ");

  378. }

  379. }

  380. }

  381. void birth(void){

  382. v=0xff;

  383. for(i=0;i<3;i++){

  384. if(br[i]/31==month && br[i]%31==day){

  385. v=i;

  386. break;

  387. }

  388. }

  389. if(v==0){print(0x40,"TZR's Birthday! ");}

  390. if(v==1){print(0x40,"CSJ's Birthday! ");}

  391. if(v==2){print(0x40,"TXT's Birthday! ");}

  392. if(v==0xff){

  393. print(0x40,"^_^ -_- 0_0");

  394. print(0x4b,":");

  395. print2(0x4c,sec/10);

  396. print2(0x4d,sec%10);

  397. print(0x4e,"s");

  398. print(0x4f," ");

  399. }

  400. }

  401. void time (void){

  402. if(sec%30/15==0){

  403. print2(0x80,C/10);

  404. print2(0x81,C%10);

  405. //print(0x82,".");

  406. //print2(0x83,D/10);

  407. print3(0x82,0x07);

  408. print(0x83,"  ");

  409. if(month>9){print2(0x85,month/10);}else{print(0x85," ");}

  410. print2(0x86,month%10);

  411. print(0x87,"-");

  412. if(day>9){print2(0x88,day/10);}else{print(0x88," ");}

  413. print2(0x89,day%10);

  414. print(0x8a," ");

  415. }else{

  416. if(week==1){print(0x80," MonDay    ");}

  417. if(week==2){print(0x80," TuesDay   ");}

  418. if(week==3){print(0x80," WednesDay ");}

  419. if(week==4){print(0x80," ThursDay  ");}

  420. if(week==5){print(0x80," FriDay    ");}

  421. if(week==6){print(0x80," SaturDay  ");}

  422. if(week==7){print(0x80," SunDay    ");}

  423. }

  424. print2(0x8b,hour/10);

  425. print2(0x8c,hour%10);

  426. if(sec%2==0){

  427. print(0x8d,":");

  428. }else{

  429. print(0x8d,"-");

  430. }

  431. print2(0x8e,min/10);

  432. print2(0x8f,min%10);

  433. if(sec%20/10==0){

  434. jieri();

  435. }else{

  436. birth();

  437. }

  438. if(db == 1){

  439. month_day();

  440. db = 0;

  441. }

  442. }

  443. /*void sound (unsigned char v,unsigned char b){

  444. ET1=1;

  445. TH1=mh;

  446. TL1=ml;

  447. TR1=1;

  448. } */

  449. void KEY(void){

  450. ke=0xff;

  451. KEYA=1;

  452. KEYB=1;

  453. KEYC=1;

  454. KEYD=1;

  455. delay(1);

  456. if(KEYA==0){delay(20);if(KEYA==0){ke=0x0a;while(~KEYA);}}

  457. if(KEYB==0){delay(20);if(KEYB==0){ke=0x0b;while(~KEYB);}}

  458. if(KEYC==0){delay(20);if(KEYC==0){ke=0x0c;while(~KEYC);}}

  459. if(KEYD==0){delay(20);if(KEYD==0){ke=0x0d;while(~KEYD);}}

  460. if(ke!=0xff){bee;}

  461. }

  462. void showbignum(unsigned char hour,unsigned char min){

  463. unsigned char s1,s2,s3,s4,temp;

  464. bit a,b,c,d,e,f,g;

  465. s1=hour/10;

  466. s2=hour%10;

  467. s3=min/10;

  468. s4=min%10;


  469. temp=nums[s1];

  470. a=temp/128;

  471. b=temp/64%2;

  472. c=temp/32%2;

  473. d=temp/16%2;

  474. e=temp/8%2;

  475. f=temp/4%2;

  476. g=temp/2%2;

  477. if(a==1){

  478. print3(0x81,0);

  479. }

  480. if(b==1){

  481. print3(0x82,2);

  482. }

  483. if(c==1){

  484. print3(0x42,2);

  485. }

  486. if(d==1 && g==0){

  487. print3(0x81,1);

  488. }

  489. if(e==1){

  490. print3(0x40,3);

  491. }

  492. if(f==1){

  493. print3(0x80,3);

  494. }

  495. if(g==1){

  496. print3(0x81,4);

  497. }

  498. }

  499. void init (void) {

  500. //mh=0x00;

  501. //ml=0x00; 3.5 3.2 4.7 1.5

  502. beep=1;

  503. beepc=0;

  504. mo=1;

  505. KEYAG=0;

  506. KEYBG=0;

  507. KEYCG=0;

  508. KEYDG=0;

  509. TMOD = 0x01;      

  510.     TH0 = 0x3c;        

  511.     TL0 = 0xb0;

  512. TH1 = 0x00;

  513. TL1 = 0x00;  

  514.     EA = 1;

  515.     ET0 = 1;

  516. ET1 = 1;

  517.     TR0 = 1;

  518. TR1 = 1;

  519. menu=0;

  520. P4SW=0x70;

  521. P2M0=0x02;

  522. P0M0=0x10;

  523. /*P3M1=0x24;

  524. P4M1=0x80;

  525. P1M1=0x20;*/

  526. blv=0;

  527. blg=0;

  528. vss=0;

  529. vdd=1;

  530. vo=0;

  531. ltv=1;

  532. P1M1=0x04;

  533. P1M0=0x02;

  534. RC=1;

  535. RP=0;

  536. //Read_init(1);

  537. Read_init(2);

  538. rbit=0;

  539. if(day==0){

  540. year=11;

  541. month=8;

  542. day=13;

  543. week=6;

  544. hour=8;

  545. min=51;

  546. sec=50;

  547. }

  548. kj=1;

  549. light=0xa0;                  

  550. LCM2402_Init();//LCM2402初始化   

  551. PWM_init();

  552. PWM0_set(light);

  553. //sound();

  554. change();

  555. autolum=1;

  556. lm35vcc=1;

  557. lm35gnd=0;

  558. P0M0=0x12;

  559. P0M1=0x01;

  560. rlv=1;

  561. rl=0;

  562. reps=6;

  563. repe=23;

  564. }

  565. void main (void){

  566. init();

  567. while (kj){

  568. /*print3(0x80,0x00);

  569. print3(0x81,0x02);   //永

  570. print3(0x82,0x04);

  571. print3(0x40,0x01);

  572. print3(0x41,0x03);

  573. print3(0x42,0x05);



  574. print3(0x83,0x06);

  575. print3(0x84,0x08);  //恒

  576. print3(0x85,0x0a);

  577. print3(0x43,0x07);

  578. print3(0x44,0x09);

  579. print3(0x45,0x0b);

  580. delay(2000);

  581. */

  582. change();

  583. print(0x80,"Everlasting Time");

  584. print(0x40," -V3- TZR Studio");

  585. delay(5000);

  586. kj=0;

  587. }

  588. change();                        

  589. while(1){ //主线程//

  590. //LCM2402_Init();

  591. if(cou==0){

  592. C=(ADC_Read()-8)*1000;

  593. C/=2048;

  594. }

  595. if(autolum==1 && rbit==1){

  596. rbit=0;

  597. LCM2402_Init();

  598. //LCM2402_Init();

  599. if(rl==1){

  600. light=165;

  601. PWM0_set(light);

  602. }else if(rl==0){

  603. light=45;

  604. PWM0_set(light);

  605. }

  606. }else if(autolum==0 && rbit==1){

  607. rbit=0;

  608. LCM2402_Init();

  609. //LCM2402_Init();

  610. }/*else if(autolum==2 && rbit==1){

  611. RC=1;

  612. rbit=0;

  613. delay(1);

  614. RP=ADC_Read();

  615. /*if(RP*4>245){

  616. light=RP*4-80*3;

  617. }else{

  618. light=5;

  619. }

  620. if(RP*4>495){

  621. light=255;

  622. }*//*

  623. light=RP;

  624. PWM0_set(light);

  625. RC=0;

  626. } */

  627. if(menu==0){

  628. aln=0xff;

  629. for(i=0;i<9;i++){

  630. if(alm[i][0]==hour && alm[i][1]==min && alm[i][2]==1){

  631. aln=i;

  632. break;

  633. }

  634. }

  635. if(aln==0xff){

  636. time();

  637. }else{

  638. print(0x80,"Alarm");

  639. print2(0x85,(i+1));

  640. print(0x86," ");

  641. print2(0x87,hour/10);

  642. print2(0x88,hour%10);

  643. print(0x89,":");

  644. print2(0x8a,min/10);

  645. print2(0x8b,min%10);

  646. print(0x8c," Pre");

  647. print(0x40,"ss any keys stop");

  648. }

  649. }else if(menu==1){

  650. print(0x80,"[A  B  C  D]");

  651. print2(0x8d,mt/10);

  652. print2(0x8e,mt%10);

  653. print(0x8f,"s");

  654. print(0x40,"Alm Time Lum Rep");

  655. if(mt==0){

  656. menu=0;

  657. change();

  658. }

  659. }else if(menu==2){

  660. if(set==0){

  661. print(0x80,"[+1 -1 SET ESC]");

  662. print(0x40,"Alm");

  663. print2(0x43,mo);

  664. print(0x44," ");

  665. print2(0x45,alm[mo-1][0]/10);

  666. print2(0x46,alm[mo-1][0]%10);

  667. print(0x47,":");

  668. print2(0x48,alm[mo-1][1]/10);

  669. print2(0x49,alm[mo-1][1]%10);

  670. if(alm[mo-1][2]==0){

  671. print(0x4a," Close");

  672. }else if(alm[mo-1][2]==1){

  673. print(0x4a," Open ");

  674. }else if(alm[mo-1][2]==2){

  675. print(0x4a," W1-5 ");

  676. }else if(alm[mo-1][2]==3){

  677. print(0x4a," W6-7 ");

  678. }else if(alm[mo-1][2]==4){

  679. print(0x4a," W 6  ");

  680. }else if(alm[mo-1][2]==5){

  681. print(0x4a," W 7  ");

  682. }else if(alm[mo-1][2]==6){

  683. print(0x4a," Once ");

  684. }

  685. }else{

  686. print(0x80,"+/-/next/OK ");

  687. if(mo==0){print(0x8c,"Hour");}

  688. if(mo==1){print(0x8c,"Mins");}

  689. if(mo==2){print(0x8c,"Ways");}

  690. print(0x40,"Alm");

  691. print2(0x43,set);

  692. print(0x44," ");

  693. print2(0x45,alm[set-1][0]/10);

  694. print2(0x46,alm[set-1][0]%10);

  695. print(0x47,":");

  696. print2(0x48,alm[set-1][1]/10);

  697. print2(0x49,alm[set-1][1]%10);

  698. if(alm[set-1][2]==0){

  699. print(0x4a," Close");

  700. }else if(alm[set-1][2]==1){

  701. print(0x4a," Open ");

  702. }else if(alm[set-1][2]==2){

  703. print(0x4a," W1-5 ");

  704. }else if(alm[set-1][2]==3){

  705. print(0x4a," W6-7 ");

  706. }else if(alm[set-1][2]==4){

  707. print(0x4a," W 6  ");

  708. }else if(alm[set-1][2]==5){

  709. print(0x4a," W 7  ");

  710. }else if(alm[set-1][2]==6){

  711. print(0x4a," Once ");

  712. }

  713. }

  714. }else if(menu==3){

  715. print(0x80,"[+1 -1 next ESC]");

  716. if(mo==0){

  717. print(0x40,"Year");

  718. print2(0x45,2);

  719. print2(0x46,0);

  720. print2(0x47,year/10);

  721. print2(0x48,year%10);

  722. }else if(mo==1){

  723. print(0x40,"Month");

  724. print(0x46,":");

  725. print2(0x47,month/10);

  726. print2(0x48,month%10);

  727. }else if(mo==2){

  728. print(0x40,"Day  ");

  729. print(0x46,":");

  730. print2(0x47,day/10);

  731. print2(0x48,day%10);

  732. }else if(mo==3){

  733. print(0x40,"Hour  ");

  734. print(0x46,":");

  735. print2(0x47,hour/10);

  736. print2(0x48,hour%10);

  737. }else if(mo==4){

  738. print(0x40,"Min  ");

  739. print(0x46,":");

  740. print2(0x47,min/10);

  741. print2(0x48,min%10);

  742. }else if(mo==5){

  743. if(week==1){print(0x40," MonDay    ");}

  744. if(week==2){print(0x40," TuesDay   ");}

  745. if(week==3){print(0x40," WednesDay ");}

  746. if(week==4){print(0x40," ThursDay  ");}

  747. if(week==5){print(0x40," FriDay    ");}

  748. if(week==6){print(0x40," SaturDay  ");}

  749. if(week==7){print(0x40," SunDay    ");}

  750. }

  751. }else if(menu==4){

  752. PWM0_set(light);

  753. print(0x80,"[+F -F Auto ESC]");

  754. print(0x40,"Lum:");

  755. print2(0x44,light/100%10);

  756. print2(0x45,light/10%10);

  757. print2(0x46,light%10);

  758. print(0x47," Auto:");

  759. if(autolum==0){

  760. print(0x4d,"OFF");

  761. }else if(autolum==1){

  762. print(0x4d,"ON ");

  763. }else if(autolum==2){

  764. print(0x4d,"AS ");

  765. }

  766. }else if(menu==5){

  767. /*print(0x80,"Sorry! This mode");

  768. print(0x40,"is open up now! ");

  769. delay(3000);

  770. menu=0;

  771. */                                                               

  772. print(0x80,"[St Ed Rep ESC]");

  773. if(reps!=0xff){

  774. print2(0x40,reps/10);

  775. print2(0x41,reps%10);

  776. print(0x42,":00 to ");

  777. print2(0x49,repe/10);

  778. print2(0x4a,repe%10);

  779. print(0x4b,":00");

  780. }else{

  781. print(0x40," -Closed-    ");

  782. }


  783. }

  784. /****************************按钮操作***************************/

  785. KEY();

  786. if(menu==0){

  787. if(ke!=0xff){menu=1;mt=15;change();}

  788. }else if(menu==1){

  789. if(ke==0x0a){menu=2;change();mo=1;set=0;}

  790. if(ke==0x0b){menu=3;change();mo=0;}

  791. if(ke==0x0c){menu=4;change();}

  792. if(ke==0x0d){menu=5;change();}

  793. }else if(menu==2){

  794. if(set==0){

  795. if(ke==0x0a){mo++;if(mo==10){mo=1;}}

  796. if(ke==0x0b){mo--;if(mo==0){mo=9;}}

  797. if(ke==0x0c){set=mo;mo=0;}

  798. if(ke==0x0d){menu=0;change();}

  799. }else{

  800. if(ke==0x0a){

  801. if(mo==2){

  802. alm[set-1][2]++;

  803. if(alm[set-1][2]==7){

  804. alm[set-1][2]=0;

  805. }else if(alm[set-1][2]==0){

  806. alm[set-1][2]=6;

  807. }

  808. }else {

  809. alm[set-1][mo]++;

  810. }

  811. }

  812. if(ke==0x0b){

  813. if(mo==2){

  814. if(alm[set-1][2]>=7){

  815. alm[set-1][2]=0;

  816. }else if(alm[set-1][2]==0){

  817. alm[set-1][2]=7;

  818. }

  819. alm[set-1][2]--;

  820. }else if(alm[set-1][mo]!=0){alm[set-1][mo]--;

  821. }

  822. }

  823. if(ke==0x0c){mo++;if(mo==3){mo=0;}}

  824. if(ke==0x0d){menu=0;change();}

  825. if(alm[set-1][0]>23){

  826. alm[set-1][0]=0;

  827. }

  828. if(alm[set-1][0]<0){

  829. alm[set-1][0]=23;

  830. }

  831. if(alm[set-1][1]<0){

  832. alm[set-1][1]=59;

  833. }

  834. }

  835. }else if(menu==3){

  836. if(ke==0x0a){

  837. if(mo==0){year++;}

  838. if(mo==1){month++;}

  839. if(mo==2){day++;}

  840. if(mo==3){hour++;}

  841. if(mo==4){min++;}

  842. if(mo==5){week++;}

  843. if(year>29){

  844. year=11;

  845. }

  846. if(month>12){

  847. month=1;

  848. }

  849. if(day>31){

  850. day=1;

  851. }

  852. if(hour>23){

  853. hour=0;

  854. }

  855. if(min>59){

  856. min=0;

  857. }

  858. if(week>7){

  859. week=1;

  860. }

  861. }

  862. if(ke==0x0b){

  863. if(mo==0 && year>11){year--;}

  864. if(mo==1 && month>1){month--;}

  865. if(mo==2 && day>1){day--;}

  866. if(mo==3 && hour>0){hour--;}

  867. if(mo==4 && min>0){min--;}

  868. if(mo==5 && week>1){min--;}

  869. }

  870. if(ke==0x0c){mo++;if(mo==6){mo=0;}}

  871. if(ke==0x0d){menu=0;change();}

  872. }else if(menu==4){

  873. if(ke==0x0a){

  874. if(light>0xFE){

  875. light=0x00;

  876. }else{

  877. light+=0x0F;

  878. }

  879. }

  880. if(ke==0x0b){

  881. if(light<0x0E){

  882. light=0xFF;

  883. }else{

  884. light-=0x0F;

  885. }

  886. }

  887. if(ke==0x0c){

  888. autolum++;

  889. if(autolum==2){

  890. autolum=0;

  891. }

  892. }

  893. if(ke==0x0d){menu=0;change();}

  894. }else if(menu==5){

  895. if(ke==0x0a){

  896. if(reps>9){

  897. reps=5;

  898. }else{

  899. reps++;

  900. }

  901. }

  902. if(ke==0x0b){

  903. if(repe>23){

  904. repe=20;

  905. }else{

  906. repe++;

  907. }

  908. }

  909. if(ke==0x0c){

  910. if(reps<0xff){

  911. reps=0xff;

  912. }else{

  913. reps=6;

  914. }

  915. }

  916. if(ke==0x0d){menu=0;change();}

  917. }

  918. }

  919. }   

  920. void tiem0(void) interrupt 1 using 3{

  921.     cou++;  

  922. if(beepc>0){

  923. beepc--;

  924. beep=0;

  925. }else if(beepc==0){

  926. beep=1;

  927. beepc=0;

  928. }      

  929.     if(cou > 19){            

  930.         cou = 0;              

  931.         sec++;

  932. if(sec%2==0){

  933. rbit=1;

  934. }

  935. if(mt>0){

  936. mt--;

  937. }                  

  938.         if(sec > 59){

  939.             sec = 0;

  940.             min++;

  941. if(hour>=reps && hour<=repe && reps!=0xff && min==30){

  942. bee;

  943. }

  944.             if(min > 59){

  945.                 min = 0;

  946. if(hour>=reps && hour<=repe && reps!=0xff){

  947. lbee;

  948. }

  949.                 hour++;

  950.                 if(hour > 23){

  951.                     hour = 0;

  952. db = 1;

  953. }  

  954.             }

  955. for(i=0;i<9;i++){

  956. if(alm[i][0]==hour && alm[i][1]==min && alm[i][2]!=0){

  957. if(alm[i][2]==1){

  958. beep=0;

  959. beepc=20*30;

  960. break;

  961. }else if(alm[i][2]==2 && week>=1 && week<=5){

  962. beep=0;

  963. beepc=20*30;

  964. break;

  965. }else if(alm[i][2]==3 && week>=6 && week<=7){

  966. beep=0;

  967. beepc=20*30;

  968. break;

  969. }else if(alm[i][2]==4 && week==6){

  970. beep=0;

  971. beepc=20*30;

  972. break;

  973. }else if(alm[i][2]==5 && week==7){

  974. beep=0;

  975. beepc=20*30;

  976. break;

  977. }else if(alm[i][2]==6){

  978. beep=0;

  979. beepc=20*30;

  980. alm[i][2]=0;

  981. break;

  982. }

  983. }

  984. }   

  985.         }   

  986.     }   

  987.     TH0 = 0x3c;

  988.     TL0 = 0xd0;   

  989. }

  990. void t1(void) interrupt 3 using 2{

  991. blv=~blv;

  992. if(blv==0){

  993. TH1=hh;

  994. TL1=hh;

  995. }else{

  996. TH1=ll;

  997. TL1=ll;

  998. }

  999. }


复制代码

CODE代码.rar (7.01 KB, 下载次数: 16)

                                                                                                                                                                                                                                                           
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:98618 发表于 2016-6-20 23:58 | 只看该作者
顶!!楼主的电子钟做的很不错啊,很简洁构造有创意呀,不知道准确性上是否精确,感觉用单片机自身的时钟可能会受程序等的影响产生误差,还有电源的地方我基本没有了解,很喜欢你做的et2中的电源部分,可否给我点电路原理图,不胜感激(424780212@qq.com),给你提点建议,就是用da芯片与喇叭做蜂鸣器部分,这样可以将闹钟部分播放优质的音乐,还有诺基亚5110液晶屏很好(也有蓝背景不是很好看),用它可以显示更多的东西,性价比超高,加上18b20显示温度,单片机推荐msp430(我没用过)在功耗上效果明显,最好用时钟芯片(ds1302便宜)
回复

使用道具 举报

板凳
ID:10075 发表于 2016-6-21 09:13 | 只看该作者
新人看看看看看学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表