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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2573|回復: 3
收起左側

單片機驅動ds3231只顯示0000,不知道什么問題

[復制鏈接]
回帖獎勵 10 黑幣 回復本帖可獲得 10 黑幣獎勵! 每人限 1 次
ID:404720 發表于 2018-12-12 13:51 | 顯示全部樓層 |閱讀模式
可能代碼有點多哈,關于數碼管的iic驅動是正常的,測試過了,現在的問題是3231的驅動,不知道怎么回事只顯示0000,也不增加
  1. #include <reg51.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char  
  4. #define uint unsigned int
  5. void get_show_time(void);//函數在下面先聲明一下
  6. void TimeDisplay(uchar Dhour,uchar Dmin,uchar Dsec);
  7. sbit SDA=P1^0;     //模擬I2C數據傳送位SDA        
  8. sbit SCL=P1^1;     //模擬I2C時鐘控制位SCL
  9. sbit INT=P3^2;      
  10. sbit RESET=P3^3;
  11. sbit SCL1=P1^2; //clk
  12. sbit SDA1=P1^3; //dio 這是數碼TM1637的定義引腳
  13. char min;//個位的分
  14. char sec;//個位的秒
  15. char min10;//個位的分
  16. char sec10;//個位的秒
  17. bit  ack;          //應答標志位
  18. #define DS3231_WriteAddress 0x56    //器件寫地址
  19. #define DS3231_ReadAddress  0x57  //器件讀地址
  20. #define DS3231_SECOND       0x00    //秒
  21. #define DS3231_MINUTE       0x01    //分
  22. #define DS3231_HOUR         0x02    //時
  23. #define DS3231_WEEK         0x03    //星期
  24. #define DS3231_DAY          0x04    //日
  25. #define DS3231_MONTH        0x05    //月
  26. #define DS3231_YEAR         0x06    //年
  27. //鬧鈴1
  28. #define DS3231_SALARM1ECOND 0x07    //秒
  29. #define DS3231_ALARM1MINUTE 0x08    //分
  30. #define DS3231_ALARM1HOUR   0x09    //時
  31. #define DS3231_ALARM1WEEK   0x0A    //星期/日
  32. //鬧鈴2
  33. #define DS3231_ALARM2MINUTE 0x0b    //分
  34. #define DS3231_ALARM2HOUR   0x0c    //時
  35. #define DS3231_ALARM2WEEK   0x0d    //星期/日
  36. #define DS3231_CONTROL      0x0e    //控制寄存器
  37. #define DS3231_STATUS       0x0f    //狀態寄存器
  38. #define BSY                 2       //忙
  39. #define OSF                 7       //振蕩器停止標志
  40. #define DS3231_XTAL         0x10    //晶體老化寄存器
  41. #define DS3231_TEMPERATUREH 0x11    //溫度寄存器高字節(8位)
  42. #define DS3231_TEMPERATUREL 0x12    //溫度寄存器低字節(高2位)

  43. uchar code dis_code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};// 0,1,2,3,4,5,6,7,8,9
  44. uchar data dis_buf[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  45. void IIC_delay(void)
  46. {
  47.     unsigned char i;
  48.     for(i=0;i<20;i++) _nop_();
  49. }

  50. void start_IIC(void) //數碼管開始信號
  51. {
  52.     SCL1=1; //給芯片發送開始信號
  53.     SDA1=1;
  54.     IIC_delay();
  55.     SDA1=0;
  56.     IIC_delay();
  57.     SCL1=0; //開始信號傳送完
  58.     IIC_delay();
  59. }
  60. void stop_IIC(void) //數碼管結束信號
  61. {
  62.     SCL1=0;
  63.     IIC_delay();
  64.     SDA1=0;
  65.     IIC_delay();
  66.     SCL1=1;
  67.     IIC_delay();
  68.     SDA1=1;
  69. }
  70. void ack_IIC() //數碼管應答信號
  71. {
  72.     SCL1=0;
  73.     _nop_();_nop_();_nop_();
  74.     while(SDA1);
  75.     SCL1=1;
  76.     _nop_();_nop_();_nop_();
  77.     SCL1=0;
  78. }
  79. void WriteByte(unsigned char WriteData) //數碼管寫信號
  80. {
  81.     unsigned char i;
  82.     for(i=0;i<8;i++)//開始傳送8位數據,每循環一次傳送一位數據
  83.     {
  84.         SCL1=0;
  85.         IIC_delay();
  86.         WriteData=WriteData>>1;
  87.         SDA1=CY;
  88.         IIC_delay();
  89.         SCL1=1;
  90.         IIC_delay();
  91.     }
  92. //8位數據傳送完
  93.     ack_IIC(); //判斷芯片發過來的ACK應答信號
  94. }
  95. void write_LEDSROM(unsigned char addr,unsigned char WData) //數碼管指定地址
  96. {
  97.     start_IIC(); //調用開始信號
  98.     WriteByte(addr); //寫起始地址命令(C0H),地址00H單元。
  99.     WriteByte(WData);//給顯示寄存器寫顯示數據,值可根據實參改變
  100.     stop_IIC(); //調用結束信號,一個字節命令發送完畢,可以發送下一個命令
  101. }
  102. void xsled(void)
  103. {
  104.     SDA1=1;
  105.     SCL1=1;
  106.     start_IIC(); //調用開始信號
  107.     WriteByte(0x40);//寫命令40H(數據設置)
  108.     stop_IIC(); //調用結束信號,一個字節命令發送完畢,可以發送下一個命令
  109.               write_LEDSROM(0xC1,min);//第2個數碼管
  110.    write_LEDSROM(0xC3,sec);//第4個數碼管
  111.    write_LEDSROM(0xC2,sec10);//第3個數碼管
  112.                 write_LEDSROM(0xC0,min10);//第1個數碼管

  113.     IIC_delay();
  114.     start_IIC(); //調用開始信號
  115.     WriteByte(0x8f); //送開屏命令,(8BH),亮度可以根據低三位調節。//顯示亮度
  116.     stop_IIC(); //調用結束信號,一個字節命令發送完畢,可以發送下一個命令
  117. }

  118. uchar BCD2HEX(uchar date)                                                 //從時鐘芯片中讀出的時間數據,需轉換為十進制數。
  119. {
  120.     uchar temp;

  121.     temp = ((date>>4)*10 + (date&0x0f));
  122.     return temp;
  123. }
  124. uchar HEX2BCD(uchar date)                                                //往時鐘芯片寫入數據時,需將待寫的十進制數轉換為8421碼。
  125. {
  126.    uchar temp;
  127.     temp = (((date/10)<<4) + (date%10));
  128.     return temp;
  129. }
  130. void delayus(uint us)
  131. {
  132.     while (us--);
  133. }
  134. void Start_I2C()
  135. {
  136.        SDA=1;                  //發送起始條件的數據信號
  137.     delayus(5);
  138.        SCL=1;
  139.     delayus(6);             //起始條件建立時間大于4.7us,延時
  140.        SDA=0;                  //發送起始信號
  141.     delayus(6);             // 起始條件鎖定時間大于4μs
  142.        SCL=0;                  //鉗住I2C總線,準備發送或接收數據
  143.     delayus(6);
  144. }
  145. void Stop_I2C()
  146. {
  147.                         SDA=0;                  //發送結束條件的數據信號
  148.     delayus(5);             //發送結束條件的時鐘信號
  149.                         SCL=1;                  //結束條件建立時間大于4us
  150.     delayus(6);
  151.                         SDA=1;                  //發送I2C總線結束信號
  152.     delayus(6);
  153. }
  154. void SendByte(uchar c)
  155. {
  156.     uchar BitCnt;
  157.    
  158.     for(BitCnt=0;BitCnt<8;BitCnt++)         //要傳送的數據長度為8位
  159.     {
  160.         if((c<<BitCnt)&0x80)
  161.             SDA=1;                          //判斷發送位
  162.         else
  163.             SDA=0;               
  164.           delayus(1);
  165.           SCL=1;                            //置時鐘線為高,通知被控器開始接收數據位
  166.           delayus(5);                       //保證時鐘高電平周期大于4μs   
  167.           SCL=0;
  168.     }
  169.        delayus(2);
  170.     SDA=1;                                  //8位發送完后釋放數據線,準備接收應答位
  171.     delayus(2);  
  172.     SCL=1;
  173.     delayus(3);
  174.     if(SDA==1)
  175.         ack=0;   
  176.     else
  177.         ack=1;                              //判斷是否接收到應答信號
  178.     SCL=0;
  179.     delayus(2);
  180. }
  181. uchar RcvByte()
  182. {
  183.    uchar retc;
  184.    uchar BitCnt;

  185.    retc=0;
  186.    SDA=1;                           //置數據線為輸入方式
  187.    for(BitCnt=0;BitCnt<8;BitCnt++)
  188.    {
  189.         delayus(1);  
  190.         SCL=0;                      //置時鐘線為低,準備接收數據位
  191.       
  192.         delayus(5);                 //時鐘低電平周期大于4.7μs
  193.       
  194.         SCL=1;                      //置時鐘線為高使數據線上數據有效
  195.         delayus(3);
  196.         retc=retc<<1;
  197.         if(SDA==1)
  198.             retc=retc+1;            //讀數據位,接收的數據位放入retc中
  199.         delayus(2);
  200.    }
  201.    SCL=0;
  202.    delayus(2);
  203.    return(retc);
  204. }

  205. void Ack_I2C(bit a)
  206. {
  207.      if(a==0)
  208.         SDA=0;              //在此發出應答或非應答信號
  209.     else
  210.         SDA=1;
  211.     delayus(3);     
  212.     SCL=1;
  213.        delayus(5);             //時鐘低電平周期大于4μs
  214.        SCL=0;                  //清時鐘線,鉗住I2C總線以便繼續接收
  215.     delayus(2);   
  216. }


  217. uchar write_byte(uchar addr, uchar write_data)
  218. {
  219.     Start_I2C();
  220.     SendByte(DS3231_WriteAddress);
  221.     if (ack == 0)
  222.         return 0;
  223.        SendByte(addr);   
  224.     if (ack == 0)
  225.         return 0;
  226.        SendByte(write_data);
  227.     if (ack == 0)
  228.         return 0;
  229.        Stop_I2C();
  230.     delayus(10);      
  231.     return 1;
  232. }
  233. uchar read_current()
  234. {
  235.     uchar read_data;
  236.     Start_I2C();
  237.     SendByte(DS3231_ReadAddress);
  238.     if(ack==0)
  239.         return(0);
  240.        read_data = RcvByte();
  241.     Ack_I2C(1);
  242.     Stop_I2C();
  243.     return read_data;
  244. }

  245. uchar read_random(uchar random_addr)
  246. {
  247.     Start_I2C();
  248.     SendByte(DS3231_WriteAddress);
  249.     if(ack==0)
  250.         return(0);
  251.        SendByte(random_addr);
  252.     if(ack==0)
  253.         return(0);
  254.        return(read_current());
  255. }
  256. void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec)
  257. {
  258.     uchar temp=0;
  259.        temp=HEX2BCD(yea);
  260.     write_byte(DS3231_YEAR,temp);   //修改年
  261.    
  262.     temp=HEX2BCD(mon);
  263.     write_byte(DS3231_MONTH,temp);  //修改月
  264.    
  265.     temp=HEX2BCD(da);
  266.     write_byte(DS3231_DAY,temp);    //修改日
  267.    
  268.     temp=HEX2BCD(hou);
  269.     write_byte(DS3231_HOUR,temp);   //修改時
  270.    
  271.     temp=HEX2BCD(min);
  272.     write_byte(DS3231_MINUTE,temp); //修改分
  273.    
  274.     temp=HEX2BCD(sec);
  275.     write_byte(DS3231_SECOND,temp); //修改秒
  276. }

  277. void get_show_time(void)
  278. {
  279.     uchar Htemp1,Htemp2,Mtemp1,Mtemp2,Stemp1,Stemp2;

  280.     Htemp1=read_random(DS3231_HOUR);    //時 24小時制
  281.     Htemp1&=0x3f;                  
  282.     Htemp2=BCD2HEX(Htemp1);
  283.    
  284.     Mtemp1=read_random(DS3231_MINUTE);  //分
  285.     Mtemp2=BCD2HEX(Mtemp1);
  286.    
  287.     Stemp1=read_random(DS3231_SECOND);  //秒
  288.     Stemp2=BCD2HEX(Stemp1);
  289.    
  290.     TimeDisplay(Htemp2,Mtemp2,Stemp2);
  291. }
  292. void TimeDisplay(uchar Dhour,uchar Dmin,uchar Dsec)
  293. {
  294. dis_buf[7]=dis_code[Dhour / 10];        // 時十位
  295. dis_buf[6]=dis_code[Dhour % 10];        // 時個位
  296. dis_buf[4]=dis_code[Dmin / 10];         // 分十位
  297. dis_buf[3]=dis_code[Dmin % 10];         // 分個位
  298. dis_buf[1]=dis_code[Dsec / 10];         // 秒十位
  299. dis_buf[0]=dis_code[Dsec % 10];         // 秒個位
  300. }



  301. void main()
  302. {
  303.     RESET=0x1;          //DS3231復位操作,正常操作下不需要每次都復位
  304.     delayus(5000);
  305.    ModifyTime(18,12,6,20,59,59);       //初始化時鐘,年月日時分秒  時采用24小時制
  306.     while(1)
  307.     {   
  308.                                    get_show_time();   
  309. min10=dis_buf[4];
  310. min=dis_buf[3];
  311. sec10=dis_buf[1];
  312. sec=dis_buf[0];
  313.                         xsled();
  314.     }
  315.    }
復制代碼


回復

使用道具 舉報

ID:396881 發表于 2018-12-12 14:57 | 顯示全部樓層
很顯然,你的3231驅動有問題,查查datesheet手冊,相信你可以的。
回復

使用道具 舉報

ID:404720 發表于 2018-12-12 16:08 | 顯示全部樓層
18656265250 發表于 2018-12-12 14:57
很顯然,你的3231驅動有問題,查查datesheet手冊,相信你可以的。

全英文看不懂啊
回復

使用道具 舉報

ID:440349 發表于 2018-12-14 18:23 | 顯示全部樓層
3231驅動問題
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品区二区三区日本 | 久久1区| 日韩在线中文字幕 | av中文天堂| 国产精品亚洲一区二区三区在线观看 | 成人在线免费网站 | 视频一二三区 | 久久亚洲一区二区三区四区 | 久精品久久 | 欧洲在线视频 | 日日天天 | 中文字字幕一区二区三区四区五区 | 91精品国产91久久久久久密臀 | 中文字幕国产日韩 | 在线欧美激情 | 伊人久久免费视频 | 成年人在线观看 | 一区二区精品 | 黄色在线免费观看 | 午夜视频一区二区三区 | 亚洲精品小视频在线观看 | 免费国产视频 | 毛片免费观看 | 97操操 | 日本不卡一区 | www.日本国产 | 日日综合 | 国产视频黄色 | 国产一级毛片精品完整视频版 | 欧美在线播放一区 | 欧美精品在线视频 | 成人免费激情视频 | 久在线 | 精品一区二区在线看 | 黄网站在线播放 | 久久伊人一区 | 精品九九九 | 午夜伦理影院 | 日本人做爰大片免费观看一老师 | 性色av香蕉一区二区 | 九色91视频 |