標題: 求教89c52rc單片機六位一體數碼管怎么可以第一次顯示如123456 [打印本頁]
作者: zhezhichun 時間: 2024-3-27 09:10
標題: 求教89c52rc單片機六位一體數碼管怎么可以第一次顯示如123456
求教89c52rc 六位一體數碼管怎么可以第一次顯示如(123456),第二次顯示(338737),第三次顯示(decfga),六個數同時顯示(用delay(1)),三次顯示間隔一秒
作者: cedtek 時間: 2024-3-28 18:07
其實你只需要了解一個動態掃描的顯示方式就可以實現了,我這里把我之前的學習筆記貼出來,我自己溫故知新的同時希望對你也有所幫助。
數碼管動態掃描顯示原理六位八段數碼管的內部結構圖如下(下圖以共陽極為例)
51hei.png (129.21 KB, 下載次數: 52)
下載附件
2024-3-30 02:45 上傳
由圖可知,六位八段數碼管當中,每個數碼位的段選信號全部連接到了一起,然后進行輸出(對于共陽極數碼管來說,段選引腳為低電平時有電流從數碼管的段選引腳流出);每個數碼位單獨引出一個位選信號用來控制數碼位的選擇,這種連接方式會使得被選中的數碼位顯示的內容都是相同的,因為這些被選中的數碼位的段選信號已經全部連接到了一起。如何使用這個六位八段數碼管來實現數碼管的動態顯示呢?我們需要使用一種方式:動態掃描
如何使用動態掃描的方式來實現數碼管的動態顯示呢?這里給大家舉一個例子:比如說,我們想要使用六位八段數碼管顯示數字 123456
51hei1.png (37.67 KB, 下載次數: 46)
下載附件
2024-3-30 02:45 上傳
如何使用六位八段數碼管來顯示數字 123456 呢?
首先我們選中第一個數碼位,讓這個數碼位顯示數字 1;然后它顯示的時間設為 T,這個 T 可以看作一個周期
51hei2.png (39.15 KB, 下載次數: 59)
下載附件
2024-3-30 02:45 上傳
當第一個數碼位完成一個 T 周期數字 1 的顯示之后,立刻選中第二個數碼位;注意,此時只選中了第二個數碼位讓它顯示數字 2,顯示的時間同樣是一個周期 T
51hei3.png (39.27 KB, 下載次數: 57)
下載附件
2024-3-30 02:45 上傳
當第二個數碼位完成了一個周期 T 數字 2 的顯示之后,立刻選中第三個數碼位;這兒注意,也是只選中了第三個數碼位讓它顯示數字 3,同樣顯示時間為 T
51hei4.png (39.27 KB, 下載次數: 49)
下載附件
2024-3-30 02:45 上傳
依次往下類推,那么此時就顯示 4
51hei5.png (39.2 KB, 下載次數: 46)
下載附件
2024-3-30 02:45 上傳
然后是 5
51hei6.png (39.26 KB, 下載次數: 50)
下載附件
2024-3-30 02:45 上傳
然后是 6
51hei7.png (39.3 KB, 下載次數: 45)
下載附件
2024-3-30 02:45 上傳
當第六個數碼位完成了一個周期 T 數字 6 的顯示之后,再重新選中第一個數碼位;這兒也是只選中了第一個數碼位,讓它繼續顯示數字 1,然后顯示的時間仍然是 T 周期,這樣依次往下循環。
通過上述動態顯示過程的描述,我們知道這樣一個循環是六個周期就是 6*T;如果說給這個 T 規定一個確切的時間會怎樣呢?首先給 T 規定一個確切的時間 1s;如果說 T 等于 1s,六位八段數碼管的六個數碼位會依次顯示 1、2、3、4、5、6 每個數字顯示的時間為 1s,如下GIF動圖所示
間隔1秒動態顯示123456.gif (41.1 KB, 下載次數: 45)
下載附件
2024-3-29 10:27 上傳
如果進一步把這個 T 進行縮短,比如說縮短到 20ms 這時候六位八段數碼管的六個數碼位會進行閃爍顯示,顯示的內容依次是 1、2、3、4、5、6,如下GIF動圖所示
間隔20毫秒動態顯示123456.gif (41.1 KB, 下載次數: 36)
下載附件
2024-3-29 10:28 上傳
如果進一步縮短時間 T 為 1ms,這時候,六位八段數碼管的六個數碼位實際上也是依次進行閃爍的顯示,顯示的內容依次是 1、2、3、4、5、6 每個數字顯示時間是 1ms,如下GIF動圖所示
間隔1毫秒動態顯示123456.gif (23.31 KB, 下載次數: 47)
下載附件
2024-3-29 10:28 上傳
但是它們切換的頻率太快了,我們的肉眼不能分辨這種閃爍,就誤以為六位八段數碼管的六個數碼位在同時進行顯示,而且顯示的內容是 123456。
這樣就使用動態掃描的方式實現了數碼管的動態顯示。
使用動態掃描的方式實現數碼管的動態顯示,實際上是利用了兩個現象:人眼的視覺暫留特性和數碼管的余暉效應。人眼在觀察景物時,光信號傳入到大腦神經需要經過一段時間,光的作用結束之后我們的視覺影像并不會立刻的消失,這種殘留的視覺被稱為后像,這種現象就被稱為視覺暫留;數碼管的余暉效應是什么意思呢?當我們停止向發光二極管供電時,發光二極管的亮度仍能夠維持一段時間。我們的動態掃描利用這兩個特性就實現了數碼管的動態顯示。
Proteus 仿真看看吧一開始先設置T為3s左右看一看,如下GIF動圖所示
20240328175050_GAQsw7lADX2.gif (483.73 KB, 下載次數: 50)
下載附件
2024-3-28 17:52 上傳
接著設置為300ms左右,如下GIF動圖所示(閃爍起來了
)
20240328175335_W9Wmpykqf15.gif (540.93 KB, 下載次數: 48)
下載附件
2024-3-28 17:54 上傳
然后設置為30ms左右,如下GIF動圖所示(貌似眨眼補幀后就是同時顯示的了
)
20240328175542_UE6ccyR4TS5.gif (713.58 KB, 下載次數: 50)
下載附件
2024-3-28 17:57 上傳
我還要快一點,那就再除個10,每個位只顯示3ms左右的時間看看吧
20240328175927_fEWASBjhJY2.gif (641.73 KB, 下載次數: 56)
下載附件
2024-3-28 18:04 上傳
看來它已經可以欺騙我們的眼睛和大腦了(至少仿真軟件認為是這樣的)
用手機拍視頻時如果畫面中有對準過多位數碼管顯示類產品的話,相信你一定注意到過手機畫面中,數碼管通常會閃爍吧,原因就是使用了動態掃描的方式顯示
作者: a399288395 時間: 2024-3-29 08:54
看來單片機開發板還沒有學入門; 找個視頻自己看了后再寫出來,然后下載到板子上看看實際情況, 再改改延時時間 你就會看到另一種不一樣的結果, 只有這樣才真正學會, 在這問這些是沒有用的, 跟你講動態掃描 就好像講無字天書一樣, 很玄妙!
作者: 明日之星8 時間: 2024-3-29 10:02
你知道六位的數碼管里面有多少個發光二極管嗎?
6x8=48個發光二極管,最笨的辦法要用49根引腳才能控制它,
聰明的辦法只要6+8=14根引腳就行了,但是要用動態掃描的方
法才能正常顯示。實際同一時間只能有一個數碼管在顯示,其
它的都是關著的不顯示的,“動態掃描”的意思是排著隊一個一個
的來顯示,只要切換的速度足夠快,我們就感覺是“同時”都在顯
示數字了。你感覺1秒鐘的時間很短,對于單片機來說卻是很漫長
的,比如24MHz的頻率它要計數2400萬才到1秒鐘。
你這個題目很大,慢慢來吧,從點亮一個發光管開始吧,然后學會
在其中的一個數碼管上顯示“12345abcd”這些,還要能隨意的顯示,
隨意的變換顯示給出的內容,然后是把時間分成小段完成動態掃描。
你要的不同時間段顯示不同的內容,還要再把時間分成大的時間段
顯示你要的內容。
作者: 黎明的曙光哈哈 時間: 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;
}
}
//上面那部分程序放在定時器中
void display_show()//數碼管顯示程序
{
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;//個位
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}; //數碼管共陰極編碼表
作者: cy009 時間: 2024-3-31 23:11
標題: 修改多次都失敗,不知何因,補發附件。
042.png (19.65 KB, 下載次數: 44)
下載附件
2024-3-31 23:04 上傳
#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]; //顯示緩沖區
/****************************************************
延時子函數(xms)
****************************************************/
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=120;j>0;j--);
}
/***************************************************************
顯示子函數
***************************************************************/
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);
}
}
/****************************************************
主函數
****************************************************/
void main()
{
while(1)
{
uint cnt; //延時計數參數,不精確的計算,想精確的建議用定時器
//數碼管刷新一次約為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
2024-4-1 18:38 上傳
點擊文件名下載附件
729 Bytes, 下載次數: 1
歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |