標(biāo)題: 求教89c52rc單片機(jī)六位一體數(shù)碼管怎么可以第一次顯示如123456 [打印本頁]

作者: zhezhichun    時(shí)間: 2024-3-27 09:10
標(biāo)題: 求教89c52rc單片機(jī)六位一體數(shù)碼管怎么可以第一次顯示如123456
求教89c52rc 六位一體數(shù)碼管怎么可以第一次顯示如(123456),第二次顯示(338737),第三次顯示(decfga),六個(gè)數(shù)同時(shí)顯示(用delay(1)),三次顯示間隔一秒

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


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



如何使用六位八段數(shù)碼管來顯示數(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

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

然后是 5

然后是 6

當(dāng)?shù)诹鶄(gè)數(shù)碼位完成了一個(gè)周期 T 數(shù)字 6 的顯示之后,再重新選中第一個(gè)數(shù)碼位;這兒也是只選中了第一個(gè)數(shù)碼位,讓它繼續(xù)顯示數(shù)字 1,然后顯示的時(shí)間仍然是 T 周期,這樣依次往下循環(huán)。
通過上述動(dòng)態(tài)顯示過程的描述,我們知道這樣一個(gè)循環(huán)是六個(gè)周期就是 6*T;如果說給這個(gè) T 規(guī)定一個(gè)確切的時(shí)間會(huì)怎樣呢?首先給 T 規(guī)定一個(gè)確切的時(shí)間 1s;如果說 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)行縮短,比如說縮短到 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)象:人眼的視覺暫留特性和數(shù)碼管的余暉效應(yīng)。人眼在觀察景物時(shí),光信號(hào)傳入到大腦神經(jīng)需要經(jīng)過一段時(shí)間,光的作用結(jié)束之后我們的視覺影像并不會(huì)立刻的消失,這種殘留的視覺被稱為后像,這種現(xiàn)象就被稱為視覺暫留;數(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 仿真看看吧一開始先設(shè)置T為3s左右看一看,如下GIF動(dòng)圖所示


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


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


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


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


作者: a399288395    時(shí)間: 2024-3-29 08:54
看來單片機(jī)開發(fā)板還沒有學(xué)入門; 找個(gè)視頻自己看了后再寫出來,然后下載到板子上看看實(shí)際情況, 再改改延時(shí)時(shí)間  你就會(huì)看到另一種不一樣的結(jié)果, 只有這樣才真正學(xué)會(huì), 在這問這些是沒有用的, 跟你講動(dòng)態(tài)掃描 就好像講無字天書一樣, 很玄妙!
作者: 明日之星8    時(shí)間: 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è)
的來顯示,只要切換的速度足夠快,我們就感覺是“同時(shí)”都在顯
示數(shù)字了。你感覺1秒鐘的時(shí)間很短,對(duì)于單片機(jī)來說卻是很漫長(zhǎng)
的,比如24MHz的頻率它要計(jì)數(shù)2400萬才到1秒鐘。
你這個(gè)題目很大,慢慢來吧,從點(diǎn)亮一個(gè)發(fā)光管開始吧,然后學(xué)會(huì)
在其中的一個(gè)數(shù)碼管上顯示“12345abcd”這些,還要能隨意的顯示,
隨意的變換顯示給出的內(nèi)容,然后是把時(shí)間分成小段完成動(dòng)態(tài)掃描。
你要的不同時(shí)間段顯示不同的內(nèi)容,還要再把時(shí)間分成大的時(shí)間段
顯示你要的內(nèi)容。
作者: 黎明的曙光哈哈    時(shí)間: 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ù)碼管共陰極編碼表
作者: cy009    時(shí)間: 2024-3-31 23:11
標(biāo)題: 修改多次都失敗,不知何因,補(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};                //共陽代碼
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






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