久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8911|回復: 3
打印 上一主題 下一主題
收起左側

51單片機時鐘(時間日期可調)

[復制鏈接]
跳轉到指定樓層
樓主
ID:266654 發(fā)表于 2017-12-25 17:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
K5按鍵 按一下,時鐘開始正常顯示時間,再按一下,顯示日期
K6按鍵為調整鍵
K7按鍵 按一下,開始顯示日期,再按一下進入 日期跟時鐘的 調節(jié)模式

單片機源程序如下:
  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;      //儲存溫度的整數(shù)部分
  14. unsigned char TD;       //儲存溫度的小數(shù)部分
  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;       //根據(jù)規(guī)定,RS為低電平,RW為高電平時,可以讀狀態(tài)
  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;                  //根據(jù)規(guī)定,RS和R/W同時為低電平時,可以寫入指令
  99. RW=0;   
  100. E=0;                   //E置低電平(寫指令時,
  101.                          // 就是讓E從0到1發(fā)生正跳變,所以應先置"0"
  102. _nop_();
  103. _nop_();             //空操作兩個機器周期,給硬件反應時間
  104. P0=dictate;            //將數(shù)據(jù)送入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由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令
  115. }
  116. void WriteAddress(unsigned char x)
  117. {
  118. Write_com(x|0x80); //顯示位置的確定方法規(guī)定為"80H+地址碼x"       
  119. }
  120. void WriteData(unsigned char y)
  121. {
  122. while(BusyTest()==1);  
  123.   RS=1;           //RS為高電平,RW為低電平時,可以寫入數(shù)據(jù)
  124.   RW=0;
  125.   E=0;            //E置低電平(寫指令時,,
  126.                    // 就是讓E從0到1發(fā)生正跳變,所以應先置"0"
  127.   P0=y;           //將數(shù)據(jù)送入P0口,即將數(shù)據(jù)寫入液晶模塊
  128.   _nop_();
  129.   _nop_();
  130.   _nop_();
  131.           _nop_();       //空操作四個機器周期,給硬件反應時間
  132.   E=1;          //E置高電平
  133.   _nop_();
  134.   _nop_();
  135.   _nop_();
  136.   _nop_();        //空操作四個機器周期,給硬件反應時間
  137.   E=0;            //當E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令
  138. }
  139. void LcdInt(void)
  140. {
  141. delay(15);             //延時15ms,首次寫指令時應給LCD一段較長的反應時間
  142. Write_com(0x38);  //顯示模式設置:16×2顯示,5×7點陣,8位數(shù)據(jù)接口
  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;           //先將數(shù)據(jù)線拉高
  159. for(time=0;time<2;time++) //略微延時約6微秒
  160. ;
  161. DQ = 0;           //再將數(shù)據(jù)線從高拉低,要求保持480~960us
  162. for(time=0;time<200;time++)  //略微延時約600微秒
  163. ;         //以向DS18B20發(fā)出一持續(xù)480~960us的低電平復位脈沖
  164. DQ = 1;           //釋放數(shù)據(jù)線(將數(shù)據(jù)線拉高)
  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;  //儲存讀出的一個字節(jié)數(shù)據(jù)
  176.         for (i=0;i<8;i++)
  177.          {
  178.           
  179.            DQ =1;       // 先將數(shù)據(jù)線拉高
  180.            _nop_();            //等待一個機器周期         
  181.            DQ = 0;      //單片機從DS18B20讀書據(jù)時,將數(shù)據(jù)線從高拉低即啟動讀時序
  182.            _nop_();     //等待一個機器周期                  
  183.            DQ = 1;     //將數(shù)據(jù)線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備
  184.            for(time=0;time<2;time++)
  185.              ;  //延時約6us,使主機在15us內采樣
  186.                          dat>>=1;
  187.            if(DQ==1)
  188.               dat|=0x80;  //如果讀到的數(shù)據(jù)是1,則將1存入dat
  189.                 else
  190.                         dat|=0x00;//如果讀到的數(shù)據(jù)是0,則將0存入dat
  191.              //將單片機檢測到的電平信號DQ存入r[i]       
  192.            for(time=0;time<8;time++)
  193.                          ;           //延時3us,兩個讀時序之間必須有大于1us的恢復期       
  194.     }                            
  195. return(dat);    //返回讀出的十六進制數(shù)據(jù)
  196. }
  197. WriteOneChar(unsigned char dat)
  198. {
  199. unsigned char i=0;
  200. for (i=0; i<8; i++)
  201.          {
  202.           DQ =1;         // 先將數(shù)據(jù)線拉高
  203.           _nop_();             //等待一個機器周期         
  204.           DQ=0;          //將數(shù)據(jù)線從高拉低時即啟動寫時序      
  205.           DQ=dat&0x01;   //利用與運算取出要寫的某位二進制數(shù)據(jù),
  206.                    //并將其送到數(shù)據(jù)線上等待DS18B20采樣       
  207.          for(time=0;time<10;time++)
  208.              ;//延時約30us,DS18B20在拉低后的約15~60us期間從數(shù)據(jù)線上采樣
  209.           DQ=1;          //釋放數(shù)據(jù)線                    
  210.           for(time=0;time<1;time++)
  211.                   ;//延時3us,兩個寫時序間至少需要1us的恢復期
  212.           dat>>=1;       //將dat中的各二進制位數(shù)據(jù)右移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('.');      //將小數(shù)點的字符常量寫入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]);    //將百位數(shù)字的字符常量寫入LCD
  242.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   }
  243. else{
  244. }
  245. WriteData(dispcode[k]);    //將十位數(shù)字的字符常量寫入LCD
  246. WriteData(dispcode[l]);    //將個位數(shù)字的字符常量寫入LCD
  247. delay(50);         //延時1ms給硬件一點反應時間     
  248. }
  249. void display_temp2(unsigned char x)
  250. {
  251. WriteAddress(0x0e);      //寫顯示地址,將在第2行第11列開始顯示
  252. WriteData(dispcode[x]);     //將小數(shù)部分的第一位數(shù)字字符常量寫入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年起到y(tǒng)ear所經歷的閏年數(shù)
  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();       //顯示溫度的小數(shù)點
  1033.   display_cent();      //顯示溫度的單位
  1034.      DS1302_GetTime(&time1);                  //讀取時間參數(shù)            
  1035.    time0[5]=(time1.Second)%10;                //把秒的個位數(shù)據(jù)存入time[5]
  1036.    time0[4]=(time1.Second)/10;                //把秒的十位數(shù)據(jù)存入time[4]
  1037.    time0[3]=(time1.Minute)%10;                //把分的個位數(shù)據(jù)存入time[3]
  1038.    time0[2]=(time1.Minute)/10;                //把分的十位數(shù)據(jù)存入time[2]
  1039.    time0[1]=(time1.Hour)%10;                  //把時的個位數(shù)據(jù)存入time[1]
  1040.    time0[0]=(time1.Hour)/10;                //把時的十位數(shù)據(jù)存入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.                                           //這樣得出的是溫度的整數(shù)部分,小數(shù)部分被丟棄了
  1063.    TD=(TL%16)*10/16;    //計算溫度的小數(shù)部分,將余數(shù)乘以10再除以16取整,
  1064.         }
  1065.         TN=TH*16+TL/16;      //實際溫度值=(TH*256+TL)/16,即:TH*16+TL/16
  1066.                                           //這樣得出的是溫度的整數(shù)部分,小數(shù)部分被丟棄了
  1067.    TD=(TL%16)*10/16;    //計算溫度的小數(shù)部分,將余數(shù)乘以10再除以16取整,
  1068.                                   //這樣得到的是溫度小數(shù)部分的第一位數(shù)字(保留1位小數(shù))
  1069.    display_temp1(TN);    //顯示溫度的整數(shù)部分
  1070.    display_temp2(TD);    //顯示溫度的小數(shù)部分
  1071.   delay(10);

  1072.    DS1302_GetTime(&time1);                  //讀取時間參數(shù)            
  1073.    time0[5]=(time1.Second)%10;                //把秒的個位數(shù)據(jù)存入time[5]
  1074.    time0[4]=(time1.Second)/10;                //把秒的十位數(shù)據(jù)存入time[4]
  1075.    time0[3]=(time1.Minute)%10;                //把分的個位數(shù)據(jù)存入time[3]
  1076.    time0[2]=(time1.Minute)/10;                //把分的十位數(shù)據(jù)存入time[2]
  1077.    time0[1]=(time1.Hour)%10;                  //把時的個位數(shù)據(jù)存入time[1]
  1078.    time0[0]=(time1.Hour)/10;                //把時的十位數(shù)據(jù)存入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, 下載次數(shù): 53)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:217998 發(fā)表于 2018-1-1 19:01 | 只看該作者
有原理圖嗎,請問
回復

使用道具 舉報

板凳
ID:434779 發(fā)表于 2018-11-29 06:12 | 只看該作者
有硬件圖最好,先點贊!
回復

使用道具 舉報

地板
ID:540216 發(fā)表于 2019-5-16 21:01 來自手機 | 只看該作者
先點贊,就是要是有原理圖就好了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 四虎最新视频 | 中文字幕亚洲欧美日韩在线不卡 | 激情欧美日韩一区二区 | 欧美精品成人影院 | 国产精品久久久久久福利一牛影视 | 久久四虎 | 91黄色免费看 | jlzzxxxx18hd护士 | 99热精品在线观看 | 精品一区二区久久久久久久网精 | 国产91综合一区在线观看 | 欧美一区二区三区视频在线观看 | 中文字幕成人av | 精品国产欧美一区二区 | 亚洲男人的天堂网站 | 中文字幕日韩欧美 | 欧美成人a∨高清免费观看 欧美日韩中 | 91影片 | 超碰精品在线 | 99精品视频免费在线观看 | 国产精品美女www爽爽爽视频 | 日日操日日干 | 日韩h| 国产精品美女久久久av超清 | 激情网站在线观看 | 成人天堂噜噜噜 | 国产一级在线 | 免费在线观看一区二区 | 国产精品国产三级国产播12软件 | 国产在线播 | 亚洲一区国产 | 国产高清在线视频 | 中文字幕一级毛片 | 色吧综合| 欧美精品一区二区免费视频 | 伊人网综合| 91国内精精品久久久久久婷婷 | 日韩二| 免费久久网 | 操网站 | 免费一二区|