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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Top嵌入式

投喂个鸡腿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值