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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2220|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

15W205S單片機(jī)+PCF8563 時鐘不動 求幫助

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:457181 發(fā)表于 2020-7-20 14:00 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
找了很多資料,還是不能讓時鐘動起來。
請大家看看我的原始碼有哪里做錯了。

單片機(jī)源程序如下:

  1. #include "reg52.h"
  2. #include "stdio.h"
  3. #include "intrins.h"


  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define ulong unsigned long
  7. #define S1_S0 0x40              //P_SW1.6
  8. #define S1_S1 0x80              //P_SW1.7
  9. sfr P_SW1 = 0xA2;            
  10. #define  _Nop()  _nop_()   /*定義空指令*/
  11. sfr P5=0xC8;
  12. sbit        SCL=P5^5;       //I2C  時鐘
  13. sbit        SDA=P5^4;       //I2C  數(shù)據(jù)
  14. bit                ack;           /*應(yīng)答標(biāo)志位*/

  15. uchar tmpdate[7]={0x50,0x30,0x17,0x25,0x05,0x12,0x20}; //時間初始化:秒、分、時、日、星期、月、年
  16. uchar rtc_address[7]={0x02,0x03,0x04,0x05,0x06,0x07,0x08};  //PCF8563中的秒、分、時、日、星期、月、年寄存器地址
  17. int sqsend,MsCount;


  18. void Init(void)
  19. {
  20.   //Serial P36,P37
  21.   ACC = P_SW1;
  22.   ACC &= ~(S1_S0 | S1_S1);    //S1_S0=1 S1_S1=0
  23.   ACC |= S1_S0;               //(P3.6/RxD_2, P3.7/TxD_2)
  24.   P_SW1 = ACC;
  25.         
  26.   //定時器

  27.         AUXR |= 0x80;        //定時器時鐘1T模式
  28.         TMOD &= 0xF0;        //設(shè)置定時器模式
  29.         TL0 = 0xCD;                //設(shè)置定時初值
  30.         TH0 = 0xD4;                //設(shè)置定時初值
  31.         ET0 = 1;
  32.         TR0 = 1;                //定時器0開始計(jì)時
  33.         EA = 1;               
  34.         
  35.         //Braud 9600
  36.         SCON = 0x50;
  37.         AUXR |= 0x01;
  38.         AUXR |= 0x04;
  39.         T2L = 0xE0;
  40.         T2H = 0xFE;
  41.         AUXR |= 0x10;
  42.         
  43.         sqsend=0;
  44.         MsCount=0;
  45. }

  46. /*******************************************************************
  47.                      起動總線函數(shù)               
  48. 函數(shù)原型: void  Start_I2c();  
  49. 功能:     啟動I2C總線,即發(fā)送I2C起始條件.  
  50. ********************************************************************/
  51. void Start_I2c()
  52. {
  53.   SDA=1;         /*發(fā)送起始條件的數(shù)據(jù)信號*/
  54.   _Nop();
  55.   SCL=1;
  56.   _Nop();        /*起始條件建立時間大于4.7us,延時*/
  57.   _Nop();
  58.   _Nop();
  59.   _Nop();
  60.   _Nop();   
  61.   SDA=0;         /*發(fā)送起始信號*/
  62.   _Nop();        /* 起始條件鎖定時間大于4μs*/
  63.   _Nop();
  64.   _Nop();
  65.   _Nop();
  66.   _Nop();      
  67.   SCL=0;       /*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) */
  68.   _Nop();
  69.   _Nop();
  70. }

  71. /*******************************************************************
  72.                       結(jié)束總線函數(shù)               
  73. 函數(shù)原型: void  Stop_I2c();  
  74. 功能:     結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件.  
  75. ********************************************************************/
  76. void Stop_I2c()
  77. {
  78.   SDA=0;      /*發(fā)送結(jié)束條件的數(shù)據(jù)信號*/
  79.   _Nop();       /*發(fā)送結(jié)束條件的時鐘信號*/
  80.   SCL=1;      /*結(jié)束條件建立時間大于4μs*/
  81.   _Nop();
  82.   _Nop();
  83.   _Nop();
  84.   _Nop();
  85.   _Nop();
  86.   SDA=1;      /*發(fā)送I2C總線結(jié)束信號*/
  87.   _Nop();
  88.   _Nop();
  89.   _Nop();
  90.   _Nop();
  91. }

  92. /*******************************************************************
  93.                  字節(jié)數(shù)據(jù)發(fā)送函數(shù)               
  94. 函數(shù)原型: void  SendByte(UCHAR c);
  95. 功能:     將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對
  96.           此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0)     
  97.            發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。
  98. ********************************************************************/
  99. void  SendByte(unsigned char  c)
  100. {
  101. unsigned char  BitCnt;

  102. for(BitCnt=0;BitCnt<8;BitCnt++)  /*要傳送的數(shù)據(jù)長度為8位*/
  103.     {
  104.      if((c<<BitCnt)&0x80)SDA=1;   /*判斷發(fā)送位*/
  105.        else  SDA=0;               
  106.      _Nop();
  107.      SCL=1;               /*置時鐘線為高,通知被控器開始接收數(shù)據(jù)位*/
  108.       _Nop();
  109.       _Nop();             /*保證時鐘高電平周期大于4μs*/
  110.       _Nop();
  111.       _Nop();
  112.       _Nop();         
  113.      SCL=0;
  114.     }
  115.    
  116.     _Nop();
  117.     _Nop();
  118.     SDA=1;                /*8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位*/
  119.     _Nop();
  120.     _Nop();   
  121.     SCL=1;
  122.     _Nop();
  123.     _Nop();
  124.     _Nop();
  125.     if(SDA==1)ack=0;     
  126.        else ack=1;        /*判斷是否接收到應(yīng)答信號*/
  127.     SCL=0;
  128.     _Nop();
  129.     _Nop();
  130. }

  131. /*******************************************************************
  132.                  字節(jié)數(shù)據(jù)接收函數(shù)               
  133. 函數(shù)原型: UCHAR  RcvByte();
  134. 功能:        用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),
  135.           發(fā)完后請用應(yīng)答函數(shù)應(yīng)答從機(jī)。  
  136. ********************************************************************/   
  137. unsigned char   RcvByte()
  138. {
  139.   unsigned char  retc;
  140.   unsigned char  BitCnt;
  141.   
  142.   retc=0;
  143.   SDA=1;                     /*置數(shù)據(jù)線為輸入方式*/
  144.   for(BitCnt=0;BitCnt<8;BitCnt++)
  145.       {
  146.         _Nop();           
  147.         SCL=0;                  /*置時鐘線為低,準(zhǔn)備接收數(shù)據(jù)位*/
  148.         _Nop();
  149.         _Nop();                 /*時鐘低電平周期大于4.7μs*/
  150.         _Nop();
  151.         _Nop();
  152.         _Nop();
  153.         SCL=1;                  /*置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/
  154.         _Nop();
  155.         _Nop();
  156.         retc=retc<<1;
  157.         if(SDA==1)retc=retc+1;  /*讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中 */
  158.         _Nop();
  159.         _Nop();
  160.       }
  161.   SCL=0;   
  162.   _Nop();
  163.   _Nop();
  164.   return(retc);
  165. }

  166. /********************************************************************
  167.                      應(yīng)答子函數(shù)
  168. 函數(shù)原型:  void Ack_I2c(bit a);
  169. 功能:      主控器進(jìn)行應(yīng)答信號(可以是應(yīng)答或非應(yīng)答信號,由位參數(shù)a決定)
  170. ********************************************************************/
  171. void Ack_I2c(bit a)
  172. {
  173.   
  174.   if(a==0)SDA=0;              /*在此發(fā)出應(yīng)答或非應(yīng)答信號 */
  175.   else SDA=1;
  176.   _Nop();
  177.   _Nop();
  178.   _Nop();      
  179.   SCL=1;
  180.   _Nop();
  181.   _Nop();                    /*時鐘低電平周期大于4μs*/
  182.   _Nop();
  183.   _Nop();
  184.   _Nop();  
  185.   SCL=0;                     /*清時鐘線,鉗住I2C總線以便繼續(xù)接收*/
  186.   _Nop();
  187.   _Nop();   
  188. }

  189. /*******************************************************************
  190.                     向有子地址器件發(fā)送字節(jié)數(shù)據(jù)函數(shù)               
  191. 函數(shù)原型: bit  ISendByte(uchar sla,ucahr c);  
  192. 功能:     從啟動總線到發(fā)送地址,數(shù)據(jù),結(jié)束總線的全過程,從器件地址sla.
  193.           如果返回1表示操作成功,否則操作有誤。
  194. 注意:    使用前必須已結(jié)束總線。
  195. ********************************************************************/
  196. bit ISendByte(unsigned char suba,unsigned char c)
  197. {
  198.    Start_I2c();               /*啟動總線*/
  199.    SendByte(0x0a2);            /*發(fā)送器件地址*/
  200.      if(ack==0)return(0);
  201.    SendByte(suba);            /*發(fā)送子器件地址*/
  202.      if(ack==0)return(0);
  203.    SendByte(c);               /*發(fā)送數(shù)據(jù)*/
  204.      if(ack==0)return(0);
  205.   Stop_I2c();                 /*結(jié)束總線*/
  206.   return(1);
  207. }

  208. /*******************************************************************
  209.                     向有子地址器件發(fā)送多字節(jié)數(shù)據(jù)函數(shù)               
  210. 函數(shù)原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
  211. 功能:     從啟動總線到發(fā)送地址,子地址,數(shù)據(jù),結(jié)束總線的全過程,從器件
  212.           地址sla,子地址suba,發(fā)送內(nèi)容是s指向的內(nèi)容,發(fā)送no個字節(jié)。
  213.           如果返回1表示操作成功,否則操作有誤。
  214. 注意:    使用前必須已結(jié)束總線。
  215. ********************************************************************/
  216. bit ISendStr(unsigned char suba,unsigned char *s,unsigned char no)
  217. {
  218.    unsigned char i;

  219.    Start_I2c();               /*啟動總線*/
  220.    SendByte(0x0a2);            /*發(fā)送器件地址*/
  221.      if(ack==0)return(0);
  222.    SendByte(suba);            /*發(fā)送器件子地址*/
  223.      if(ack==0)return(0);

  224.    for(i=0;i<no;i++)
  225.     {   
  226.      SendByte(*s);               /*發(fā)送數(shù)據(jù)*/
  227.        if(ack==0)return(0);
  228.      s++;
  229.     }
  230. Stop_I2c();                 /*結(jié)束總線*/
  231.   return(1);
  232. }

  233. /*******************************************************************
  234.                     向有子地址器件讀字節(jié)數(shù)據(jù)函數(shù)               
  235. 函數(shù)原型: bit  IRcvByte(uchar sla,ucahr *c);  
  236. 功能:     從啟動總線到發(fā)送地址,讀數(shù)據(jù),結(jié)束總線的全過程,從器件地
  237.           址sla,返回值在c.
  238.            如果返回1表示操作成功,否則操作有誤。
  239. 注意:    使用前必須已結(jié)束總線。
  240. ********************************************************************/
  241. bit IRcvByte(unsigned char suba,unsigned char *c)
  242. {
  243.    Start_I2c();               /*啟動總線*/
  244.    SendByte(0x0a2);            /*發(fā)送器件地址*/
  245.      if(ack==0)return(0);
  246.    SendByte(suba);            /*發(fā)送器件子地址*/
  247.      if(ack==0)return(0);

  248.    Start_I2c();                /*啟動總線*/
  249.    SendByte(0x0a3);           /*發(fā)送器件地址*/
  250.      if(ack==0)return(0);
  251.    *c=RcvByte();               /*讀取數(shù)據(jù)*/
  252.      Ack_I2c(1);               /*發(fā)送非就答位*/
  253.   Stop_I2c();                  /*結(jié)束總線*/
  254.   return(1);
  255. }

  256. /*******************************************************************
  257.                     向有子地址器件讀取多字節(jié)數(shù)據(jù)函數(shù)               
  258. 函數(shù)原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
  259. 功能:     從啟動總線到發(fā)送地址,子地址,讀數(shù)據(jù),結(jié)束總線的全過程,從器件
  260.           地址sla,子地址suba,讀出的內(nèi)容放入s指向的存儲區(qū),讀no個字節(jié)。
  261.            如果返回1表示操作成功,否則操作有誤。
  262. 注意:    使用前必須已結(jié)束總線。
  263. ********************************************************************/
  264. bit IRcvStr(unsigned char suba,unsigned char *s,unsigned char no)
  265. {
  266.    unsigned char i;

  267.    Start_I2c();               /*啟動總線*/
  268.    SendByte(0x0a2);            /*發(fā)送器件地址*/
  269.      if(ack==0)return(0);
  270.    SendByte(suba);            /*發(fā)送器件子地址*/
  271.      if(ack==0)return(0);

  272.    Start_I2c();
  273.    SendByte(0x0a3);
  274.       if(ack==0)return(0);

  275.    for(i=0;i<no-1;i++)
  276.     {   
  277.      *s=RcvByte();               /*發(fā)送數(shù)據(jù)*/
  278.       Ack_I2c(0);                /*發(fā)送就答位*/  
  279.      s++;
  280.     }
  281.    *s=RcvByte();
  282.     Ack_I2c(1);                 /*發(fā)送非應(yīng)位*/
  283. Stop_I2c();                    /*結(jié)束總線*/
  284.   return(1);
  285. }

  286. /**************************************************
  287. 函數(shù)名稱:set_rtc()
  288. 函數(shù)功能:BCD處理,將十進(jìn)制數(shù)轉(zhuǎn)化為BCD編碼(按十六進(jìn)制數(shù)計(jì)算)
  289. ***************************************************/                                 
  290. void set_rtc()          //設(shè)定時鐘數(shù)據(jù)(pcf8563芯片中的數(shù)據(jù)是以bcd形式存儲和處理)
  291. {  
  292.         ISendStr(0x02,tmpdate,7); //將數(shù)據(jù)寫入PCF8563相應(yīng)寄存器
  293. }

  294. /**************************************************
  295. 函數(shù)名稱:rtc_init()
  296. 函數(shù)功能:時鐘初始化        
  297. ***************************************************/        
  298. void rtc_init()                //時鐘初始化
  299. {
  300.   set_rtc();                                                        //將預(yù)設(shè)的時間進(jìn)行DEC->BCD轉(zhuǎn)換
  301.         ISendByte(0x00,0x00);
  302.         ISendByte(0x01,0x00);
  303. }

  304. /**************************************************
  305. 函數(shù)名稱:ead_rtc()
  306. 函數(shù)功能:讀時鐘函數(shù),將讀出的數(shù)據(jù)存入tmpdate緩存數(shù)組中
  307. ***************************************************/        
  308. void read_rtc()          //讀時鐘函數(shù),將讀出的數(shù)據(jù)存入tmpdate緩存數(shù)組中
  309. {
  310.         IRcvStr(0x02,tmpdate,7);
  311.         tmpdate[0]=tmpdate[0]&0x7f;        //秒
  312.         tmpdate[1]=tmpdate[1]&0x7f;        //分
  313.         tmpdate[2]=tmpdate[2]&0x3f;        //時
  314.         tmpdate[3]=tmpdate[3]&0x3f;        //日
  315.         tmpdate[4]=tmpdate[4]&0x07;        //星期
  316.         tmpdate[5]=tmpdate[5]&0xff;        //月
  317.         tmpdate[6]=tmpdate[6]&0xff;        //年
  318.         
  319. }

  320. void Delay100us()                //@11.0592MHz
  321. {
  322.         uchar i, j;

  323.         _nop_();
  324.         _nop_();
  325.         i = 2;
  326.         j = 15;
  327.         do
  328.         {
  329.                 while (--j);
  330.         } while (--i);
  331. }

  332. void SendData(char c)
  333. {
  334.         ES=0;
  335.         SBUF=c;
  336.         while(!TI);
  337.         TI=0;
  338.         ES=1;
  339.         Delay100us();
  340. }

  341. /**********************主函數(shù)*******************************************/
  342. void main()
  343. {
  344.         rtc_init();                                                        //時間初始化
  345.         Init();


  346.         while(1)
  347.         {         
  348.                 read_rtc();                                                                                                                //讀時間并處理
  349.                 SendData(tmpdate[6]);
  350.                 SendData(tmpdate[5]);
  351.                 SendData(tmpdate[3]);
  352.                 SendData(tmpdate[2]);
  353.                 SendData(tmpdate[1]);
  354.                 SendData(tmpdate[0]);

  355.         }               
  356. }

  357. void exter0() interrupt 1
  358. {
  359.         TL0 = 0xCD;                //設(shè)置定時初值
  360.         TH0 = 0xD4;                //設(shè)置定時初值
  361. }

  362. void ser() interrupt 4
  363. {
  364.         RI=0;
  365. }
復(fù)制代碼
輸出
  1. 201225173050
  2. 201225173050
  3. 201225173050
  4. 201225173050
  5. 201225173050
復(fù)制代碼

時鐘永遠(yuǎn)都是201225173050,不會改變。
希望大家?guī)蛶兔纯茨睦锍鲥e。
謝謝!



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:56960 發(fā)表于 2020-7-22 10:16 | 只看該作者
初乍看 很難看出問題在哪里的,我覺得最好是先檢查硬件,再查軟件,逐步排查吧!
回復(fù)

使用道具 舉報

板凳
ID:412523 發(fā)表于 2020-11-22 21:42 | 只看該作者
你把STOP位置一試下
回復(fù)

使用道具 舉報

地板
ID:88256 發(fā)表于 2020-11-22 23:41 | 只看該作者
201225173050是你設(shè)定的初始時間(可以改成2020年的時間了),你的主程序里 rtc_init(); 只是將初始化的數(shù)值寫入,并沒有調(diào)時的程序,所以時間肯定是2012年,加之沒有判斷,每次上電都寫入相同的數(shù)值,所以每次讀出肯定都是一樣的。你先把8563的備用電源加上,運(yùn)行一次程序,然后屏蔽325行的 set_rtc(); 并再次寫入程序,看看秒是不是有走?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品免费视频 | 国产99视频精品免费播放照片 | 男女羞羞视频在线看 | 日日干日日操 | 成人性视频在线播放 | 日韩欧美国产一区二区三区 | 久久久久久美女 | 国产精品一区二区三区四区五区 | 国产精品成人一区二区 | 国产网站在线免费观看 | 亚洲欧美激情精品一区二区 | 殴美黄色录像 | 欧美日韩国产免费 | 欧美午夜精品久久久久久浪潮 | 成人小视频在线观看 | 成人影院一区二区三区 | 国产精品毛片无码 | 亚洲色图综合网 | 欧美日韩国产不卡 | 久久欧美精品 | 91精品国产91 | 久久国产一区二区三区 | 99热99| 日韩欧美国产精品一区二区三区 | 中文字幕一区二区三区在线视频 | 国产美女视频一区 | 免费在线观看91 | 国产日产欧产精品精品推荐蛮挑 | 精品国产不卡一区二区三区 | 免费v片 | 天天综合网7799精品 | 国产精品毛片av一区 | 午夜影院在线观看 | av在线伊人 | 在线激情视频 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 国产欧美一级 | 久久久久久久一区 | 亚洲精品一区二区在线 | 欧美成人精品 | 国产欧美日韩综合精品一 |