(2)数码管动态显示(循环显示0~9,时间间隔为1秒,1秒的时间间隔用定时器T0实现) ①汇编语言: 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的初始值 ;要设置为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;//数码管位选端定义 uchar c,i; //数码管译码表 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秒计时设置 c=0;//中断次数计数 p27=1;//数码管位选端关闭 TMOD=1;//设置定时器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++;//倒计时总数每秒减1 } if(i<10) { p27=0;//数码管位选选通 P0=NumDecode[i];//显示数据 } else //循环计时设置 { i=0; } } } void timer0() interrupt 1//定时器0中断入口 { TH0=(65536-46080)/256;//定时器重新赋初值 TL0=(65536-46080)%256; c++;//中断次数 }