找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

求教89c52rc單片機(jī)六位一體數(shù)碼管怎么可以第一次顯示如123456

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
求教89c52rc 六位一體數(shù)碼管怎么可以第一次顯示如(123456),第二次顯示(338737),第三次顯示(decfga),六個(gè)數(shù)同時(shí)顯示(用delay(1)),三次顯示間隔一秒
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:866313 發(fā)表于 2024-3-28 18:07 | 只看該作者
其實(shí)你只需要了解一個(gè)動(dòng)態(tài)掃描的顯示方式就可以實(shí)現(xiàn)了,我這里把我之前的學(xué)習(xí)筆記貼出來(lái),我自己溫故知新的同時(shí)希望對(duì)你也有所幫助。
數(shù)碼管動(dòng)態(tài)掃描顯示原理
六位八段數(shù)碼管的內(nèi)部結(jié)構(gòu)圖如下(下圖以共陽(yáng)極為例)


由圖可知,六位八段數(shù)碼管當(dāng)中,每個(gè)數(shù)碼位的段選信號(hào)全部連接到了一起,然后進(jìn)行輸出(對(duì)于共陽(yáng)極數(shù)碼管來(lái)說(shuō),段選引腳為低電平時(shí)有電流從數(shù)碼管的段選引腳流出);每個(gè)數(shù)碼位單獨(dú)引出一個(gè)位選信號(hào)用來(lái)控制數(shù)碼位的選擇,這種連接方式會(huì)使得被選中的數(shù)碼位顯示的內(nèi)容都是相同的,因?yàn)檫@些被選中的數(shù)碼位的段選信號(hào)已經(jīng)全部連接到了一起。如何使用這個(gè)六位八段數(shù)碼管來(lái)實(shí)現(xiàn)數(shù)碼管的動(dòng)態(tài)顯示呢?我們需要使用一種方式:動(dòng)態(tài)掃描
如何使用動(dòng)態(tài)掃描的方式來(lái)實(shí)現(xiàn)數(shù)碼管的動(dòng)態(tài)顯示呢?這里給大家舉一個(gè)例子:比如說(shuō),我們想要使用六位八段數(shù)碼管顯示數(shù)字 123456



如何使用六位八段數(shù)碼管來(lái)顯示數(shù)字 123456 呢?
首先我們選中第一個(gè)數(shù)碼位,讓這個(gè)數(shù)碼位顯示數(shù)字 1;然后它顯示的時(shí)間設(shè)為 T,這個(gè) T 可以看作一個(gè)周期

當(dāng)?shù)谝粋(gè)數(shù)碼位完成一個(gè) T 周期數(shù)字 1 的顯示之后,立刻選中第二個(gè)數(shù)碼位;注意,此時(shí)只選中了第二個(gè)數(shù)碼位讓它顯示數(shù)字 2,顯示的時(shí)間同樣是一個(gè)周期 T

當(dāng)?shù)诙䝼(gè)數(shù)碼位完成了一個(gè)周期 T 數(shù)字 2 的顯示之后,立刻選中第三個(gè)數(shù)碼位;這兒注意,也是只選中了第三個(gè)數(shù)碼位讓它顯示數(shù)字 3,同樣顯示時(shí)間為 T

依次往下類(lèi)推,那么此時(shí)就顯示 4

然后是 5

然后是 6

當(dāng)?shù)诹鶄(gè)數(shù)碼位完成了一個(gè)周期 T 數(shù)字 6 的顯示之后,再重新選中第一個(gè)數(shù)碼位;這兒也是只選中了第一個(gè)數(shù)碼位,讓它繼續(xù)顯示數(shù)字 1,然后顯示的時(shí)間仍然是 T 周期,這樣依次往下循環(huán)。
通過(guò)上述動(dòng)態(tài)顯示過(guò)程的描述,我們知道這樣一個(gè)循環(huán)是六個(gè)周期就是 6*T;如果說(shuō)給這個(gè) T 規(guī)定一個(gè)確切的時(shí)間會(huì)怎樣呢?首先給 T 規(guī)定一個(gè)確切的時(shí)間 1s;如果說(shuō) T 等于 1s,六位八段數(shù)碼管的六個(gè)數(shù)碼位會(huì)依次顯示 1、2、3、4、5、6 每個(gè)數(shù)字顯示的時(shí)間為 1s,如下GIF動(dòng)圖所示

如果進(jìn)一步把這個(gè) T 進(jìn)行縮短,比如說(shuō)縮短到 20ms 這時(shí)候六位八段數(shù)碼管的六個(gè)數(shù)碼位會(huì)進(jìn)行閃爍顯示,顯示的內(nèi)容依次是 1、2、3、4、5、6,如下GIF動(dòng)圖所示

如果進(jìn)一步縮短時(shí)間 T 為 1ms,這時(shí)候,六位八段數(shù)碼管的六個(gè)數(shù)碼位實(shí)際上也是依次進(jìn)行閃爍的顯示,顯示的內(nèi)容依次是 1、2、3、4、5、6 每個(gè)數(shù)字顯示時(shí)間是 1ms,如下GIF動(dòng)圖所示

但是它們切換的頻率太快了,我們的肉眼不能分辨這種閃爍,就誤以為六位八段數(shù)碼管的六個(gè)數(shù)碼位在同時(shí)進(jìn)行顯示,而且顯示的內(nèi)容是 123456。
這樣就使用動(dòng)態(tài)掃描的方式實(shí)現(xiàn)了數(shù)碼管的動(dòng)態(tài)顯示。
使用動(dòng)態(tài)掃描的方式實(shí)現(xiàn)數(shù)碼管的動(dòng)態(tài)顯示,實(shí)際上是利用了兩個(gè)現(xiàn)象:人眼的視覺(jué)暫留特性和數(shù)碼管的余暉效應(yīng)。人眼在觀察景物時(shí),光信號(hào)傳入到大腦神經(jīng)需要經(jīng)過(guò)一段時(shí)間,光的作用結(jié)束之后我們的視覺(jué)影像并不會(huì)立刻的消失,這種殘留的視覺(jué)被稱(chēng)為后像,這種現(xiàn)象就被稱(chēng)為視覺(jué)暫留;數(shù)碼管的余暉效應(yīng)是什么意思呢?當(dāng)我們停止向發(fā)光二極管供電時(shí),發(fā)光二極管的亮度仍能夠維持一段時(shí)間。我們的動(dòng)態(tài)掃描利用這兩個(gè)特性就實(shí)現(xiàn)了數(shù)碼管的動(dòng)態(tài)顯示。

以上內(nèi)容是我在觀看視頻教程34-第二十三講-數(shù)碼管動(dòng)態(tài)顯示(一)后的筆記的一部分


Proteus 仿真看看吧一開(kāi)始先設(shè)置T為3s左右看一看,如下GIF動(dòng)圖所示


接著設(shè)置為300ms左右,如下GIF動(dòng)圖所示(閃爍起來(lái)了


然后設(shè)置為30ms左右,如下GIF動(dòng)圖所示(貌似眨眼補(bǔ)幀后就是同時(shí)顯示的了


我還要快一點(diǎn),那就再除個(gè)10,每個(gè)位只顯示3ms左右的時(shí)間看看吧


看來(lái)它已經(jīng)可以欺騙我們的眼睛和大腦了(至少仿真軟件認(rèn)為是這樣的)
用手機(jī)拍視頻時(shí)如果畫(huà)面中有對(duì)準(zhǔn)過(guò)多位數(shù)碼管顯示類(lèi)產(chǎn)品的話,相信你一定注意到過(guò)手機(jī)畫(huà)面中,數(shù)碼管通常會(huì)閃爍吧,原因就是使用了動(dòng)態(tài)掃描的方式顯示

評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:230500 發(fā)表于 2024-3-29 08:54 | 只看該作者
看來(lái)單片機(jī)開(kāi)發(fā)板還沒(méi)有學(xué)入門(mén); 找個(gè)視頻自己看了后再寫(xiě)出來(lái),然后下載到板子上看看實(shí)際情況, 再改改延時(shí)時(shí)間  你就會(huì)看到另一種不一樣的結(jié)果, 只有這樣才真正學(xué)會(huì), 在這問(wèn)這些是沒(méi)有用的, 跟你講動(dòng)態(tài)掃描 就好像講無(wú)字天書(shū)一樣, 很玄妙!
回復(fù)

使用道具 舉報(bào)

地板
ID:1110945 發(fā)表于 2024-3-29 10:02 | 只看該作者
你知道六位的數(shù)碼管里面有多少個(gè)發(fā)光二極管嗎?
6x8=48個(gè)發(fā)光二極管,最笨的辦法要用49根引腳才能控制它,
聰明的辦法只要6+8=14根引腳就行了,但是要用動(dòng)態(tài)掃描的方
法才能正常顯示。實(shí)際同一時(shí)間只能有一個(gè)數(shù)碼管在顯示,其
它的都是關(guān)著的不顯示的,“動(dòng)態(tài)掃描”的意思是排著隊(duì)一個(gè)一個(gè)
的來(lái)顯示,只要切換的速度足夠快,我們就感覺(jué)是“同時(shí)”都在顯
示數(shù)字了。你感覺(jué)1秒鐘的時(shí)間很短,對(duì)于單片機(jī)來(lái)說(shuō)卻是很漫長(zhǎng)
的,比如24MHz的頻率它要計(jì)數(shù)2400萬(wàn)才到1秒鐘。
你這個(gè)題目很大,慢慢來(lái)吧,從點(diǎn)亮一個(gè)發(fā)光管開(kāi)始吧,然后學(xué)會(huì)
在其中的一個(gè)數(shù)碼管上顯示“12345abcd”這些,還要能隨意的顯示,
隨意的變換顯示給出的內(nèi)容,然后是把時(shí)間分成小段完成動(dòng)態(tài)掃描。
你要的不同時(shí)間段顯示不同的內(nèi)容,還要再把時(shí)間分成大的時(shí)間段
顯示你要的內(nèi)容。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:977869 發(fā)表于 2024-3-29 11:09 | 只看該作者
#define  display_tm_base    15u

//
display_time++
if(display_time>=display_tm_base)
                                {
                                        display_show();
                                        display_time=0;
                                        index++;
                                        if(index>=12)


                                        {
                                                index=0;
                                        }
                                }

//上面那部分程序放在定時(shí)器中


void display_show()//數(shù)碼管顯示程序
{
        if(run_mode==6)
        {
                show_value[0]=mode_timer_value/100;     //百位
                show_value[1]=mode_timer_value%100/10;   //十位
                show_value[2]=mode_timer_value%100%10;//十位  
        }
        else
        {
                  if(pro_set==0)
                {
                                show_value[0]=trigger_cut/100;     //百位
                }
                else
                {
                                show_value[0]=16;     //P段顯示
                }
        show_value[1]=trigger_cut%100/10;   //十位
        show_value[2]=trigger_cut%100%10;//十位  
        }

        show_value[3]=intergral/100;  //百位
        show_value[4]=intergral%100/10;// 十位
        show_value[5]=intergral%100%10;//個(gè)位
        if(index==0)
        {
                        select_pin1=0;
                        select_pin2=1;
                        select_pin3=1;
                        select_pin4=1;
                        select_pin5=1;
                        select_pin6=1;
                        show_port=table[show_value[2]];
        }
        else if(index==2)
        {
                        select_pin1=1;
                        select_pin2=0;
                        select_pin3=1;
                        select_pin4=1;
                        select_pin5=1;
                        select_pin6=1;
                        show_port=table[show_value[1]];
        }
        else if(index==4)
        {
                        select_pin1=1;
                        select_pin2=1;
                        select_pin3=0;
                        select_pin4=1;
                        select_pin5=1;
                        select_pin6=1;
                        show_port=table[show_value[0]];
        }
        else if(index==6)
        {
                        select_pin1=1;
                        select_pin2=1;
                        select_pin3=1;
                        select_pin4=0;
                        select_pin5=1;
                        select_pin6=1;
                        show_port=table[show_value[5]];
        }
        else if(index==8)
        {
                        select_pin1=1;
                        select_pin2=1;
                        select_pin3=1;
                        select_pin4=1;
                        select_pin5=0;
                        select_pin6=1;
                        show_port=table[show_value[4]];
        }
        else if(index==10)
        {
                        select_pin1=1;
                        select_pin2=1;
                        select_pin3=1;
                        select_pin4=1;
                        select_pin5=1;
                        select_pin6=0;
                        show_port=table[show_value[3]];
        }
        else
        {
                        select_pin1=1;
                        select_pin2=1;
                        select_pin3=1;
                        select_pin4=1;
                        select_pin5=1;
                        select_pin6=1;
                //        show_port=0X00;
        }
}


char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x73};  //數(shù)碼管共陰極編碼表
回復(fù)

使用道具 舉報(bào)

6#
ID:619259 發(fā)表于 2024-3-31 23:11 | 只看該作者

修改多次都失敗,不知何因,補(bǔ)發(fā)附件。



#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xc2};                //共陽(yáng)代碼
uchar code com[]={0x01,0x02,0x04,0x08,0x10,0x20};   //位碼
uchar seg_buff[6];      //顯示緩沖區(qū)
/****************************************************
    延時(shí)子函數(shù)(xms)
****************************************************/
void delay(uint xms)   
{
    uint i,j;
    for(i=xms;i>0;i--)
       for(j=120;j>0;j--);
}

/***************************************************************
    顯示子函數(shù)
***************************************************************/
void seg_show(uchar a,uchar b,uchar c,uchar x,uchar y,uchar z)
{
    uchar i;
    seg_buff[0]=seg[a];
    seg_buff[1]=seg[b ];
    seg_buff[2]=seg[c];
    seg_buff[3]=seg[x];
    seg_buff[4]=seg[y];
    seg_buff[5]=seg[z];   
   
    for(i=0;i<6;i++)
    {
        P2=0x00;
        P0=seg_buff[ i];
        P2=com[ i];
        delay(1);
    }
}

/****************************************************
    主函數(shù)
****************************************************/
void main()
{
    while(1)
    {
        uint cnt;       //延時(shí)計(jì)數(shù)參數(shù),不精確的計(jì)算,想精確的建議用定時(shí)器
                          //數(shù)碼管刷新一次約為6ms,167次約為1秒
        if(cnt<167)    seg_show(1,2,3,4,5,6);
        else if(cnt>=167 && cnt<334)   seg_show(3,3,8,7,3,7);
        else   seg_show(13,14,12,15,16,10);
        cnt++;
        if(cnt>501) cnt=0;
    }
}

seg05.rar

729 Bytes, 下載次數(shù): 1

評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表