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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機(jī)DS3231數(shù)碼管電子鐘制作

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
   在開發(fā)板移植STC98C52+兩塊74HC573用DS1320驅(qū)動碼數(shù)管電子鐘,用洞洞做, 玩過DS1302鐘知道,DS1302要精度很高晶振,但是受外界溫度影響還是有很大誤差。網(wǎng)上很難找到用DS3231數(shù)碼管電子鐘例子,以前我在淘寶購DS3231模板一直在空,總想找源植入改變DS1320驅(qū)動碼數(shù)管電子鐘,現(xiàn)在終于找到了,STC98C52+74HC573+74HC138或STC98C52+74HC245+74HC138驅(qū)動數(shù)碼管,數(shù)碼管顯示很好、方便,象DS3231這樣精準(zhǔn)不必要加什么樣GPS或紅外了。改一下STC98C52+兩塊74HC573用DS1320驅(qū)動數(shù)碼管電子鐘,把DS1320移掉,兩塊74HC573,留一換一,試一下,成功顯示了。

制作出來的實(shí)物圖如下:


單片機(jī)源程序如下:
  1. #include <STC89C5xRC.H>
  2. #include <intrins.h>
  3. #define uchar   unsigned char  
  4. #define uint    unsigned int
  5. sbit SDA=P3^7;     //DS3231模擬I2C數(shù)據(jù)傳送位SDA        
  6. sbit SCL=P3^6;     //DS3231模擬I2C時鐘控制位SCL     

  7. sbit key1=P1^0;                //設(shè)置鍵
  8. sbit key4=P3^1;                //鬧鐘設(shè)置
  9. sbit key2=P1^4;                //加加
  10. sbit key3=P1^7;                //減減   
  11. sbit SPK=P2^0;               //蜂鳴器

  12. sbit IA=P2^7;//行控制線A                   //138  
  13. sbit IB=P2^6;//行控制線B
  14. sbit IC=P2^5;//行控制線C

  15. bit  ack;          //應(yīng)答標(biāo)志位

  16. #define DS3231_WriteAddress 0xD0    //器件寫地址
  17. #define DS3231_ReadAddress  0xD1    //器件讀地址
  18. #define DS3231_SECOND       0x00    //秒
  19. #define DS3231_MINUTE       0x01    //分
  20. #define DS3231_HOUR         0x02    //時
  21. #define DS3231_WEEK         0x03    //星期
  22. #define DS3231_DAY          0x04    //日
  23. #define DS3231_MONTH        0x05    //月
  24. #define DS3231_YEAR         0x06    //年
  25. //鬧鈴1            
  26. #define DS3231_SALARM1ECOND 0x07    //秒
  27. #define DS3231_ALARM1MINUTE 0x08    //分
  28. #define DS3231_ALARM1HOUR   0x09    //時
  29. #define DS3231_ALARM1WEEK   0x0A    //星期/日
  30. //鬧鈴2
  31. #define DS3231_ALARM2MINUTE 0x0b    //分
  32. #define DS3231_ALARM2HOUR   0x0c    //時
  33. #define DS3231_ALARM2WEEK   0x0d    //星期/日
  34. #define DS3231_CONTROL      0x0e    //控制寄存器
  35. #define DS3231_STATUS       0x0f    //狀態(tài)寄存器
  36. #define BSY                 2       //忙
  37. #define OSF                 7       //振蕩器停止標(biāo)志
  38. #define DS3231_XTAL         0x10    //晶體老化寄存器
  39. #define DS3231_TEMPERATUREH 0x11    //溫度寄存器高字節(jié)(8位)
  40. #define DS3231_TEMPERATUREL 0x12    //溫度寄存器低字節(jié)(高2位)  



  41. uchar code dis_code[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};         //時間
  42. uchar data dis_buf[8];
  43. uchar data dis_digit;
  44. uchar line;
  45. uchar wss,key1n,key2n,key3n,tcont,miao,miao1;
  46. uchar temp,sec,min,hou,da,mon,yea,wee,alhou,almin;
  47.                  //秒  分  時  日 月  年  星期 鬧時  鬧分

  48. void scan(uchar Value)
  49. {
  50.    switch(Value)
  51.     {
  52.            case  0: IA=0;IB=0;IC=0;break;
  53.            case  1: IA=1;IB=0;IC=0;break;
  54.            case  2: IA=0;IB=1;IC=0;break;
  55.            case  3: IA=1;IB=1;IC=0;break;
  56.        case  4: IA=0;IB=0;IC=1;break;
  57.            case  5: IA=1;IB=0;IC=1;break;
  58.            case  6: IA=0;IB=1;IC=1;break;
  59.            case  7: IA=1;IB=1;IC=1;break;
  60.         //   break;
  61.     }
  62. }

  63. uchar BCD2HEX(uchar val)    //BCD轉(zhuǎn)換為Byte
  64. {
  65.    return    ((val>>4)*10)+(val&0x0f);
  66. }

  67. uchar HEX2BCD(uchar val)    //B碼轉(zhuǎn)換為BCD碼
  68. {
  69.    return  (((val%100)/10)<<4)|(val%10);
  70. }

  71. void delayus(uint us)
  72. {
  73.     while (--us);
  74. }

  75. void Start_I2C()
  76. {
  77.     SDA=1;                  //發(fā)送起始條件的數(shù)據(jù)信號
  78.     delayus(4);
  79.     SCL=1;
  80.     delayus(4);             //起始條件建立時間大于4.7us,延時
  81.    
  82.     SDA=0;                  //發(fā)送起始信號
  83.     delayus(4);             // 起始條件鎖定時間大于4μs
  84.       
  85.     SCL=0;                  //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
  86.     delayus(4);
  87. }

  88. void Stop_I2C()
  89. {
  90.     SDA=0;                  //發(fā)送結(jié)束條件的數(shù)據(jù)信號
  91.     delayus(4);             //發(fā)送結(jié)束條件的時鐘信號
  92.     SCL=1;                  //結(jié)束條件建立時間大于4us
  93.     delayus(4);
  94.    
  95.     SDA=1;                  //發(fā)送I2C總線結(jié)束信號
  96.     delayus(4);
  97. }

  98. void SendByte(uchar c)
  99. {
  100.     uchar BitCnt;
  101.    
  102.     for(BitCnt=0;BitCnt<8;BitCnt++)         //要傳送的數(shù)據(jù)長度為8位
  103.     {
  104.         if((c<<BitCnt)&0x80)
  105.           SDA=1;                          //判斷發(fā)送位
  106.         else
  107.           SDA=0;               
  108.           delayus(4);
  109.           SCL=1;                            //置時鐘線為高,通知被控器開始接收數(shù)據(jù)位
  110.           delayus(4);                       //保證時鐘高電平周期大于4μs   
  111.           SCL=0;
  112.     }
  113.    
  114.     delayus(4);
  115.     SDA=1;                                  //8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位
  116.     delayus(4);  
  117.     SCL=1;
  118.     delayus(4);
  119.     if(SDA==1)
  120.         ack=0;   
  121.     else
  122.         ack=1;                              //判斷是否接收到應(yīng)答信號
  123.     SCL=0;
  124.     delayus(4);
  125. }

  126. uchar RcvByte()
  127. {
  128.    uchar retc;
  129.    uchar BitCnt;

  130.    retc=0;
  131.    SDA=1;                           //置數(shù)據(jù)線為輸入方式
  132.    for(BitCnt=0;BitCnt<8;BitCnt++)
  133.    {
  134.         delayus(4);  
  135.         SCL=0;                      //置時鐘線為低,準(zhǔn)備接收數(shù)據(jù)位
  136.       
  137.         delayus(4);                 //時鐘低電平周期大于4.7μs
  138.       
  139.         SCL=1;                      //置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
  140.         delayus(4);
  141.         retc=retc<<1;
  142.         if(SDA==1)
  143.             retc=retc+1;            //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中
  144.         delayus(4);
  145.    }
  146.    SCL=0;
  147.    delayus(4);
  148.    return(retc);
  149. }


  150. void Ack_I2C(bit a)
  151. {

  152.     if(a==0)
  153.         SDA=0;              //在此發(fā)出應(yīng)答或非應(yīng)答信號
  154.     else
  155.         SDA=1;
  156.     delayus(4);     
  157.     SCL=1;
  158.    
  159.     delayus(4);             //時鐘低電平周期大于4μs
  160.    
  161.     SCL=0;                  //清時鐘線,鉗住I2C總線以便繼續(xù)接收
  162.     delayus(4);   
  163. }


  164. uchar write_byte(uchar addr, uchar write_data)
  165. {
  166.     Start_I2C();
  167.     SendByte(DS3231_WriteAddress);
  168.     if (ack == 0)
  169.         return 0;
  170.    
  171.     SendByte(addr);   
  172.     if (ack == 0)
  173.         return 0;
  174.    
  175.     SendByte(write_data);
  176.     if (ack == 0)
  177.         return 0;
  178.    
  179.     Stop_I2C();
  180.     delayus(4);      
  181.     return 1;
  182. }


  183. uchar read_current()
  184. {
  185.     uchar read_data;
  186.     Start_I2C();
  187.     SendByte(DS3231_ReadAddress);
  188.     if(ack==0)
  189.         return(0);
  190.    
  191.     read_data = RcvByte();
  192.     Ack_I2C(1);
  193.     Stop_I2C();
  194.     return read_data;
  195. }


  196. uchar read_random(uchar random_addr)
  197. {
  198.     Start_I2C();
  199.     SendByte(DS3231_WriteAddress);
  200.     if(ack==0)
  201.         return(0);
  202.    
  203.     SendByte(random_addr);
  204.     if(ack==0)
  205.         return(0);
  206.    
  207.     return(read_current());
  208. }


  209. void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec,uchar wee)
  210. {
  211.     uchar temp=0;
  212.    
  213.     temp=HEX2BCD(yea);
  214.     write_byte(DS3231_YEAR,temp);   //修改年          
  215.    
  216.     temp=HEX2BCD(mon);
  217.     write_byte(DS3231_MONTH,temp);  //修改月
  218.    
  219.     temp=HEX2BCD(da);
  220.     write_byte(DS3231_DAY,temp);    //修改日
  221.    
  222.     temp=HEX2BCD(hou);
  223.     write_byte(DS3231_HOUR,temp);   //修改時
  224.    
  225.     temp=HEX2BCD(min);
  226.     write_byte(DS3231_MINUTE,temp); //修改分
  227.    
  228.     temp=HEX2BCD(sec);
  229.     write_byte(DS3231_SECOND,temp); //修改秒

  230.         temp=HEX2BCD(wee);
  231.         write_byte(DS3231_WEEK,temp);   //修星期
  232. }

  233. void SetAlarm(uchar alhou,uchar almin)//修改鬧鐘1
  234. {
  235.         uchar temp = 0;
  236.        
  237. //        temp = HEX2BCD(da);
  238. //        write_byte(DS3231_AL1DAY,temp);                   //修改日
  239.        
  240.         temp = HEX2BCD(alhou);
  241.         write_byte(DS3231_ALARM1HOUR,temp);                   //修改時       
  242.        
  243.         temp = HEX2BCD(almin);
  244.         write_byte(DS3231_ALARM1MINUTE,temp);                 //修改分
  245. }

  246. /*void SetA2arm(uchar da,uchar hour,uchar min)//修改鬧鐘2
  247. {
  248.         uchar temp = 0;
  249.         temp = HEX2BCD(da);
  250.         write_byte(DS3231_AL2DAY,temp);                   //修改日
  251.        
  252.         temp = HEX2BCD(hour);
  253.         write_byte(DS3231_AL2HOUR,temp);                   //修改時
  254.        
  255.         temp = HEX2BCD(min);
  256.         write_byte(DS3231_AL2MIN,temp);                 //修改分
  257. }*/

  258. void TimeDisplay(uchar Dhour,uchar Dmin,uchar Dsec)           //時間
  259. {
  260.         if(key2n==2&wss==0)                                                        //調(diào)時閃爍
  261.           {
  262.        dis_buf[7]=dis_buf[6]=0;
  263.           }
  264.         else
  265.          {
  266.            dis_buf[7]=dis_code[Dhour / 10];        // 時十位
  267.        dis_buf[6]=dis_code[Dhour % 10];        // 時個位
  268.          }
  269.         if(key2n==1&wss==0)                                                   //調(diào)分閃爍
  270.           {
  271.              dis_buf[4]=dis_buf[3]= 0;                 
  272.           }
  273.         else
  274.           {
  275.         dis_buf[4]=dis_code[Dmin / 10];         // 分十位
  276.         dis_buf[3]=dis_code[Dmin % 10];         // 分個位
  277.           }
  278.     dis_buf[1]=dis_code[Dsec / 10];             // 秒十位
  279.     dis_buf[0]=dis_code[Dsec % 10];             // 秒個位
  280.     dis_buf[2]=dis_buf[5]=0x40;                 // 顯示"-"   
  281. }



  282. void DateDisplay(uchar Dyear,uchar Dmonth,uchar Dday)        //日期
  283. {
  284.         if(key2n==5&wss==0)                                                    //調(diào)年閃爍
  285.           {
  286.                  dis_buf[7]=dis_buf[6]=0;
  287.           }
  288.         else
  289.           {
  290.          dis_buf[7]=dis_code[Dyear / 10];        // 年十位
  291.          dis_buf[6]=dis_code[Dyear % 10];        // 年個位
  292.           }

  293.         if(key2n==4&wss==0)                                                         //調(diào)月閃爍
  294.           {
  295.                  dis_buf[4]=dis_buf[3]=0;
  296.           }
  297.         else
  298.           {
  299.          dis_buf[4]=dis_code[Dmonth / 10];       // 月十位
  300.          dis_buf[3]=dis_code[Dmonth % 10];       // 月個位
  301.           }

  302.         if(key2n==3&wss==0)                                                         //調(diào)天閃爍
  303.           {
  304.                  dis_buf[1]=dis_buf[0]=0;
  305.           }
  306.         else
  307.           {
  308.          dis_buf[1]=dis_code[Dday / 10];         // 天十位
  309.          dis_buf[0]=dis_code[Dday % 10];         // 天個位
  310.           }

  311.     dis_buf[2]=dis_buf[5]=0;                     // 顯示" "
  312. }

  313. void TimeDisplay1(uchar xin,uchar T1,uchar T2,uchar T3)         //星期,溫度
  314. {
  315.         if(key2n==6&wss==0)                 //調(diào)星期閃爍
  316.           {
  317.                  dis_buf[6]=0;                //星期
  318.           }
  319.         else
  320.           {
  321.                  dis_buf[6]=dis_code[xin %10];    //星期
  322.           }
  323.             
  324.     dis_buf[3]=dis_code[T1 % 11];         //溫度十位
  325.     dis_buf[2]=dis_code[T2 / 11] | 0x80;  //溫度個位帶點(diǎn)
  326.     dis_buf[1]=dis_code[T3 % 11];         //小數(shù)位
  327.     dis_buf[0]=0x58;                                           //顯示c
  328.     dis_buf[5]=dis_buf[7]=0x40;           //顯示"-"
  329.     dis_buf[4]=0;
  330. }

  331. void displayAL(uchar alhou,uchar almin)        //顯示鬧鐘1
  332. {
  333.            dis_buf[7]=0x77;        //顯示A
  334.        dis_buf[6]=0x38;        //顯示L

  335.         if(key3n==2&wss==0)                                                   //調(diào)時閃爍
  336.           {
  337.              dis_buf[4]=dis_buf[3]= 0;                 
  338.           }
  339.         else
  340.           {
  341.          dis_buf[4]=dis_code[alhou / 10];         // 時十位
  342.          dis_buf[3]=dis_code[alhou % 10];         // 時個位
  343.           }
  344.         if(key3n==1&wss==0)
  345.           {
  346.                  dis_buf[1]=dis_buf[0]=0;                                 //調(diào)分閃爍
  347.           }
  348.         else
  349.           {
  350.          dis_buf[1]=dis_code[almin / 10];             // 分十位
  351.          dis_buf[0]=dis_code[almin % 10];             // 分個位
  352.           }
  353.     dis_buf[2]=0x40;                    // 顯示"-"
  354.         dis_buf[5]=0x01;                          // 顯示"-"
  355. }

  356. /*void displayAL(uchar A,B)        //顯示鬧鐘2
  357. {
  358.         smg[0] = 16;                    // 顯示"A" 鬧鐘
  359.         smg[1] = 17;                    // 顯示"L" 鬧鐘
  360.         smg[3] = sz[0]/10;            //“時“
  361.         smg[4] = sz[0]%10;           //“時“
  362.         smg[6] = sz[1]/10;           //“分“
  363.         smg[7] = sz[1]%10;           //“分“
  364.         sz[0] = A;
  365.         sz[1] = B;
  366.         smg[2] = 10;                      // 顯示"-"
  367.         smg[5] = 10;                           // 顯示"-"
  368. }*/

  369. void get_show_time(void)                                  //時間顯示
  370. {
  371.     uchar Htemp1,Htemp2,Mtemp1,Mtemp2,Stemp1,Stemp2;

  372.     Htemp1=read_random(DS3231_HOUR);    //時 24小時制
  373.     Htemp1&=0x3f;                  
  374.     Htemp2=BCD2HEX(Htemp1);
  375.    
  376.     Mtemp1=read_random(DS3231_MINUTE);  //分
  377.     Mtemp2=BCD2HEX(Mtemp1);
  378.    
  379.     Stemp1=read_random(DS3231_SECOND);  //秒
  380.     Stemp2=BCD2HEX(Stemp1);
  381.    
  382.     TimeDisplay(Htemp2,Mtemp2,Stemp2);        //時間顯示函數(shù)
  383. }


  384. void get_show_date(void)                                        //日期顯示
  385. {
  386.     uchar Ytemp1,Ytemp2,Mtemp1,Mtemp2,Dtemp1,Dtemp2;
  387.    
  388.     Ytemp1=read_random(DS3231_YEAR);        //年
  389.     Ytemp2=BCD2HEX(Ytemp1);
  390.    
  391.     Mtemp1=read_random(DS3231_MONTH);       //月
  392.     Mtemp2=BCD2HEX(Mtemp1);
  393.    
  394.     Dtemp1=read_random(DS3231_DAY);         //日
  395.     Dtemp2=BCD2HEX(Dtemp1);
  396.    
  397.     DateDisplay(Ytemp2,Mtemp2,Dtemp2);               //日期顯示函數(shù)
  398. }



  399. void get_show_Temperature(void)                                   //溫度顯示
  400. {
  401.     uchar G,G1,Ttemp1,Ttemp2,Ttemp3,Ttemp4;
  402.    
  403.     Ttemp1=read_random(DS3231_TEMPERATUREH);    //溫度 高字節(jié)
  404.     Ttemp2=BCD2HEX(Ttemp1);
  405.    
  406.     Ttemp3=read_random(DS3231_TEMPERATUREL);    //溫度低字節(jié)
  407.     Ttemp4=BCD2HEX(Ttemp3);

  408.         G = read_random(DS3231_WEEK);                        //星期;
  409.         G1=BCD2HEX(G);

  410.         TimeDisplay1(G1,Ttemp2,Ttemp4);                    //星期 溫度顯示函數(shù)
  411. }

  412. /*******************讀取鬧鈴1時間********************/
  413. void ReadAlarm()
  414. {
  415.         uchar A,A1,B,B1;
  416.         A = read_random(DS3231_ALARM1HOUR);          //時
  417.         A1 = BCD2HEX(A);

  418.         B = read_random(DS3231_ALARM1MINUTE);                //分
  419.         B1 = BCD2HEX(B);
  420. //        temp = read_random(DS3231_AL1DAY);          //星期or日
  421. //        A = BCD2HEX(temp);
  422.         displayAL(A1,B1);                                                         //送顯示
  423. }
  424. /***************讀取鬧鈴2時間***************/
  425. /*void ReadA2arm()
  426. {
  427.         uchar temp,A2,B2,C2;
  428.         temp = read_random(DS3231_AL2MIN);                //分
  429.         C2 = BCD2HEX(temp);
  430.         temp = read_random(DS3231_AL2HOUR);          //時
  431.         B2 = BCD2HEX(temp);
  432.         temp = read_random(DS3231_AL2DAY);          //星期or日
  433.         A2 = BCD2HEX(temp);
  434.         display(A2,B2,C2);                                                //送顯示
  435. }*/

  436. void didi(void)                   //按鍵發(fā)音
  437. {
  438.          SPK=1;
  439.          delayus(5000);
  440.          SPK=0;
  441. }

  442. void didial(void)                   //按鍵發(fā)音
  443. {
  444.          SPK=1;
  445.          delayus(2000);
  446.          SPK=0;
  447. }

  448. void keyal1(void)                     //查看鬧鐘
  449. {
  450. //        if(key2==0)                     //查看鬧鐘1
  451. //          {
  452. //                 zz=0;
  453. //          }

  454. /*        if(key3==0)                     //查看鬧鐘2
  455.           {
  456.                   ReadAlarm();
  457.           }*/
  458. }

  459. void key()                  //調(diào)時間函數(shù)
  460. {
  461.         if(key1==0)
  462.           {
  463.                  delayus(500);
  464.                  if(key1==0)
  465.                    {
  466.                       didi();
  467.                           key3n=0;
  468.                           while(!key1);
  469.                           key2n++;                  
  470.                           if(key2n==7)
  471.                            {
  472.                                   key2n=0;
  473.                                   key1n=0;
  474.                                   miao1=0;
  475.                            }
  476.                          if(key2n==1)           //調(diào)時間顯示時間
  477.                            {
  478.                                   key1n=0;
  479.                            }
  480.                          if(key2n==3)           //調(diào)日期顯示日期
  481.                            {
  482.                                   key1n=6;
  483.                            }
  484.                          if(key2n==6)           //調(diào)星期顯示星期
  485.                            {
  486.                                   key1n=7;
  487.                            }
  488.                    }
  489.           }

  490.          if((key2n==1)&key2==0)                  //分加加
  491.           {
  492.                   delayus(500);
  493.                   if(key2==0)
  494.                    {
  495.                          didi();
  496.                          while(!key2);
  497.                          min++;
  498.                          if(min==60)min=00;
  499.              temp=HEX2BCD(min);
  500.              write_byte(DS3231_MINUTE,temp); //修改分
  501.                    }
  502.           }       

  503.          if((key2n==1)&key3==0)                  //分減減
  504.           {
  505.                   delayus(500);
  506.                   if(key3==0)
  507.                    {
  508.                          didi();
  509.                          while(!key3);
  510.                          min--;
  511.                          if(min==-1)min=59;
  512.              temp=HEX2BCD(min);
  513.              write_byte(DS3231_MINUTE,temp); //修改分
  514.                    }
  515.           }

  516.         if((key2n==2)&key2==0)                  //時加加
  517.           {
  518.                   delayus(500);
  519.                   if(key2==0)
  520.                    {
  521.                          didi();
  522.                          while(!key2);
  523.                          hou++;
  524.                          if(hou==24)hou=00;
  525.              temp=HEX2BCD(hou);
  526.              write_byte(DS3231_HOUR,temp);   //修改時
  527.                    }
  528.           }       

  529.          if((key2n==2)&key3==0)                  //時減減
  530.           {
  531.                   delayus(500);
  532.                   if(key3==0)
  533.                    {
  534.                          didi();
  535.                          while(!key3);
  536.                          hou--;
  537.                          if(hou==-1)hou=23;
  538.              temp=HEX2BCD(hou);
  539.              write_byte(DS3231_HOUR,temp);   //修改時
  540.                    }
  541.           }  
  542.                  
  543.         if((key2n==3)&key2==0)                  //日加加
  544.           {
  545.                   delayus(500);
  546.                   if(key2==0)
  547.                    {
  548.                          didi();
  549.                          while(!key2);
  550.                          da++;
  551.                          if(da==32)da=01;
  552.              temp=HEX2BCD(da);
  553.              write_byte(DS3231_DAY,temp);    //修改日
  554.                    }
  555.           }       

  556.          if((key2n==3)&key3==0)                  //日減減
  557.           {
  558.                   delayus(500);
  559.                   if(key3==0)
  560.                    {
  561.                          didi();
  562.                          while(!key3);
  563.                          da--;
  564.                          if(da==-1)da=31;
  565.              temp=HEX2BCD(da);
  566.              write_byte(DS3231_DAY,temp);    //修改日
  567.                    }
  568.           }       
  569.           
  570.         if((key2n==4)&key2==0)                  //月加加
  571.           {
  572.                   delayus(500);
  573.                   if(key2==0)
  574.                    {
  575.                          didi();
  576.                          while(!key2);
  577.                          mon++;
  578.                          if(mon==13)mon=1;
  579.              temp=HEX2BCD(mon);
  580.              write_byte(DS3231_MONTH,temp);  //修改月
  581.                    }
  582.           }       

  583.          if((key2n==4)&key3==0)                  //月減減
  584.           {
  585.                   delayus(500);
  586.                   if(key3==0)
  587.                    {
  588.                          didi();
  589.                          while(!key3);
  590.                          mon--;
  591.                          if(mon==-1)mon=12;
  592.              temp=HEX2BCD(mon);
  593.              write_byte(DS3231_MONTH,temp);  //修改月
  594.                    }
  595.           }  
  596.           
  597.         if((key2n==5)&key2==0)                  //年加加
  598.           {
  599.                   delayus(500);
  600.                   if(key2==0)
  601.                    {
  602.                          didi();
  603.                          while(!key2);
  604.                          yea++;
  605.                          if(yea==30)yea=15;
  606.              temp=HEX2BCD(yea);
  607.              write_byte(DS3231_YEAR,temp);   //修改年
  608.                    }
  609.           }       

  610.          if((key2n==5)&key3==0)                  //年減減
  611.           {
  612.                   delayus(500);
  613.                   if(key3==0)
  614.                    {
  615.                          didi();
  616.                          while(!key3);
  617.                          yea--;
  618.                          if(yea==14)yea=30;
  619.              temp=HEX2BCD(yea);
  620.              write_byte(DS3231_YEAR,temp);   //修改年
  621.                    }
  622.           }
  623.           
  624.         if((key2n==6)&key2==0)                  //星期加加
  625.           {
  626.                   delayus(500);
  627.                   if(key2==0)
  628.                    {
  629.                          didi();
  630.                          while(!key2);
  631.                          wee++;
  632.                          if(wee==8)wee=1;
  633.              temp=HEX2BCD(wee);
  634.                  write_byte(DS3231_WEEK,temp);   //修改星期
  635.                    }
  636.           }       

  637.          if((key2n==6)&key3==0)                  //星期減減
  638.           {
  639.                   delayus(500);
  640.                   if(key3==0)
  641.                    {
  642.                          didi();
  643.                          while(!key3);
  644.                          wee--;
  645.                          if(wee==0)wee=7;
  646.              temp=HEX2BCD(wee);
  647.                  write_byte(DS3231_WEEK,temp);   //修改星期
  648.                    }
  649.           }                     
  650. }

  651. void keyal(void)                  //調(diào)鬧鐘函數(shù)
  652. {
  653.         if(key4==0)
  654.           {
  655.                  delayus(500);
  656.                  if(key4==0)
  657.                   {
  658.                      didi();
  659.                          key1n=9;          //顯示鬧鐘
  660.                          while(!key4);
  661.                          key3n++;                  
  662.                          if(key3n==3)
  663.                           {
  664.                                  key2n=0;
  665.                                  key3n=0;
  666.                                  key1n=0;
  667.                                  miao1=0;
  668.                           }
  669.                   }
  670.           }

  671.         if((key3n==1)&key2==0)                  //分加加
  672.           {
  673.                   delayus(500);
  674.                   if(key2==0)
  675.                    {
  676.                          didi();
  677.                          while(!key2);
  678.                          almin++;
  679.                          if(almin==60)almin=0;
  680.              temp=HEX2BCD(almin);
  681.              write_byte(DS3231_ALARM1MINUTE,temp); //修改分
  682.                    }
  683.           }       

  684.          if((key3n==1)&key3==0)                  //分減減
  685.           {
  686.                   delayus(500);
  687.                   if(key3==0)
  688.                    {
  689.                          didi();
  690.                          while(!key3);
  691.                          almin--;
  692.                          if(almin==-1)almin=59;
  693.              temp=HEX2BCD(almin);
  694.              write_byte(DS3231_ALARM1MINUTE,temp); //修改分
  695.                    }
  696.           }
  697.         if((key3n==2)&key2==0)                  //時加加
  698.           {
  699.                   delayus(500);
  700.                   if(key2==0)
  701.                    {
  702.                          didi();
  703.                          while(!key2);
  704.                          alhou++;
  705.                          if(alhou==24)alhou=0;
  706.              temp=HEX2BCD(alhou);
  707.              write_byte(DS3231_ALARM1HOUR,temp);   //修改時
  708.                    }
  709.           }       

  710.          if((key3n==2)&key3==0)                  //時減減
  711.           {
  712.                   delayus(500);
  713.                   if(key3==0)
  714.                    {
  715.                          didi();
  716.                          while(!key3);
  717.                          hou--;
  718.                          if(hou==-1)hou=23;
  719.              temp=HEX2BCD(hou);
  720.              write_byte(DS3231_ALARM1HOUR,temp);   //修改時
  721.                    }
  722.           }
  723. }

  724. void ALzx()                                                                   //鬧鐘執(zhí)行程序與整點(diǎn)報時
  725. {
  726.         uchar Y,Z,X,V,W;
  727.         X = read_random(DS3231_ALARM1HOUR);          //鬧鐘“時”
  728.         V = read_random(DS3231_ALARM1MINUTE);        //鬧鐘“分”
  729.         Y = read_random(DS3231_HOUR);                //時 24小時制
  730.     Z = read_random(DS3231_MINUTE);                  //分
  731.         W = read_random(DS3231_SECOND);                        //秒
  732.         if(((X == Y) && (V == Z)))        //如果鬧鐘時間和時鐘時間相同,bz12為鬧鐘控制位
  733.         {
  734.                 didial();                                                //鬧鐘翻轉(zhuǎn) 報警
  735.         }
  736. ……………………

  737. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼


所有資料51hei提供下載:
DIY.rar (7.62 MB, 下載次數(shù): 427)


評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:353831 發(fā)表于 2018-7-21 21:54 來自手機(jī) | 只看該作者
數(shù)碼管亮度不均勻啊
回復(fù)

使用道具 舉報

板凳
ID:231936 發(fā)表于 2018-7-22 10:46 | 只看該作者
wl020807 發(fā)表于 2018-7-21 21:54
數(shù)碼管亮度不均勻啊

那是74HC138引起的,在第一段位加電阻510,就解決了。
回復(fù)

使用道具 舉報

地板
ID:363686 發(fā)表于 2018-8-9 17:00 | 只看該作者
學(xué)習(xí)帖,收藏啦
回復(fù)

使用道具 舉報

5#
ID:363686 發(fā)表于 2018-8-9 17:11 | 只看該作者
請教樓主:是R6的阻值由360歐改為510歐嗎?
回復(fù)

使用道具 舉報

6#
ID:363686 發(fā)表于 2018-8-9 17:14 | 只看該作者
是將74HC138第7腳R6的阻值由360歐改為510歐嗎?
回復(fù)

使用道具 舉報

7#
ID:231936 發(fā)表于 2018-8-9 18:21 | 只看該作者
sunke928 發(fā)表于 2018-8-9 17:14
是將74HC138第7腳R6的阻值由360歐改為510歐嗎?

是的,這個是一個限流電阻,要求不嚴(yán)。另外注意DS3231模塊上充電電阻應(yīng)該是102,有些是201。
回復(fù)

使用道具 舉報

8#
ID:363686 發(fā)表于 2018-8-10 11:47 | 只看該作者
gxlin 發(fā)表于 2018-8-9 18:21
是的,這個是一個限流電阻,要求不嚴(yán)。另外注意DS3231模塊上充電電阻應(yīng)該是102,有些是201。

非常感謝,樓主
回復(fù)

使用道具 舉報

9#
ID:59525 發(fā)表于 2018-9-2 21:04 | 只看該作者
謝謝樓主的分享,
回復(fù)

使用道具 舉報

10#
ID:232619 發(fā)表于 2018-10-4 14:57 | 只看該作者
學(xué)習(xí)帖,收藏啦
回復(fù)

使用道具 舉報

11#
ID:456424 發(fā)表于 2019-1-18 08:09 | 只看該作者
最近在做這個 參考參考
回復(fù)

使用道具 舉報

12#
ID:438499 發(fā)表于 2019-1-18 20:41 | 只看該作者
謝謝分享!學(xué)習(xí)學(xué)習(xí)!
回復(fù)

使用道具 舉報

13#
ID:229361 發(fā)表于 2019-1-21 13:35 | 只看該作者
謝謝樓主的分享
回復(fù)

使用道具 舉報

14#
ID:471573 發(fā)表于 2019-1-23 15:52 | 只看該作者
很不錯!!!
回復(fù)

使用道具 舉報

15#
ID:438499 發(fā)表于 2019-2-6 14:30 | 只看該作者
學(xué)習(xí)下,非常謝謝!
回復(fù)

使用道具 舉報

16#
ID:474696 發(fā)表于 2019-2-8 17:42 | 只看該作者
感謝分享!
回復(fù)

使用道具 舉報

17#
ID:502514 發(fā)表于 2019-4-3 00:10 | 只看該作者
樓主你好,<STC89C5xRC.H>即使添加了stc的頭文件keil仍不識別,可以使用reg52.h么?
回復(fù)

使用道具 舉報

18#
ID:231936 發(fā)表于 2019-4-3 21:09 | 只看該作者
你的keil有問題,STC89C51這么老,keil不可能不識別。
回復(fù)

使用道具 舉報

19#
ID:502514 發(fā)表于 2019-4-6 23:17 | 只看該作者
gxlin 發(fā)表于 2019-4-3 21:09
你的keil有問題,STC89C51這么老,keil不可能不識別。

好的謝謝,下載了stc的頭文件庫就好用了
回復(fù)

使用道具 舉報

20#
ID:448212 發(fā)表于 2019-5-27 14:47 | 只看該作者
謝謝了!感謝分享
回復(fù)

使用道具 舉報

21#
ID:583100 發(fā)表于 2019-11-25 14:42 | 只看該作者
謝謝!好資料!
回復(fù)

使用道具 舉報

22#
ID:625113 發(fā)表于 2019-11-26 09:17 來自手機(jī) | 只看該作者
謝分享,收藏了
回復(fù)

使用道具 舉報

23#
ID:638375 發(fā)表于 2019-11-30 22:48 | 只看該作者
學(xué)習(xí)了,謝謝分享!!
回復(fù)

使用道具 舉報

24#
ID:585982 發(fā)表于 2019-12-1 14:40 | 只看該作者
學(xué)習(xí)學(xué)習(xí),感謝樓主
回復(fù)

使用道具 舉報

25#
ID:632112 發(fā)表于 2019-12-6 11:41 | 只看該作者
謝謝樓主的分享
回復(fù)

使用道具 舉報

26#
ID:879141 發(fā)表于 2021-2-8 01:29 | 只看該作者
還未試過用數(shù)碼管造時鐘,下載試一下。感謝分享!
回復(fù)

使用道具 舉報

27#
ID:529213 發(fā)表于 2021-4-8 21:03 來自手機(jī) | 只看該作者
請問數(shù)碼管是用共陰還是共陽,非常感謝,想仿制一個。
回復(fù)

使用道具 舉報

28#
ID:231936 發(fā)表于 2021-4-16 21:02 | 只看該作者
共陰極

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

29#
ID:430492 發(fā)表于 2021-4-26 18:26 | 只看該作者
這個比較實(shí)用,以高精度時鐘為基礎(chǔ),采用大LED數(shù)碼管顯示輸出。
回復(fù)

使用道具 舉報

30#
ID:921294 發(fā)表于 2021-6-9 14:53 | 只看該作者
謝謝分享,正在學(xué)習(xí)中,先下載下來,后續(xù)自已動手照樣子做一個。
回復(fù)

使用道具 舉報

31#
ID:67274 發(fā)表于 2021-12-5 02:33 | 只看該作者
這個好,容易理解.
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩免费一区二区 | 天堂在线91 | 91久久国产 | 亚洲h色 | 岛国av免费看 | 在线一区二区三区 | 另类二区| 久久亚洲国产 | 欧美一级片a | 国产在线视频一区 | 91精品国产乱码久久久久久久 | 国产黑丝在线 | 91成人免费看 | av免费网站在线观看 | 黄色大片免费观看 | 高清国产午夜精品久久久久久 | 黄色片视频免费 | 久久9久| 国产av毛片 | 91性高湖久久久久久久久_久久99 | 激情网站在线观看 | 精品久久久久久久久久久久久久久久久 | 国产精品久久久久久久久大全 | 欧美一区日韩一区 | 久久久久久国产精品mv | 欧美精品一区二区在线观看 | 久久高清 | 久久国产精品久久久久久久久久 | 欧美a∨| 欧美 日韩 国产 一区 | 国产精品免费在线 | 亚洲欧美精 | 国产精品一区免费 | 亚洲精品日韩综合观看成人91 | 国产美女一区二区三区 | 中文字幕99| 精品视频一区二区三区 | 爱爱视频日本 | 日韩一区二区在线视频 | 免费在线观看成人 | 成人精品在线视频 |