单片机设计的四人抢答器
下面的程序有没有什么错误,另外哪位高手能够给我具体讲一下每句话都是什么意思,非常感谢org0000hajmpmain;上电自动转向主程序org0003hajmpstart...
下面的程序有没有什么错误,另外哪位高手能够给我具体讲一下每句话都是什么意思,非常感谢
org 0000h
ajmp main ;上电自动转向主程序
org 0003h
ajmp start ;转向start 子程序
org 000bh
ajmp time ;转向time子程序
org 0030h ;主程序首地址
main: mov tmod,#1 ;置T/C 0为方式1,定时;置T/C 1为方式1,计数
mov th0,#0b1h ;送T/C 0定时初值
mov tl0,#0e0h
mov ie, #83h ;设置中断
setb tr0
mov r3,#0
mov r4,#0
mov 30h,#0 ;显示秒表的个位LED数码管清零
mov 31h,#0 ;显示秒表的十位LED数码管清零
mov 32h,#0 ;显示选手号的LED数码管清零
disp: mov sp,5fh
mov a,#03h ;对8155初始化,A口、B口输出,C口输入
mov dptr,#0ff20h
movx @dptr,a
loop: mov r5,#1 ;置字位码初值
mov r0,#30h ;置显示缓冲区指针初值
mov a,r5
loop1: mov dptr,#0ff21h ;字位码送8155 A口
movx @dptr,a
mov dptr,#0ff22h
mov a,@r0
add a,#0eh
movc a,@a+pc ;查字位码表
movx @dptr,a ;字形码送8155 B口
acall dlay ;延时1MS
inc r0
mov a,r5
jb acc.2,ld
rl a
mov r5,a
ajmp loop1
ld: sjmp loop ;周而复始
table:db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,0c8h ;字形码表
dlay: mov r7,#02h ;延时子程序
dl1: mov r6,#0ffh
dl2: djnz r6,dl2
djnz r7,dl1
ret ;中断返回
time: mov th0,#0b1h ;重新装入计数初值
mov tl0,#0e0h
push psw ;保护现场
push acc
mov a,#0fh
orl p1,a
mov a,p1
anl a,#0fh
cjne a,#0,go_on
inc r3
cjne r3,#25,back
mov r3,#0
inc r4
mov a,r4
mov b,#10
div ab
mov 31h,a
mov 30h,b
cjne r4,#20,back ;判断是否到20秒
cpl p1.7 ;到20秒红灯亮警告
mov 32h,#10
clr tr0 ;停止T/C 0计时
sjmp back
go_on: clr tr0
jnb acc.0,two ;判断是不是一号选手按键,若不是,转向二号
mov 32h,#01h ;LED显示1
sjmp back
two: jnb acc.1,three ;判断是不是二号选手按键,若不是,转向三号
mov 32h,#02h ;LED显示2
sjmp back
three: jnb acc.2,four ;判断是不是三号选手按键,若不是,转向四号
mov 32h,#03h ;LED显示3
sjmp back
four: mov 32h,#04h ;LED显示4
back: pop acc
pop psw
reti ;中断返回
start: setb tr0
reti ;中断返回
end 展开
org 0000h
ajmp main ;上电自动转向主程序
org 0003h
ajmp start ;转向start 子程序
org 000bh
ajmp time ;转向time子程序
org 0030h ;主程序首地址
main: mov tmod,#1 ;置T/C 0为方式1,定时;置T/C 1为方式1,计数
mov th0,#0b1h ;送T/C 0定时初值
mov tl0,#0e0h
mov ie, #83h ;设置中断
setb tr0
mov r3,#0
mov r4,#0
mov 30h,#0 ;显示秒表的个位LED数码管清零
mov 31h,#0 ;显示秒表的十位LED数码管清零
mov 32h,#0 ;显示选手号的LED数码管清零
disp: mov sp,5fh
mov a,#03h ;对8155初始化,A口、B口输出,C口输入
mov dptr,#0ff20h
movx @dptr,a
loop: mov r5,#1 ;置字位码初值
mov r0,#30h ;置显示缓冲区指针初值
mov a,r5
loop1: mov dptr,#0ff21h ;字位码送8155 A口
movx @dptr,a
mov dptr,#0ff22h
mov a,@r0
add a,#0eh
movc a,@a+pc ;查字位码表
movx @dptr,a ;字形码送8155 B口
acall dlay ;延时1MS
inc r0
mov a,r5
jb acc.2,ld
rl a
mov r5,a
ajmp loop1
ld: sjmp loop ;周而复始
table:db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,0c8h ;字形码表
dlay: mov r7,#02h ;延时子程序
dl1: mov r6,#0ffh
dl2: djnz r6,dl2
djnz r7,dl1
ret ;中断返回
time: mov th0,#0b1h ;重新装入计数初值
mov tl0,#0e0h
push psw ;保护现场
push acc
mov a,#0fh
orl p1,a
mov a,p1
anl a,#0fh
cjne a,#0,go_on
inc r3
cjne r3,#25,back
mov r3,#0
inc r4
mov a,r4
mov b,#10
div ab
mov 31h,a
mov 30h,b
cjne r4,#20,back ;判断是否到20秒
cpl p1.7 ;到20秒红灯亮警告
mov 32h,#10
clr tr0 ;停止T/C 0计时
sjmp back
go_on: clr tr0
jnb acc.0,two ;判断是不是一号选手按键,若不是,转向二号
mov 32h,#01h ;LED显示1
sjmp back
two: jnb acc.1,three ;判断是不是二号选手按键,若不是,转向三号
mov 32h,#02h ;LED显示2
sjmp back
three: jnb acc.2,four ;判断是不是三号选手按键,若不是,转向四号
mov 32h,#03h ;LED显示3
sjmp back
four: mov 32h,#04h ;LED显示4
back: pop acc
pop psw
reti ;中断返回
start: setb tr0
reti ;中断返回
end 展开
3个回答
展开全部
如果有电路原理图就更好分析了。。。
org 0000h
ajmp main ; ;上电自动转向主程序
org 0003h ;【外部中断0入口 】
ajmp start ; ;转向start 子程序
org 000bh ;【定时器T0中断入口】
ajmp time ; 转向time子程序
org 0030h ; ;主程序首地址
main: mov tmod,#1; 0000 0001 置T/C 1为【方式0】,计数 ;【置T/C 0为方式1,定时】
mov th0,#0b1h; ;送T/C 0定时初值
mov tl0,#0e0h
mov ie, #83h ; ;设置中断
setb tr0 ;【启动T0】
mov r3,#0
mov r4,#0
mov 30h,#0; ;显示秒表的个位LED数码管清零
mov 31h,#0; ;显示秒表的十位LED数码管清零
mov 32h,#0; ;显示选手号的LED数码管清零
disp: mov sp,5fh
mov a,#03h ; 0000 0011 ;对8155初始化,A口、B口输出,C口输入
mov dptr,#0ff20h ;【控制口的地址】
movx @dptr,a ;【写8155控制字】
loop: mov r5,#1 ; ;置字位码初值
mov r0,#30h ; ;置显示缓冲区指针初值
mov a,r5
loop1: mov dptr,#0ff21h ; ;字位码送8155 A口
movx @dptr,a ;把a的值送到A口
mov dptr,#0ff22h ;8155 B口
mov a,@r0
add a,#0eh ;【a=0FH 0eH=14=1+2+1+1+3+1+1+2+2 (跳过14个字节)】
movc a,@a+pc ; ;查字位码表
movx @dptr,a ; ;字形码送8155 B口 【(本指令占1个字节)】
acall dlay ; ;延时1MS 【(本指令占2个字节)】
inc r0 ; 【(本指令占1个字节)】
mov a,r5 ; 【(本指令占1个字节)】
jb acc.2,ld ; 【(本指令占3个字节)】
rl a ; 【(本指令占1个字节)】
mov r5,a ; 【(本指令占1个字节)】
ajmp loop1 ; 【(本指令占2个字节)】
ld: sjmp loop ; ;周而复始 ; 【(本指令占2个字节)】
table:db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,0c8h ; 共阳 字形码表
;【 0 1 2 3 4 5 6 7 8 9 0】
dlay: mov r7,#02h ; ;延时子程序,【大约延时2*255+2*2+2*2us=518us】
dl1: mov r6,#0ffh
dl2: djnz r6,dl2
djnz r7,dl1
ret ; ;【子程序返回】而非【中断返回】,两者不一样
time: mov th0,#0b1h ; ;重新装入计数初值
mov tl0,#0e0h
push psw ; ;保护现场
push acc
mov a,#0fh
orl p1,a ;【p1口低四位输出高电平】
mov a,p1 ;【读P1口】
anl a,#0fh ;【屏蔽高四位】
cjne a,#0,go_on ;【A低四位不为零就转移到go_on】
inc r3 ;
cjne r3,#25,back ;【r3不等于25就转移到back,即直接返回】
mov r3,#0 ;【如果r3等于25了,就把r3的值清零】
inc r4
mov a,r4
mov b,#10
div ab ;【r4除以10,以分离出个位和十位。个位(余数)放在b,十位(商)放在a】
mov 31h,a
mov 30h,b
cjne r4,#20,back ; 判断是否到20秒
cpl p1.7 ; ;到20秒红灯亮警告
mov 32h,#10
clr tr0 ; ;停止T/C 0计时
sjmp back
go_on: clr tr0
jnb acc.0,two ; ;判断是不是一号选手按键,若不是,转向二号
mov 32h,#01h ; ;LED显示1
sjmp back
two: jnb acc.1,three ; ;判断是不是二号选手按键,若不是,转向三号
mov 32h,#02h; ;LED显示2
sjmp back
three: jnb acc.2,four ; ;判断是不是三号选手按键,若不是,转向四号
mov 32h,#03h ; ;LED显示3
sjmp back
four: mov 32h,#04h ; ;LED显示4
back: pop acc
pop psw
reti ; ;中断返回
start: setb tr0
reti ; ;中断返回
end
org 0000h
ajmp main ; ;上电自动转向主程序
org 0003h ;【外部中断0入口 】
ajmp start ; ;转向start 子程序
org 000bh ;【定时器T0中断入口】
ajmp time ; 转向time子程序
org 0030h ; ;主程序首地址
main: mov tmod,#1; 0000 0001 置T/C 1为【方式0】,计数 ;【置T/C 0为方式1,定时】
mov th0,#0b1h; ;送T/C 0定时初值
mov tl0,#0e0h
mov ie, #83h ; ;设置中断
setb tr0 ;【启动T0】
mov r3,#0
mov r4,#0
mov 30h,#0; ;显示秒表的个位LED数码管清零
mov 31h,#0; ;显示秒表的十位LED数码管清零
mov 32h,#0; ;显示选手号的LED数码管清零
disp: mov sp,5fh
mov a,#03h ; 0000 0011 ;对8155初始化,A口、B口输出,C口输入
mov dptr,#0ff20h ;【控制口的地址】
movx @dptr,a ;【写8155控制字】
loop: mov r5,#1 ; ;置字位码初值
mov r0,#30h ; ;置显示缓冲区指针初值
mov a,r5
loop1: mov dptr,#0ff21h ; ;字位码送8155 A口
movx @dptr,a ;把a的值送到A口
mov dptr,#0ff22h ;8155 B口
mov a,@r0
add a,#0eh ;【a=0FH 0eH=14=1+2+1+1+3+1+1+2+2 (跳过14个字节)】
movc a,@a+pc ; ;查字位码表
movx @dptr,a ; ;字形码送8155 B口 【(本指令占1个字节)】
acall dlay ; ;延时1MS 【(本指令占2个字节)】
inc r0 ; 【(本指令占1个字节)】
mov a,r5 ; 【(本指令占1个字节)】
jb acc.2,ld ; 【(本指令占3个字节)】
rl a ; 【(本指令占1个字节)】
mov r5,a ; 【(本指令占1个字节)】
ajmp loop1 ; 【(本指令占2个字节)】
ld: sjmp loop ; ;周而复始 ; 【(本指令占2个字节)】
table:db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,0c8h ; 共阳 字形码表
;【 0 1 2 3 4 5 6 7 8 9 0】
dlay: mov r7,#02h ; ;延时子程序,【大约延时2*255+2*2+2*2us=518us】
dl1: mov r6,#0ffh
dl2: djnz r6,dl2
djnz r7,dl1
ret ; ;【子程序返回】而非【中断返回】,两者不一样
time: mov th0,#0b1h ; ;重新装入计数初值
mov tl0,#0e0h
push psw ; ;保护现场
push acc
mov a,#0fh
orl p1,a ;【p1口低四位输出高电平】
mov a,p1 ;【读P1口】
anl a,#0fh ;【屏蔽高四位】
cjne a,#0,go_on ;【A低四位不为零就转移到go_on】
inc r3 ;
cjne r3,#25,back ;【r3不等于25就转移到back,即直接返回】
mov r3,#0 ;【如果r3等于25了,就把r3的值清零】
inc r4
mov a,r4
mov b,#10
div ab ;【r4除以10,以分离出个位和十位。个位(余数)放在b,十位(商)放在a】
mov 31h,a
mov 30h,b
cjne r4,#20,back ; 判断是否到20秒
cpl p1.7 ; ;到20秒红灯亮警告
mov 32h,#10
clr tr0 ; ;停止T/C 0计时
sjmp back
go_on: clr tr0
jnb acc.0,two ; ;判断是不是一号选手按键,若不是,转向二号
mov 32h,#01h ; ;LED显示1
sjmp back
two: jnb acc.1,three ; ;判断是不是二号选手按键,若不是,转向三号
mov 32h,#02h; ;LED显示2
sjmp back
three: jnb acc.2,four ; ;判断是不是三号选手按键,若不是,转向四号
mov 32h,#03h ; ;LED显示3
sjmp back
four: mov 32h,#04h ; ;LED显示4
back: pop acc
pop psw
reti ; ;中断返回
start: setb tr0
reti ; ;中断返回
end
华芯测试
2024-09-01 广告
2024-09-01 广告
电学测试台是深圳市华芯测试科技有限公司的核心设备之一,它集成了高精度测量仪器与自动化控制系统,专为半导体芯片、电子元件及模块的电性能检测而设计。该测试台能够迅速、准确地完成电压、电流、电阻、电容及频率等关键参数的测试,确保产品质量符合行业标...
点击进入详情页
本回答由华芯测试提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询