找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8288|回复: 3
收起左侧

51单片机时钟(时间日期可调)

[复制链接]
ID:266654 发表于 2017-12-25 17:44 | 显示全部楼层 |阅读模式
K5按键 按一下,时钟开始正常显示时间,再按一下,显示日期
K6按键为调整键
K7按键 按一下,开始显示日期,再按一下进入 日期跟时钟的 调节模式

单片机源程序如下:
  1. #include <at89x52.h>
  2. #include <DS1302.h>
  3. #include <intrins.h>
  4. unsigned char time0[]={0,0,0,0,0,0,0,0};//用来储存时间
  5. unsigned char date[]={0,0,0,0,0,0,0,0};//用来储存日期
  6. unsigned char time2[]={1,1,1,1,1,1,1,1};//用来储存时间
  7. unsigned char date1[]={0,0,0,0,0,0,0,0};//用来储存日期
  8. unsigned char time3[]={0,0,0,0,0,0,0,0};//用来储存时间
  9. unsigned char time4[]={1,1,1,1,1,1,1,1};//用来储存时间
  10. unsigned char code User[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};
  11. unsigned char TL;     //储存暂存器的温度低位
  12. unsigned char TH;    //储存暂存器的温度高位
  13. unsigned char TN;      //储存温度的整数部分
  14. unsigned char TD;       //储存温度的小数部分
  15. unsigned char sum=0;
  16. unsigned char code dispcode[]={"0123456789-"};
  17. unsigned char code dispcode1[]={"1234567"};
  18. sbit fmq=P3^6;
  19. sbit RS=P2^0;    //寄存器选择位,将RS位定义为P2.0引脚
  20. sbit RW=P2^1;    //读写选择位,将RW位定义为P2.1引脚
  21. sbit E=P2^2;     //使能信号位,将E位定义为P2.2引脚
  22. sbit BF=P0^7;    //忙碌标志位,,将BF位定义为P0.7引脚
  23. unsigned char z,h=0,x,i,c;
  24. unsigned char flag1,tltemp;
  25. sbit DQ=P3^3;
  26. unsigned char time;   //设置全局变量,专门用于严格延时

  27. SYSTEMTIME  time1;   //在ds1302.h文件中已经定义了一个名字为SYSTEMTIME的结构体,在这里我们定义一个变量名
  28.                                   //为time的SYSTEMTIME结构体
  29. void delay(unsigned char i)     //延时子程序  
  30. {
  31. unsigned char j;
  32. while((i--)!=0)
  33. {
  34. for(j=123;j>0;j--);
  35. }
  36. }
  37. void delayus(unsigned char xus)
  38. {
  39. for(i=xus;i>0;i--)
  40. for(c=57;c>0;c--);
  41. }
  42. void beep()
  43. {                     
  44. fmq=0;
  45. delayus(2);
  46. fmq=1;
  47. delayus(2);
  48. delay(100);                                                       
  49. delayus(100);
  50. fmq=1;
  51. delayus(100);
  52. delay(200);
  53. fmq=0;
  54. delayus(2);
  55. fmq=1;
  56. delayus(2);
  57. delay(100);                                                       
  58. delayus(100);
  59. fmq=1;
  60. delayus(100);
  61. delay(200);
  62. fmq=0;
  63. delayus(2);
  64. fmq=1;
  65. delayus(2);
  66. delay(100);                                                       
  67. delayus(100);
  68. fmq=1;
  69. delayus(100);
  70. delay(200);
  71. fmq=0;
  72. delayus(2);
  73. fmq=1;
  74. delayus(2);
  75. delay(100);                                                       
  76. delayus(100);
  77. fmq=1;
  78. delayus(100);
  79. delay(200);
  80. }

  81. bit BusyTest(void)
  82. {
  83.         bit result;
  84.         RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态
  85.         RW=1;
  86.         E=1;        //E=1,才允许读写
  87.         _nop_();   //空操作
  88.         _nop_();
  89.         _nop_();
  90.         _nop_();   //空操作四个机器周期,给硬件反应时间       
  91.         result=BF;  //将忙碌标志电平赋给result
  92.         E=0;
  93.         return result;
  94. }
  95. void Write_com (unsigned char dictate)
  96. {   
  97. while(BusyTest()==1); //如果忙就等待
  98. RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令
  99. RW=0;   
  100. E=0;                   //E置低电平(写指令时,
  101.                          // 就是让E从0到1发生正跳变,所以应先置"0"
  102. _nop_();
  103. _nop_();             //空操作两个机器周期,给硬件反应时间
  104. P0=dictate;            //将数据送入P0口,即写入指令或地址
  105. _nop_();
  106. _nop_();
  107. _nop_();
  108. _nop_();               //空操作四个机器周期,给硬件反应时间
  109. E=1;                   //E置高电平
  110. _nop_();
  111. _nop_();
  112. _nop_();
  113. _nop_();               //空操作四个机器周期,给硬件反应时间
  114.   E=0;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令
  115. }
  116. void WriteAddress(unsigned char x)
  117. {
  118. Write_com(x|0x80); //显示位置的确定方法规定为"80H+地址码x"       
  119. }
  120. void WriteData(unsigned char y)
  121. {
  122. while(BusyTest()==1);  
  123.   RS=1;           //RS为高电平,RW为低电平时,可以写入数据
  124.   RW=0;
  125.   E=0;            //E置低电平(写指令时,,
  126.                    // 就是让E从0到1发生正跳变,所以应先置"0"
  127.   P0=y;           //将数据送入P0口,即将数据写入液晶模块
  128.   _nop_();
  129.   _nop_();
  130.   _nop_();
  131.           _nop_();       //空操作四个机器周期,给硬件反应时间
  132.   E=1;          //E置高电平
  133.   _nop_();
  134.   _nop_();
  135.   _nop_();
  136.   _nop_();        //空操作四个机器周期,给硬件反应时间
  137.   E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令
  138. }
  139. void LcdInt(void)
  140. {
  141. delay(15);             //延时15ms,首次写指令时应给LCD一段较长的反应时间
  142. Write_com(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口
  143. delay(5);   //延时5ms 
  144. Write_com(0x38);
  145. delay(5);
  146. Write_com(0x38); //3次写 设置模式
  147. delay(5);
  148. Write_com(0x0C);  //显示模式设置:显示开,有光标,光标闪烁
  149. delay(5);
  150. Write_com(0x06);  //显示模式设置:光标右移,字符不移
  151. delay(5);                                                                                          
  152. Write_com(0x01);  //清屏幕指令,将以前的显示内容清除
  153. delay(5);
  154. }

  155. bit Init_DS18B20(void)       
  156. {
  157. bit flag1;         //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
  158. DQ = 1;           //先将数据线拉高
  159. for(time=0;time<2;time++) //略微延时约6微秒
  160. ;
  161. DQ = 0;           //再将数据线从高拉低,要求保持480~960us
  162. for(time=0;time<200;time++)  //略微延时约600微秒
  163. ;         //以向DS18B20发出一持续480~960us的低电平复位脉冲
  164. DQ = 1;           //释放数据线(将数据线拉高)
  165. for(time=0;time<10;time++)
  166. ;  //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
  167. flag1=DQ;          //让单片机检测是否输出了存在脉冲(DQ=0表示存在)      
  168. for(time=0;time<200;time++)  //延时足够长时间,等待存在脉冲输出完毕
  169.   ;
  170. return (flag1);    //返回检测成功标志
  171. }
  172. unsigned char ReadOneChar(void)
  173. {
  174.         unsigned char i=0;       
  175.         unsigned char dat;  //储存读出的一个字节数据
  176.         for (i=0;i<8;i++)
  177.          {
  178.           
  179.            DQ =1;       // 先将数据线拉高
  180.            _nop_();            //等待一个机器周期         
  181.            DQ = 0;      //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
  182.            _nop_();     //等待一个机器周期                  
  183.            DQ = 1;     //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
  184.            for(time=0;time<2;time++)
  185.              ;  //延时约6us,使主机在15us内采样
  186.                          dat>>=1;
  187.            if(DQ==1)
  188.               dat|=0x80;  //如果读到的数据是1,则将1存入dat
  189.                 else
  190.                         dat|=0x00;//如果读到的数据是0,则将0存入dat
  191.              //将单片机检测到的电平信号DQ存入r[i]       
  192.            for(time=0;time<8;time++)
  193.                          ;           //延时3us,两个读时序之间必须有大于1us的恢复期       
  194.     }                            
  195. return(dat);    //返回读出的十六进制数据
  196. }
  197. WriteOneChar(unsigned char dat)
  198. {
  199. unsigned char i=0;
  200. for (i=0; i<8; i++)
  201.          {
  202.           DQ =1;         // 先将数据线拉高
  203.           _nop_();             //等待一个机器周期         
  204.           DQ=0;          //将数据线从高拉低时即启动写时序      
  205.           DQ=dat&0x01;   //利用与运算取出要写的某位二进制数据,
  206.                    //并将其送到数据线上等待DS18B20采样       
  207.          for(time=0;time<10;time++)
  208.              ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
  209.           DQ=1;          //释放数据线                    
  210.           for(time=0;time<1;time++)
  211.                   ;//延时3us,两个写时序间至少需要1us的恢复期
  212.           dat>>=1;       //将dat中的各二进制位数据右移1位
  213.          }
  214.   for(time=0;time<4;time++);
  215.               //稍作延时,给硬件一点反应时间
  216. }
  217. void ReadyReadTemp(void)
  218. {
  219.   Init_DS18B20();     //将DS18B20初始化
  220.         WriteOneChar(0xCC); // 跳过读序号列号的操作
  221.         WriteOneChar(0x44); // 启动温度转换          
  222.       delay(200); //转换一次需要延时一段时间

  223.         Init_DS18B20();     //将DS18B20初始化
  224.         WriteOneChar(0xCC); //跳过读序号列号的操作
  225.         WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位       
  226. }

  227. void display_dot(void)
  228. {         
  229. WriteAddress(0x0d);          //写显示地址,将在第2行第10列开始显示                  
  230. WriteData('.');      //将小数点的字符常量写入LCD
  231. delay(50);         //延时1ms给硬件一点反应时间               
  232. }
  233. void display_temp1(unsigned char x)
  234. {
  235. unsigned char k,l;     //j,k,l分别储存温度的百位、十位和个位
  236. k=(x%100)/10;    //取十位
  237. l=x%10;             //取个位  
  238. WriteAddress(0x0b);    //写显示地址,将在第1行第11列开始显示
  239. if(flag1==1)                                //负温度时 显示“—”
  240. {
  241. WriteData(dispcode[10]);    //将百位数字的字符常量写入LCD
  242.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   }
  243. else{
  244. }
  245. WriteData(dispcode[k]);    //将十位数字的字符常量写入LCD
  246. WriteData(dispcode[l]);    //将个位数字的字符常量写入LCD
  247. delay(50);         //延时1ms给硬件一点反应时间     
  248. }
  249. void display_temp2(unsigned char x)
  250. {
  251. WriteAddress(0x0e);      //写显示地址,将在第2行第11列开始显示
  252. WriteData(dispcode[x]);     //将小数部分的第一位数字字符常量写入LCD
  253. delay(50);          //延时1ms给硬件一点反应时间
  254. }
  255. display_cent()
  256. {           unsigned char j;
  257.          Write_com(0x40);       //设定CGRAM地址
  258.                 delay(5);
  259.                 for(j=0;j<8;j++ )
  260.                 {
  261.                         WriteData(User[j]);//写入自定义图形 ℃
  262.                 }
  263.                    WriteAddress(0x0f);//设定屏幕上的显示位置
  264.                  delay(5);
  265.                    WriteData(0x00);                                  //从CGRAM里取出自定义图形显示
  266. }

  267. unsigned char button_time(n,x,y)        //时钟调整子程序
  268. unsigned char n,x,y;
  269. {
  270. if(P1_7==0)
  271. {
  272.     delay(15);
  273.     if(P1_7==0)
  274.         {
  275.             n++;
  276.         if(n==x)
  277.             n=0;
  278.         while(P1_7==0);
  279.         }
  280. }

  281. if(P1_5==0)
  282. {
  283.     delay(15);
  284.     if(P1_5==0)
  285.         {
  286.         if(n==0)
  287.             n=y;
  288.             else
  289.         n--;                                               
  290.         while(P1_5==0);
  291.            }
  292. }
  293. return n;
  294. }


  295. unsigned char button_date(n,x,y)        //日期调整子程序
  296. unsigned char n,x,y;
  297. {
  298. if(P1_7==0)
  299. {
  300.     delay(15);
  301.     if(P1_7==0)
  302.         {
  303.             n++;
  304.                 if(time1.Month==1||time1.Month==3||time1.Month==5||time1.Month==7
  305.                 ||time1.Month==8||time1.Month==10||time1.Month==12)
  306.                 x=32;
  307.                 if(time1.Month==4||time1.Month==6||time1.Month==9||time1.Month==11)
  308.                 x=31;
  309.                 if(time1.Month==2)
  310.                 x=29;
  311.                 if(((time1.Year%4==0&&time1.Year%100!=0)||time1.Year%400==0)&&time1.Month==2)
  312.                 x=30;
  313.         if(n==x)
  314.             n=1;
  315.        
  316.         while(P1_7==0);
  317.         }
  318. }

  319. if(P1_5==0)
  320. {
  321.     delay(15);
  322.     if(P1_5==0)
  323.         {
  324.                 if(time1.Month==1||time1.Month==3||time1.Month==5||time1.Month==7
  325.                 ||time1.Month==8||time1.Month==10||time1.Month==12)
  326.                 y=31;
  327.                 if(time1.Month==4||time1.Month==6||time1.Month==9||time1.Month==11)
  328.                 y=30;
  329.                 if(time1.Month==2)
  330.                 y=28;
  331.                 if(((time1.Year%4==0&&time1.Year%100!=0)||time1.Year%400==0)&&time1.Month==2)
  332.                 y=29;
  333.         if(n==1)
  334.             n=y;
  335.             else
  336.         n--;                                               
  337.         while(P1_5==0);
  338.            }
  339. }
  340. return n;
  341. }
  342. unsigned char button_date1(n,x,y)        //日期调整子程序
  343. unsigned char n,x,y;
  344. {
  345. if(P1_7==0)
  346. {
  347.     delay(15);
  348.     if(P1_7==0)
  349.         {
  350.             n++;
  351.         if(n==x)
  352.             n=1;
  353.         while(P1_7==0);
  354.         }
  355. }

  356. if(P1_5==0)
  357. {
  358.     delay(15);
  359.     if(P1_5==0)
  360.         {
  361.         if(n==1)
  362.             n=y;
  363.             else
  364.         n--;                                               
  365.         while(P1_5==0);
  366.            }
  367. }
  368. return n;
  369. }
  370. bit leap_year()
  371. {
  372. bit leap;
  373. if((time1.Year%4==0&&time1.Year%100!=0)||time1.Year%400==0)//闰年的条件
  374.         leap=1;
  375. else
  376.         leap=0;
  377. return leap;
  378. }
  379.                                             

  380. unsigned char week_proc()
  381. {        unsigned char num_leap,week;       
  382. unsigned char c;
  383. num_leap=time1.Year/4-time1.Year/100+time1.Year/400;//自00年起到year所经历的闰年数
  384. if( leap_year()&&time1.Month<=2 )          //既是闰年且是1月和2月       
  385.         c=2;
  386. else
  387.         c=3;
  388. week=(time1.Year+dispcode1[time1.Month]+time1.Day+num_leap+c)%7;//计算对应的星期
  389. return week;
  390. }       

  391. void display(second10,second1,minute10,minute1,hour10,hour1,day10,day1,month10,month1,year10,year1)        //显示子程序
  392. unsigned char second10,second1,minute10,minute1,hour10,hour1,day10,day1,month10,month1,year10,year1;  
  393. {  

  394. WriteAddress(0x40);
  395. WriteData(dispcode[second10]);//显示秒的十位
  396. delay(1);

  397. WriteAddress(0x41);
  398. WriteData(dispcode[second1]);        //显示秒的个位
  399. delay(1);

  400. WriteAddress(0x42);
  401. WriteData('-');                //显示"-"
  402. delay(1);

  403. WriteAddress(0x43);
  404. WriteData(dispcode[minute10]);//显示分的十位
  405. delay(1);

  406. WriteAddress(0x44);
  407. WriteData(dispcode[minute1]);        //显示分的个位
  408. delay(1);

  409. WriteAddress(0x45);
  410. WriteData('-');                //显示"-"
  411. delay(1);

  412. WriteAddress(0x46);
  413. WriteData(dispcode[hour10]);        //显示时的十位
  414. delay(1);

  415. WriteAddress(0x47);

  416. WriteData(dispcode[hour1]);        //显示时的个位
  417. delay(1);


  418. WriteAddress(0x00);
  419. WriteData('2');
  420. delay(1);
  421. WriteAddress(0x01);
  422. WriteData('0');
  423. delay(1);
  424. WriteAddress(0x02);
  425. WriteData(dispcode[day10]);//显示日的十位
  426. delay(1);
  427. WriteAddress(0x03);
  428. WriteData(dispcode[day1]);//显示日的十位
  429. delay(1);
  430. WriteAddress(0x04);
  431. WriteData('-');
  432. delay(1);

  433.   WriteAddress(0x05);
  434. WriteData(dispcode[month10]);//显示月的十位
  435. delay(1);
  436. WriteAddress(0x06);
  437. WriteData(dispcode[month1]);//显示月的十位
  438. delay(1);
  439. WriteAddress(0x07);
  440. WriteData('-');
  441. delay(1);

  442. WriteAddress(0x08);
  443. WriteData(dispcode[year10]);//显示年的十位
  444. delay(1);
  445. WriteAddress(0x09);
  446. WriteData(dispcode[year1]);//显示年的十位
  447. delay(1);
  448. }


  449. void display1()
  450. {
  451. while(1)
  452. {
  453. WriteAddress(0x00);
  454. WriteData('2');//显示秒的十位
  455. delay(1);
  456. WriteAddress(0x01);
  457. WriteData('0');//显示秒的十位
  458. delay(1);
  459.    WriteAddress(0x02);
  460. WriteData(dispcode[date1[0]]);//显示年的十位
  461. delay(1);
  462. WriteAddress(0x03);
  463. WriteData(dispcode[date1[1]]);//显示年的个位
  464. delay(1);
  465. WriteAddress(0x04);
  466. WriteData('-');
  467. delay(1);
  468. WriteAddress(0x05);
  469. WriteData(dispcode[date1[2]]);//显示月的十位
  470. delay(1);
  471. WriteAddress(0x06);
  472. WriteData(dispcode[date1[3]]);//显示月的个位
  473. delay(1);
  474. WriteAddress(0x07);
  475. WriteData('-');
  476. delay(1);
  477. WriteAddress(0x08);
  478. WriteData(dispcode[date1[4]]);  //显示日的十位
  479. delay(1);
  480. WriteAddress(0x09);
  481. WriteData(dispcode[date1[5]]);  //显示日的个位
  482. delay(1);


  483. WriteAddress(0x47);
  484. WriteData(dispcode[10]);//显示秒的十位
  485. delay(1);

  486. WriteAddress(0x46);
  487. WriteData(dispcode[10]);        //显示秒的个位
  488. delay(1);

  489. WriteAddress(0x45);
  490. WriteData(dispcode[10]);                //显示"-"
  491. delay(1);

  492. WriteAddress(0x44);
  493. WriteData(dispcode[10]);//显示分的十位
  494. delay(1);

  495. WriteAddress(0x43);
  496. WriteData(dispcode[10]);        //显示分的个位
  497. delay(1);

  498. WriteAddress(0x42);
  499. WriteData(dispcode[10]);                //显示"-"
  500. delay(1);

  501. WriteAddress(0x40);
  502. WriteData(dispcode[time2[0]]);        //显示时的十位
  503. delay(1);

  504. WriteAddress(0x41);
  505. WriteData(dispcode[time2[1]]);        //显示时的个位
  506. delay(1);

  507. if(P1_7==0)
  508. delay(10);
  509. if(P1_7==0)
  510. {
  511. time2[1]++;
  512. if(time2[1]==10)
  513. {
  514. time2[1]=0;
  515. time2[0]++;
  516. }
  517. if(time2[0]==2&&time2[1]==4)
  518. {
  519. time2[0]=0;
  520. time2[1]=0;
  521. }
  522. while(P1_7==0);
  523. }

  524. if(P1_5==0)
  525. {delay(10);
  526. if(P1_5==0)
  527. {
  528. time2[1]--;
  529. if(time2[1]==0&&time2[0]==0)
  530. {
  531. time2[0]=2;
  532. time2[1]=4;
  533. }
  534. if(time2[1]==0-1)
  535. {       
  536. time2[0]--;
  537. time2[1]=9;
  538. }
  539. while(P1_5==0);
  540. }
  541. }
  542. if(P1_6==0)
  543. break;               
  544. }
  545. }

  546. void display2()
  547. {
  548. while(1)
  549. {

  550. WriteAddress(0x00);
  551. WriteData('2');//显示秒的十位
  552. delay(1);
  553. WriteAddress(0x01);
  554. WriteData('0');//显示秒的十位
  555. delay(1);

  556. WriteAddress(0x02);
  557. WriteData(dispcode[date1[0]]);//显示秒的十位
  558. delay(1);
  559. WriteAddress(0x03);
  560. WriteData(dispcode[date1[1]]);//显示秒的十位
  561. delay(1);
  562. WriteAddress(0x04);
  563. WriteData('-');//显示秒的十位
  564. delay(1);
  565. WriteAddress(0x05);
  566. WriteData(dispcode[date1[2]]);//显示秒的十位
  567. delay(1);
  568. WriteAddress(0x26);
  569. WriteData(dispcode[date1[3]]);//显示秒的十位
  570. delay(1);
  571. WriteAddress(0x07);
  572. WriteData('-');//显示秒的十位
  573. delay(1);
  574. WriteAddress(0x08);
  575. WriteData(dispcode[date1[4]]);//显示秒的十位
  576. delay(1);
  577. WriteAddress(0x09);
  578. WriteData(dispcode[date1[5]]);//显示秒的十位
  579. delay(1);

  580. WriteAddress(0x40);
  581. WriteData(dispcode[10]);//显示秒的十位
  582. delay(1);

  583. WriteAddress(0x41);
  584. WriteData(dispcode[10]);        //显示秒的个位
  585. delay(1);

  586. WriteAddress(0x42);
  587. WriteData(dispcode[10]);                //显示"-"
  588. delay(1);

  589. WriteAddress(0x43);
  590. WriteData(dispcode[time2[2]]);//显示分的十位
  591. delay(1);

  592. WriteAddress(0x44);
  593. WriteData(dispcode[time2[3]]);        //显示分的个位
  594. delay(1);

  595. WriteAddress(0x45);
  596. WriteData(dispcode[10]);                //显示"-"
  597. delay(1);

  598. WriteAddress(0x46);
  599. WriteData(dispcode[10]);        //显示时的十位
  600. delay(1);

  601. WriteAddress(0x47);
  602. WriteData(dispcode[10]);        //显示时的个位
  603. delay(1);

  604. if(P1_7==0)
  605. delay(10);
  606. if(P1_7==0)
  607. {
  608. time2[3]++;
  609. if(time2[3]==10)
  610. {
  611. time2[3]=0;
  612. time2[2]++;  
  613. }
  614. if(time2[2]==6&&time2[3]==1)
  615. {
  616. time2[2]=0;
  617. time2[3]=0;
  618. }
  619. while(P1_7==0);
  620. }

  621. if(P1_5==0)
  622. {delay(10);
  623. if(P1_5==0)
  624. {       
  625. time2[3]--;       
  626. if(time2[3]==0&&time2[2]==0)
  627. {
  628. time2[2]=6;
  629. time2[3]=0;
  630. }
  631. if(time2[3]==0-1)
  632. {time2[2]--;
  633. time2[3]=9;}
  634. while(P1_5==0);}
  635. }
  636. if(P1_6==0)
  637. break;
  638. }
  639. }

  640. void display3()
  641. {
  642. while(1)
  643. {
  644. WriteAddress(0x00);
  645. WriteData('2');//显示秒的十位
  646. delay(1);
  647. WriteAddress(0x01);
  648. WriteData('0');//显示秒的十位
  649. delay(1);
  650.    WriteAddress(0x02);
  651. WriteData(dispcode[date1[0]]);//显示年的十位
  652. delay(1);
  653. WriteAddress(0x03);
  654. WriteData(dispcode[date1[1]]);//显示年的个位
  655. delay(1);
  656. WriteAddress(0x04);
  657. WriteData('-');
  658. delay(1);
  659. WriteAddress(0x05);
  660. WriteData(dispcode[date1[2]]);//显示月的十位
  661. delay(1);
  662. WriteAddress(0x06);
  663. WriteData(dispcode[date1[3]]);//显示月的个位
  664. delay(1);
  665. WriteAddress(0x07);
  666. WriteData('-');
  667. delay(1);
  668. WriteAddress(0x08);
  669. WriteData(dispcode[date1[4]]);  //显示日的十位
  670. delay(1);
  671. WriteAddress(0x09);
  672. WriteData(dispcode[date1[5]]);  //显示日的个位
  673. delay(1);


  674. WriteAddress(0x47);
  675. WriteData(dispcode[10]);//显示秒的十位
  676. delay(1);

  677. WriteAddress(0x46);
  678. WriteData(dispcode[10]);        //显示秒的个位
  679. delay(1);

  680. WriteAddress(0x45);
  681. WriteData(dispcode[10]);                //显示"-"
  682. delay(1);

  683. WriteAddress(0x44);
  684. WriteData(dispcode[10]);//显示分的十位
  685. delay(1);

  686. WriteAddress(0x43);
  687. WriteData(dispcode[10]);        //显示分的个位
  688. delay(1);

  689. WriteAddress(0x42);
  690. WriteData(dispcode[10]);                //显示"-"
  691. delay(1);

  692. WriteAddress(0x40);
  693. WriteData(dispcode[time3[0]]);        //显示时的十位
  694. delay(1);

  695. WriteAddress(0x41);
  696. WriteData(dispcode[time3[1]]);        //显示时的个位
  697. delay(1);

  698. if(P1_7==0)
  699. delay(10);
  700. if(P1_7==0)
  701. {
  702. time3[1]++;
  703. if(time3[1]==10)
  704. {
  705. time3[1]=0;
  706. time3[0]++;
  707. }
  708. if(time3[0]==2&&time3[1]==4)
  709. {
  710. time3[0]=0;
  711. time3[1]=0;
  712. }
  713. while(P1_7==0);
  714. }

  715. if(P1_5==0)
  716. {delay(10);
  717. if(P1_5==0)
  718. {
  719. time3[1]--;
  720. if(time3[1]==0&&time3[0]==0)
  721. {
  722. time3[0]=2;
  723. time3[1]=4;
  724. }
  725. if(time3[1]==0-1)
  726. {       
  727. time3[0]--;
  728. time3[1]=9;
  729. }
  730. while(P1_5==0);
  731. }
  732. }
  733. if(P1_6==0)
  734. break;               
  735. }
  736. }

  737. void display4()
  738. {
  739. while(1)
  740. {

  741. WriteAddress(0x00);
  742. WriteData('2');//显示秒的十位
  743. delay(1);
  744. WriteAddress(0x01);
  745. WriteData('0');//显示秒的十位
  746. delay(1);

  747. WriteAddress(0x02);
  748. WriteData(dispcode[date1[0]]);//显示秒的十位
  749. delay(1);
  750. WriteAddress(0x03);
  751. WriteData(dispcode[date1[1]]);//显示秒的十位
  752. delay(1);
  753. WriteAddress(0x04);
  754. WriteData('-');//显示秒的十位
  755. delay(1);
  756. WriteAddress(0x05);
  757. WriteData(dispcode[date1[2]]);//显示秒的十位
  758. delay(1);
  759. WriteAddress(0x26);
  760. WriteData(dispcode[date1[3]]);//显示秒的十位
  761. delay(1);
  762. WriteAddress(0x07);
  763. WriteData('-');//显示秒的十位
  764. delay(1);
  765. WriteAddress(0x08);
  766. WriteData(dispcode[date1[4]]);//显示秒的十位
  767. delay(1);
  768. WriteAddress(0x09);
  769. WriteData(dispcode[date1[5]]);//显示秒的十位
  770. delay(1);

  771. WriteAddress(0x40);
  772. WriteData(dispcode[10]);//显示秒的十位
  773. delay(1);

  774. WriteAddress(0x41);
  775. WriteData(dispcode[10]);        //显示秒的个位
  776. delay(1);

  777. WriteAddress(0x42);
  778. WriteData(dispcode[10]);                //显示"-"
  779. delay(1);

  780. WriteAddress(0x43);
  781. WriteData(dispcode[time3[2]]);//显示分的十位
  782. delay(1);

  783. WriteAddress(0x44);
  784. WriteData(dispcode[time3[3]]);        //显示分的个位
  785. delay(1);

  786. WriteAddress(0x45);
  787. WriteData(dispcode[10]);                //显示"-"
  788. delay(1);

  789. WriteAddress(0x46);
  790. WriteData(dispcode[10]);        //显示时的十位
  791. delay(1);

  792. WriteAddress(0x47);
  793. WriteData(dispcode[10]);        //显示时的个位
  794. delay(1);

  795. if(P1_7==0)
  796. delay(10);
  797. if(P1_7==0)
  798. {
  799. time3[3]++;
  800. if(time3[3]==10)
  801. {
  802. time3[3]=0;
  803. time3[2]++;  
  804. }
  805. if(time3[2]==6&&time3[3]==1)
  806. {
  807. time3[2]=0;
  808. time3[3]=0;
  809. }
  810. while(P1_7==0);
  811. }

  812. if(P1_5==0)
  813. {delay(10);
  814. if(P1_5==0)
  815. {       
  816. time3[3]--;       
  817. if(time3[3]==0&&time3[2]==0)
  818. {
  819. time3[2]=6;
  820. time3[3]=0;
  821. }
  822. if(time3[3]==0-1)
  823. {time3[2]--;
  824. time3[3]=9;}
  825. while(P1_5==0);}
  826. }
  827. if(P1_6==0)
  828. break;
  829. }
  830. }

  831.   void display5()
  832. {
  833. while(1)
  834. {
  835. WriteAddress(0x00);
  836. WriteData('2');//显示秒的十位
  837. delay(1);
  838. WriteAddress(0x01);
  839. WriteData('0');//显示秒的十位
  840. delay(1);
  841.    WriteAddress(0x02);
  842. WriteData(dispcode[date1[0]]);//显示年的十位
  843. delay(1);
  844. WriteAddress(0x03);
  845. WriteData(dispcode[date1[1]]);//显示年的个位
  846. delay(1);
  847. WriteAddress(0x04);
  848. WriteData('-');
  849. delay(1);
  850. WriteAddress(0x05);
  851. WriteData(dispcode[date1[2]]);//显示月的十位
  852. delay(1);
  853. WriteAddress(0x06);
  854. WriteData(dispcode[date1[3]]);//显示月的个位
  855. delay(1);
  856. WriteAddress(0x07);
  857. WriteData('-');
  858. delay(1);
  859. WriteAddress(0x08);
  860. WriteData(dispcode[date1[4]]);  //显示日的十位
  861. delay(1);
  862. WriteAddress(0x09);
  863. WriteData(dispcode[date1[5]]);  //显示日的个位
  864. delay(1);


  865. WriteAddress(0x47);
  866. WriteData(dispcode[10]);//显示秒的十位
  867. delay(1);

  868. WriteAddress(0x46);
  869. WriteData(dispcode[10]);        //显示秒的个位
  870. delay(1);

  871. WriteAddress(0x45);
  872. WriteData(dispcode[10]);                //显示"-"
  873. delay(1);

  874. WriteAddress(0x44);
  875. WriteData(dispcode[10]);//显示分的十位
  876. delay(1);

  877. WriteAddress(0x43);
  878. WriteData(dispcode[10]);        //显示分的个位
  879. delay(1);

  880. WriteAddress(0x42);
  881. WriteData(dispcode[10]);                //显示"-"
  882. delay(1);

  883. WriteAddress(0x40);
  884. WriteData(dispcode[time4[0]]);        //显示时的十位
  885. delay(1);

  886. WriteAddress(0x41);
  887. WriteData(dispcode[time4[1]]);        //显示时的个位
  888. delay(1);

  889. if(P1_7==0)
  890. delay(15);
  891. if(P1_7==0)
  892. {
  893. time4[1]++;
  894. if(time4[1]==10)
  895. {
  896. time4[1]=0;
  897. time4[0]++;
  898. if(time4[0]==6)
  899. {
  900. time4[1]=0;
  901. time4[0]=0;

  902. }
  903. }
  904. if(time4[0]==2&&time4[1]==4)
  905. {
  906. time4[0]=0;
  907. time4[1]=0;
  908. }
  909. while(P1_7==0);
  910. }

  911. if(P1_5==0)
  912. {delay(15);
  913. if(P1_5==0)
  914. {
  915. time4[1]--;
  916. if(time4[1]==0&&time4[0]==0)
  917. {
  918. time4[0]=2;
  919. time4[1]=4;
  920. }
  921. if(time4[1]==0-1)
  922. {       
  923. time4[0]--;
  924. time4[1]=9;
  925. }
  926. while(P1_5==0);
  927. }
  928. }
  929. if(P1_6==0)
  930. break;               
  931. }
  932. }

  933. void display6()
  934. {
  935. while(1)
  936. {

  937. WriteAddress(0x00);
  938. WriteData('2');//显示秒的十位
  939. delay(1);
  940. WriteAddress(0x01);
  941. WriteData('0');//显示秒的十位
  942. delay(1);

  943. WriteAddress(0x02);
  944. WriteData(dispcode[date1[0]]);//显示秒的十位
  945. delay(1);
  946. WriteAddress(0x03);
  947. WriteData(dispcode[date1[1]]);//显示秒的十位
  948. delay(1);
  949. WriteAddress(0x04);
  950. WriteData('-');//显示秒的十位
  951. delay(1);
  952. WriteAddress(0x05);
  953. WriteData(dispcode[date1[2]]);//显示秒的十位
  954. delay(1);
  955. WriteAddress(0x26);
  956. WriteData(dispcode[date1[3]]);//显示秒的十位
  957. delay(1);
  958. WriteAddress(0x07);
  959. WriteData('-');//显示秒的十位
  960. delay(1);
  961. WriteAddress(0x08);
  962. WriteData(dispcode[date1[4]]);//显示秒的十位
  963. delay(1);
  964. WriteAddress(0x09);
  965. WriteData(dispcode[date1[5]]);//显示秒的十位
  966. delay(1);

  967. WriteAddress(0x40);
  968. WriteData(dispcode[10]);//显示秒的十位
  969. delay(1);

  970. WriteAddress(0x41);
  971. WriteData(dispcode[10]);        //显示秒的个位
  972. delay(1);

  973. WriteAddress(0x42);
  974. WriteData(dispcode[10]);                //显示"-"
  975. delay(1);

  976. WriteAddress(0x43);
  977. WriteData(dispcode[time4[2]]);//显示分的十位
  978. delay(1);

  979. WriteAddress(0x44);
  980. WriteData(dispcode[time4[3]]);        //显示分的个位
  981. delay(1);

  982. WriteAddress(0x45);
  983. WriteData(dispcode[10]);                //显示"-"
  984. delay(1);

  985. WriteAddress(0x46);
  986. WriteData(dispcode[10]);        //显示时的十位
  987. delay(1);

  988. WriteAddress(0x47);
  989. WriteData(dispcode[10]);        //显示时的个位
  990. delay(1);

  991. if(P1_7==0)
  992. delay(15);
  993. if(P1_7==0)
  994. {
  995. time4[3]++;
  996. if(time4[3]==10)
  997. {
  998. time4[3]=0;
  999. time4[2]++;  
  1000. }
  1001. if(time4[2]==6&&time4[3]==1)
  1002. {
  1003. time4[2]=0;
  1004. time4[3]=0;
  1005. }
  1006. while(P1_7==0);
  1007. }

  1008. if(P1_5==0)
  1009. {delay(15);
  1010. if(P1_5==0)
  1011. {       
  1012. time4[3]--;       
  1013. if(time4[3]==0&&time4[2]==0)
  1014. {
  1015. time4[2]=6;
  1016. time4[3]=0;
  1017. }
  1018. if(time4[3]==0-1)
  1019. {time4[2]--;
  1020. time4[3]=9;}
  1021. while(P1_5==0);}
  1022. }
  1023. if(P1_6==0)
  1024. break;
  1025. }
  1026. }

  1027. void main()
  1028. {  
  1029. unsigned char flag;
  1030. Initial_DS1302();
  1031. LcdInt();
  1032.     display_dot();       //显示温度的小数点
  1033.   display_cent();      //显示温度的单位
  1034.      DS1302_GetTime(&time1);                  //读取时间参数            
  1035.    time0[5]=(time1.Second)%10;                //把秒的个位数据存入time[5]
  1036.    time0[4]=(time1.Second)/10;                //把秒的十位数据存入time[4]
  1037.    time0[3]=(time1.Minute)%10;                //把分的个位数据存入time[3]
  1038.    time0[2]=(time1.Minute)/10;                //把分的十位数据存入time[2]
  1039.    time0[1]=(time1.Hour)%10;                  //把时的个位数据存入time[1]
  1040.    time0[0]=(time1.Hour)/10;                //把时的十位数据存入time[0]

  1041.                  time2[5]=time0[5]-1;        time2[4]=time0[4];                 time2[3]=time0[3];
  1042.                 time2[2]=time0[2];            time2[1]=time0[1];                  time2[0]=time0[0];
  1043.                  time3[5]=time0[5]-1;        time3[4]=time0[4];                 time3[3]=time0[3];
  1044.                 time3[2]=time0[2];            time3[1]=time0[1];                  time3[0]=time0[0];
  1045.                   time4[5]=time0[5]-1;        time4[4]=time0[4];                 time4[3]=time0[3];
  1046.                 time4[2]=time0[2];            time4[1]=time0[1];                  time4[0]=time0[0];

  1047. while(1)                                                            
  1048. {
  1049.      flag1=0;
  1050.         ReadyReadTemp();     //读温度准备
  1051.     TL=ReadOneChar();    //先读的是温度值低位
  1052.         TH=ReadOneChar();    //接着读的是温度值高位
  1053.         if((TH&0xf8)!=0x00)//判断高五位 得到温度正负标志
  1054.         {
  1055.         flag=1;
  1056.         TL=~TL;         //取反
  1057.         TH=~TH;          //取反
  1058.         tltemp=TL+1; //低位加1
  1059.         TL=tltemp;
  1060.         if(tltemp>255) TH++;  //如果低8位大于255,向高8位进1
  1061.    TN=TH*16+TL/16;      //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
  1062.                                           //这样得出的是温度的整数部分,小数部分被丢弃了
  1063.    TD=(TL%16)*10/16;    //计算温度的小数部分,将余数乘以10再除以16取整,
  1064.         }
  1065.         TN=TH*16+TL/16;      //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
  1066.                                           //这样得出的是温度的整数部分,小数部分被丢弃了
  1067.    TD=(TL%16)*10/16;    //计算温度的小数部分,将余数乘以10再除以16取整,
  1068.                                   //这样得到的是温度小数部分的第一位数字(保留1位小数)
  1069.    display_temp1(TN);    //显示温度的整数部分
  1070.    display_temp2(TD);    //显示温度的小数部分
  1071.   delay(10);

  1072.    DS1302_GetTime(&time1);                  //读取时间参数            
  1073.    time0[5]=(time1.Second)%10;                //把秒的个位数据存入time[5]
  1074.    time0[4]=(time1.Second)/10;                //把秒的十位数据存入time[4]
  1075.    time0[3]=(time1.Minute)%10;                //把分的个位数据存入time[3]
  1076.    time0[2]=(time1.Minute)/10;                //把分的十位数据存入time[2]
  1077.    time0[1]=(time1.Hour)%10;                  //把时的个位数据存入time[1]
  1078.    time0[0]=(time1.Hour)/10;                //把时的十位数据存入time[0]
  1079.    date[5]=(time1.Day)%10;
  1080.    date[4]=(time1.Day)/10;
  1081.    date[3]=(time1.Month)%10;
  1082.    date[2]=(time1.Month)/10;
  1083.    date[1]=(time1.Year)%10;
  1084.    date[0]=(time1.Year)/10;       
  1085.                 date1[5]=date[5];        date1[4]=date[4];  date1[3]=date[3];
  1086.                 date1[2]=date[2];          date1[1]=date[1];          date1[0]=date[0];

  1087.         

  1088. ……………………

  1089. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
时间日期可调.zip (80.72 KB, 下载次数: 53)
回复

使用道具 举报

ID:217998 发表于 2018-1-1 19:01 | 显示全部楼层
有原理图吗,请问
回复

使用道具 举报

ID:434779 发表于 2018-11-29 06:12 | 显示全部楼层
有硬件图最好,先点赞!
回复

使用道具 举报

ID:540216 发表于 2019-5-16 21:01 来自手机 | 显示全部楼层
先点赞,就是要是有原理图就好了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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