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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4631|回復(fù): 7
收起左側(cè)

怎么用單片機定時器做數(shù)碼管動態(tài)顯示?我的程序仿真不出來

[復(fù)制鏈接]
ID:354168 發(fā)表于 2018-12-4 16:42 | 顯示全部樓層 |閱讀模式
我想用定時器做數(shù)碼管刷新,這個程序不知道哪里錯了,用protues仿真不出來。
QQ圖片20181204163942.png

#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int


code uchar led_7d_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,
                         0x92,0x82,0xf8,0x80,0x90,
                                               0x88,0x83,0xc6,0xa1,0x86,0x8e};
code uchar led_7d_dig[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar disp_buff[8]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
void disp_led(void);
uchar num=0;
void main()
{  uchar cnt=0;
   uint sec=0;
   TMOD=0x01;//設(shè)置T0為方式一
   TH0=0xFC;//給T0賦初值,定時1ms
   TL0=0x67;
   TR0=1;
   while(1)
    {disp_led();
         if(TF0==1)
           {TF0=0;         //T0溢出后,清零標(biāo)志位重新賦初值
            TH0=0xFC;
                TL0=0x67;
                cnt++; //T0溢出次數(shù)
            }
                if (cnt>=1000)//定時1s
                 {cnt=0;
                  sec++;//1s后數(shù)碼管計數(shù)加一
                  disp_buff[0]=led_7d_seg[sec%10];
                  disp_buff[1]=led_7d_seg[sec/10%10];
                  disp_buff[2]=led_7d_seg[sec/100%10];
                  disp_buff[3]=led_7d_seg[sec/1000%10];
                  disp_buff[4]=led_7d_seg[sec/10000%10];
                  disp_buff[5]=led_7d_seg[sec/100000%10];
                  disp_buff[6]=led_7d_seg[sec/1000000%10];
                  disp_buff[7]=led_7d_seg[sec/10000000%10];
                  }

         }
}
void disp_led(void)
{P2=0;
P0=disp_buff[num];
P2=led_7d_dig[num];
num++;
num=num%8;
}

回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2018-12-4 20:54 | 顯示全部樓層
無標(biāo)題.jpg
你對此一下就知道哪里錯了
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
code uchar led_7d_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,
                         0x92,0x82,0xf8,0x80,0x90,
                         0x88,0x83,0xc6,0xa1,0x86,0x8e};
code uchar led_7d_dig[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar disp_buff[8];
void disp_led(void);
uchar num=0;

void main()
{
        uint cnt=0;
        unsigned long sec=0;
        TMOD=0x01;//設(shè)置T0為方式一
        TH0=0xFC;//給T0賦初值,定時1ms
        TL0=0x67;
        TR0=1;
        while(1)
        {
                if(TF0==1)
                {
                        TF0=0;         //T0溢出后,清零標(biāo)志位重新賦初值
                        TH0=0xFC;
                        TL0=0x67;
                        cnt++; //T0溢出次數(shù)
                        if (cnt>=1000)//定時1s
                        {
                                cnt=0;
                                sec++;//1s后數(shù)碼管計數(shù)加一
                                disp_buff[0]=sec%10;
                                disp_buff[1]=sec/10%10;
                                disp_buff[2]=sec/100%10;
                                disp_buff[3]=sec/1000%10;
                                disp_buff[4]=sec/10000%10;
                                disp_buff[5]=sec/100000%10;
                                disp_buff[6]=sec/1000000%10;
                                disp_buff[7]=sec/10000000%10;
                        }
                        disp_led();
                }
        }
}
void disp_led(void)
{
        P0=0xff;
        P2=led_7d_dig[num];
        P0=led_7d_seg[disp_buff[num]];
        num++;
        num=num%8;
}

回復(fù)

使用道具 舉報

ID:354168 發(fā)表于 2018-12-4 22:26 | 顯示全部樓層
本帖最后由 牧阿木 于 2018-12-4 22:57 編輯

謝謝你幫我改程序啊!我還是有點不明白的地方,
這個位選的接法不太懂,
還有就是為什么不能這樣寫disp_buff[0]=led_7d_seg[sec%10];,而是disp_buff[0]=sec%10;然后讓P0=led_7d_seg[disp_buff[num]];
也不太明白這個“num”,為什么位選和段選賦值都用到了num。對數(shù)碼管賦值的時候是不是不用把1到15都寫出來啊?
如果你有空閑的時候就告訴我吧,麻煩你啦!
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2018-12-5 09:30 | 顯示全部樓層
牧阿木 發(fā)表于 2018-12-4 22:26
謝謝你幫我改程序啊!我還是有點不明白的地方,
這個位選的接法不太懂,
還有就是為什么不能這樣寫disp_bu ...

1.位驅(qū)動的接法與硬件的物理結(jié)構(gòu)相關(guān),如果位碼這樣寫led_7d_dig[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};就可以按照你的接法。否則顯示的數(shù)是反序的。
2.為了用多位數(shù)碼管正常顯示一個大數(shù)字,往往將該數(shù)分解為個、十、百......的方法分別保存在緩存數(shù)組中。P0輸出的不是真實的數(shù)字,而是代表這個數(shù)字的圖形----段碼,也就是譯碼。所以P0=段碼數(shù)組[緩存數(shù)組[下標(biāo)num]]。
3.由于變量num限制在0~7范圍循環(huán),在這里num是作為位碼和緩存兩個數(shù)組的下標(biāo)公用。
4.不是對數(shù)碼管賦值!是對P0賦值驅(qū)動數(shù)碼管。在實物中8個數(shù)碼管的段接點是連接在一起的,某時間段某個數(shù)碼管亮滅是由位碼確定的。
5.你的程序其他錯誤:uint sec=0;,uint 類型最大65535,uchar cnt=0;,uchar 類型最大255.uchar disp_buff[8]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};,這樣定義會造成加電初始全顯示8.8.8......,還有顯示程序放在 if(TF0==1)外,在實際應(yīng)用中會因為刷新速度太快而無法正常顯示。
回復(fù)

使用道具 舉報

ID:354168 發(fā)表于 2018-12-5 11:38 | 顯示全部樓層
哇!你能回復(fù)我我太開心啦!哈哈哈哈。謝謝你啊!
你給我講的我能明白一點,但是有的地方還不太懂。
uchar disp_buff[8]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};我這樣定義緩存區(qū)是想讓它初始化全不亮,因為這個是共陽極接法嘛,0xFF是全為高電平,數(shù)碼管都是滅的。
可是在定義輸出顯示的時候你把P0=0xff,這樣它不就什么都不顯示嘛,為什么仿真的時候它的八位都顯示0啊?
還有一個問題是主函數(shù)里并沒有對P2口的led_7d_dig[num]進(jìn)行延時設(shè)置,為什么數(shù)碼管還可以以1ms的速度刷新呢?
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2018-12-5 14:13 | 顯示全部樓層
本帖最后由 wulin 于 2018-12-5 14:44 編輯
牧阿木 發(fā)表于 2018-12-5 11:38
哇!你能回復(fù)我我太開心啦!哈哈哈哈。謝謝你啊!
你給我講的我能明白一點,但是有的地方還不太懂。
ucha ...

1.因為你定義的是緩存數(shù)組里的初始數(shù)據(jù)都是0xff,也就是255,因?qū)霐?shù)碼管數(shù)組的數(shù)據(jù)只限制在0~15范圍,溢出無效,系統(tǒng)默認(rèn)0x00,所以顯示8.8.8.8.8.8.8.8.,如果想在加電初始不顯示,可以在數(shù)碼管數(shù)組中增加第16個元素0xff,緩存數(shù)組里的初始數(shù)據(jù)都設(shè)置0x10,才能使P0=0xff。我定義緩存數(shù)組用的是缺省設(shè)置,系統(tǒng)默認(rèn)0x00,所以開機全顯0.
2.顯示程序里的P0=0xff,是消隱語句,不加此句在實際電路中數(shù)碼管會有鬼影(不該亮的筆畫微亮)。
3.把顯示程序放在if(TF0==1)里就是為了以1ms的速度刷新。再加延時就畫蛇添足了。
回復(fù)

使用道具 舉報

ID:354168 發(fā)表于 2018-12-7 15:26 來自觸屏版 | 顯示全部樓層
wulin 發(fā)表于 2018-12-5 14:13
1.因為你定義的是緩存數(shù)組里的初始數(shù)據(jù)都是0xff,也就是255,因?qū)霐?shù)碼管數(shù)組的數(shù)據(jù)只限制在0~15范圍, ...

謝謝你啊!哈哈我還是不太明白緩存數(shù)組和數(shù)碼管數(shù)組這里為什么我的數(shù)碼管全亮,而你的就只顯示0。num在0-7循環(huán),它就用不到定義的數(shù)碼管里邊后六位了(數(shù)碼管里我定義了從0-F)那為什么后邊再加0xff它就全都不顯示了啊?
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2018-12-7 20:46 | 顯示全部樓層
牧阿木 發(fā)表于 2018-12-7 15:26
謝謝你啊!哈哈我還是不太明白緩存數(shù)組和數(shù)碼管數(shù)組這里為什么我的數(shù)碼管全亮,而你的就只顯示0。num在0- ...

P0=led_7d_seg[disp_buff[num]];在這里num值表示緩存的下標(biāo)0~7,如果緩存數(shù)組里的初始數(shù)據(jù)都設(shè)置0x10就是16,這時等效P0=led_7d_seg[16],因數(shù)碼管數(shù)組第16元素是增加的0xff,所以這時等效P0=0xff,數(shù)碼管全都不顯示。我這樣解釋已經(jīng)比教科書還詳細(xì),如果還不能理解就只能在今后實踐中逐漸理解了。

評分

參與人數(shù) 1黑幣 +8 收起 理由
牧阿木 + 8 謝謝你啊!是我沒有理解數(shù)組的含義。我現(xiàn)在.

查看全部評分

回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品精品视频一区二区三区 | 日韩av一区二区在线观看 | 日本不卡一区二区三区在线观看 | 国产色片| 九九热精品视频 | 成人免费一区二区 | 男人久久天堂 | 国产日韩欧美在线一区 | 国产美女在线观看 | 成人在线免费网站 | 日韩欧美三级在线 | 久久婷婷色 | 欧美日韩视频 | 国产精品久久久久久妇女6080 | 成人国产免费观看 | 欧美一区二区三区视频 | 国产精品99久久久久久宅男 | 黄色成人国产 | 免费一区二区三区在线视频 | 伊人网站在线观看 | 欧美精品一区二区免费 | 男人的天堂avav | 在线观看中文字幕 | 日韩欧美精品一区 | 黄色国产在线播放 | 日本中文字幕日韩精品免费 | 色婷婷久久久久swag精品 | 国产99久久精品一区二区300 | 日韩欧美在线一区 | 在线视频91 | 91资源在线 | 日本人做爰大片免费观看一老师 | 亚洲精品99 | 懂色一区二区三区免费观看 | 日韩欧美在线不卡 | 九九九视频 | 日韩一区二区三区四区五区六区 | 国产欧美精品一区二区三区 | 在线视频91 | 国产欧美日韩在线播放 | 日本亚洲欧美 |