⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 receive.asm

📁 一个单片机驱动红外通信的程序,很有意义.当然你也可以举一反三,用作无线通信,也可以仿照该程序做蓝牙通信协议
💻 ASM
字号:
/***************************************************************+
*文件名:	Receive.asm
*版权:		www.zlgmcu.com
*日期:		16:27 04-3-16
*功能:		多机红外通信接收端程序代码
****************************************************************/
$NOMOD51
$INCLUDE (REG932.INC)

INFR		EQU	P0.4			;定义红外接收端口
MOTOR_CONTROL	EQU	P0.5			;定义外部设备控制端口

HEADFLAG	BIT	0x10			;定义帧头出错标志
BITFLAG		BIT	0x11			;定义位出错标志
DATA1		DATA	0x30			;定义DATA1全局变量
DATA2		DATA	0x31			;定义DATA2全局变量
;-------------------------------------
	ORG	0000H
	AJMP	MAIN
	ORG	003BH
	AJMP	KEY_ISR
;-------------------------------------
	ORG	0080H
MAIN:
	MOV	P0M1,#0x00			;定义P0口模式
	MOV	P0M2,#0x00

	ACALL	KEYISR_INIT			;调用按键中断初始化程序
	ACALL	DELAY100US
LOOP:
	ACALL	POWER_DOWN			;调用完全掉电程序
	AJMP	LOOP
	RET
;-------------------------------------
;功能:键盘中断初始化
;-------------------------------------
KEYISR_INIT:
	MOV	KBMASK,#0x10			;P04键盘中断
	MOV	KBCON,#0x00			;清键盘中断标志位
	SETB	EKBI				;键盘中断使能
	SETB	EA				;开中断
	RET
;-------------------------------------
;功能:完全掉电
;-------------------------------------
POWER_DOWN:
	MOV	PCONA,#0xFF			;功能模块掉电
	MOV	PCON,#0x03			;进入完全掉电状态
	RET
;-------------------------------------
;功能:帧校验
;-------------------------------------
READHEAD:
	MOV	A,#4				
	ACALL	DELAY_N00US			;延时400us
	JNB	INFR,SKIP1			;INFR为0,跳至SKIP1
	SETB	HEADFLAG			;INFR为1,置帧错误标志
SKIP1:
	ACALL	DELAY100US			;延时100us
	JNB	INFR,SKIP2			;再次读INFR,并对其进行判断,其为0,跳
	SETB	HEADFLAG			;为1,置帧错误标志
SKIP2:
	MOV	A,#5
	ACALL	DELAY_N00US			;延时500us

	MOV	A,#4
	ACALL	DELAY_N00US			;延时400us
	JB	INFR,SKIP3			;INFR为1,跳至SKIP3
	SETB	HEADFLAG			;INFR为0,置帧错误标志
SKIP3:
	ACALL	DELAY100US			;延时100us
	JB	INFR,SKIP4			;再次读INFR,并对其进行判断,其为1,跳
	SETB	HEADFLAG			;为0,置帧错误标志
SKIP4:
	MOV	A,#5
	ACALL	DELAY_N00US	
	
	MOV	A,#4				
	ACALL	DELAY_N00US			;延时400us
	JNB	INFR,SKIP5			;INFR为0,跳至SKIP5
	SETB	HEADFLAG			;INFR为1,置帧错误标志
SKIP5:
	ACALL	DELAY100US			;延时100us
	JNB	INFR,SKIP6			;再次读INFR,并对其进行判断,其为0,跳
	SETB	HEADFLAG			;为1,置帧错误标志
SKIP6:
	MOV	A,#5
	ACALL	DELAY_N00US			;延时500us
	RET
;-------------------------------------
;功能:从红外线传送的数据上读取1字节
;出口参数:A
;-------------------------------------
READBYTE:
	CLR	A				;将A清0
	MOV	R7,#8				;定义循环次数8
READBYTE_START:	
	ACALL	DELAY100US			;延时100US
	JB	INFR,BIT1			;读INFR,为1,则跳至BIT1
BIT0:	ANL	A,#0xEF				;为0,清最高位为0
	JMP	READBIT_OVER	
BIT1:	ORL	A,#0x80				;为1,置最高位为1
READBIT_OVER:
	RL	A				;左移1位
	
	MOV	R4,A				;保存A
	MOV	A,#4
	ACALL	DELAY_N00US			;延时400us
	MOV	A,R4				;还原A
	DJNZ	R7,READBYTE_START		
	RET
;-------------------------------------
;功能:读取接收到的红外数据
;出口参数:DATA1,DATA2
;-------------------------------------
READDATA:
	ACALL	READBYTE			;读取一字节
	MOV	DATA1,A				;存入DATA1
	ACALL	READBYTE			;读取一字节
	MOV	DATA2,A				;存如DATA2
	RET
;-------------------------------------
;功能:延时100US
;注:在7.373Mhz情况下
;-------------------------------------
DELAY100US:
	MOV	R7,#182
LOOP1:
	DJNZ	R7,LOOP1	
	RET
;-------------------------------------
;功能:延时N x 100us,
;入口参数:A
;-------------------------------------
DELAY_N00US:
	MOV	R5,A
LOOP_N00US:
	ACALL	DELAY100US
	DJNZ	R5,LOOP_N00US
	RET
;-------------------------------------
;功能:MS级延时
;入口参数:A
;-------------------------------------
DELAYMS:
	MOV	R3,A
LOOPMS1:
	MOV	R4,#10
LOOPMS2:
	ACALL	DELAY100US
	DJNZ	R4,LOOPMS2
	DJNZ	R3,LOOPMS1
	RET
;-------------------------------------
;功能:键盘中断服务程序
;-------------------------------------
KEY_ISR:
	CLR	EA				;关中断
	MOV	PCONA,#0x00			;外部功能模块上电
	JNB	INFR,$				;读取INFR,等待其为1,
	MOV	A,#5
	ACALL	DELAYMS				;延时5ms
	
	JB	INFR,$				;等待INFr为0
	ACALL	READHEAD			;帧头校验
	ACALL	READDATA			;读数据
	
	MOV	A,DATA1				
	CJNE	A,#0x01,NONE_CONTROL		;判断数据,
	SETB	MOTOR_CONTROL			;为1,则开外部设备(灯)
	/*
	MOV	A,DATA2
	CJNE	A,#0x02,NONE_CONTROL		;判断数据,
	SETB	MOTOR_CONTROL			;为2,则开外部设备(灯)
	*/
NONE_CONTROL:
	
	MOV	KBCON,#0x00			;清键盘中断标志
	SETB	EA				;开中断
	RETI
;-------------------------------------
	END
;-------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -