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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)換晶振后Ds1302時間走快的問題?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:653305 發(fā)表于 2020-7-1 18:44 來自觸屏版 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
我開始用的芯片是stc 89c51,晶振是11.0592M,
現(xiàn)在改用了stc 12c5a60s2芯片,速度是傳統(tǒng)芯片的12倍,晶振采用的是33.177M,然后時間顯示總是比較快,不知道怎么調(diào)試這個程序,滿足時序要求
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:94031 發(fā)表于 2020-7-1 20:19 | 只看該作者
肯定是先讀懂有關(guān)程序才可下手。
回復(fù)

使用道具 舉報

板凳
ID:94031 發(fā)表于 2020-7-1 20:24 | 只看該作者
按道理 Ds1302走時快慢與單片機(jī)換晶振無關(guān),Ds1302有自己晶振。
回復(fù)

使用道具 舉報

地板
ID:789121 發(fā)表于 2020-7-1 20:42 | 只看該作者
是顯示的更新速率快,還是時間不對,理論上時間只跟Ds1302的晶振有關(guān)系。如果更新速率快。更改延時函數(shù)
回復(fù)

使用道具 舉報

5#
ID:452950 發(fā)表于 2020-7-1 21:00 | 只看該作者
DS1302自己用的是32768M的晶振,只要這個晶振沒問題就可以了
回復(fù)

使用道具 舉報

6#
ID:653305 發(fā)表于 2020-7-1 21:03 來自觸屏版 | 只看該作者
不要黑 發(fā)表于 2020-7-1 20:42
是顯示的更新速率快,還是時間不對,理論上時間只跟Ds1302的晶振有關(guān)系。如果更新速率快。更改延時函數(shù)

更新速率很快
回復(fù)

使用道具 舉報

7#
ID:653305 發(fā)表于 2020-7-1 21:04 來自觸屏版 | 只看該作者
xxpp2011 發(fā)表于 2020-7-1 21:00
DS1302自己用的是32768M的晶振,只要這個晶振沒問題就可以了

那單片機(jī)的晶振,進(jìn)入中斷的時間設(shè)置有關(guān)嗎了吧?
回復(fù)

使用道具 舉報

8#
ID:653305 發(fā)表于 2020-7-1 21:05 來自觸屏版 | 只看該作者
不要黑 發(fā)表于 2020-7-1 20:42
是顯示的更新速率快,還是時間不對,理論上時間只跟Ds1302的晶振有關(guān)系。如果更新速率快。更改延時函數(shù)

那要在哪里延時呢?
回復(fù)

使用道具 舉報

9#
ID:452950 發(fā)表于 2020-7-1 21:16 | 只看該作者
STC12比51要快,所以原來的延時函數(shù)本來能拖延足夠時間,但是換成12以后實(shí)際延時時長就短了,所以要把延時函數(shù)的參數(shù)增大,具體數(shù)值可以用軟件算
回復(fù)

使用道具 舉報

10#
ID:789121 發(fā)表于 2020-7-1 21:19 | 只看該作者
栗文化 發(fā)表于 2020-7-1 21:05
那要在哪里延時呢?

看看顯示函數(shù)后面有沒有,或者把程序貼一下
回復(fù)

使用道具 舉報

11#
ID:653305 發(fā)表于 2020-7-1 21:48 來自觸屏版 | 只看該作者
不要黑 發(fā)表于 2020-7-1 21:19
看看顯示函數(shù)后面有沒有,或者把程序貼一下
  1. #include <STC12C5A60S2.H>
  2. #include "intrins.h"
  3. sbit DS1302_CE = P0^0;
  4. sbit DS1302_CK = P0^1;
  5. sbit DS1302_IO = P0^2;

  6. bit flag200ms = 0;       //200ms定時標(biāo)志
  7. unsigned char T0RH = 0;  //T0重載值的高字節(jié)
  8. unsigned char T0RL = 0;  //T0重載值的低字節(jié)

  9. void ConfigTimer0(unsigned int ms);
  10. void InitDS1302();
  11. unsigned char DS1302SingleRead(unsigned char reg);
  12. extern void InitLcd1602();
  13. extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);

  14. void main()
  15. {
  16.     unsigned char i;
  17.     unsigned char psec=0xAA;  //秒備份,初值A(chǔ)A確保首次讀取時間后會刷新顯示
  18.     unsigned char time[8];    //當(dāng)前時間數(shù)組
  19.     unsigned char str[12];    //字符串轉(zhuǎn)換緩沖區(qū)

  20.     EA = 1;           //開總中斷
  21.     ConfigTimer0(1);  //T0定時1ms
  22.     InitDS1302();     //初始化實(shí)時時鐘
  23.     InitLcd1602();    //初始化液晶
  24.    
  25.     while (1)
  26.     {
  27.         if (flag200ms)  //每200ms讀取依次時間
  28.         {
  29.             flag200ms = 0;
  30.             for (i=0; i<7; i++)  //讀取DS1302當(dāng)前時間
  31.             {
  32.                 time[i] = DS1302SingleRead(i);
  33.             }
  34.             if (psec != time[0]) //檢測到時間有變化時刷新顯示
  35.             {
  36.                 str[0] = '2';  //添加年份的高2位:20
  37.                 str[1] = '0';
  38.                 str[2] = (time[6] >> 4) + '0';  //“年”高位數(shù)字轉(zhuǎn)換為ASCII碼
  39.                 str[3] = (time[6]&0x0F) + '0';  //“年”低位數(shù)字轉(zhuǎn)換為ASCII碼
  40.                 str[4] = '-';  //添加日期分隔符
  41.                 str[5] = (time[4] >> 4) + '0';  //“月”
  42.                 str[6] = (time[4]&0x0F) + '0';
  43.                 str[7] = '-';
  44.                 str[8] = (time[3] >> 4) + '0';  //“日”
  45.                 str[9] = (time[3]&0x0F) + '0';
  46.                 str[10] = '\0';
  47.                 LcdShowStr(0, 0, str);  //顯示到液晶的第一行
  48.                
  49.                 str[0] = (time[5]&0x0F) + '0';  //“星期”
  50.                 str[1] = '\0';
  51.                 LcdShowStr(11, 0, "week");
  52.                 LcdShowStr(15, 0, str);  //顯示到液晶的第一行
  53.                
  54.                 str[0] = (time[2] >> 4) + '0';  //“時”
  55.                 str[1] = (time[2]&0x0F) + '0';
  56.                 str[2] = ':';  //添加時間分隔符
  57.                 str[3] = (time[1] >> 4) + '0';  //“分”
  58.                 str[4] = (time[1]&0x0F) + '0';
  59.                 str[5] = ':';
  60.                 str[6] = (time[0] >> 4) + '0';  //“秒”
  61.                 str[7] = (time[0]&0x0F) + '0';
  62.                 str[8] = '\0';
  63.                 LcdShowStr(4, 1, str);  //顯示到液晶的第二行
  64.                
  65.                 psec = time[0];  //用當(dāng)前值更新上次秒數(shù)
  66.             }
  67.         }
  68.     }
  69. }

  70. void BusDelay()
  71. {
  72.     _nop_();
  73.     _nop_();
  74.           _nop_();
  75.     _nop_();
  76.    
  77. }

  78. /* 發(fā)送一個字節(jié)到DS1302通信總線上 */
  79. void DS1302ByteWrite(unsigned char dat)
  80. {
  81.     unsigned char mask;
  82.    
  83.     for (mask=0x01; mask!=0; mask<<=1)  //低位在前,逐位移出
  84.     {


  85.         if ((mask&dat) != 0) //首先輸出該位數(shù)據(jù)
  86.             DS1302_IO = 1;
  87.         else
  88.             DS1302_IO = 0;
  89.                                 DS1302_CK = 1;                                //然后拉高時鐘
  90.                                 BusDelay();
  91.         DS1302_CK = 0;       //再拉低時鐘,完成一個位的操作
  92.     }
  93.     DS1302_IO = 1;           //最后確保釋放IO引腳
  94. }
  95. /* 由DS1302通信總線上讀取一個字節(jié) */
  96. unsigned char DS1302ByteRead()
  97. {
  98.     unsigned char mask;
  99.     unsigned char dat = 0;

  100.     for (mask=0x01; mask!=0; mask<<=1)  //低位在前,逐位讀取
  101.     {
  102.         if (DS1302_IO != 0)  //首先讀取此時的IO引腳,并設(shè)置dat中的對應(yīng)位
  103.         {
  104.             dat |= mask;
  105.         }
  106.                                     DS1302_CK = 1;                                 //然后拉高時
  107.                                     BusDelay();
  108.             DS1302_CK = 0;       //再拉低時鐘,完成一個位的操作

  109.     }
  110.     return dat;              //最后返回讀到的字節(jié)數(shù)據(jù)
  111. }
  112. /* 用單次寫操作向某一寄存器寫入一個字節(jié),reg-寄存器地址,dat-待寫入字節(jié) */
  113. void DS1302SingleWrite(unsigned char reg, unsigned char dat)
  114. {
  115.     DS1302_CE = 1;                   //使能片選信號
  116.     DS1302ByteWrite((reg<<1)|0x80);  //發(fā)送寫寄存器指令
  117.     DS1302ByteWrite(dat);            //寫入字節(jié)數(shù)據(jù)
  118.     DS1302_CE = 0;                   //除能片選信號
  119. }
  120. /* 用單次讀操作從某一寄存器讀取一個字節(jié),reg-寄存器地址,返回值-讀到的字節(jié) */
  121. unsigned char DS1302SingleRead(unsigned char reg)
  122. {
  123.     unsigned char dat;
  124.    
  125.     DS1302_CE = 1;                   //使能片選信號
  126.     DS1302ByteWrite((reg<<1)|0x81);  //發(fā)送讀寄存器指令
  127.     dat = DS1302ByteRead();          //讀取字節(jié)數(shù)據(jù)
  128.     DS1302_CE = 0;                   //除能片選信號
  129.    
  130.     return dat;
  131. }
  132. /* DS1302初始化,如發(fā)生掉電則重新設(shè)置初始時間 */
  133. void InitDS1302()
  134. {
  135.     unsigned char i;
  136.     unsigned char code InitTime[] = {  
  137.         0x70,0x30,0x07, 0x30, 0x05, 0x06, 0x21
  138.     };
  139.    
  140.     DS1302_CE = 0;  //初始化DS1302通信引腳
  141.     DS1302_CK = 0;
  142.     i = DS1302SingleRead(0);  //讀取秒寄存器
  143.     if ((i & 0x80) != 0)      //由秒寄存器最高位CH的值判斷DS1302是否已停止
  144.     {
  145.         DS1302SingleWrite(7, 0x00);  //撤銷寫保護(hù)以允許寫入數(shù)據(jù)
  146.         for (i=0; i<7; i++)          //設(shè)置DS1302為默認(rèn)的初始時間
  147.         {
  148.             DS1302SingleWrite(i, InitTime[i]);
  149.         }
  150.     }
  151. }
  152. /* 配置并啟動T0,ms-T0定時時間 */
  153. void ConfigTimer0(unsigned int ms)
  154. {
  155.     unsigned long tmp;  //臨時變量
  156.     AUXR=0x80;          //不分頻
  157.     tmp = 33177600;     //定時器計數(shù)頻率
  158.     tmp = (tmp * ms) / 1000;  //計算所需的計數(shù)值
  159.     tmp = 65536 - tmp;        //計算定時器重載值
  160.     tmp = tmp + 28;           //補(bǔ)償中斷響應(yīng)延時造成的誤差
  161.     T0RH = (unsigned char)(tmp>>8);  //定時器重載值拆分為高低字節(jié)
  162.     T0RL = (unsigned char)tmp;
  163.     TMOD &= 0xF0;   //清零T0的控制位
  164.     TMOD |= 0x01;   //配置T0為模式1
  165.     TH0 = T0RH;     //加載T0重載值
  166.     TL0 = T0RL;
  167.     ET0 = 1;        //使能T0中斷
  168.     TR0 = 1;        //啟動T0
  169. }
  170. /* T0中斷服務(wù)函數(shù),執(zhí)行200ms定時 */
  171. void InterruptTimer0() interrupt 1
  172. {
  173.     static unsigned int tmr200ms = 0;
  174.    
  175.     TH0 = T0RH;  //重新加載重載值
  176.     TL0 = T0RL;
  177.     tmr200ms++;
  178.     if (tmr200ms >= 200)  //定時200ms
  179.     {
  180.         tmr200ms = 0;
  181.         flag200ms = 1;
  182.     }
  183. }
復(fù)制代碼
回復(fù)

使用道具 舉報

12#
ID:653305 發(fā)表于 2020-7-2 08:32 來自觸屏版 | 只看該作者
不要黑 發(fā)表于 2020-7-1 21:19
看看顯示函數(shù)后面有沒有,或者把程序貼一下

幫忙看一下,哪里的思路有誤
回復(fù)

使用道具 舉報

13#
ID:298952 發(fā)表于 2020-7-2 09:14 | 只看該作者
DS1302的時間改變的速度是與自身攜帶的晶振有關(guān),正常用32.768k。
回復(fù)

使用道具 舉報

14#
ID:653305 發(fā)表于 2020-7-2 09:31 來自觸屏版 | 只看該作者
1224527279 發(fā)表于 2020-7-2 09:14
DS1302的時間改變的速度是與自身攜帶的晶振有關(guān),正常用32.768k。

DS1302的晶振就是這個數(shù),讀時序,和寫時序不滿足要求也會出現(xiàn)這種情況嘛?
回復(fù)

使用道具 舉報

15#
ID:1064915 發(fā)表于 2023-4-24 15:44 | 只看該作者
unsigned char code InitTime[] = {  
        0x70,0x30,0x07, 0x30, 0x05, 0x06, 0x21
    };
秒不能大于59
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 美女视频黄色的 | 亚洲男人天堂 | 免费的日批视频 | 一级高清免费毛片 | 国产免费a视频 | 国产精品不卡 | 99精品一区二区三区 | 欧美中文字幕一区二区三区亚洲 | 99亚洲| 亚洲欧美一区二区三区视频 | 欧洲视频一区 | 亚洲天堂精品久久 | 国产99热在线 | 91视视频在线观看入口直接观看 | 91久久夜色精品国产网站 | 亚洲成人一二三 | 日本三级精品 | 亚洲精品成人网 | 91精品国产自产精品男人的天堂 | 伊人色综合久久久天天蜜桃 | 亚洲一区二区三区四区五区中文 | 久久久影院| av在线电影网 | 欧美日韩1区2区 | julia中文字幕久久一区二区 | 欧美视频第二页 | 国产999精品久久久 日本视频一区二区三区 | 国产99久久久久 | 中国人pornoxxx麻豆 | 国产综合精品一区二区三区 | 在线国产小视频 | 日韩超碰 | 九九九视频在线 | 国产视频中文字幕 | 国产亚洲精品久久情网 | 中文字幕1区 | 日韩在线免费视频 | 日韩一区二区三区在线观看 | 久久久蜜桃一区二区人 | 国产成人aⅴ | 91精品入口蜜桃 |