懂AT89S52单片机 汇编 抢答器 的高手进来

来源:百度知道 编辑:UC知道 时间:2024/06/10 07:28:31
我做的是一个8路抢答器的程序。但我就这个程序弄进单片机里去,不能用呀,我这个程序错那儿了?帮我看看嘛!谢谢!(只是给我改程序别的东西全是好的)请把改后的程序给全 谢谢高手们了!

程序如下:
START:MOV R5,#0BH
MOV R4,#0BH
MOV R3,#OBH
ACALL DISPLAY
JB P3.0 NEXT
ACALL DELAY
JB P3.0,NEXT
ACALL BARK
MOV A,R1
MOV R6,A
SETB OK
MOV R7,#01H
MOV R3,#0AH
AJMP COUNT
NEXT:JNB P1.0,FALSE1
JNB P1.1 FALSE2
JNB P1.2 FALSE3
JNB P1.3 FALSE4
JNB P1.4 FALSE5
JNB P1.5 FALSE6
JNB P1.6 FALSE7
JNB P1.7 FALSE8
AJMP START
INTOSUB:MOV A,R1
MOV B,#0AH
DIV AB
MOV R5,A
MOV R4,B
MOV R3,#0AH
ACALL DISPLAY
JNB P3.4 INCO
JNB P3.5 DECO
JNB P3.1 BACKO
AJMP INTOSUB
INCO:MOV A,R1
CJNE A,#36H,ADD0
MOV R1,#00H
ACALL DELAY1
AJMP UNTOSUB
ADD0:INC R1
ACALL DELAY1
AJMP INTOSUB
DECO:MOV A,R1
JZ SETR1
DEC R1
ACALL DELAYL
AJMP INTOSUB
SETR1:MOV R1,#63H
ACALL DELAY1

我这里有一个抢答器程序你看下吧,我建议你装一个Protues软件与keil联调一下进行硬件仿真。
LED1 EQU 30H ;定义数码管1显示数值变量
LED2 EQU 31H ;定义数码管2显示数值变量
LED3 EQU 32H ;定义数码管3显示数值变量
LED4 EQU 33H ;定义数码管4显示数值变量
LedT0 EQU 34H ;定义当前显示哪个数码管标志位

ORG 0000H ;开始
LJMP START ;转入主程序
ORG 000BH ;定时器0中断入口
LJMP INT_TO
ORG 0030H
START:
MOV SP,#60H ;初始化堆栈指针
MOV TMOD,#01H ;设定T0为十六位定时模式。
MOV TH0,#0F6H ;给定时器初始值2.5MS
MOV TL0,#03BH ;
SETB TR0 ;开定时器0计数
SETB ET0 ;致能定时0中断
CLR TF0 ;清定时0中断标志
SETB EA ;开总中断

MOV LedT0,#1H ;初始化数码管标志位,使得中断中第一次显示数码管1
MOV DPTR,#TABLE ;初始化数据指针DPTR
MAIN:
MOV LED1,#10h ;给4个数码管初始值,4个数码管开始显示"----"
MOV LED2,#10h
MOV LED3,#10h
MOV LED4,#10h

SCAN: ;主循环,按键SW5按下一次,数码管4的值加1
JB P3.3,SCAN1 ;有按键?
CALL DELAY10MS ;去键抖
JB P3.3,SCAN1 ;再次确认

MOV P1,#0FEH ;点亮P1口的led灯
MOV LED3,#0H ;给两个数码管显示01
MOV LED4,#1H
CPL P2.3 ;蜂鸣器鸣叫