C51數碼管鬼影產生的乙個解決方法 中斷)

2021-10-03 19:03:56 字數 1772 閱讀 7900

(這個方法有助於加深對於中斷的理解)

在今天設計乙個關於數碼管的秒錶時,採用了以下**:

#include 

sbit addr0=p1

^0;sbit addr1=p1

^1;sbit addr2=p1

^2;sbit addr3=p1

^3;sbit enled=p1

^4;unsigned char code ledchar=

;unsigned char ledbuff[6]

=;unsigned char i=0;

unsigned int cnt=0;

unsigned char flag=0;

void

main()

;if(sec/

100%

10==

0&&sec/10%

10!=0)

; ledbuff[3]

=0x40

; ledbuff[4]

=0x4f

; ledbuff[5]

=0x5b;}

}}void

interrupttimer0

() interrupt 1p0=

0x00

;switch

(i)}

;

原本目的是三位秒錶如果百位為0則不會亮,但是卻出現了鬼影現象,這是為什麼呢?

個人的理解是,在以下**處,由於原本採用的定時器中斷方式,在定時器即將溢位時,**剛好執行到if之前,則會帶著錯誤的ledbuff值進入中斷程式,產生鬼影

ledbuff[1]

= ledchar[sec/10%

10]; ledbuff[2]

= ledchar[sec/

100%10]

;if(sec/

100%

10==

0&&sec/10%

10==

0)

下面是改進之後的**,也就是將相關賦值放在中斷程式中進行,就能消除鬼影啦(但是有的微控制器型號不同值得留意)

#include 

sbit addr0=p1

^0;sbit addr1=p1

^1;sbit addr2=p1

^2;sbit addr3=p1

^3;sbit enled=p1

^4;unsigned char code ledchar=

;unsigned char ledbuff[6]

=;unsigned char i =0;

unsigned int cnt =0;

unsigned char flag =0;

unsigned long sec =0;

void

main()

void

interrupttimer0

() interrupt 1

if(sec/

100%

10==

0&&sec/10%

10!=0)

}th0

=0xfc

;tl0

=0x67

; cnt++;if

(cnt >=

1000)p0

=0x00

;switch

(i)}

C51微控制器動態數碼管顯示

delay時間設定的不同可以展示出不同的效果,人的肉眼正常情況下只能分辨變化超過 24ms 間隔的運動,所以小於24ms看起來感覺是靜態顯示的,當延長delay時間時可展現出明顯的動態效果。include include typedef unsigned int u16 typedef unsign...

C51微控制器靜態數碼管 (0 F)

數碼管靜態顯示輪換 include typedef unsigned char u8 typedef unsigned int u16 sbit kza p2 2 控制顯示數碼管具體位 sbit kzb p2 3 sbit kzc p2 4 顯示位 u8 code shumag u8 a 10,i ...

C51微控制器Day03 數碼管靜態顯示

89c51引腳介紹 見課件 數碼管顯示的原理 位選和段選 include sbit dula p2 6 sbit wela p2 7 void main 編碼表code 隨機儲存器中每定義乙個變數都會占用乙個位元組如uchar,而int佔兩個位元組,而隨機儲存器共128位元組,故要合理使用 code...