(2)數(shù)碼管動態(tài)顯示(循環(huán)顯示0~9,時間間隔為1秒,1秒的時間間隔用定時器T0實現(xiàn)) ①匯編語言: ORG 0000H AJMP MAIN ORG 000BH AJMP INTT0 ORG 0030H MAIN:CLR P2.7 MOV DPTR,#TAB CLR A MOV R2,#0H MOV R3,#0H MOV TMOD,#01H MOV TH0,#4CH MOV TL0,#00H SETB EA SETB ET0 SETB TR0 HERE: CJNE R2,#14H,HERE MOV R2,#0H PUSH ACC MOVC A,@A+DPTR MOV P0,A POP ACC INC A INC R3 CJNE R3,#0AH,HERE MOV R3,#00H ;此處用DJNZ 更方便,只不過R3的初始值 ;要設(shè)置為0AH,同時取消INC R3指令(此行上面第二行) CLR A AJMP HERE ORG 80H INTT0:MOV TH0,#4CH MOV TL0,#00H INC R2 RETI TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H END ②C語言 #include<reg51.h> #define uint unsigned int #define uchar unsigned char sbit p27=P2^7;//數(shù)碼管位選端定義 uchar c,i; //數(shù)碼管譯碼表 unsigned char code NumDecode[] = { 0XC0,//;0 0XF9,//;1 0XA4,//;2 0XB0,//;3 0X99,//;4 0X92,//;5 0X82,//;6 0XF8,//;7 0X80,//;8 0X90,//;9 }; void main() { i=0;//10秒計時設(shè)置 c=0;//中斷次數(shù)計數(shù) p27=1;//數(shù)碼管位選端關(guān)閉 TMOD=1;//設(shè)置定時器0為工作方式1 TH0=(65536-46080)/256;//定時50ms高8位求模 TL0=(65536-46080)%256;//定時50ms低8位求余 EA=1;//開總中斷 ET0=1;//定時器0中斷 TR0=1;//啟動定時器0 while(1) { if(c==20)//50ms中斷20次 { c=0; i++;//倒計時總數(shù)每秒減1 } if(i<10) { p27=0;//數(shù)碼管位選選通 P0=NumDecode[i];//顯示數(shù)據(jù) } else //循環(huán)計時設(shè)置 { i=0; } } } void timer0() interrupt 1//定時器0中斷入口 { TH0=(65536-46080)/256;//定時器重新賦初值 TL0=(65536-46080)%256; c++;//中斷次數(shù) }