51单片机串口应用实例(汇编)

举报
JeckXu666 发表于 2022/01/17 23:12:56 2022/01/17
【摘要】 51串口结合外部中断实例 一、 实验题目二、 设计方案及电路三、 实验步骤四、 实验程序 一、 实验题目 猜数字小游戏:串行口发送0x01、0x02、0x03 HEX数据中的一个到51单片...

一、 实验题目

猜数字小游戏:串行口发送0x01、0x02、0x03 HEX数据中的一个到51单片机,对应的按键key1-key3,发送数据之后,另一边人员猜测对应的HEX码,并按下对应的按键,若按下正确的按键,则LED灯闪烁,按下不正确的按键,则蜂鸣器响一下报错,程序可以一直执行到猜中停止,此时按下key4清空复位运行数据,等待下一个串口发送的数据进行下一次猜数字。

二、 设计方案及电路

设计方案:
串口通过定时器1产生9600波特率,接收中断里面处理接收数据,主循环里面对接收数据进行判断,根据不同的HEX码转换到不同的按键判断任务,通过扫描的方式读取KEY1-3,判断读取的值,如果与HEX码对应的按键不同,则跳转到蜂鸣器报警函数,执行后在返回按键扫描,若相同则跳转到流水灯函数,一直处于循环之中,通过按键4的外部中断清零状态,返回接收判断循环,等待下一次串口的数据来到。
电路图:

在这里插入图片描述

三、 实验步骤

  1. 编写串口初始化程序,配置中断接收内容
  2. 编写判断循环主体函数
  3. 根据主体判断循环的结果,编写各个按键判断循环
  4. 在按键判断循环里面编写按键扫描函数,判断按键按下的结果,正确跳转到流水灯循环函数,错误则跳转到蜂鸣器报错函数,执行蜂鸣器报警后返回按键扫描继续判断。
  5. 编写流水灯循环及蜂鸣器报警函数
  6. 编写按键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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。