51 匯編語言編程:變速計數(shù)
;用51單片機控制 2位數(shù)碼管動態(tài)顯示 00 ~ 99。
;從 00 開始顯示,顯示數(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 定時50ms(假設(shè)晶振頻率是 12MHz)。
;大家都知道,每當(dāng)中斷 20 次,就是 1s。
;如果這個 20,不是固定的常數(shù),而是個變量,分別是:
; 2、4、6...、20,那么,即可實現(xiàn)定時 100ms、200ms、...。
;程序中,使用寄存器B,保存這個變量,初始時,令其為 2。
;以后,每當(dāng)計數(shù)到十位數(shù)發(fā)生變化時,就把 B 加上 2。
;加到了 22,就再令其為 2。
;程序仿真執(zhí)行的截圖如下:
;圖中使用了共陽數(shù)碼管。
;觀看的效果如何呢 ?
;前面的,定時 100ms、200ms...,太快,看不很準。
;但是,可以看出來,計數(shù)速度,是逐漸減慢的。
;等到了 90~00,就可以看到,每隔一秒,跳一個字,還是很準確的。
----
C 語言程序如下:
#include
char n1 = 0, n2 = 0; //用于顯示
char n_t1 = 0, n_t2 = 2; //用于計數(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;
}
}
}