找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12331|回復: 19
打印 上一主題 下一主題
收起左側(cè)

數(shù)碼管實現(xiàn)加1計數(shù)器,循環(huán)顯示000-999,間隔1秒,定時器方式!我這到底錯哪?

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:145415 發(fā)表于 2016-11-17 22:04 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit dula=P2^6;
  5. sbit wela=P2^7;
  6. uchar num,b,count;
  7. uint flag=0;
  8. uint bai=0,shi=0,ge=0;
  9. uint xms;
  10. void delayms(uint);
  11. void display(uint bai,uint shi,uint ge);
  12. uchar code table[]={
  13. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};
  14. void main()
  15. {
  16.         TMOD=0x00;
  17.         TH0=(8192-8000)/32;
  18.         TL0=(8192-8000)%32;
  19.         EA=1;
  20.         ET0=1;
  21.         TR0=1;

  22.         while(1)
  23.         {
  24.         display(bai,shi,ge);
  25.         }
  26.        
  27. }
  28. void display(uint bai,uint shi,uint ge)
  29. {        dula=1;
  30.         P0=table[ge];
  31.         dula=0;
  32.         P0=0xff;
  33.         wela=1;
  34.         P0=0x2f;
  35.         wela=0;
  36.         delayms(100);
  37.        
  38.     dula=1;
  39.         P0=table[shi];
  40.         dula=0;
  41.         P0=0xff;
  42.         wela=1;
  43.         P0=0x1f;
  44.         wela=0;
  45.     delayms(100);
  46.        
  47.         dula=1;
  48.         P0=table[bai];
  49.         dula=0;
  50.         P0=0xff;
  51.         wela=1;
  52.         P0=0x37;
  53.         wela=0;
  54.         delayms(100);


  55. }
  56. void timer0()interrupt 0
  57. {
  58.     TH0=(8192-8000)/32;
  59.         TL0=(8192-8000)%32;
  60.    count++;
  61.    if(count ==125)
  62.    {
  63.         count = 0;
  64.                 bai=num/100;
  65.         shi=(num - (bai*100))/10;
  66.         ge=num%10;
  67.                 num++;
  68.         if(num==999)
  69.              num = 0;

  70.    }
  71. }

  72. void delayms(uint xms)
  73. {
  74.         uint i,j;
  75.         for(i=xms;i>0;i--)
  76.                 for(j=110;j>0;j--);
  77. }
復制代碼


運行后并沒有實現(xiàn)預定功能,就一直顯示000,我分析原因是因為,display的參數(shù)沒有傳過去!但是該怎么改?請大家?guī)兔纯!我是新?br />
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復

使用道具 舉報

沙發(fā)
ID:138155 發(fā)表于 2016-11-18 08:39 | 只看該作者
兩種可能 一是可能數(shù)據(jù)傳遞不成功  二是 定時器沒有計數(shù)
回復

使用道具 舉報

板凳
ID:111634 發(fā)表于 2016-11-18 11:20 | 只看該作者
本帖最后由 zl2168 于 2016-11-18 11:22 編輯

為什么不吸取教訓?上次給了你一個程序,還帶keil調(diào)試,與別人的程序比較,不知你有什么體會?給你學習方法的建議有什么感想?不學理論,盲目實踐,不是事倍功半,就是知其然,不知其所以然。
回復

使用道具 舉報

地板
ID:111634 發(fā)表于 2016-11-18 11:25 | 只看該作者
為什么有人學得快、學的好,有人學得慢、學的差?除了悟性、勤奮外,學習方法不好是一個重要原因!
回復

使用道具 舉報

5#
ID:148310 發(fā)表于 2016-11-18 12:17 | 只看該作者
TMOD=0x00;這名句改為 TMOD = 0X01;
TMOE寄存器的低4位是設(shè)置T0定時器的工作模式;
59.void timer0()interrupt 0 這句改為:void timer0() interrupt  1 (此處中斷號不對,0是外部中斷,1是內(nèi)部中斷)
另:做為初學者來說,從一開始,就要養(yǎng)成良好編程的習慣,程序要加注釋,層次要清晰。建議看宋學松老師的視頻,(本論壇就有下載)不要看郭天祥老師的。。。。
寫了這些,有沒有HB啊
回復

使用道具 舉報

6#
ID:148310 發(fā)表于 2016-11-18 12:19 | 只看該作者
忘說了,我也是初學者,希望高手 不要噴我,謝謝~
回復

使用道具 舉報

7#
ID:148624 發(fā)表于 2016-11-18 12:48 | 只看該作者
你程序里面數(shù)字變化的量num都沒有看到有變化的地方,肯定一直是000啊
回復

使用道具 舉報

8#
ID:140371 發(fā)表于 2016-11-18 18:56 來自手機 | 只看該作者
wuyibin2003 發(fā)表于 2016-11-18 08:39
兩種可能 一是可能數(shù)據(jù)傳遞不成功  二是 定時器沒有計數(shù)

中斷編號有誤。延時過長。
回復

使用道具 舉報

9#
ID:102056 發(fā)表于 2016-11-18 23:36 來自手機 | 只看該作者
第一個是跳轉(zhuǎn)到中斷那里應(yīng)該寫,interrupt 1     第二個是每次顯示數(shù)碼管最好是先寫消隱   ,第三是寫完段碼顯示就不要段碼控制為0,不然就顯示動不了,延時時間太長。最后一個中斷控制里計算個,十,百,最好提到主函數(shù)里,不然1秒計數(shù)就會產(chǎn)生很大的誤差。
回復

使用道具 舉報

10#
ID:102056 發(fā)表于 2016-11-19 21:55 | 只看該作者
電路圖不一樣。自行修改
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P1^7;
sbit wela=P1^6;
uchar num,count;
uint bai=0,shi=0,ge=0;
void display(uint bai,uint shi,uint ge);
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};
void delay1ms(void)   //誤差 -0.651041666667us
{
    unsigned char a,b;
    for(b=102;b>0;b--)
        for(a=3;a>0;a--);
}
void main()
{
        TMOD=0x00;
        TH0=(8192-8000)/32;
        TL0=(8192-8000)%32;
        EA=1;
        ET0=1;
        TR0=1;

        while(1)
        {
        display(bai,shi,ge);
        }
        
}
void display(uint bai,uint shi,uint ge)
{   
            bai=num/100;
        shi=(num - (bai*100))/10;
        ge=num%10;


                dula=1;
                P0=0X00;
                dula=0;
                wela=1;
        P0=0x7f;
        wela=0;
        dula=1;
        P0=table[ge];  
        delay1ms();
        
                dula=1;
                P0=0X00;
                dula=0;
                wela=1;
        P0=0xbf;
        wela=0;
        dula=1;
        P0=table[shi];  
        delay1ms();
        
                dula=1;
                P0=0X00;
                dula=0;
                wela=1;
        P0=0xdf;
        wela=0;
        dula=1;
        P0=table[bai];
        delay1ms();


}
void timer0()interrupt 1
{
    TH0=(8192-8000)/32;
    TL0=(8192-8000)%32;
   count++;
   if(count ==125)
   {
        count = 0;
         num++;
        if(num==999)
          num = 0;

   }
}


回復

使用道具 舉報

11#
ID:148930 發(fā)表于 2016-11-19 23:43 | 只看該作者
看了一下你的板子好像是天祥的。我只覺得你一個地方有問題,天祥的書里不是也說了嘛,中斷函數(shù)里少放東西,盡量把計算和賦值提到外面來
回復

使用道具 舉報

12#
ID:111634 發(fā)表于 2016-11-20 11:18 | 只看該作者
xht9951 發(fā)表于 2016-11-18 12:17
TMOD=0x00;這名句改為 TMOD = 0X01;
TMOE寄存器的低4位是設(shè)置T0定時器的工作模式;
59.void timer0()inte ...

“做為初學者來說,從一開始,就要養(yǎng)成良好編程的習慣,程序要加注釋,層次要清晰!睂︻^!!
回復

使用道具 舉報

13#
ID:111634 發(fā)表于 2016-11-21 09:20 | 只看該作者
先學學正確的東西。
回復

使用道具 舉報

14#
ID:145415 發(fā)表于 2016-11-21 09:34 | 只看該作者
king@ 發(fā)表于 2016-11-19 21:55
電路圖不一樣。自行修改
#include
#define uchar unsigned char

非常感謝
回復

使用道具 舉報

15#
ID:145415 發(fā)表于 2016-11-21 09:35 | 只看該作者
zl2168 發(fā)表于 2016-11-18 11:20
為什么不吸取教訓?上次給了你一個程序,還帶keil調(diào)試,與別人的程序比較,不知你有什么體會?給你學習方法 ...

非常感謝,學生下次一定注意
回復

使用道具 舉報

16#
ID:145415 發(fā)表于 2016-11-21 09:35 | 只看該作者
xht9951 發(fā)表于 2016-11-18 12:17
TMOD=0x00;這名句改為 TMOD = 0X01;
TMOE寄存器的低4位是設(shè)置T0定時器的工作模式;
59.void timer0()inte ...

非常感謝
回復

使用道具 舉報

17#
ID:149144 發(fā)表于 2016-11-21 10:17 | 只看該作者
定時器沒跑吧
回復

使用道具 舉報

18#
ID:121114 發(fā)表于 2016-12-11 14:29 | 只看該作者
解決沒有??什么問題
回復

使用道具 舉報

19#
ID:150555 發(fā)表于 2016-12-11 21:36 | 只看該作者
void timer0()interrupt 0    不是0 是1,你好好看看中斷級別。
回復

使用道具 舉報

20#
ID:155877 發(fā)表于 2016-12-19 14:04 | 只看該作者
求電路圖!
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表