一、 实验题目
猜数字小游戏:串行口发送0x01、0x02、0x03 HEX数据中的一个到51单片机,对应的按键key1-key3,发送数据之后,另一边人员猜测对应的HEX码,并按下对应的按键,若按下正确的按键,则LED灯闪烁,按下不正确的按键,则蜂鸣器响一下报错,程序可以一直执行到猜中停止,此时按下key4清空复位运行数据,等待下一个串口发送的数据进行下一次猜数字。
二、 设计方案及电路
设计方案:
串口通过定时器1产生9600波特率,接收中断里面处理接收数据,主循环里面对接收数据进行判断,根据不同的HEX码转换到不同的按键判断任务,通过扫描的方式读取KEY1-3,判断读取的值,如果与HEX码对应的按键不同,则跳转到蜂鸣器报警函数,执行后在返回按键扫描,若相同则跳转到流水灯函数,一直处于循环之中,通过按键4的外部中断清零状态,返回接收判断循环,等待下一次串口的数据来到。
电路图:
三、 实验步骤
编写串口初始化程序,配置中断接收内容
编写判断循环主体函数
根据主体判断循环的结果,编写各个按键判断循环
在按键判断循环里面编写按键扫描函数,判断按键按下的结果,正确跳转到流水灯循环函数,错误则跳转到蜂鸣器报错函数,执行蜂鸣器报警后返回按键扫描继续判断。
编写流水灯循环及蜂鸣器报警函数
编写按键key4的外部中断函数,使按键按下后跳转到初始判断循环函数,调试复位流水灯IO口
四、 实验程序
ORG 0000H
LJMP MAIN
ORG 0003H ;INTO中断入口
LJMP INTT0
ORG 0023H ;串口中断入口
LJMP RX_TI
MAIN: ;初始化函数MAIN函数
MOV SCON, #0X50 ;串口初始化
ANL PCON, #00H
MOV TMOD, #0X20
MOV TL1, #0XFD ;波特率9600
MOV TH1, #0XFD
SETB TR1 ;开启中断
SETB ES
SETB EA
SETB RI
SETB EX0 ;打开外部中断0
SETB IT0 ;跳变沿触发方式
LOOP: ;判断循环函数,判断串口接收的数据,跳转对应函数
MOV R4, #00H
MOV A, R3
MOV R7, A
CJNE R7, #01H, JUDGE1 ;0x01对应按键1判断
LJMP LOOP1
JUDGE1:
CJNE R7, #02H, JUDGE2 ;0x02对应按键2判断
LJMP LOOP2
JUDGE2:
CJNE R7, #03H, LOOP ;0x03对应按键3判断
LJMP LOOP3
LJMP LOOP
LOOP1: ;按键1判断循环函数
MOV P3, #0FFH
MOV A, P3
CPL A
ANL A, #18H
JNZ KEY_WRONG ;扫描到不是不是按键1则跳转到蜂鸣器报错函数
MOV A, P3
ANL A, #20H
JNZ LOOP1
LJMP KEY_RIGHT ;扫描到按键1则跳转到流水灯函数
LJMP LOOP
LOOP2: ;按键2判断循环函数(与1同)
MOV P3, #0FFH
MOV A, P3
CPL A
ANL A, #28H
JNZ KEY_WRONG
MOV A, P3
ANL A, #10H
JNZ LOOP2
LJMP KEY_RIGHT
LJMP LOOP
LOOP3: ;按键3判断循环函数(与1同)
MOV P3, #0FFH
MOV A, P3
CPL A
ANL A, #30H
JNZ KEY_WRONG
MOV A, P3
ANL A, #08H
JNZ LOOP3
LJMP KEY_RIGHT
LJMP LOOP
INTT0: ;按键4外部中断函数,复位LED的IO口,跳转返回判断循环
PUSH ACC
SETB P2^0
ACALL DELAY
SETB P2^1
MOV R4, #01H
MOV R7, #00H
POP ACC
RETI
RX_TI: ;按键2判断循环函数(与1同)
PUSH ACC
CLR RI
MOV R7, SBUF
ACALL DELAY
MOV A, R7
MOV R3, A
POP ACC
RETI
KEY_RIGHT: ;流水的循环函数
CJNE R4, #00H, LOOP
SETB P2^0
CLR P2^1
ACALL DELAY
SETB P2^1
CLR P2^0
ACALL DELAY
LJMP KEY_RIGHT
KEY_WRONG: ;蜂鸣器报警函数
CLR P0^0
ACALL DELAY
SETB P0^0
LJMP LOOP
DELAY: ;延时函数
MOV R5, #255
LOOP5:
MOV R6, #255
DJNZ R6, $
DJNZ R5, LOOP5
RET
END