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

📄 host.asm

📁 LPC900 FLASH单片机--红外多机通信应用实例
💻 ASM
字号:
/***************************************************************
*文件名:	host.asm
*版权:		www.zlgmcu.com
*日期:		16:27 04-3-16
*功能:		多机红外通信发送端程序代码
***************************************************************/
$NOMOD51
$INCLUDE(REG932.INC)

KEY1	EQU	P0.0			;定义KEY1键
KEY2	EQU	P0.1			;定义KEY2键
INFR	EQU	P0.3			;定义红外发送引脚

PLLEN	BIT	TCR20.7
;------------------------------
	ORG	0000H			
	AJMP	MAIN
	ORG	003BH
	AJMP	KEY_ISR
;------------------------------
	ORG	0080H
MAIN:
	MOV	P0M1,#0x00		;定义P0口属性
	MOV	P0M2,#0x00
	MOV	P2M1,#0x40		;定义P2.6(OCA)口属性
	MOV	P2M2,#0x40
	
	ACALL	CCU_INIT		;CCU初始化
	ACALL	KEYISR_INIT		;键盘中断初始化
LOOP:	
	ACALL	POWER_DOWN		;完全掉电
	AJMP	LOOP
	RET
;-------------------------------
;功能:CCU初始化
;-------------------------------
CCU_INIT:
	MOV	TOR2H,#0x02		;CCU定时器重装值
	MOV	TOR2L,#0x05
	MOV	OCRAH,#0x01		;(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比为50%
	MOV	OCRAL,#0x02
	MOV	TCR21,#0x85		;PLL预分频为5+1
	MOV	CCCRA,#0x01		;非反相的PWM在比较匹配时置位,在CCU定时器向下溢出时清0
	
	SETB	PLLEN			;启动PLL
	SETB	OCA
	JNB	PLLEN,$
	MOV	TCR20,#0x82		;设置输出模式,非反相PWM
	RET
;--------------------------------
;功能:键盘中断初始化
;--------------------------------
KEYISR_INIT:
	MOV	KBMASK,#0x03		;设置P01->P00为中断源
	MOV	KBCON,#0x00		;清除键盘中断标志
	SETB	EKBI			;键盘中断允许
	SETB	EA			;开中断
	RET
;--------------------------------
;功能:完全掉电
;--------------------------------
POWER_DOWN:
	MOV	PCONA,#0xFF		;外部模块掉电
	MOV	PCON,#0x03		;进入完全掉电模式
	RET
;--------------------------------
;功能:按键判断程序
;--------------------------------
READ_KEY:
	MOV	A,#12			
	ACALL	DELAYMS			;延时12MS
	JNB	KEY1,KEY1_DOWN		;判断KEY1是否按下
	JNB	KEY2,KEY2_DOWN		;判断KEY2是否按下
	JMP	NOKEY_DOWN		
KEY1_DOWN:				;KEY1按下	
	JNB	KEY1,$			;等待KEY1为1
	ACALL	START_DEVICE01		;发送启动设备1(灯)的指令
	JMP	NOKEY_DOWN		
KEY2_DOWN:				;KEY2按下
	JNB	KEY2,$			;等待KEY2为1
	ACALL	START_DEVICE02		;发送启动设备2(门/窗)的指令
	JMP	NOKEY_DOWN
NOKEY_DOWN:
	RET
;--------------------------------
;功能:启动外部设备1
;--------------------------------
START_DEVICE01:				
	ACALL	SEND_HEAD		;发送帧头
	MOV	A,#0x01
	ACALL	SEND_DATA		;发送数据	
	RET
;--------------------------------
START_DEVICE02:
	ACALL	SEND_HEAD		;发送帧头
	MOV	A,#0x02
	ACALL	SEND_DATA		;发送数据
	RET
;--------------------------------
;功能:发送帧头
;--------------------------------
SEND_HEAD:
	CLR	INFR			;拉低INFR
	MOV	A,#50
	ACALL	DELAYMS			;延时50ms
	SETB	INFR			;拉高INFR
	MOV	A,#10		
	ACALL	DELAYMS			;延时10ms
	
	CLR	INFR			;拉低INFR
	MOV	A,#1	
	ACALL	DELAYMS			;延时1ms
	SETB	INFR			;拉高INFR
	MOV	A,#1
	ACALL	DELAYMS			;延时1ms
	CLR	INFR			;拉低INFR
	MOV	A,#1	
	ACALL	DELAYMS			;延时1ms
	RET
;--------------------------------
;功能:通过红外载波发送数据
;入口参数:R6
;--------------------------------
SEND_DATA:
	MOV	R7,#8			;循环次数
START_SEND:
	MOV	A,R6
	RLC	A			;将最高位移入A
	JC	BIT1			;当C为1时,跳至BIT1
	JMP	BIT0			;跳至BIT0
BIT1:
	SETB	INFR			;INFR置高
	AJMP	SENDBIT
BIT0:
	CLR	INFR			;INFR置0
	MOV	R6,A			;将A保存进R6
SENDBIT:
	ACALL	DELAY400US		;延时400us
	DJNZ	R7,START_SEND
	RET
;---------------------------------
;功能:延时100us(7.373MHz时)
;---------------------------------
DELAY100US:
	MOV	R5,#182
LOOP1:
	DJNZ	R5,LOOP1
	RET
;---------------------------------
;功能:延时400us
;---------------------------------
DELAY400US:
	MOV	R3,#4
LOOP4:	
	ACALL	DELAY100US
	DJNZ	R3,LOOP4
	RET
;---------------------------------
;功能:ms级延时
;入口参数:A
;---------------------------------
DELAYMS:
	MOV	R3,A
LOOP_N:	
	MOV	R2,#10
LOOP10:
	ACALL	DELAY100US
	DJNZ	R2,LOOP10
	DJNZ	R3,LOOP_N
	RET
;---------------------------------
;功能:键盘中断服务程序
;---------------------------------
KEY_ISR:
	CLR	EA			;关中断
	MOV	PCONA,#0x00		;外部功能模块上电
	ACALL	CCU_INIT		;CCU初始化
	
	MOV	A,#10
	ACALL	DELAYMS			;延时10ms
	ACALL	READ_KEY		;调用判断按键子程序
	MOV	KBCON,#0x00		;清中断标志位
	MOV	A,#50		
	ACALL	DELAYMS			;延时50ms
	SETB	EA			;开中断
	RETI
;--------------------------------
	END
;--------------------------------

⌨️ 快捷键说明

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