用51單片機(jī)控制 2位數(shù)碼管動(dòng)態(tài)顯示 00 ~ 99
;用51單片機(jī)控制 2位數(shù)碼管動(dòng)態(tài)顯示 00 ~ 99。
;從 00 開始顯示,顯示數(shù)字每隔一段時(shí)間加 1,一直到 99,然后回到 00。
;從 00 到 10 每隔 100ms 加 1;
;從 10 到 20 每隔 200ms 加 1;
;其它依此類推;
;從 90 到 99 然后到 00 每隔 1s 加 1。
;做而論道用匯編語言編寫的程序如下:
? ? ORG ? 0000H
? ? JMP ? MAIN
? ? ORG ? 000BH
? ? JMP ? T0_INT
MAIN:
? ? MOV ? TMOD, #01H
? ? MOV ? TH0, #HIGH(65536-50000)
? ? MOV ? TL0, #LOW(65536-50000)
? ? SETB ?TR0
? ? SETB ?ET0
? ? SETB ?EA
? ? MOV ? B, #2
? ? MOV ? R2, B
? ? MOV ? R4, #0
? ? MOV ? R5, #0
? ? MOV ? R6, #2
LOOP:
? ? MOV ? A, R4
? ? ADD ? A, #(TAB - $ - 3)
? ? MOVC ?A, @A + PC
? ? MOV ? P0, A
? ? MOV ? P2, #2
? ? DJNZ ?R7, $
? ? DJNZ ?R7, $
? ? MOV ? P2, #0
? ? MOV ? A, R5
? ? ADD ? A, #(TAB - $ - 3)
? ? MOVC ?A, @A + PC
? ? MOV ? P0, A
? ? MOV ? P2, #1
? ? DJNZ ?R7, $
? ? DJNZ ?R7, $
? ? MOV ? P2, #0
? ? SJMP ?LOOP
;---------------------------------------
TAB: ? ? ?;共陽段碼
? ? DB ?0C0H, 0F9H, 0A4H, 0B0H
? ? DB ?099H, 092H, 082H, 0F8H
? ? DB ?080H, 090H
;---------------------------------------
T0_INT:
? ? MOV ? TH0, #HIGH(65536-50000)
? ? MOV ? TL0, #LOW(65536-50000)
? ? DJNZ ?R2, T0_END
? ? MOV ? R2, B
? ? INC ? R4
? ? CJNE ?R4, #10, T0_END
? ? MOV ? R4, #0
? ? INC ? R6
? ? INC ? R6
? ? CJNE ?R6, #22, T_B
? ? MOV ? R6, #2
T_B:
? ? MOV ? B, R6
? ? INC ? R5
? ? CJNE ?R5, #10, T0_END
? ? MOV ? R5, #0
T0_END:
? ? RETI
;---------------------------------------
END
;程序中,用 T0 定時(shí)50ms(假設(shè)晶振頻率是 12MHz)。
;大家都知道,每當(dāng)中斷 20 次,就是 1s。
;如果這個(gè) 20,不是固定的常數(shù),而是個(gè)變量,分別是:
; 2、4、6...、20,那么,即可實(shí)現(xiàn)定時(shí) 100ms、200ms、...。
;程序中,使用寄存器B,保存這個(gè)變量,初始時(shí),令其為 2。
;以后,每當(dāng)計(jì)數(shù)到十位數(shù)發(fā)生變化時(shí),就把 B 加上 2。
;加到了 22,就再令其為 2。
;程序仿真執(zhí)行的截圖如下:
;圖片鏈接:http://xiangce.baidu.com/picture/detail/beb6214cc0782f2e85f5ba61dd2af810553a9272
;圖中使用了共陽數(shù)碼管。
;觀看的效果如何呢 ?
;前面的,定時(shí) 100ms、200ms...,太快,看不很準(zhǔn)。
;但是,可以看出來,計(jì)數(shù)速度,是逐漸減慢的。
;等到了 90~00,就可以看到,每隔一秒,跳一個(gè)字,還是很準(zhǔn)確的。
;本題目來自:http://zhidao.baidu.com/question/570496034.html
;提問者,是想要 C 語言的程序,但是,題目中,也沒有說清楚,呵呵,白忙了。
----
C 語言程序如下:
#include
char n1 = 0, n2 = 0; ? ? //用于顯示
char n_t1 = 0, n_t2 = 2; //用于計(jì)數(shù)
char code seg[] = { ? ? ?//共陽段碼
? ? 0xC0, 0xf9, 0xa4, 0xb0, 0x99,
? ? 0x92, 0x82, 0xf8, 0x80, 0x90}; //0 ~ 9
void Main(void)
{
? ? char ?i;
? ? TMOD = 0x01;
? ? TH0 = (65536 - 50000) / 256;
? ? TL0 = (65536 - 50000) % 256;
? ? TR0 = 1;
? ? ET0 = 1;
? ? EA = 1;
? ? while (1) {
? ? ? P0 = seg[n1]; P2 = 2; for(i = 0; i < 100; i++); P2 = 0;
? ? ? P0 = seg[n2]; P2 = 1; for(i = 0; i < 100; i++); P2 = 0;
? ? }
}
T0_INT() ? interrupt 1
{
? ? TH0 = (65536 - 50000) / 256;
? ? TL0 = (65536 - 50000) % 256;
? ? n_t1++;
? ? if (n_t1 == n_t2) ?{
? ? ? n_t1 = 0;
? ? ? n1++;
? ? ? if (n1 == 10) {
? ? ? ? n1 = 0;
? ? ? ??
? ? ? ? n_t2 += 2;
? ? ? ? if (n_t2 == 22) n_t2 = 2;
? ? ? ? n2++;
? ? ? ? if (n2 == 10) n2 = 0;
? ? ? }
? ? }
}