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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2919|回復: 10
打印 上一主題 下一主題
收起左側

求助 數碼管做個簡單單片機時鐘的秒數問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:284781 發表于 2018-2-22 16:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 imlwg 于 2018-2-22 16:16 編輯

德飛萊hc6800-es v2.0單片機,八位數碼管做個簡單時鐘,1毫秒中斷,運行后發現一秒的時間和現實相差太多,以下是代碼,請教各位大蝦是哪兒出了問題。

  1. #include<reg52.h>
  2. #include<intrins.h>

  3. #define duanxian P0

  4. sbit led138c=P2^4;
  5. sbit led138b=P2^3;
  6. sbit led138a=P2^2;
  7. unsigned char  duan[11]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};

  8. void timeinit();
  9. void displayinit();
  10.   void display();
  11.   void dely(unsigned int dat){while(dat--);}


  12. unsigned long int cnt=0;
  13. unsigned int sec=0,min=0,hour=0;
  14. unsigned char temp,b=0x00;

  15. void main()
  16. {        
  17.            timeinit();         
  18.     displayinit();
  19.    
  20.     while(1);
  21.         

  22.   
  23.   }
  24.   
  25.   void timeinit()
  26.   {
  27.           TMOD |=0X01;
  28.         TH0=0XFC;
  29.         TL0=0X18;
  30.         ET0=1;
  31.         EA=1;
  32.         TR0=1;
  33.   }        
  34.   
  35.   void displayinit()
  36.   {
  37.           unsigned int n=0;
  38.          do
  39.                 {        for(n=0;n<8;n++)
  40.                     {
  41.                     switch(n)
  42.                         {
  43.                                    case(0): led138c=0;led138b=0;led138a=0;duanxian=duan[0];break;
  44.                                    case(1): led138c=0;led138b=0;led138a=1;duanxian=duan[0];break;
  45.                               case(2): led138c=0;led138b=1;led138a=0;duanxian=0x80;break;
  46.                     case(3): led138c=0;led138b=1;led138a=1;duanxian=duan[0];break;
  47.                     case(4): led138c=1;led138b=0;led138a=0;duanxian=duan[0];break;
  48.                     case(5): led138c=1;led138b=0;led138a=1;duanxian=0x80;break;
  49.                     case(6): led138c=1;led138b=1;led138a=0;duanxian=duan[0];break;
  50.                     case(7): led138c=1;led138b=1;led138a=1;duanxian=duan[0];break;
  51.                 };
  52.                dely(100);
  53.                duanxian=0x00;
  54.                    };
  55.             }while(TF0==0);
  56.   }

  57.   void time0() interrupt 1
  58.   {
  59.    
  60.           TH0=0XFC;
  61.         TL0=0X18;
  62.         cnt++;
  63.         display();
  64.         if(cnt==100)
  65.         {
  66.                 cnt=0;
  67.                 sec++;
  68.                 temp=duan[10];
  69.             duan[10]=b;
  70.             b=temp;

  71.         };
  72.         if(sec==60){sec=0;min++;};
  73.         if(min==60){min=0;hour++;}
  74.         if(hour==24)hour=0;
  75.   }

  76.   void display()
  77.   {
  78.   
  79.         unsigned int a;
  80.    for(a=0;a<8;a++)
  81.         {
  82.       switch(a)
  83.           {case(0): led138c=0;led138b=0;led138a=0;duanxian=duan[sec%10];break;
  84.            case(1): led138c=0;led138b=0;led138a=1;duanxian=duan[sec/10%10];break;
  85.            case(2): led138c=0;led138b=1;led138a=0;duanxian=duan[10];break;
  86.            case(3): led138c=0;led138b=1;led138a=1;duanxian=duan[min%10];break;
  87.            case(4): led138c=1;led138b=0;led138a=0;duanxian=duan[min/10%10];break;
  88.            case(5):led138c=1;led138b=0;led138a=1;duanxian=duan[10];break;
  89.            case(6): led138c=1;led138b=1;led138a=0;duanxian=duan[hour%10];break;
  90.            case(7): led138c=1;led138b=1;led138a=1;duanxian=duan[hour/10%10];break;
  91.            };
  92.           dely(100);
  93.            duanxian=0x00;
  94.            };
  95.          
  96.            

  97.   }
復制代碼


HC6800-ES V2.0.pdf

404.98 KB, 下載次數: 6

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

使用道具 舉報

沙發
ID:243146 發表于 2018-2-22 17:03 | 只看該作者
試試 TL0=0X66;
回復

使用道具 舉報

板凳
ID:213173 發表于 2018-2-22 17:51 | 只看該作者
你的中斷周期設置1ms,可是中斷服務任務內容需要近8ms才能完成,時間怎么可能正確?
回復

使用道具 舉報

地板
ID:123289 發表于 2018-2-22 18:19 | 只看該作者
普通晶振,如果程序寫得好,日差可以做到一秒之內。
樓主用1ms中斷,一般程序可以做到是日差是:
一天有86400000個1ms,每次中斷會有±0.5時基脈沖的誤差。
例:用12M,標準51的時基是1us。
則不可控日誤差是:86400000*1us=86.4秒。
而要達成日差一秒之內,必須改變中斷參數,初學者能做到百秒以內也可以了。
回復

使用道具 舉報

5#
ID:284781 發表于 2018-2-23 19:40 | 只看該作者
wulin 發表于 2018-2-22 17:51
你的中斷周期設置1ms,可是中斷服務任務內容需要近8ms才能完成,時間怎么可能正確?

謝謝,你說的很對,后來我把顯示放在了主程序while循環中,秒顯示改善很多,但還不夠精準,大約一分鐘慢了一秒半的樣子。還請教是哪的問題。

  1. #include<reg52.h>
  2. #include<intrins.h>

  3. #define duanxian P0

  4. sbit led138c=P2^4;
  5. sbit led138b=P2^3;
  6. sbit led138a=P2^2;
  7. unsigned char  duan[11]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};

  8. void timeinit();
  9. void displayinit();
  10.   void display();
  11.   void dely(unsigned int dat){while(dat--);}


  12. unsigned long int cnt=0;
  13. unsigned int sec=0,min=0,hour=0;
  14. unsigned char temp,b=0x00;

  15. void main()
  16. {       
  17.            timeinit();         
  18.     displayinit();
  19.    
  20.     while(1){        display();};
  21.        

  22.   
  23.   }
  24.   
  25.   void timeinit()
  26.   {
  27.           TMOD |=0X01;
  28.         TH0=0XFC;
  29.         TL0=0X18;
  30.         ET0=1;
  31.         EA=1;
  32.         TR0=1;
  33.   }       
  34.   
  35.   void displayinit()
  36.   {
  37.           unsigned int n=0;
  38.          do
  39.                 {        for(n=0;n<8;n++)
  40.                     {
  41.                     switch(n)
  42.                         {
  43.                                    case(0): led138c=0;led138b=0;led138a=0;duanxian=duan[0];break;
  44.                                    case(1): led138c=0;led138b=0;led138a=1;duanxian=duan[0];break;
  45.                               case(2): led138c=0;led138b=1;led138a=0;duanxian=0x80;break;
  46.                     case(3): led138c=0;led138b=1;led138a=1;duanxian=duan[0];break;
  47.                     case(4): led138c=1;led138b=0;led138a=0;duanxian=duan[0];break;
  48.                     case(5): led138c=1;led138b=0;led138a=1;duanxian=0x80;break;
  49.                     case(6): led138c=1;led138b=1;led138a=0;duanxian=duan[0];break;
  50.                     case(7): led138c=1;led138b=1;led138a=1;duanxian=duan[0];break;
  51.                 };
  52.                dely(100);
  53.                duanxian=0x00;
  54.                    };
  55.             }while(TF0==0);
  56.   }

  57.   void time0() interrupt 1
  58.   {
  59.    
  60.           TH0=0XFC;
  61.         TL0=0X18;
  62.         cnt++;
  63. //        display();
  64.         if(cnt==1000)
  65.         {
  66.                 cnt=0;
  67.                 sec++;
  68.                 temp=duan[10];
  69.             duan[10]=b;
  70.             b=temp;

  71.         };
  72.         if(sec==60){sec=0;min++;};
  73.         if(min==60){min=0;hour++;}
  74.         if(hour==24)hour=0;
  75.   }

  76.   void display()
  77.   {
  78.   
  79.         unsigned int a;
  80.    for(a=0;a<8;a++)
  81.         {
  82.       switch(a)
  83.           {case(0): led138c=0;led138b=0;led138a=0;duanxian=duan[sec%10];break;
  84.            case(1): led138c=0;led138b=0;led138a=1;duanxian=duan[sec/10%10];break;
  85.            case(2): led138c=0;led138b=1;led138a=0;duanxian=duan[10];break;
  86.            case(3): led138c=0;led138b=1;led138a=1;duanxian=duan[min%10];break;
  87.            case(4): led138c=1;led138b=0;led138a=0;duanxian=duan[min/10%10];break;
  88.            case(5):led138c=1;led138b=0;led138a=1;duanxian=duan[10];break;
  89.            case(6): led138c=1;led138b=1;led138a=0;duanxian=duan[hour%10];break;
  90.            case(7): led138c=1;led138b=1;led138a=1;duanxian=duan[hour/10%10];break;
  91.            };
  92.           dely(100);
  93.            duanxian=0x00;
  94.            };
  95.           
  96.           

  97.   }
復制代碼

回復

使用道具 舉報

6#
ID:284781 發表于 2018-2-23 19:50 | 只看該作者
yzwzfyz 發表于 2018-2-22 18:19
普通晶振,如果程序寫得好,日差可以做到一秒之內。
樓主用1ms中斷,一般程序可以做到是日差是:
一天有8 ...

謝謝,這樣的話用中斷做時鐘微調中斷參數只有用實踐來檢驗程序的可用性了,感覺心里怪怪的。用ds1302能做精準嗎?我目前還沒學到1302.
回復

使用道具 舉報

7#
ID:284781 發表于 2018-2-23 20:31 | 只看該作者
中斷改為10毫秒效果好了很多。
回復

使用道具 舉報

8#
ID:213173 發表于 2018-2-24 12:02 | 只看該作者
本帖最后由 wulin 于 2018-2-24 15:35 編輯
imlwg 發表于 2018-2-23 19:50
謝謝,這樣的話用中斷做時鐘微調中斷參數只有用實踐來檢驗程序的可用性了,感覺心里怪怪的。用ds1302能做 ...

定時器用8位自動重裝模式,周期250us,調整TH0、TL0值粗調,調整中斷計數微調,精度可以控制在日秒內。
#include<reg52.h>
#include<intrins.h>
#define duanxian P0
sbit led138c=P2^4;
sbit led138b=P2^3;
sbit led138a=P2^2;
unsigned char  duan[11]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};
void timeinit();
void displayinit();
void display();
unsigned int cnt250us=0;
unsigned char sec=0,min=0,hour=12;
unsigned char temp,b=0x00;
bit ms_flag=0;
//void dely(unsigned int dat){while(dat--);}

void main()
{        
        timeinit();         
//        displayinit();//此函數沒有意義
        while(1)
        {        

                display();
        }
}
void timeinit()                //250微秒@12.000MHz
{
        TMOD |= 0x02;                //設置定時器模式
        TL0 = 0x06;                //設置定時初值                +-粗調
        TH0 = 0x06;                //設置定時重載值  +-粗調
        TR0 = 1;                //定時器0開始計時
        ET0=1;
        EA=1;
}
/*
void displayinit()
{
        unsigned int n=0;
        do
        {        
                for(n=0;n<8;n++)
                {
                        switch(n)
                        {
                                case(0): led138c=0;led138b=0;led138a=0;duanxian=duan[0];break;
                                case(1): led138c=0;led138b=0;led138a=1;duanxian=duan[0];break;
                                case(2): led138c=0;led138b=1;led138a=0;duanxian=0x40;break;
                                case(3): led138c=0;led138b=1;led138a=1;duanxian=duan[0];break;
                                case(4): led138c=1;led138b=0;led138a=0;duanxian=duan[0];break;
                                case(5): led138c=1;led138b=0;led138a=1;duanxian=0x40;break;
                                case(6): led138c=1;led138b=1;led138a=0;duanxian=duan[0];break;
                                case(7): led138c=1;led138b=1;led138a=1;duanxian=duan[0];break;
                        }
                        dely(100);
                        duanxian=0x00;
                }
        }while(TF0);
}
*/
void time0() interrupt 1
{
        cnt250us++;
        if(cnt250us%4==0)
                ms_flag=1;
        if(cnt250us>=4000)//+-可以微調
        {
                cnt250us=0;
                sec++;
                temp=duan[10];
                duan[10]=b;
                b=temp;
        }
        if(sec>=60){sec=0;min++;};
        if(min>=60){min=0;hour++;}
        if(hour>=24)hour=0;
}

void display()
{
        static unsigned char a=0;
//        for(a=0;a<8;a++)
//        {
        if(ms_flag==1)//1ms循環顯示1位
        {
                ms_flag=0;
                duanxian=0x00;
                switch(a)
                {
                        case(0): led138c=0;led138b=0;led138a=0;duanxian=duan[sec%10];a++;break;
                        case(1): led138c=0;led138b=0;led138a=1;duanxian=duan[sec/10%10];a++;break;
                        case(2): led138c=0;led138b=1;led138a=0;duanxian=duan[10];a++;break;
                        case(3): led138c=0;led138b=1;led138a=1;duanxian=duan[min%10];a++;break;
                        case(4): led138c=1;led138b=0;led138a=0;duanxian=duan[min/10%10];a++;break;
                        case(5): led138c=1;led138b=0;led138a=1;duanxian=duan[10];a++;break;
                        case(6): led138c=1;led138b=1;led138a=0;duanxian=duan[hour%10];a++;break;
                        case(7): led138c=1;led138b=1;led138a=1;duanxian=duan[hour/10%10];a=0;break;
                }
        //        dely(100);
        //        duanxian=0x00;
        }
}
回復

使用道具 舉報

9#
ID:284781 發表于 2018-2-25 07:33 來自手機 | 只看該作者
wulin 發表于 2018-2-24 12:02
定時器用8位自動重裝模式,周期250us,調整TH0、TL0值粗調,調整中斷計數微調,精度可以控制在日秒內。
...

謝謝,我上機試試。
回復

使用道具 舉報

10#
ID:284781 發表于 2018-2-25 07:43 來自手機 | 只看該作者
wulin 發表于 2018-2-24 12:02
定時器用8位自動重裝模式,周期250us,調整TH0、TL0值粗調,調整中斷計數微調,精度可以控制在日秒內。
...

謝謝,我上機試試
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品啪啪 | 国产在线视频三区 | 久久精品国产亚洲 | aaaa一级毛片 | 亚洲欧洲一区 | 91成人影院 | 精品熟人一区二区三区四区 | 日韩在线不卡 | 欧美精品一区三区 | 综合久久99 | 中文字幕第100页 | 亚洲免费观看视频 | 中文字幕在线播放第一页 | 亚洲综合在线播放 | 国产区精品 | 成人精品视频在线观看 | 精品一区av| 91久久国产综合久久 | 羞羞在线观看视频 | 国产精品视屏 | 91深夜福利视频 | 中文字幕免费视频 | av看片网站 | 成年人在线视频 | 日本不卡一区二区三区在线观看 | 91大神在线资源观看无广告 | 99久久久久国产精品免费 | 国产精品免费在线 | 天天操天天摸天天干 | 亚洲欧美日韩在线 | 国产成人区 | 男女性毛片 | 精品一区二区久久 | 日韩在线一区二区三区 | 国产在线观看一区二区三区 | 日韩一级免费电影 | 91精品久久久 | 在线 丝袜 欧美 日韩 制服 | 欧美精品成人影院 | 亚洲啊v在线 | 精品欧美一区二区在线观看视频 |