51单片机串口应用实例(汇编)
【摘要】
51串口结合外部中断实例
一、 实验题目二、 设计方案及电路三、 实验步骤四、 实验程序
一、 实验题目
猜数字小游戏:串行口发送0x01、0x02、0x03 HEX数据中的一个到51单片...
一、 实验题目
猜数字小游戏:串行口发送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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
文章来源: blog.csdn.net,作者:JeckXu666,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq_45396672/article/details/109790722
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)