找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3751|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

DIY單片機(jī)Ds3231高精度時(shí)鐘程序 溫度顯示器12864 ds18b20 89c51

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:586730 發(fā)表于 2019-8-2 10:37 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
DIY高精度時(shí)鐘、溫度顯示器Ds3231+12864+ds18b20+89c51
硬件:
程序:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include<stdlib.h>
  4.                                                                        
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. /*端口定義*/
  8. sbit LCD_RS=P2^6;
  9. sbit LCD_RW=P2^5;
  10. sbit LCD_EN=P2^4;
  11. sbit LCD_PSB=P2^3;
  12. sbit DQ=P3^7;                                                        //18b20
  13. sbit SDA=P1^4;                                               //ds32321            //模擬I2C數(shù)據(jù)傳送位SDA      
  14. sbit SCL=P1^3;                                   //模擬I2C時(shí)鐘控制位SCL
  15. //***按鍵功能****//
  16. ////***K1停止時(shí)間顯示****//
  17. ////***K2選擇修改位置****//
  18. ////***K3進(jìn)行加1的修改****//
  19. ////***K4將修改寫(xiě)入ds3231,同時(shí)啟動(dòng)時(shí)間顯示****//
  20. sbit K1=P3^2;                                          
  21. sbit K2=P3^3;
  22. sbit K3=P3^4;
  23. sbit K4=P3^5;
  24. //定義變量                           
  25. uchar numbr[10]="0123456789";                                          //字模
  26.                                                                                    
  27.                                                                                                                                                                                                                  
  28. uchar dis4[]="   ";                                                                                                     //                第四行顯示   自己添加
  29. uchar t[]="  .   ℃" ;                                                                        //18b20
  30. uint  sdata,xiaoshu1,xiaoshu2;                                                         //整數(shù)、小數(shù)1位、小數(shù)2位
  31. bit  fg=1;                                   //溫度正負(fù)標(biāo)志
  32. uchar tempL=0,tempH=0;                                                                                                     // 變量            
  33. uchar year,month,date,hour,min,sec;                                                        //              ds3231
  34. uchar a[]="2011年22月33日";
  35. uchar b[]="11時(shí)22分33秒";
  36.                                 ///函數(shù)
  37. //******************延時(shí)子程序 *******************************

  38. //這個(gè)延時(shí)程序的具體延時(shí)時(shí)間是time=i*8+10,適用于小于2ms的延時(shí)

  39. //************************************************************
  40. void delay(unsigned char i)
  41. {
  42. for(i;i>0;i--);
  43. }
  44. //***********************************************************
  45. //                     延時(shí)子程序
  46. //************************************************************
  47. void delay1ms(uchar j)
  48. {
  49. while(j!=0)
  50. {uchar i;
  51. for(i=124;i>0;i--);  //延時(shí)124*8+10=1002us
  52. j--;
  53. }
  54. }
  55. /**************************12864部分*************************************/
  56. /**************************12864部分*************************************/            
  57.                                                                                                                                             /*寫(xiě)指令數(shù)據(jù)到LCD
  58.                                                                                                                                             RS=L——表示DB0-DB7為顯示指令數(shù)據(jù)
  59.                                                                                                                                             RW=L——表示DB0-DB7數(shù)據(jù)被write(當(dāng)E=“H-L”,指令數(shù)據(jù)被寫(xiě)到IR或DR)
  60.                                                                                                                                             E=高脈沖
  61.                                                                                                                                             此時(shí)DB0-DB7=指令碼              */
  62. void write_cmd(uchar cmd)
  63. {
  64.               LCD_RS=0;
  65.               LCD_RW=0;
  66.               LCD_EN=0;
  67.               P0=cmd;
  68.               delay1ms(5);
  69.               LCD_EN=1;
  70.               delay1ms(5);
  71.               LCD_EN=0;
  72. }
  73.                                                                                                                               /*設(shè)定顯示位置*/
  74. void lcd_pos(uchar X, uchar Y)
  75. {
  76.               uchar pos;

  77.               if(X == 0)
  78.               {
  79.                             X = 0x80;
  80.               }
  81.               else if(X == 1)
  82.               {
  83.                             X = 0x90;
  84.               }
  85.               else if(X == 2)
  86.               {
  87.                             X = 0x88;
  88.               }
  89.               else if(X == 3)
  90.               {
  91.                             X = 0x98;
  92.               }
  93.               pos = X + Y;
  94.               write_cmd(pos);                                                                                    //顯示地址
  95. }

  96.                                                                                                                                                                         /*寫(xiě)顯示數(shù)據(jù)到LCD*/
  97.                                                                                                                                                                         /*
  98.                                                                                                                                                                                       RS=H ——表示DB0-DB7為顯示數(shù)據(jù)
  99.                                                                                                                                                                                       RW=L ——RW=L,E='H-L',DB0-DB7數(shù)據(jù)被寫(xiě)到IR或DR            
  100.                                                                                                                                                                                       E=高脈沖
  101.                                                                                                                                                                                       DB0-DB7=顯示數(shù)據(jù)              */
  102. void write_dat(uchar dat)
  103. {
  104.               LCD_RS=1;
  105.               LCD_RW=0;
  106.               LCD_EN=0;
  107.               P0=dat;
  108.               delay1ms(5);
  109.               LCD_EN=1;
  110.               delay1ms(5);
  111.               LCD_EN=0;
  112. }
  113.                                                                                                                                                                                       /*LCD初始化*/
  114. void lcd_init()
  115. {              uint i;

  116.               LCD_PSB=1;                                                                                                                              //并口方式
  117.               write_cmd(0x30);                                                                                                  //基本操作指令
  118.               delay1ms(5);
  119.               write_cmd(0x0c);                                                                                                  //打開(kāi)顯示,光標(biāo)關(guān)閉
  120.               delay1ms(5);
  121.               write_cmd(0x01);                                                                                                  //清除LCD顯示類(lèi)容
  122.               delay1ms(5);


  123.               lcd_pos(3,0);
  124.                                                         i=0;
  125.                                                         while(dis4[i]!='\0')
  126.                                                                       {
  127.                                                                       delay1ms(1);
  128.                                                                       write_dat(dis4[i]);
  129.                                                                       delay1ms(1);
  130.                                                                       i++;
  131.                                                                       }
  132.                                                                                                                                                                                                    
  133. }
  134. /**********************************18b20************************************************/
  135. /**********************************18b20************************************************/


  136. void Init_DS18B20(void)                                                                                                                                             //初始化
  137. {
  138. uchar x=0;
  139. DQ=1; //DQ先置高
  140. delay(8); //稍延時(shí)
  141. DQ=0; //發(fā)送復(fù)位脈沖
  142. delay(80); //延時(shí)(>480us)
  143. DQ=1; //拉高數(shù)據(jù)線
  144. delay(5); //等待(15~60us)
  145. x=DQ; //用X的值來(lái)判斷初始化有沒(méi)有成功,18B20存在的話X=0,否則X=1
  146. delay(20);
  147. }

  148. //**********讀一個(gè)字節(jié)************//

  149. ReadOneChar(void)  //主機(jī)數(shù)據(jù)線先從高拉至低電平1us以上,再使數(shù)據(jù)線升為高電平,從而產(chǎn)生讀信號(hào)
  150. {
  151. unsigned char i=0; //每個(gè)讀周期最短的持續(xù)時(shí)間為60us,各個(gè)讀周期之間必須有1us以上的高電平恢復(fù)期
  152. unsigned char dat=0;
  153. for (i=8;i>0;i--) //一個(gè)字節(jié)有8位
  154. {
  155. DQ=1;
  156. delay(1);
  157. DQ=0;
  158. dat>>=1;
  159. DQ=1;
  160. if(DQ)
  161. dat|=0x80;
  162. delay(4);
  163. }
  164. return(dat);
  165. }
  166. //*********************** **寫(xiě)一個(gè)字節(jié)**************************//

  167. void WriteOneChar(unsigned char dat)
  168. {
  169.   unsigned char i=0; //數(shù)據(jù)線從高電平拉至低電平,產(chǎn)生寫(xiě)起始信號(hào)。15us之內(nèi)將所需寫(xiě)的位送到數(shù)據(jù)線上,
  170.   for(i=8;i>0;i--) //在15~60us之間對(duì)數(shù)據(jù)線進(jìn)行采樣,如果是高電平就寫(xiě)1,低寫(xiě)0發(fā)生。
  171.   {
  172.    DQ=0; //在開(kāi)始另一個(gè)寫(xiě)周期前必須有1us以上的高電平恢復(fù)期。
  173.    DQ=dat&0x01;
  174.    delay(5);
  175.    DQ=1;
  176.    dat>>=1;
  177.   }
  178.   delay(4);
  179. }

  180. void ReadTemperature(void)                                                                                                                               //讀溫度值(低位放tempL;高位放tempH;)//
  181.               {
  182.               Init_DS18B20(); //初始化
  183.               WriteOneChar(0xcc); //跳過(guò)讀序列號(hào)的操作
  184.               WriteOneChar(0x44); //啟動(dòng)溫度轉(zhuǎn)換
  185.               delay(125); //轉(zhuǎn)換需要一點(diǎn)時(shí)間,延時(shí)
  186.               Init_DS18B20(); //初始化
  187.               WriteOneChar(0xcc); //跳過(guò)讀序列號(hào)的操作
  188.               WriteOneChar(0xbe); //讀溫度寄存器(頭兩個(gè)值分別為溫度的低位和高位)
  189.               tempL=ReadOneChar(); //讀出溫度的低位LSB
  190.               tempH=ReadOneChar(); //讀出溫度的高位MSB

  191.                             if(tempH>0x7f)      //最高位為1時(shí)溫度是負(fù)
  192.                             {
  193.                             tempL=~tempL;         //補(bǔ)碼轉(zhuǎn)換,取反加一
  194.                             tempH=~tempH+1;      
  195.                             fg=0;      //讀取溫度為負(fù)時(shí)fg=0
  196.        }
  197.                             sdata = tempL/16+tempH*16;      //整數(shù)部分
  198.                             xiaoshu1 = (tempL&0x0f)*10/16; //小數(shù)第一位
  199.                             xiaoshu2 = (tempL&0x0f)*100/16%10;//小數(shù)第二位
  200.                             t[0]=numbr[sdata/10];
  201.                             t[1]=numbr[sdata%10];
  202.                             t[3]=numbr[xiaoshu1];
  203.                             t[4]=numbr[xiaoshu2];

  204.               }
  205. /*****************************************ds3231********************************************/

  206. #define ADDRTW          0xD0    //器件寫(xiě)地址
  207. #define ADDRTD          0xD1 //器件讀地址
  208. #define DS3231_SEC      0x00    //秒
  209. #define DS3231_MIN      0x01    //分
  210. #define DS3231_HOUR     0x02    //時(shí)
  211. #define DS3231_DAY      0x03    //星期
  212. #define DS3231_DATE     0x04    //日
  213. #define DS3231_MONTH    0x05    //月
  214. #define DS3231_YEAR     0x06    //年
  215. //鬧鈴1           
  216. #define DS3231_Al1SEC   0x07    //秒
  217. #define DS3231_AL1MIN   0x08    //分
  218. #define DS3231_AL1HOUR  0x09    //時(shí)
  219. #define DS3231_AL1DAY   0x0A    //星期/日
  220. //鬧鈴2
  221. #define DS3231_AL2MIN   0x0b    //分
  222. #define DS3231_AL2HOUR  0x0c    //時(shí)
  223. #define DS3231_AL2DAY   0x0d    //星期/日
  224. #define DS3231_CONTROL  0x0e    //控制寄存器
  225. #define DS3231_STATUS   0x0f    //狀態(tài)寄存器
  226. bit ack;


  227. uchar BCD2HEX(uchar val)           //BCD轉(zhuǎn)換為Byte            
  228. {              uchar i;
  229.     i= val&0x0f;
  230.     val >>= 4;
  231.     val &= 0x0f;
  232.     val *= 10;
  233.     i += val;

  234.     return i;
  235. }


  236. uchar HEX2BCD(uchar val)//B碼轉(zhuǎn)換為BCD碼
  237.               {
  238.               uchar i,j,k;
  239.             
  240.                 i=val/10;
  241.                 j=val%10;
  242.                 k=j+(i<<4);
  243.                 return k;
  244.               }

  245. void Start()            
  246. {
  247.     SDA=1;                  //發(fā)送起始條件的數(shù)據(jù)信號(hào)
  248.     delay(1);
  249.     SCL=1;
  250.     delay(5);             //起始條件建立時(shí)間大于4.7us,延時(shí)
  251.                  SDA=0;                  //發(fā)送起始信號(hào)
  252.     delay(5);             // 起始條件鎖定時(shí)間大于4μs
  253.     SCL=0;                  //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
  254.     delay(2);
  255. }
  256. void Stop()
  257. {
  258.     SDA=0;                  //發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)
  259.     delay(1);             //發(fā)送結(jié)束條件的時(shí)鐘信號(hào)
  260.     SCL=1;                  //結(jié)束條件建立時(shí)間大于4us
  261.     delay(5);

  262.     SDA=1;                  //發(fā)送I2C總線結(jié)束信號(hào)
  263.     delay(4);
  264. }
  265. /********************************************************/
  266. /*******************************************************************
  267.                   字節(jié)數(shù)據(jù)發(fā)送函數(shù)              
  268. 函數(shù)原型:     void   SendByte(uchar Dat);
  269. 功能:      將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對(duì)
  270.            此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0)
  271.            ack=1        發(fā)送數(shù)據(jù)正常,
  272.            ack=0        被控器無(wú)應(yīng)答或損壞。
  273. ********************************************************************/
  274. void SendByte(uchar Dat)
  275. {
  276. uchar BitCnt;

  277.     for(BitCnt=0;BitCnt<8;BitCnt++)         //要傳送的數(shù)據(jù)長(zhǎng)度為8位
  278.     {
  279.         if((Dat<<BitCnt)&0x80)
  280.             SDA=1;                          //判斷發(fā)送位
  281.         else
  282.             SDA=0;              
  283.           delay(1);
  284.          SCL=1;                            //置時(shí)鐘線為高,通知被控器開(kāi)始接收數(shù)據(jù)位
  285.           delay(5);                       //保證時(shí)鐘高電平周期大于4μs  
  286.           SCL=0;
  287.     }

  288.     delay(2);
  289.     SDA=1;                                  //8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位
  290.     delay(2);
  291.     SCL=1;
  292.    delay(3);
  293.     if(SDA==1)
  294.         ack=0;   
  295.     else
  296.         ack=1;                              //判斷是否接收到應(yīng)答信號(hào)
  297.     SCL=0;
  298.     delay(2);
  299. }

  300. uchar RcvByte()                                                                                                                              // 功能:      用來(lái)接收從器件傳來(lái)的數(shù)據(jù),并判斷總線錯(cuò)誤(不發(fā)應(yīng)答信號(hào)),發(fā)完后請(qǐng)用應(yīng)答函數(shù)應(yīng)答從機(jī)。
  301. {
  302. uchar retc;
  303. uchar BitCnt;

  304.    retc=0;
  305.    SDA=1;                           //置數(shù)據(jù)線為輸入方式
  306.    for(BitCnt=0;BitCnt<8;BitCnt++)
  307.    {
  308.         delay(1);
  309.         SCL=0;                      //置時(shí)鐘線為低,準(zhǔn)備接收數(shù)據(jù)位

  310.         delay(5);                 //時(shí)鐘低電平周期大于4.7μs

  311.         SCL=1;                      //置時(shí)鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
  312.         delay(3);
  313.         retc=retc<<1;
  314.         if(SDA==1)
  315.             retc=retc+1;            //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中
  316.         delay(2);
  317.    }
  318.    SCL=0;
  319.    delay(2);
  320.    return(retc);
  321. }

  322. void I2CACK(bit a)                                          // 功能:       主控器進(jìn)行應(yīng)答信號(hào)(可以是應(yīng)答或非應(yīng)答信號(hào),由位參數(shù)a決定)
  323. {

  324.     if(a==0)
  325.         SDA=0;              //在此發(fā)出應(yīng)答或非應(yīng)答信號(hào)
  326.     else
  327.         SDA=1;
  328.     delay(3);   
  329.     SCL=1;

  330.     delay(5);             //時(shí)鐘低電平周期大于4μs

  331.     SCL=0;                  //清時(shí)鐘線,鉗住I2C總線以便繼續(xù)接收
  332.     delay(2);  
  333. }



  334. uchar I2CRead()                                                                                                                              /************從DS3231當(dāng)前地址讀一個(gè)字節(jié)************/
  335. {
  336. uchar read_data;
  337.               Start();
  338.     SendByte(ADDRTD);                                                                     
  339.     if(ack==0)
  340.     {
  341.   return(0);
  342.     }
  343.     read_data = RcvByte();
  344.     I2CACK(1);
  345.     Stop();
  346.     return read_data;
  347. }


  348. uchar I2CReadAdd(uchar addr)                                                                                    /************從DS3231指定地址讀一個(gè)字節(jié)************/
  349.               {
  350.                   Start();
  351.                   SendByte(ADDRTW);                                         
  352.                   if(ack==0)
  353.                   {            
  354.                 return(0);
  355.                   }
  356.                   SendByte(addr);
  357.                   if(ack==0)
  358.                   {            
  359.                 return(0);
  360.                   }
  361.                   return(I2CRead());
  362.               }
  363. void Readtime()                                                                                                                                            /*********************讀取時(shí)間**********************/
  364.               {
  365.               uchar temp;
  366.               temp=I2CReadAdd(DS3231_SEC);//秒
  367.               sec=BCD2HEX(temp);
  368.             
  369.               temp=I2CReadAdd(DS3231_MIN);//分
  370.               min=BCD2HEX(temp);
  371.             
  372.               temp=I2CReadAdd(DS3231_HOUR);  //時(shí)                 
  373.               hour=BCD2HEX(temp);
  374.             
  375.               temp=I2CReadAdd(DS3231_DATE);  //日
  376.               date=BCD2HEX(temp);
  377.             
  378.               temp=I2CReadAdd(DS3231_MONTH); //月
  379.               month=BCD2HEX(temp);
  380.             
  381.               temp=I2CReadAdd(DS3231_YEAR);  //年
  382.               year=BCD2HEX(temp);
  383.               }

  384. void InitDS3231()                                                                                                                                                                        //ds3231初始化
  385.               {SCL=1;
  386.               delay(5);
  387.               SDA=1;
  388.               delay(5);

  389.               }
  390. void TimeDisplay(uchar Dhour,uchar Dmin,uchar Dsec)                                                        //時(shí)分秒數(shù)組賦值            
  391.               {              b[0]=numbr[Dhour / 10];        // 時(shí)十位
  392.                   b[1]=numbr[Dhour % 10];        // 時(shí)個(gè)位
  393.                   b[4]=numbr[Dmin / 10];         // 分十位
  394.                   b[5]=numbr[Dmin % 10];         // 分個(gè)位
  395.                   b[8]=numbr[Dsec / 10];         // 秒十位
  396.                   b[9]=numbr[Dsec % 10];         // 秒個(gè)位
  397.               }
  398. void DateDisplay(uchar Dyear,uchar Dmonth,uchar Dday)                                          //年月天數(shù)組賦值               
  399.               {              a[2]=numbr[Dyear / 10];        // 年十位
  400.                   a[3]=numbr[Dyear % 10];        // 年個(gè)位
  401.                   a[6]=numbr[Dmonth / 10];       // 月十位
  402.                   a[7]=numbr[Dmonth % 10];       // 月個(gè)位
  403.                   a[10]=numbr[Dday / 10];         // 天十位
  404.                   a[11]=numbr[Dday % 10];         // 天個(gè)位                                                         
  405.               }

  406. void Start_I2C()
  407. {
  408.     SDA=1;                  //發(fā)送起始條件的數(shù)據(jù)信號(hào)
  409.     delay(1);
  410.     SCL=1;
  411.     delay(5);             //起始條件建立時(shí)間大于4.7us,延時(shí)

  412.     SDA=0;                  //發(fā)送起始信號(hào)
  413.     delay(5);             // 起始條件鎖定時(shí)間大于4μs

  414.     SCL=0;                  //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
  415.     delay(2);
  416. }

  417. void Stop_I2C()
  418. {
  419.     SDA=0;                  //發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)
  420.     delay(1);             //發(fā)送結(jié)束條件的時(shí)鐘信號(hào)
  421.     SCL=1;                  //結(jié)束條件建立時(shí)間大于4us
  422.     delay(5);

  423.     SDA=1;                  //發(fā)送I2C總線結(jié)束信號(hào)
  424.     delay(4);
  425. }

  426. uchar write_byte(uchar addr, uchar write_data)
  427. {
  428.     Start_I2C();
  429.     SendByte(ADDRTW);                            //////*******************************************************************///////////
  430.     if (ack == 0)
  431.         return 0;

  432.     SendByte(addr);  
  433.     if (ack == 0)
  434.         return 0;

  435.     SendByte(write_data);
  436.     if (ack == 0)
  437.         return 0;

  438.     Stop_I2C();
  439.      delay1ms(10);     
  440.     return 1;
  441. }

  442. void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec)
  443. {                uchar temp=0;

  444.     temp=HEX2BCD(yea);
  445.     write_byte(DS3231_YEAR,temp);   //修改年

  446.     temp=HEX2BCD(mon);
  447.     write_byte(DS3231_MONTH,temp);  //修改月

  448.     temp=HEX2BCD(da);                                                                                                                                 /////////////////////
  449.     write_byte(DS3231_DATE,temp);    //修改日

  450.     temp=HEX2BCD(hou);
  451.     write_byte(DS3231_HOUR,temp);   //修改時(shí)

  452.     temp=HEX2BCD(min);
  453.     write_byte(DS3231_MIN,temp); //修改分

  454.     temp=HEX2BCD(sec);
  455.     write_byte(DS3231_SEC,temp); //修改秒
  456. }





  457. void xianshi(void)
  458.    {

  459.                                           { uint i;
  460.                            
  461.                                          
  462.                             TimeDisplay(hour,min,sec);                                                                                                                                          
  463.                                                         lcd_pos(1,1);                                             //時(shí)間
  464.                                                         i=0;
  465.                                                         while(b[i]!='\0')
  466.                                                                       {
  467.                                                                       delay1ms(1);
  468.                                                                       write_dat(b[i]);
  469.                                                                       delay1ms(1);
  470.                                                                       i++;
  471.                                                                       }
  472.                            
  473.                                                         DateDisplay(year,month,date);              //顯示日期                                                                                                                                                                                                                                                           
  474.                                                         delay1ms(1);
  475.                                                         lcd_pos(0,0);
  476.                                                         i=0;
  477.                                                         while(a[i]!='\0')
  478.                                                                       {
  479.                                                                       delay1ms(1);
  480.                                                                       write_dat(a[i]);
  481.                                                                       delay1ms(1);
  482.                                                                       i++;
  483.                                                                       }
  484.                                                         ReadTemperature();                                                                                                  //顯示溫度
  485.                                                         delay1ms(1);
  486.                                                         lcd_pos(2,1);
  487.                                                         delay1ms(1);
  488.                                                         i=0;
  489.                                                         while(t[i]!='\0')
  490.                                                                                     {
  491.                                                                                     delay1ms(1);
  492.                                                                                     write_dat(t[i]);
  493.                                                                                     delay1ms(2);
  494.                                                                                     i++;
  495.                                                                                     }
  496.                                           }
  497. }

  498. void shuaxin(void)
  499.               {                            uint i;
  500.                             TimeDisplay(hour,min,sec);                                                                                                                                          
  501.                                                         lcd_pos(1,1);                                             //時(shí)間
  502.                                                         i=0;
  503.                                                         while(b[i]!='\0')
  504.                                                                       {
  505.                                                                       delay1ms(1);
  506.                                                                       write_dat(b[i]);
  507.                                                                       delay1ms(1);
  508.                                                                       i++;
  509.                                                                       }
  510.                            
  511.                                                         DateDisplay(year,month,date);              //顯示日期                                                                                                                                                                                                                                                           
  512.                                                         delay1ms(1);
  513.                                                         lcd_pos(0,0);
  514.                                                         i=0;
  515.                                                         while(a[i]!='\0')
  516.                                                                       {
  517.                                                                       delay1ms(1);
  518.                                                                       write_dat(a[i]);
  519.                                                                       delay1ms(1);
  520.                                                                       i++;
  521.                                                                       }
  522.               }



  523. void sotp(void)                                                                                                                                                                                    
  524. {
  525.               uint i;                                          
  526.             
  527. while(1)
  528.               {
  529.               duan1:                            if(K1==0)
  530.                                           {
  531.                                           delay1ms(100);
  532.                                           if(K1==0)
  533.                                                         {
  534.                                                         Readtime();
  535.                                                         shuaxin();
  536.                                                         i=0;
  537.                                           goto duan2;
  538.                                                       
  539.                                                         }
  540.                                           }
  541.                                           else
  542.                                           {goto duan5;}

  543.               duan2:                            if(K2==0)
  544.                                           {
  545.                                                         delay1ms(100);
  546.                                                         if(K2==0)
  547.                                                         {
  548.                                                         i++;
  549.                                                         if(i>6){i=0;}
  550.                                                         shuaxin();
  551.                                                         }            
  552.                                           }
  553.                                           switch(i)
  554.                                           {
  555.                                                         case 0:   if(K3==0){delay1ms(100);if(K3==0){year=year+1;}                            if(year>=100){year=0;}                                                                                                  shuaxin();} break;
  556.                                                         case 1:   if(K3==0){delay1ms(100);if(K3==0){month=month+1;}              if(month>=13){month=0;}                                                                                                  shuaxin();} break;
  557.                                                         case 2:   if(K3==0){delay1ms(100);if(K3==0){date=date+1;}                            if(date>=32){date=0;}                                                                                                  shuaxin();} break;
  558.                                                         case 3:   if(K3==0){delay1ms(100);if(K3==0){hour=hour+1;}                            if(hour>=25){hour=0;}                                                                                                  shuaxin();} break;
  559.                                                         case 4:   if(K3==0){delay1ms(100);if(K3==0){min=min+1;}                              if(min>=61){min=0;}                                                                                                                   shuaxin();} break;
  560.                                                         case 5:   if(K3==0){delay1ms(100);if(K3==0){sec=sec+1;}                             if(sec>=61){sec=0;}                                                                                                                  shuaxin();} break;
  561.                                           }


  562.               duan4:                            if(K4==0)
  563.                                           {
  564.                                           delay1ms(100);
  565.                                           if(K4==0)
  566.                                           {
  567.                                           ModifyTime(year,month,date,hour,min,sec);
  568.                                           goto duan5;                                                    ///////////////////*******************//////////
  569.                                           }            
  570.                             }
  571.             
  572.                                             else
  573.                                           {goto duan2;}
  574.             
  575.             
  576.             
  577.             

  578.                

  579. duan5:              Readtime();
  580.                             xianshi();
  581.                             }
  582.                            
  583.               }
  584.                



  585. main()                                                                        /*主程序*/
  586. {
  587.             
  588.             
  589.               lcd_init();
  590.               delay1ms(5);
  591.               InitDS3231();
  592.               delay1ms(5);
  593.               delay1ms(5);
  594.               sotp();            
  595. }
復(fù)制代碼

以上的Word格式文檔51黑下載地址:
ds3231,51例程.7z (2.83 MB, 下載次數(shù): 94)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:463339 發(fā)表于 2019-8-21 00:40 | 只看該作者
樓主您好,請(qǐng)問(wèn)您這個(gè)作品,有上電實(shí)時(shí)顯示時(shí)間(跟著當(dāng)前時(shí)間走,不會(huì)重新刷新時(shí)間)功能嗎?
回復(fù)

使用道具 舉報(bào)

板凳
ID:71883 發(fā)表于 2019-8-22 12:16 | 只看該作者
樓主程序太復(fù)雜有空試試
回復(fù)

使用道具 舉報(bào)

地板
ID:471297 發(fā)表于 2021-1-18 23:55 | 只看該作者
能加上星期和農(nóng)歷就完美了
回復(fù)

使用道具 舉報(bào)

5#
ID:390416 發(fā)表于 2021-1-19 01:09 | 只看該作者
用我這個(gè)貼子的代碼 更好  http://www.torrancerestoration.com/bbs/dpj-200966-1.html
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表