找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13693|回复: 30
收起左侧

51单片机DS3231数码管电子钟制作

  [复制链接]
ID:231936 发表于 2018-7-19 11:55 | 显示全部楼层 |阅读模式
   在开发板移植STC98C52+两块74HC573用DS1320驱动码数管电子钟,用洞洞做, 玩过DS1302钟知道,DS1302要精度很高晶振,但是受外界温度影响还是有很大误差。网上很难找到用DS3231数码管电子钟例子,以前我在淘宝购DS3231模板一直在空,总想找源植入改变DS1320驱动码数管电子钟,现在终于找到了,STC98C52+74HC573+74HC138或STC98C52+74HC245+74HC138驱动数码管,数码管显示很好、方便,象DS3231这样精准不必要加什么样GPS或红外了。改一下STC98C52+两块74HC573用DS1320驱动数码管电子钟,把DS1320移掉,两块74HC573,留一换一,试一下,成功显示了。

制作出来的实物图如下:
001.jpg 002.jpg 001.jpg 002.jpg

单片机源程序如下:
  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数据传送位SDA        
  6. sbit SCL=P3^6;     //DS3231模拟I2C时钟控制位SCL     

  7. sbit key1=P1^0;                //设置键
  8. sbit key4=P3^1;                //闹钟设置
  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;          //应答标志位

  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    //状态寄存器
  36. #define BSY                 2       //忙
  37. #define OSF                 7       //振荡器停止标志
  38. #define DS3231_XTAL         0x10    //晶体老化寄存器
  39. #define DS3231_TEMPERATUREH 0x11    //温度寄存器高字节(8位)
  40. #define DS3231_TEMPERATUREL 0x12    //温度寄存器低字节(高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转换为Byte
  64. {
  65.    return    ((val>>4)*10)+(val&0x0f);
  66. }

  67. uchar HEX2BCD(uchar val)    //B码转换为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;                  //发送起始条件的数据信号
  78.     delayus(4);
  79.     SCL=1;
  80.     delayus(4);             //起始条件建立时间大于4.7us,延时
  81.    
  82.     SDA=0;                  //发送起始信号
  83.     delayus(4);             // 起始条件锁定时间大于4μs
  84.       
  85.     SCL=0;                  //钳住I2C总线,准备发送或接收数据
  86.     delayus(4);
  87. }

  88. void Stop_I2C()
  89. {
  90.     SDA=0;                  //发送结束条件的数据信号
  91.     delayus(4);             //发送结束条件的时钟信号
  92.     SCL=1;                  //结束条件建立时间大于4us
  93.     delayus(4);
  94.    
  95.     SDA=1;                  //发送I2C总线结束信号
  96.     delayus(4);
  97. }

  98. void SendByte(uchar c)
  99. {
  100.     uchar BitCnt;
  101.    
  102.     for(BitCnt=0;BitCnt<8;BitCnt++)         //要传送的数据长度为8位
  103.     {
  104.         if((c<<BitCnt)&0x80)
  105.           SDA=1;                          //判断发送位
  106.         else
  107.           SDA=0;               
  108.           delayus(4);
  109.           SCL=1;                            //置时钟线为高,通知被控器开始接收数据位
  110.           delayus(4);                       //保证时钟高电平周期大于4μs   
  111.           SCL=0;
  112.     }
  113.    
  114.     delayus(4);
  115.     SDA=1;                                  //8位发送完后释放数据线,准备接收应答位
  116.     delayus(4);  
  117.     SCL=1;
  118.     delayus(4);
  119.     if(SDA==1)
  120.         ack=0;   
  121.     else
  122.         ack=1;                              //判断是否接收到应答信号
  123.     SCL=0;
  124.     delayus(4);
  125. }

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

  130.    retc=0;
  131.    SDA=1;                           //置数据线为输入方式
  132.    for(BitCnt=0;BitCnt<8;BitCnt++)
  133.    {
  134.         delayus(4);  
  135.         SCL=0;                      //置时钟线为低,准备接收数据位
  136.       
  137.         delayus(4);                 //时钟低电平周期大于4.7μs
  138.       
  139.         SCL=1;                      //置时钟线为高使数据线上数据有效
  140.         delayus(4);
  141.         retc=retc<<1;
  142.         if(SDA==1)
  143.             retc=retc+1;            //读数据位,接收的数据位放入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;              //在此发出应答或非应答信号
  154.     else
  155.         SDA=1;
  156.     delayus(4);     
  157.     SCL=1;
  158.    
  159.     delayus(4);             //时钟低电平周期大于4μs
  160.    
  161.     SCL=0;                  //清时钟线,钳住I2C总线以便继续接收
  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)                                                        //调时闪烁
  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)                                                   //调分闪烁
  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)                                                    //调年闪烁
  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)                                                         //调月闪烁
  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)                                                         //调天闪烁
  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)                 //调星期闪烁
  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;  //温度个位带点
  326.     dis_buf[1]=dis_code[T3 % 11];         //小数位
  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)                                                   //调时闪烁
  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;                                 //调分闪烁
  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);        //时间显示函数
  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);               //日期显示函数
  398. }



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

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

  410.         TimeDisplay1(G1,Ttemp2,Ttemp4);                    //星期 温度显示函数
  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)                   //按键发音
  437. {
  438.          SPK=1;
  439.          delayus(5000);
  440.          SPK=0;
  441. }

  442. void didial(void)                   //按键发音
  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()                  //调时间函数
  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)           //调时间显示时间
  477.                            {
  478.                                   key1n=0;
  479.                            }
  480.                          if(key2n==3)           //调日期显示日期
  481.                            {
  482.                                   key1n=6;
  483.                            }
  484.                          if(key2n==6)           //调星期显示星期
  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)                  //调闹钟函数
  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()                                                                   //闹钟执行程序与整点报时
  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();                                                //闹钟翻转 报警
  735.         }
  736. ……………………

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

所有资料51hei提供下载:
DIY.rar (7.62 MB, 下载次数: 421)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:353831 发表于 2018-7-21 21:54 来自手机 | 显示全部楼层
数码管亮度不均匀啊
回复

使用道具 举报

ID:231936 发表于 2018-7-22 10:46 | 显示全部楼层
wl020807 发表于 2018-7-21 21:54
数码管亮度不均匀啊

那是74HC138引起的,在第一段位加电阻510,就解决了。
回复

使用道具 举报

ID:363686 发表于 2018-8-9 17:00 | 显示全部楼层
学习帖,收藏啦
回复

使用道具 举报

ID:363686 发表于 2018-8-9 17:11 | 显示全部楼层
请教楼主:是R6的阻值由360欧改为510欧吗?
回复

使用道具 举报

ID:363686 发表于 2018-8-9 17:14 | 显示全部楼层
是将74HC138第7脚R6的阻值由360欧改为510欧吗?
回复

使用道具 举报

ID:231936 发表于 2018-8-9 18:21 | 显示全部楼层
sunke928 发表于 2018-8-9 17:14
是将74HC138第7脚R6的阻值由360欧改为510欧吗?

是的,这个是一个限流电阻,要求不严。另外注意DS3231模块上充电电阻应该是102,有些是201。
回复

使用道具 举报

ID:363686 发表于 2018-8-10 11:47 | 显示全部楼层
gxlin 发表于 2018-8-9 18:21
是的,这个是一个限流电阻,要求不严。另外注意DS3231模块上充电电阻应该是102,有些是201。

非常感谢,楼主
回复

使用道具 举报

ID:59525 发表于 2018-9-2 21:04 | 显示全部楼层
谢谢楼主的分享,
回复

使用道具 举报

ID:232619 发表于 2018-10-4 14:57 | 显示全部楼层
学习帖,收藏啦
回复

使用道具 举报

ID:456424 发表于 2019-1-18 08:09 | 显示全部楼层
最近在做这个 参考参考
回复

使用道具 举报

ID:438499 发表于 2019-1-18 20:41 | 显示全部楼层
谢谢分享!学习学习!
回复

使用道具 举报

ID:229361 发表于 2019-1-21 13:35 | 显示全部楼层
谢谢楼主的分享
回复

使用道具 举报

ID:471573 发表于 2019-1-23 15:52 | 显示全部楼层
很不错!!!
回复

使用道具 举报

ID:438499 发表于 2019-2-6 14:30 | 显示全部楼层
学习下,非常谢谢!
回复

使用道具 举报

ID:474696 发表于 2019-2-8 17:42 | 显示全部楼层
感谢分享!
回复

使用道具 举报

ID:502514 发表于 2019-4-3 00:10 | 显示全部楼层
楼主你好,<STC89C5xRC.H>即使添加了stc的头文件keil仍不识别,可以使用reg52.h么?
回复

使用道具 举报

ID:231936 发表于 2019-4-3 21:09 | 显示全部楼层
你的keil有问题,STC89C51这么老,keil不可能不识别。
回复

使用道具 举报

ID:502514 发表于 2019-4-6 23:17 | 显示全部楼层
gxlin 发表于 2019-4-3 21:09
你的keil有问题,STC89C51这么老,keil不可能不识别。

好的谢谢,下载了stc的头文件库就好用了
回复

使用道具 举报

ID:448212 发表于 2019-5-27 14:47 | 显示全部楼层
谢谢了!感谢分享
回复

使用道具 举报

ID:583100 发表于 2019-11-25 14:42 | 显示全部楼层
谢谢!好资料!
回复

使用道具 举报

ID:625113 发表于 2019-11-26 09:17 来自手机 | 显示全部楼层
谢分享,收藏了
回复

使用道具 举报

ID:638375 发表于 2019-11-30 22:48 | 显示全部楼层
学习了,谢谢分享!!
回复

使用道具 举报

ID:585982 发表于 2019-12-1 14:40 | 显示全部楼层
学习学习,感谢楼主
回复

使用道具 举报

ID:632112 发表于 2019-12-6 11:41 | 显示全部楼层
谢谢楼主的分享
回复

使用道具 举报

ID:879141 发表于 2021-2-8 01:29 | 显示全部楼层
還未試過用數碼管造時鐘,下載試一下。感謝分享!
回复

使用道具 举报

ID:529213 发表于 2021-4-8 21:03 来自手机 | 显示全部楼层
请问数码管是用共阴还是共阳,非常感谢,想仿制一个。
回复

使用道具 举报

ID:231936 发表于 2021-4-16 21:02 | 显示全部楼层
共阴极

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:430492 发表于 2021-4-26 18:26 | 显示全部楼层
这个比较实用,以高精度时钟为基础,采用大LED数码管显示输出。
回复

使用道具 举报

ID:921294 发表于 2021-6-9 14:53 | 显示全部楼层
谢谢分享,正在学习中,先下载下来,后续自已动手照样子做一个。
回复

使用道具 举报

ID:67274 发表于 2021-12-5 02:33 | 显示全部楼层
这个好,容易理解.
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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