標(biāo)題: ds1302時(shí)鐘數(shù)碼管數(shù)字顯示的很亂 怎么辦 程序也沒(méi)有錯(cuò)誤 [打印本頁(yè)]

作者: 李博文    時(shí)間: 2018-7-24 14:32
標(biāo)題: ds1302時(shí)鐘數(shù)碼管數(shù)字顯示的很亂 怎么辦 程序也沒(méi)有錯(cuò)誤
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define MAIN_Fosc    11059200UL

  4. /*自定義類型明*/
  5. typedef unsigned char INT8U;
  6. typedef unsigned char uchar;

  7. typedef unsigned int INT16U;
  8. typedef unsigned int uint;
  9. /*聲明硬件的接口*/
  10. sbit TSCLK = P1^0;//時(shí)鐘線
  11. sbit TIO = P1^1;  //數(shù)據(jù)線
  12. sbit TRST = P1^2; //使能端

  13. sbit DU = P2^6;//段選
  14. sbit WE = P2^7;//位選
  15. /*共陽(yáng)極數(shù)碼管段選碼*/
  16. uchar code table[]={
  17. //         0                1           2          3                  4                5
  18.         0xc0,  0xf9,  0xa4,  0xb0,  0x99,  0x92,  
  19. //         6                 7                8           9          .                 關(guān)顯示
  20.     0x82,  0xf8,  0x80,  0x90,  0x7f,   0xff
  21. };
  22. /*位選碼*/
  23. uchar code T_COM[] = {
  24. //1      2     3       4     5      6
  25. 0x01,  0x02,  0x04,  0x08,  0x10,  0x20
  26. };
  27. /*延時(shí)函數(shù)*/
  28. void Delay_Ms(INT16U ms)
  29. {
  30.   INT16U i;
  31.   do{
  32.             i = MAIN_Fosc/96000;
  33.           while(--i);
  34.     }while(--ms);
  35. }
  36. /*顯示函數(shù)*/
  37. void Display(uchar Hour,Min,Sec)
  38. {
  39.    //第一位數(shù)碼管 小時(shí)十位
  40.    DU = 0;
  41.    P0 = table[Hour/10];
  42.    DU = 1;
  43.    DU = 0;

  44.    WE = 0;
  45.    P0 = T_COM[0];
  46.    WE = 1;
  47.    WE = 0;
  48.    Delay_Ms(3);
  49.    //第二位數(shù)碼管 小時(shí)個(gè)位
  50.    DU = 0;
  51.    P0 = table[Hour%10] | 0x7f;// 0111 1111 顯示小數(shù)點(diǎn)
  52.    DU = 1;
  53.    DU = 0;

  54.    WE = 0;
  55.    P0 = T_COM[1];
  56.    WE = 1;
  57.    WE = 0;
  58.    Delay_Ms(3);
  59.    //第三位數(shù)碼管
  60.    DU = 0;
  61.    P0 = table[Min/10];
  62.    DU = 1;
  63.    DU = 0;

  64.    WE = 0;
  65.    P0 = T_COM[2];
  66.    WE = 1;
  67.    WE = 0;
  68.    Delay_Ms(3);
  69.    //第四位數(shù)碼管
  70.    DU = 0;
  71.    P0 = table[Min%10] | 0x7f;
  72.    DU = 1;
  73.    DU = 0;

  74.    WE = 0;
  75.    P0 = T_COM[3];
  76.    WE = 1;
  77.    WE = 0;
  78.    Delay_Ms(3);
  79.    //第五位數(shù)碼管
  80.    DU = 0;
  81.    P0 = table[Sec/10];
  82.    DU = 1;
  83.    DU = 0;
  84.    
  85.    WE = 0;
  86.    P0 = T_COM[4];
  87.    WE = 1;
  88.    WE = 0;
  89.    Delay_Ms(3);
  90.    //第六位數(shù)碼管
  91.    DU = 0;
  92.    P0 = table[Sec%10];
  93.    DU = 1;
  94.    DU = 0;

  95.    WE = 0;
  96.    P0 = T_COM[5];
  97.    WE = 1;
  98.    WE = 0;
  99.    Delay_Ms(3);
  100. }
  101. //寫DS1302
  102. void Writer_DS1302_DAT(uchar cmd,uchar dat)         //命令和數(shù)據(jù)需要給出
  103. {
  104.     uchar i;
  105.         TRST = 0;
  106.         TSCLK = 0;
  107.         TRST = 1;
  108.         for(i = 0; i < 8; i++)
  109.           {
  110.             TSCLK = 0;
  111.                 TIO = cmd & 0x01;
  112.                 TSCLK = 1;//拉高時(shí)鐘總線接收數(shù)據(jù)
  113.             dat >>= 1;//右移一位 往最低位移 左移往最高位移          從低位開始發(fā)送 需右移 把八位數(shù)據(jù)出  從高位發(fā)送需左移
  114.       }
  115.    for(i = 0; i < 8; i++)
  116.       {
  117.          TSCLK = 0;
  118.                  TIO  = dat & 0x01;
  119.                  TSCLK = 1;
  120.                  dat >>= 1;  
  121.       }
  122. }
  123. //讀DS1302數(shù)據(jù)
  124. uchar Read_DS1302_DAT(uchar cmd)
  125. {
  126.    uchar i, dat;
  127.    TRST = 0;
  128.    TSCLK = 0;
  129.    TRST = 1;
  130.    for(i = 0;i < 8; i++)// 寫入命令
  131.    {
  132.                TSCLK = 0;
  133.                 TIO = cmd & 0x01;
  134.                 TSCLK = 1;
  135.                 dat >>= 1; //
  136.    }
  137.    for(i = 0; i < 8 ; i++)// 讀八次
  138.    {
  139.        TSCLK  = 0;
  140.            dat >>= 1;
  141.            if(TIO) dat |= 0x80;
  142.            TSCLK = 1;
  143.         }
  144.         return dat;
  145. }

  146. //數(shù)據(jù)轉(zhuǎn)BCD
  147. uchar Dat_Chg_BCD(uchar dat)
  148. {
  149.      uchar dat1,dat2;
  150.          dat1 = dat / 10;
  151.          dat2 = dat % 10;
  152.          dat2 = dat2 + dat1 * 16;
  153.          return dat2;
  154. }

  155. //BCD轉(zhuǎn)數(shù)據(jù)
  156. uchar BCD_Chg_Dat(uchar dat)
  157. {
  158.     uchar dat1,dat2;
  159.         dat1 = dat / 16;
  160.         dat2 = dat % 16;
  161.         dat2 = dat2 + dat1 * 10;
  162.         return dat2;
  163. }
  164. void main()
  165. {
  166.    uchar i;
  167.    uchar Sec,Min,Hour;
  168.    Writer_DS1302_DAT(0x8e, 0);
  169.    Writer_DS1302_DAT(0x80,Dat_Chg_BCD(30));
  170.    Writer_DS1302_DAT(0x82,Dat_Chg_BCD(15));
  171.    Writer_DS1302_DAT(0x84,Dat_Chg_BCD(19));
  172.    Writer_DS1302_DAT(0x8e,0x80);
  173.    while(1)
  174.    {
  175.      Writer_DS1302_DAT(0x8e,0);
  176.          Sec = BCD_Chg_Dat(Read_DS1302_DAT(0x81));
  177.          Min = BCD_Chg_Dat(Read_DS1302_DAT(0x83));
  178.          Hour = BCD_Chg_Dat(Read_DS1302_DAT(0x85));
  179.          Writer_DS1302_DAT(0x8e,0x80);
  180.          for(i = 0;i < 50; i++)
  181.          {
  182.             Display(Hour,Min,Sec);
  183.          }
  184.      }
  185. }
復(fù)制代碼

為什么仿真的時(shí)候 數(shù)碼管顯示數(shù)字很亂

捕獲3.PNG (59.75 KB, 下載次數(shù): 46)

捕獲3.PNG

作者: zl2168    時(shí)間: 2018-7-30 20:53
本帖最后由 zl2168 于 2018-7-31 09:49 編輯

實(shí)例94  模擬電子鐘(由80C51定時(shí)器產(chǎn)生秒時(shí)基)
Proteus仿真一下,確認(rèn)有效。
實(shí)例94 模擬電子鐘(由80C51定時(shí)器產(chǎn)生秒時(shí)基).rar (43.05 KB, 下載次數(shù): 6)

以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1,內(nèi)有常用的單片機(jī)應(yīng)用100案例,用于仿真實(shí)驗(yàn)操作,電路與程序真實(shí)可靠可信可行。書中電路和程序設(shè)計(jì)有詳細(xì)說(shuō)明,程序語(yǔ)句條條有注解。

作者: xsk    時(shí)間: 2018-7-31 00:59
位選碼和段選碼和延遲




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1