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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4863|回復: 7
收起左側

[原創設計][電子手表制作]第3期V1.2版(DS3231鬧鐘程序)

  [復制鏈接]
ID:884042 發表于 2021-7-14 12:09 | 顯示全部樓層 |閱讀模式
本帖最后由 xjx51 于 2021-8-11 16:06 編輯

今天來做DS23231的鬧鐘功能
前幾天已經做好了DS3231的鬧鐘啟動函數,現在也測試成功,
來曬一下開啟和關閉的程序:
  1. #include <reg51.h>
  2. #include <intrins.h>

  3. /*DS3231使用功能定義*/
  4. typedef unsigned char uchar;   
  5. typedef unsigned int  uint ;   

  6. sbit SDA=P1^3;     //模擬I2C數據傳送位SDA      
  7. sbit SCL=P1^1;     //模擬I2C時鐘控制位SCL
  8. sbit SQW=P3^7;

  9. bit  ack;          //應答標志位

  10. #define DS3231_WriteAddress 0xD0    //器件寫地址
  11. #define DS3231_ReadAddress  0xD1    //器件讀地址

  12. #define DS3231_SECOND       0x00    //秒
  13. #define DS3231_MINUTE       0x01    //分
  14. #define DS3231_HOUR         0x02    //時
  15. #define DS3231_WEEK         0x03    //星期
  16. #define DS3231_DAY          0x04    //日
  17. #define DS3231_MONTH        0x05    //月
  18. #define DS3231_YEAR         0x06    //年
  19. //鬧鈴1           
  20. #define DS3231_SALARM1ECOND 0x07    //秒
  21. #define DS3231_ALARM1MINUTE 0x08    //分
  22. #define DS3231_ALARM1HOUR   0x09    //時
  23. #define DS3231_ALARM1WEEK   0x0A    //星期/日
  24. //鬧鈴2
  25. #define DS3231_ALARM2MINUTE 0x0b    //分
  26. #define DS3231_ALARM2HOUR   0x0c    //時
  27. #define DS3231_ALARM2WEEK   0x0d    //星期/日
  28. #define DS3231_CONTROL      0x0e    //控制寄存器
  29. #define DS3231_STATUS       0x0f    //狀態寄存器
  30. #define BSY                 2       //忙
  31. #define OSF                 7       //振蕩器停止標志
  32. #define DS3231_XTAL         0x10    //晶體老化寄存器
  33. #define DS3231_TEMPERATUREH 0x11    //溫度寄存器高字節(8位)
  34. #define DS3231_TEMPERATUREL 0x12    //溫度寄存器低字節(高2位)
  35. uchar  DS3231Time[9]={0x40,0x59,0x05,0x21,0x05,0x08,0x06,0x00,0x00}; //秒分時年月日周溫度高字節溫度低字節
  36. /*全局函數定義*/
  37. extern void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec,uchar wee);
  38. extern void  get_show_Temperature(void);
  39. extern void READ_Time();
  40. extern void DS3231_Init();                        
  41. extern uchar DS3231_Time[9];
  42. void delayus(uint us)
  43. {
  44.     while(us--);
  45. }
  46. uchar BCD2HEX(uchar val)    //BCD轉換為Byte
  47. {
  48.     uchar temp;
  49.     temp=val&0x0f;                          
  50.     val>>=4;
  51.     val&=0x0f;
  52.     val*=10;
  53.     temp+=val;
  54.   
  55.     return temp;
  56. }


  57. uchar HEX2BCD(uchar val)    //B碼轉換為BCD碼
  58. {
  59.     uchar i,j,k;
  60.     i=val/10;
  61.     j=val;
  62.     k=j+(i<<4);
  63.     return k;
  64. }
  65. void Start_I2C()
  66. {
  67.     SDA=1;                  //發送起始條件的數據信號
  68.     delayus(1);
  69.     SCL=1;
  70.     delayus(5);             //起始條件建立時間大于4.7us,延時
  71.   
  72.     SDA=0;                  //發送起始信號
  73.     delayus(5);             // 起始條件鎖定時間大于4μs
  74.       
  75.     SCL=0;                  //鉗住I2C總線,準備發送或接收數據
  76.     delayus(2);
  77. }


  78. void Stop_I2C()
  79. {
  80.     SDA=0;                  //發送結束條件的數據信號
  81.     delayus(1);             //發送結束條件的時鐘信號
  82.     SCL=1;                  //結束條件建立時間大于4us
  83.     delayus(5);
  84.   
  85.     SDA=1;                  //發送I2C總線結束信號
  86.     delayus(4);
  87. }


  88. void SendByte(uchar c)
  89. {
  90.     uchar BitCnt;
  91.   
  92.     for(BitCnt=0;BitCnt<8;BitCnt++)         //要傳送的數據長度為8位
  93.     {
  94.         if((c<<BitCnt)&0x80)
  95.             SDA=1;                          //判斷發送位
  96.         else
  97.             SDA=0;              
  98.           delayus(1);
  99.           SCL=1;                            //置時鐘線為高,通知被控器開始接收數據位
  100.           delayus(5);                       //保證時鐘高電平周期大于4μs  
  101.           SCL=0;
  102.     }
  103.   
  104.     delayus(2);
  105.     SDA=1;                                  //8位發送完后釋放數據線,準備接收應答位
  106.     delayus(2);
  107.     SCL=1;
  108.     delayus(3);
  109.     if(SDA==1)
  110.         ack=0;   
  111.     else
  112.         ack=1;                              //判斷是否接收到應答信號
  113.     SCL=0;
  114.     delayus(2);
  115. }


  116. uchar RcvByte()
  117. {
  118.    uchar retc;
  119.    uchar BitCnt;

  120.    retc=0;
  121.    SDA=1;                           //置數據線為輸入方式
  122.    for(BitCnt=0;BitCnt<8;BitCnt++)
  123.    {
  124.         delayus(1);
  125.         SCL=0;                      //置時鐘線為低,準備接收數據位
  126.       
  127.         delayus(5);                 //時鐘低電平周期大于4.7μs
  128.      
  129.         SCL=1;                      //置時鐘線為高使數據線上數據有效
  130.         delayus(3);
  131.         retc=retc<<1;
  132.         if(SDA==1)
  133.             retc=retc+1;            //讀數據位,接收的數據位放入retc中
  134.         delayus(2);
  135.    }
  136.    SCL=0;
  137.    delayus(2);
  138.    return(retc);
  139. }




  140. void Ack_I2C(bit a)
  141. {

  142.     if(a==0)
  143.         SDA=0;              //在此發出應答或非應答信號
  144.     else
  145.         SDA=1;
  146.     delayus(3);   
  147.     SCL=1;
  148.   
  149.     delayus(5);             //時鐘低電平周期大于4μs
  150.   
  151.     SCL=0;                  //清時鐘線,鉗住I2C總線以便繼續接收
  152.     delayus(2);  
  153. }




  154. uchar write_byte(uchar addr, uchar write_data)
  155. {
  156.     Start_I2C();
  157.     SendByte(DS3231_WriteAddress);
  158.     if (ack == 0)
  159.         return 0;
  160.   
  161.     SendByte(addr);  
  162.     if (ack == 0)
  163.         return 0;
  164.   
  165.     SendByte(write_data);
  166.     if (ack == 0)
  167.         return 0;
  168.   
  169.     Stop_I2C();
  170.     delayus(10);     
  171.     return 1;
  172. }




  173. uchar read_current()
  174. {
  175.     uchar read_data;
  176.     Start_I2C();
  177.     SendByte(DS3231_ReadAddress);
  178.     if(ack==0)
  179.         return(0);
  180.   
  181.     read_data = RcvByte();
  182.     Ack_I2C(1);
  183.     Stop_I2C();
  184.     return read_data;
  185. }




  186. uchar read_random(uchar random_addr)
  187. {
  188.     Start_I2C();
  189.     SendByte(DS3231_WriteAddress);
  190.     if(ack==0)
  191.         return(0);
  192.   
  193.     SendByte(random_addr);
  194.     if(ack==0)
  195.         return(0);
  196.   
  197.     return(read_current());
  198. }




  199. void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec,uchar wee)
  200. {
  201.     uchar temp=0;
  202.   
  203.     //temp=HEX2BCD(yea);
  204.     write_byte(DS3231_YEAR,yea);   //修改年
  205.   
  206.     //temp=HEX2BCD(mon);
  207.     write_byte(DS3231_MONTH,mon);  //修改月
  208.   
  209.     //temp=HEX2BCD(da);
  210.     write_byte(DS3231_DAY,da);    //修改日
  211.          
  212.     //temp=HEX2BCD(hou);
  213.     write_byte(DS3231_HOUR,hou);   //修改時
  214.   
  215.     //temp=HEX2BCD(min);
  216.     write_byte(DS3231_MINUTE,min); //修改分
  217.          
  218.     //temp=HEX2BCD(sec);
  219.     write_byte(DS3231_SECOND,sec); //修改秒

  220.         write_byte(DS3231_WEEK,wee); //修改周
  221. }
  222. void  get_show_Temperature(void)
  223. {
  224.     uchar Ttemp1,Ttemp2;
  225.           write_byte(0x0e,0x20);
  226.     Ttemp1=read_random(DS3231_TEMPERATUREH);    //溫度 高字節
  227.           DS3231Time[7]=Ttemp1;
  228.     Ttemp2=read_random(DS3231_TEMPERATUREL);    //溫度低字節
  229.         Ttemp2=(Ttemp2>>6)*25;
  230.         DS3231Time[8]=Ttemp2;
  231. }
  232. void READ_Time()
  233. {
  234.    
  235.     DS3231Time[0]=read_random(DS3231_SECOND);
  236.         DS3231Time[1]=read_random(DS3231_MINUTE);
  237.         DS3231Time[2]=read_random(DS3231_HOUR);
  238.         DS3231Time[3]=read_random(DS3231_YEAR);
  239.         DS3231Time[4]=read_random(DS3231_MONTH);
  240.         DS3231Time[5]=read_random(DS3231_DAY);
  241.         DS3231Time[6]=read_random(DS3231_WEEK);
  242.         get_show_Temperature();
  243. }
  244. void DS3231_opennz1(uchar second,minute,hour,day)
  245. {
  246.     write_byte(0x0e,0x1d);  
  247.         write_byte(DS3231_SALARM1ECOND,second);//秒
  248.         write_byte(DS3231_ALARM1MINUTE,minute);//分
  249.         write_byte(DS3231_ALARM1HOUR,hour);//時
  250.         write_byte(DS3231_ALARM1WEEK,day);//星期/日
  251. }
  252. void DS3231_opennz2(minute,hour,day)
  253. {
  254.     write_byte(0x0e,0x1e);  
  255.         write_byte(DS3231_ALARM2MINUTE,minute);//分
  256.         write_byte(DS3231_ALARM2HOUR,hour);//時
  257.         write_byte(DS3231_ALARM2WEEK,day);//星期/日
  258. }
  259. void DS3231_Init()
  260. {
  261.     ModifyTime(DS3231Time[3],DS3231Time[4],DS3231Time[5],DS3231Time[2],DS3231Time[1],DS3231Time[0],DS3231Time[6]);
  262. }
復制代碼
其中void DS3231_opennz1(uchar second,minute,hour,day)和void DS3231_opennz2(minute,hour,day)分別是鬧鐘1和鬧鐘2的啟動程序,
下面是鬧鐘的關閉程序:
unsigned char i;
write_byte(0x0f,i|=0x00);
這是停止鬧鐘2和鬧鐘1。
鬧鐘判斷程序:
void nz_if()
{
    unsigned char i;
        i=read_random(0x0f);//讀取狀態寄存器
        i=i&0x02;//鬧鐘2寫i=i&0x02;鬧鐘1寫i=i&0x01;
        if(i == 0x02)//鬧鐘2寫i==0x02;鬧鐘1寫i==0x01;
        {        
            //鬧鐘提醒程序,你們想怎么搞就怎么搞
        }

希望能幫到你們!




評分

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

查看全部評分

回復

使用道具 舉報

ID:934353 發表于 2021-7-15 15:42 | 顯示全部樓層
厲害了,值得參考
回復

使用道具 舉報

ID:898540 發表于 2021-10-21 20:50 | 顯示全部樓層
uchar  DS3231Time[9]={0x40,0x59,0x05,0x21,0x05,0x08,0x06,0x00,0x00}; //秒分時年月日周溫度高字節溫度低字節        請問這行的數據是什么意思,怎么數據手冊沒有看到?
回復

使用道具 舉報

ID:898540 發表于 2021-11-12 23:03 | 顯示全部樓層

uchar  DS3231Time[9]={0x40,0x59,0x05,0x21,0x05,0x08,0x06,0x00,0x00};   同問這個,什么意思?
回復

使用道具 舉報

ID:884042 發表于 2022-7-25 01:05 | 顯示全部樓層
combo111 發表于 2021-11-12 23:03
uchar  DS3231Time[9]={0x40,0x59,0x05,0x21,0x05,0x08,0x06,0x00,0x00};   同問這個,什么意思?

好久沒上論壇,所以沒看到,請諒解,這個是時鐘數據,用一個數組,比如要讀秒就調用:
i=DS3231Time[0];
這里用的是BCD碼,所以還需解碼,
second=(i/16*10)+(i&0x0f);
回復

使用道具 舉報

ID:1093241 發表于 2023-10-5 19:35 | 顯示全部樓層
如何能設置多個鬧鐘呢
回復

使用道具 舉報

ID:1112603 發表于 2024-5-1 11:33 | 顯示全部樓層
學習了,非常感謝!
回復

使用道具 舉報

ID:871721 發表于 2024-8-12 18:45 來自手機 | 顯示全部樓層
yongquan 發表于 2023-10-5 19:35
如何能設置多個鬧鐘呢

ds1302就只有兩個鬧鐘的地址
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费一区 | 欧美激情在线精品一区二区三区 | www.欧美.com| 久色视频在线观看 | av黄色在线 | 欧美精品日韩精品国产精品 | 国产精品成人一区二区 | 少妇一级淫片aaaaaaaaa | 日韩欧美理论片 | 日韩一区二区在线观看视频 | 桃花av在线 | 亚洲免费一区二区 | 亚洲国产一区二区视频 | 国产激情视频 | 亚洲精品一二区 | aaa在线观看 | 久久精品亚洲精品国产欧美 | 久久久久九九九女人毛片 | 97色综合 | 在线播放国产一区二区三区 | 毛片免费观看 | 99国产精品99久久久久久 | 亚洲视频免费在线 | 国产在线1区 | 荷兰欧美一级毛片 | 麻豆久久久久久久久久 | 美日韩免费视频 | 国产91黄色 | 91在线视频免费观看 | 免费在线视频精品 | 一区二区三区国产精品 | 中文字幕av在线一二三区 | av电影一区二区 | 天天操夜夜艹 | 国产免费人成xvideos视频 | 成人免费一区二区三区牛牛 | 国产色婷婷精品综合在线播放 | 欧美综合久久 | 久久精品网| 日韩欧美中文 | 一区二区成人 |