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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4494|回復: 0
收起左側(cè)

關(guān)于DS1307時鐘芯片的讀寫問題

[復制鏈接]
ID:357775 發(fā)表于 2018-6-24 14:29 | 顯示全部樓層 |閱讀模式
使用STC的15W系列單片機對DS1307進行時間的讀寫,讀出來的數(shù)據(jù)全是00,求高手指點,代碼如下:
  1. #define         MAIN_Fosc                        12000000L        //定義主時鐘
  2. #include        "STC15Fxxxx.H"

  3. #define                Baudrate1                                        9600L
  4. #define         CNT_END                                         12000
  5. #define         DS1307_ADDR                         0xD0

  6. sbit WARNING=P3^3;

  7. sbit I2C_SCL=P5^5;                     //時鐘信號引腳定義
  8. sbit I2C_SDA=P5^4;                     //數(shù)據(jù)信號引腳定義

  9. //sbit I2C_SCL=P1^6;                     //時鐘信號引腳定義
  10. //sbit I2C_SDA=P1^7;                     //數(shù)據(jù)信號引腳定義
  11. u8 B_TX1_Busy=0;
  12. u8 Send_Buff[16];
  13. u8 DS1307_Data[7]={0};                                                //數(shù)據(jù)讀出緩存
  14. u8 DS1307_Buff[7]={0,57,13,7,27,5,18};        //數(shù)據(jù)寫入緩存
  15. u8 i;
  16. u16 cnt=0;
  17. bit temp_flag=0;
  18. void        UART1_Config_withT2(u16 dat);        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  19. void delay_ms(u8 ms);
  20. void DelayXus(u8 n);

  21. void Send_I2C_Byte(u8 txd);
  22. u8 Receive_I2C(void);
  23. u8 read_byte(u8 add);
  24. void write_byte(u8 add,u8 dat);
  25. void SendByte(u8 dat);
  26. void Read_RTC(u8 *p);
  27. void Set_RTC(u8 *p);



  28. //========================================================================
  29. // 函數(shù): void main(void)
  30. // 描述: 主函數(shù)
  31. //========================================================================
  32. void main(void)
  33. {
  34.         P1M1 = 0;        P1M0 = 1;        //設置為準雙向口
  35.         P3M1 = 0;        P3M0 = 1;        //設置為準雙向口
  36.         P5M1 = 0;        P5M0 = 0;        //設置為準雙向口
  37.         WARNING=0;
  38.         I2C_SCL=1;
  39.         I2C_SDA=1;
  40.         UART1_Config_withT2(2);
  41.         EA=1;
  42.        

  43.                 Set_RTC(DS1307_Buff);                //設置時間
  44.        
  45. //向其他寄存器寫入數(shù)據(jù)
  46.                 write_byte(0x09,0xF1);

  47.        
  48.         while (1)
  49.         {
  50.                
  51.                
  52.                 delay_ms(200);
  53.                 delay_ms(200);
  54.                 delay_ms(200);
  55.                 delay_ms(200);
  56.                 delay_ms(200);
  57.                 SendByte(read_byte(0x09));

  58.                 //讀取時間測試
  59.                 Read_RTC(DS1307_Data);                //讀取時間
  60.                 for(i=0;i<7;i++)                                        //讀取時間并用串口發(fā)送
  61.                 {
  62.                         SendByte(DS1307_Data[i]);               
  63.                 }
  64.                 SendByte(read_byte(0x09));
  65.         }
  66. }


  67. //========================================================================
  68. // 描述: 設置Timer2做波特率發(fā)生器。
  69. // 參數(shù): dat: Timer2的重裝值.
  70. //========================================================================
  71. void        UART1_Config_withT2(u16 dat)        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  72. {
  73.         AUXR |= 0x01;                        //S1 BRT Use Timer2;
  74.         AUXR &= ~(1<<4);        //Timer stop
  75.         AUXR &= ~(1<<3);        //Timer2 set As Timer
  76.         AUXR |=  (1<<2);        //Timer2 set as 1T mode
  77.         TH2 = dat / 256;
  78.         TL2 = dat % 256;
  79.         IE2  &= ~(1<<2);        //禁止中斷
  80.         AUXR |=  (1<<4);        //Timer run enable
  81.        
  82.         SCON = (SCON & 0x3f) | 0x40;        //UART1模式, 0x00: 同步移位輸出, 0x40: 8位數(shù)據(jù),可變波特率, 0x80: 9位數(shù)據(jù),固定波特率, 0xc0: 9位數(shù)據(jù),可變波特率
  83. //        PS  = 1;        //高優(yōu)先級中斷
  84.         ES  = 1;        //允許中斷
  85.         REN = 1;        //允許接收
  86.         P_SW1 &= 0x3f;
  87.         P_SW1 |= 0x00;                //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7 (必須使用內(nèi)部時鐘)
  88. //        PCON2 |=  (1<<4);        //內(nèi)部短路RXD與TXD, 做中繼, ENABLE,DISABLE

  89.         B_TX1_Busy = 0;
  90. }

  91. /*--------------------------------延時相關(guān)函數(shù)--------------------------------*/
  92. void  delay_ms(u8 ms)
  93. {
  94.      unsigned int i;
  95.          do{
  96.               i = MAIN_Fosc / 13000;
  97.                   while(--i)        ;   //14T per loop
  98.      }while(--ms);
  99. }
  100. /**************************************
  101. 延時X微秒(@12M)
  102. 不同的工作環(huán)境,需要調(diào)整此函數(shù)
  103. 此延時函數(shù)是使用1T的指令周期進行計算,與傳統(tǒng)的12T的MCU不同
  104. **************************************/
  105. void DelayXus(u8 n)
  106. {
  107.         while (n--)
  108.         {
  109.                 _nop_();
  110.                 _nop_();
  111.         }
  112. }

  113. /*-------------------------------IIC通信相關(guān)函數(shù)-----------------------------------*/

  114. void Start_I2C()                  //啟動IIC
  115. {
  116.         I2C_SDA=1;
  117.         DelayXus(1);
  118.         I2C_SCL=1;
  119.         DelayXus(3);
  120.         I2C_SDA=0;
  121.         DelayXus(3);
  122.         I2C_SCL=0;
  123. }

  124. void Stop_I2C()                  //關(guān)閉IIC
  125. {
  126.         I2C_SDA=0;
  127.         DelayXus(3);
  128.         I2C_SCL=1;
  129.         DelayXus(3);
  130.         I2C_SDA=1;
  131.         DelayXus(3);
  132.         I2C_SCL=0;
  133. }
  134. bit Wait_Ack(void)                                                        //等待應答信號
  135. {
  136.         u8 ucErrTime=0;

  137.         I2C_SCL=1;
  138.         DelayXus(3);
  139.         while(I2C_SDA)
  140.         {
  141.                 ucErrTime++;
  142.                 if(ucErrTime>250)
  143.                 {
  144.                         Stop_I2C();
  145.                         return 1;
  146.                 }
  147.         }
  148.         I2C_SCL=1;
  149.         return 0;
  150. }
  151. void I2CAck()                    //發(fā)送應答信號
  152. {
  153.         I2C_SCL=1;
  154.         DelayXus(3);
  155.         I2C_SDA=1;
  156.         DelayXus(3);
  157.         I2C_SCL=0;
  158. }
  159. void I2CNotAck()                 //發(fā)送非應答信號
  160. {
  161.         I2C_SCL=1;
  162.         DelayXus(3);
  163.         I2C_SDA=0;
  164.         DelayXus(3);
  165.         I2C_SCL=0;
  166. }
  167. void Send_I2C_Byte(u8 txd)            //在總線上發(fā)送一個字節(jié)
  168. {  
  169.         u8 i;
  170.        
  171.         for(i=0;i<8;i++)
  172.         {
  173.                 I2C_SCL=0;
  174.                 DelayXus(3);
  175.                 if(txd&0x80)
  176.                         I2C_SDA=1;
  177.                 else
  178.                         I2C_SDA=0;
  179.                 txd<<=1;
  180.                 DelayXus(3);
  181.                 I2C_SCL=1;
  182.                 DelayXus(3);
  183.         }
  184.         I2C_SCL=0;
  185. }
  186. u8 Receive_I2C()        //在總線上接收一個字節(jié)
  187. {
  188.         u8 i,receive=0,Data_R;
  189.         I2C_SCL=1;
  190.         DelayXus(3);
  191.   for(i=0;i<8;i++ )
  192.         {
  193.                 I2C_SCL=0;
  194.                 DelayXus(3);
  195.                 I2C_SCL=1;
  196.                 DelayXus(3);
  197.                 Data_R=I2C_SDA;
  198.                 if(Data_R==0X08)
  199.                         receive|=0X80>>i;
  200.         }                                         
  201.         I2C_SCL=0;
  202.         DelayXus(3);
  203.         return receive;
  204. }
  205. u8 read_byte(u8 add)        //從D1307指定地址讀出一個字節(jié)數(shù)據(jù)
  206. {
  207.         u8 dat,temp;

  208.         Start_I2C();
  209.         Send_I2C_Byte(DS1307_ADDR);
  210.         Wait_Ack();
  211.         Send_I2C_Byte(add);
  212.         Wait_Ack();
  213.         Stop_I2C();
  214.         Start_I2C();
  215.         Send_I2C_Byte(DS1307_ADDR+1);
  216.         Wait_Ack();
  217.         dat=Receive_I2C();
  218.         I2CAck();
  219.         Stop_I2C();
  220.         temp=dat/16;
  221.         dat=dat%16;
  222.         dat=dat+temp*10;

  223.         return dat;
  224. }


  225. void write_byte(u8 add,u8 dat) //向D1307中地址為address的寄存器寫入一字節(jié)數(shù)據(jù)
  226. {
  227.         u8 temp;
  228.         temp=dat/10;
  229.         temp<<=4;
  230.         temp=dat%10+temp;
  231.        
  232.         Start_I2C();
  233.         Send_I2C_Byte(DS1307_ADDR);
  234.         Wait_Ack();
  235.         Send_I2C_Byte(add);
  236.         Wait_Ack();
  237.         Send_I2C_Byte(temp);
  238.         Stop_I2C();
  239. }
  240. void Read_RTC(u8 *p)                //讀取時間
  241. {
  242.         u8 i;

  243.         for(i=0;i<7;i++)
  244.         {
  245.                 p[i]=(read_byte(i));
  246.         }
  247. }
  248. void Set_RTC(u8 *p)                        //設置時間
  249. {
  250.         u8 i,temp,dat;
  251.         Start_I2C();
  252.         Send_I2C_Byte(DS1307_ADDR);
  253.         Wait_Ack();
  254.         Send_I2C_Byte(0);
  255.         Wait_Ack();
  256.         for(i=0;i<7;i++)
  257.         {
  258.                 dat=*p;
  259.                 temp=dat/10;
  260.                 temp<<=4;
  261.                 temp=dat%10+temp;
  262.                 Send_I2C_Byte(temp);
  263.                 p++;
  264.                 Wait_Ack();
  265.         }
  266.         Stop_I2C();
  267. }




  268. void SendByte(u8 dat)
  269. {
  270.         B_TX1_Busy = 1;                                        //標志發(fā)送忙
  271.         SBUF = dat;                                                                //發(fā)一個字節(jié)
  272.         while(B_TX1_Busy > 0);        //等待發(fā)送完成
  273. }
  274. //========================================================================
  275. // 函數(shù): void UART1_int (void) interrupt UART1_VECTOR
  276. // 描述: UART1中斷函數(shù)。
  277. //========================================================================
  278. void UART1_int (void) interrupt 4
  279. {
  280.         if(RI)
  281.         {
  282.                 RI = 0;
  283.         }

  284.         if(TI)
  285.         {
  286.                 TI = 0;
  287.                 B_TX1_Busy = 0;
  288.         }
  289. }
復制代碼



回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区中文字幕 | 欧美一级黑人aaaaaaa做受 | 亚洲国产精品一区 | 九九久久这里只有精品 | 91精品国产高清一区二区三区 | 精品国产一区二区三区观看不卡 | 国产在线拍偷自揄拍视频 | 国产欧美在线 | 成人在线观看免费 | 色综合视频在线 | 中文字幕乱码一区二区三区 | 紧缚调教一区二区三区视频 | 91精品久久久久久久久久入口 | 国产精品久久久久久52avav | 天天干天天操天天射 | 日韩精品一区二区三区第95 | 国产在线观看网站 | 91福利网| 一区二区日本 | 羞羞的视频在线 | 国产激情视频网 | 欧美日韩国产一区二区三区 | 国产日本精品视频 | 天天艹日日干 | 久久99国产精一区二区三区 | 国产一区二区a | 中文字幕乱码一区二区三区 | 九九视频在线观看视频6 | 欧美一级精品片在线看 | 日韩一区二区三区在线 | 久色网| 天堂成人av | 婷婷久久综合 | 国产欧美在线视频 | 日韩精品一区二区三区视频播放 | 中文字幕成人在线 | 久久精品国产一区 | 午夜免费成人 | 日韩欧美操 | 亚欧精品 | 亚洲高清视频一区二区 |