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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6463|回復: 9
收起左側

ds3231采用數碼管顯示的單片機仿真程序 74hc138譯碼

  [復制鏈接]
ID:250820 發表于 2017-11-18 17:19 | 顯示全部樓層 |閱讀模式
ds3231采用數碼管顯示 74hc138
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png 0.png

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

  7. sbit key1=P2^3;                //設置鍵
  8. sbit key4=P2^4;                //鬧鐘設置
  9. sbit key2=P3^5;                //加加
  10. sbit key3=P3^4;                //減減   
  11. sbit SPK=P2^5;         //蜂鳴器

  12. sbit IA=P2^0;//行控制線A                   //138  
  13. sbit IB=P2^1;//行控制線B
  14. sbit IC=P2^2;//行控制線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 % 10];         //溫度十位
  325.     dis_buf[2]=dis_code[T2 / 10] | 0x80;  //溫度個位帶點
  326.     dis_buf[1]=dis_code[T3 % 10];         //小數位
  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黑下載附件…………
復制代碼

所有資料51hei提供下載:
ds3231采用數碼管顯示 74hc138.rar (126.93 KB, 下載次數: 141)
回復

使用道具 舉報

ID:251133 發表于 2018-3-14 15:02 | 顯示全部樓層
好東西,分享了
回復

使用道具 舉報

ID:231936 發表于 2018-6-11 08:07 | 顯示全部樓層
按樓主電路圖仿做一DS3231電子鐘,確實DS3231計時準是DS1302不得比。發現該電路第一位發光亮還可以,可是后面7位要晚上才看得見,不知是74HC138問題,因我是第一次用。用共陰極數碼管,另外溫度顯示誤差較大。上供大家參考。
回復

使用道具 舉報

ID:410513 發表于 2018-10-16 14:34 | 顯示全部樓層
很好,很詳細,樓主辛苦了
回復

使用道具 舉報

ID:35873 發表于 2019-3-25 01:50 | 顯示全部樓層
好資料   
回復

使用道具 舉報

ID:529213 發表于 2019-7-1 19:06 來自手機 | 顯示全部樓層
這個程序秒鐘的個位數跳動不均勻,忽快忽慢
回復

使用道具 舉報

ID:353831 發表于 2019-12-3 20:23 來自手機 | 顯示全部樓層
gxlin 發表于 2018-6-11 08:07
按樓主電路圖仿做一DS3231電子鐘,確實DS3231計時準是DS1302不得比。發現該電路第一位發光亮還可以,可是后 ...

樓主 你的問題解決了嗎?我仿制了一個是一樣的問題
回復

使用道具 舉報

ID:210959 發表于 2019-12-7 20:17 | 顯示全部樓層
感謝樓主提供DS3231的仿真程序。
回復

使用道具 舉報

ID:685070 發表于 2020-3-31 09:33 | 顯示全部樓層
樓主,已經開始仿真 ,有幾個問題:1.仿真里很多單片機IO口標注錯誤。2.仿真中設置時間或日期后,已經設置好的選項也會變動。3.在開發板上測試,不能正常顯示,只顯示0。4.第一位很亮,別的都很暗,還沒找處問題,估計是限流。
回復

使用道具 舉報

ID:719406 發表于 2020-3-31 11:38 來自手機 | 顯示全部樓層
謝謝分享!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人在线免费观看视频 | 午夜在线影院 | 中文字幕三区 | 日韩中文字幕 | 国产成人叼嘿视频在线观看 | 国产在线一区二区 | 国产99精品 | 久久久免费 | 亚洲精品中文字幕在线 | 视频一区在线 | 日韩一区二区免费视频 | 国产做爰| 色视频www在线播放国产人成 | 午夜丰满少妇一级毛片 | 久久av一区 | 日韩欧美亚洲 | 久久久久九九九女人毛片 | 九九九久久国产免费 | 日韩精品免费在线 | 国产三级| 老牛影视av一区二区在线观看 | 久久久久久综合 | 国产一区久久精品 | 看片国产 | 网站国产 | 免费的色网站 | 精品真实国产乱文在线 | 色视频在线免费观看 | 欧美视频在线播放 | 一区二区三区视频 | 久久精品视频播放 | 亚洲一区二区三区福利 | 国内精品久久精品 | 国户精品久久久久久久久久久不卡 | 可以免费观看的av | 伊人精品久久久久77777 | 久久久久久综合 | 成人在线一级片 | 成人免费观看男女羞羞视频 | 涩涩片影院 | 欧美亚州综合 |