P2=0x20;
P0=table[shi]; delay(50); P2=0; P2=0x10;
P0=table[ge]; delay(50); P2=0;}
附件3
附录:程序代码
ORG 0000H ;单片机主程序入口地址 LJMP MAIN
ORG 0003H ; 外部中断0入口地址
LJMP INTER0 ORG 000BH ; 定时器0入口地址 LJMP TIMER0
INIT_T0: ; 子程序,初始化定时器0
MOV TMOD,#01H ; 定时器0工作方式1,16位计数器 MOV R2, #20 ; 1s=1000ms=20*50ms
MOV TL0,#00H ; 对于f=11.0592MHz的晶体振荡器 MOV TH0,#4CH ; (2^16-x)*(f/12)=50ms,x=4C00H SETB ET0 SETB EA SETB TR0
RET ; 返回,return MAIN: ; 主程序 MOV SP,#60H ; 设置堆栈位置
21
MOV R0,#44H ; 显示数据开始存放地址 MOV R1,#0 ; 数码管位数 MOV 43H,#1 ; 千位 MOV 42H,#2 ; 百位 MOV 41H,#3 ; 十位 MOV 40H,#4 ; 个位
SETB EX0 ;初始化外部中断0,允许中断源 SETB EA ;初始化外部中断0,允许总中断 SETB IT0 ;初始化外部中断0,下降沿触发方式 CALL INIT_T0 ; 调用子程序初始化定时器0 LOOP1: MOV A,@R0 MOV DPTR,#TAB01 MOVC A,@A+DPTR
MOV P0,A ; 向数码管发送数据 MOV A,R1 MOV DPTR,#TAB02 MOVC A,@A+DPTR
MOV P2,A ; 选中某个数码管 CALL DELAY ; 延时 INC R0 INC R1
CJNE R1,#4,LOOP1 ; 4个数码管显示完毕? MOV R0,#44H ; 显示数据开始存放地址 MOV R1,#0
22
JMP LOOP1 ; 反复执行 DELAY: ; 延时子程序 MOV R6,#2 ; (R6)=2
DEL01: MOV R7,#250 ; (R7)=250
DEL02: DJNZ R7,DEL02 ; R7减1不等于0跳转 DJNZ R6,DEL01 ; R6减1不等于0跳转 RET ; 返回
TIMER0: ; 定时器0中断服务程序
MOV TL0,#00H ; 对于f=11.0592MHz的晶体振荡器 MOV TH0,#4CH ; (2^16-x)*(f/12)=50ms,x=4C00H
DJNZ R2,END_T0 ; 如果不到20次中断则不足1s MOV R2, #20 ; 1s=1000ms=20*50ms
MOV A, 40H ;准备显示个位 MOV 44H, A
MOV A, 41H ;准备显示十位 MOV 45H, A
MOV A, 42H ;准备显示百位 MOV 46H, A
MOV A, 43H ;准备显示千位 MOV 47H, A
MOV 40H, #0 ; 准备下一次测量转速 MOV 41H, #0 ; 准备下一次测量转速
23
MOV 42H, #0 ; 准备下一次测量转速 MOV 43H, #0 ; 准备下一次测量转速 END_T0: RETI ; 中断返回,return interrupt
INTER0: ; 外部中断0中断服务程序 MOV A,40H INC A MOV 40H,A
CJNE A,#10,END_EX0
MOV 40H,#0 ;个位大于10则修改为0,十位加MOV A,41H INC A MOV 41H,A
CJNE A,#10,END_EX0
MOV 41H,#0 ;十位大于10则修改为0,百位加MOV A,42H INC A MOV 42H,A
CJNE A,#10,END_EX0
MOV 42H,#0 ;百位大于10则修改为0,千位加MOV A,43H INC A MOV 43H,A
CJNE A,#10,END_EX0
24
1 1 1
MOV 43H,#0 ;千位大于10则修改为0 END_EX0:
RETI ; 中断返回,return interrupt
TAB01:DB 0C0H,0F9H,0A4H,0B0H,099H ; 01234 段码 DB 092H,082H,0F8H,080H,090H ; 56789 段码 DB
088H,083H,0C6H,0A1H,086H,08EH ; ABCDEF段码 TAB02:DB 0EH,0DH,0BH,07H; 数码管位选 END ; 程序结束
25