Ⅰ 單片機led數碼管實驗
單片機led數碼管 秒錶模擬實例,很簡單的,可以參考一下,
#include<reg52.h> //秒錶程序
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar ,shi;
uint a1,a2;
sbit D1=P3^0;
sbit D2=P3^1;
sbit D3=P3^2;
sbit D4=P3^3;
sbit key=P3^5;
sbit key1=P3^7;
bit j ;
uint y ;
void main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
=0;
shi=0;
while(1)
{
if(key==0)
{
j=0;
}
if(key1==0)
{
j=1; a2=0;
}
}
}
void timer0()interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
a1++;
y++;
if(a1==100)
{
a1=0;
if(j==1) a2++;
if(a2>=10000) a2=0;
}
D1 = 1; D2 = 1; D3 = 1; D4 = 1;
if(y==1)
{
P1=table[a2%10000/1000];
D4=0;
}
if(y==2)
{
P1=table[a2%1000/100];
D3=0;
}
if(y==3)
{
P1=table[a2%100/10];
D2=0;
}
if(y==4)
{
P1=table[a2%10];
D1=0;
y=0;
}
}
Ⅱ 單片機數碼管動態顯示
下面是用段選和位選的數碼管動態顯示程序,可以參照下寫法
#include <AT89X51.H>
unsigned char dispbitcnt; //數碼管位碼掃描變數
unsigned char second;
//秒變數
unsigned char minite;
//分變數
unsigned char hour;
//時變數
unsigned char tcnt;
//秒信號產生變數
unsigned char mstcnt;
//掃描時間變數
const unsigned char dispcode[10]={0xc0,0xf9,0xa4,0xb0,0x99,<br> <br> <br> 0x92,0x82,0xf8,0x80,0x90};
//0123456789段碼
const unsigned char dispbitcode[6]={0xfe,0xfd,0xfb,0xf7,<br> <br> <br> 0xef,0xdf};
//123456位碼
unsigned char dispbuf[6]={0,0,0,0,0,0};
//緩沖數組
//**************TMR0中斷數碼管掃描程序*********************
void Timer0() interrupt 1
{
P2=dispcode[dispbuf[dispbitcnt]];//段碼
P1=dispbitcode[dispbitcnt];//位碼
dispbitcnt++;
if(dispbitcnt==6)
{dispbitcnt=0;<br> }
tcnt++;
//中斷產生秒信號
if(tcnt==244)
{tcnt=0;<br> <br>second++;<br> <br>if(second==60)<br> <br> {second=0;<br> <br> minite++;<br> <br> if(minite==60)<br> <br> {minite=0;<br> <br> <br>hour++;<br> <br> <br>if(hour==24)<br> <br> <br> {hour=0;<br> <br> <br> }
}
}
dispbuf[4]=second%10;
dispbuf[5]=second/10;
dispbuf[2]=minite%10;
dispbuf[3]=minite/10;
dispbuf[0]=hour%10;
dispbuf[1]=hour/10;
}
TMOD=0x01;
TL0=0x10;
TH0=0xf0;
}
///****************1ms延時程序******************
void delay_1ms(unsigned char i)
{
unsigned char j;
for(i=0;i<144;i++)
for(j=0;j<144;j++);
}
//*************主程序********************
void main(void)
{
TMOD=0x01;
TL0=0x10;
TH0=0xf0;
while(1)
{
dispbitcnt=0;
P1=0x00;
//開段碼
P2=0x00;
//開位碼
delay_1ms(200);
//延時
delay_1ms(200);
//延時
delay_1ms(200);
//延時
delay_1ms(200);
//延時
P2=0xff;
//關位碼
EA=1;
ET0=1;
TR0=1;
while(1);
}
}
Ⅲ 我在學AVR單片機在遇到數碼管動態顯示實驗時,裡面要有個Delay延時,為什麼要延時啊
大凡涉及動態顯示,有一個基本數據,那就是一個畫面在1秒的時間內最少顯示24次(24Hz),至於這個數據的出處我也不詳細,如此,一個畫面停留時間不能大於42毫秒,而要想畫面穩定則至少要達到50Hz以上,對於數碼管的顯示,由於是通過通/斷電的方式進行掃描控制的,所以這又有別於上訴的幀頻顯示原理,因為電源的頻繁通斷使得數碼管獲得的平均工作電流降低了,相當於PWM調壓作用,所以要仔細調整通/斷這兩個延時時間以獲得兼顧顯示的穩定和亮度的合理,另外最終顯示結果還和顯示代碼的結構及實板演示、模擬模擬等多種因素有關。
Ⅳ 數碼管動態顯示中要改善顯示效果實驗程序應作哪些修改
1. 在Proteus軟體中畫好51單片機最小核心電路,包括復位電路和晶振電路
2. 在電路中增加四個7段數碼管(共陽/共陰自選),將P1口作數據輸出口與7段數碼管數據引腳相連 ,P2.0~P2.3引腳輸出選控制信號
3. 在Keil軟體中編寫程序,採用動態顯示法,實現數碼管分別顯示數字1,2,3,4
二、實驗目的
1. 鞏固Proteus軟體和Keil軟體的使用方法
Ⅳ 數碼管動態顯示工作原理
1、多個數碼管的段碼連接在一起,位碼分別控制。
2、由於段碼連接在一起,如果數碼管全亮,則顯示的數據相同,所以為了顯示不同的數字,任何時刻,只能有一個數碼管顯示,其餘不顯示。
3、用軟體使這幾個數碼管輪流顯示我們需要的數字。
4、只要更新頻率足夠快(>100Hz),肉眼看起來,這些數碼管就同時顯示我們需要的數字了。
(5)單片機數碼管動態顯示實驗擴展閱讀:
數碼管的最常見形式有10個陰極,形狀為數字0到9,某些數碼管還有一個或兩個小數點。然而也有其他類型的數碼管顯示字母、標記和符號。如一種「數碼管」,其陰極為一個模板製成的面具,上面有數字形狀的孔。一些俄羅斯的數碼管,如IN-14,使用倒立的數字2代表5,大概是為了節約生產成本,而沒有明顯的技術或美學方面的原因。俄羅斯的數碼管大部分都使用了倒立的2作為5。
將170伏的直流電壓加在陰極和陽極之間,每一個陰極可以發出氖的的紅橙色光。由於混合氣體的不同,不同類型的數碼管之間的顏色有所區別。壽命較長的數碼管在製造中加入了汞,減少了濺射,結果發出的光的顏色為藍色或紫色調。在某些情況下,這些顏色被玻璃上的紅色或橙色過濾塗層過濾。
Ⅵ 單片機數碼管顯示生日實訓會出現的問題
我們最常用的是七段式和八段式LED數碼管,八段比七段多了一個小數點,其他的基本相同。所謂的八段就是指數碼管里有八個小LED發光二極體,通過控制不同的LED的亮滅來顯示出不同的字形。數碼管又分為共陰極和共陽極兩種類型,其實共陰極就是將八個LED的陰極連在一起,讓其接地,這樣給任何一個LED的另一端高電平,它便能點亮。而共陽極就是將八個LED的陽極連在一起。其原理圖如下。
註:共陽極數碼管:低電平點亮
共陰極數碼管:高電平點亮
2.段碼位元組與位元組中各位對應關系:
代碼位: D7 D6 D5 D4 D3 D2 D1 D0
顯示段: dp g f e d c b a
3.重影:IO口從高電平到低電平,有一定的殘留的電流在裡面。
在數碼管動態顯示實驗中,每次送完段選數據後,在送入位選數據之前,需要一句
「P0 = 0xff」 ,這條語句的專業名稱叫做「消影」
解釋如下:
在剛送完段選數據後,P0口仍然保持著上次的段選數據,若不加「P0 = 0xff」這句話,再執行接下來的打開位鎖存器命令後,原來保持在P0口的段選數據將立即通過位選鎖存器直接加在數碼管上,接下來才是再次通過P0口給位選鎖存器送入位選數據,雖然這個過程非常短暫,但是在數碼管高速顯示狀態下,我們仍然可以看到數碼管出現顯示混亂的現象,加上消影之後,在開啟位鎖存器後,P0口數據全為高電平,所以哪個數碼管都不會亮,因此這個消影的動作是很重要的。
4.關於送數據與送段選位選先後問題:
/*
* 函數名:DulaSet
* 描述 :數碼管段選設置
* 輸入 :DP:數碼管段選是否為帶小數點顯示方式 Y:是 / N:否
* DU:段選——范圍為16個字形碼
* 輸出 :無
* 備注 :先送位選數據,再使能鎖存器,(最佳寫法)
* 因為只有P0狀態穩定了,鎖進去的數據才不會出錯
* 否則顯示0x00(即數碼管8位全關斷)會有亮影
* 接著關鎖存器,一瞬間鎖存器即可鎖存數據
*/
void DulaSet(uchar DP,uchar DU)
{
if(DP == Y)
P0 = NTDP[DU]; //送段選數據,帶小數點段選表示
else if(DP == N)
P0 = NT[DU]; //送段選數據
DULA = 1; //開U1鎖存器端
DULA = 0; //關U1鎖存器端
}
5.數碼管靜態顯示與動態顯示的區別:
(對於單片機上8位的數碼管(8段LED)
靜態:
段碼線:每一位段碼線分別與一個8位I/O鎖存器輸出相連
位碼線:8個8位I/O口
動態:
段碼線:一個數碼管佔用一個8位I/O口
位碼線:8個數碼管佔用一個8位I/O口
但在實際單片機硬體電路連接中,都把段碼線並聯,故,靜態顯示方式下,所有數碼管顯示相同。
3. 由於各個數碼管的段碼線並聯,(靜態顯示下)在同一時刻,8個數碼管將顯示相同的字元,因此若要各個數碼管能夠同時顯示出與本位相應的顯示字元,就必須採用動態掃描的顯示方式。即在某一時刻,只讓某一位的位選線處於選通狀態,同時,段碼線上輸出相應為要顯示的字元。LED不同為顯示的時間間隔(掃描間隔)應根據實際情況而定。發光二極體從導通到發光有一定的延時,導通時間太短,發光太弱,人眼無法看清;時間太長,要受限於臨界閃爍頻率,而且此時間越長,佔用單片機的時間越多。另外顯示位數增多,也將佔用大量的單片機時間,因此動態顯示的實質是一些犧牲單片機的時間來換取I/O埠的減少。
Ⅶ 單片機實驗中數碼管顯示出現拖影的原因及解決方法
你所謂的拖影,本人稱之為 殘影。
數碼管殘影的產生,只發生在動態掃描的設計電路中,主要問題是軟體設計者考慮不足引起的。
殘影產生的原理是:
在程序進行切換數碼管顯示時,舊數據(上一位數碼管的段選數據)依然存在,就開啟了新數碼管的位選,導致 舊數據 在 新數碼管 短暫出現,然後程序更換新數據,替換了 舊數據。反復快速的進行此類操作,導致短時間內,舊數據 在 新數碼管 上的顯示次數劇增,使光亮度達到人眼可以輕微辨別的程度,於是出現所謂 殘影。
解決方法:
從上面看出,合適的段選、位選開啟過程是消除殘影的重要因素。不同編程習慣,有不同的過程方法。只要保證,在新位選開啟前,數據已經更新即可。例:
關閉所有段選→數據①→段選①→時間→關閉所有段選→數據②→段選②→時間→關閉所有段選……………………
Ⅷ 如何利用單片機讓4位數碼管顯示
程序如下(用的是STC89C52晶元):
#include<reg52.h>//52系列單片機頭文件
#defineucharunsignedchar
#defineuintunsignedint
uintx,y;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//共陰極數碼管編碼
voiddisplay(uchar,uchar,uchar,uchar);//聲明子函數
voiddelay(int);//聲明子函數
voidmain()
{
while(1)
{
display(1,2,3,4);//主程序始終調用數碼管顯示子程序
}
}
voiddisplay(uchara,ucharb,ucharc,uchard)
{
P2=0xef;
P0=table[a];//給第一個數碼管送"a"
delay(1);//延時1ms
P2=0xdf;
P0=table[b];//給第二個數碼管送"b"
delay(1);//延時1ms
P2=0xbf;
P0=table[c];//給第三個數碼管送"c"
delay(1);//延時1ms
P2=0x7f;
P0=table[d];//給第三個數碼管送"d"
delay(1);//延時1ms
}
voiddelay(uintz)//延時子函數
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
(8)單片機數碼管動態顯示實驗擴展閱讀
led數碼管是由多個發光二極體封裝在一起組成「8」字型的器件,引線已在內部連接完成,只需引出它們的各個筆劃,公共電極。led數碼管常用段數一般為7段有的另加一個小數點,還有一種是類似於3位「+1」型。
位數有半位,1,2,3,4,5,6,8,10位等等,led數碼管根據LED的接法不同分為共陰和共陽兩類,了解LED的這些特性,對編程是很重要的,因為不同類型的數碼管,除了它們的硬體電路有差異外,編程方法也是不同的。