📄 uart_ir_slave.asm
字号:
;*****************************************************************
; 文件: UART_IR_Slave.asm
; 功能: 利用LPC900系列单片机的UART和CCU模块实现红外通信.
; 此程序为从机程序,当接收到16字节数据后,再把接收的数据
; 返回给主机.
;*****************************************************************
$INCLUDE (REG932.INC)
;变量定义
FE BIT SCON.7
PLEEN BIT TCR20.7
BRGR1_DATA DATA 09H ;波特率设为2400bit/s
BRGR0_DATA DATA 0B4H
RCV_BUF DATA 30H ;接收缓冲区首地址(30H~3FH)
ORG 0000H
AJMP MAIN
;主程序开始
ORG 0100H
MAIN:
MOV SP,#60H
MOV P0M1,#00H ;P0,P1口设置为准双向
MOV P0M2,#00H
MOV P1M1,#00H
MOV P1M2,#00H
MOV P2M1,#0C0H ;P2.6,P2.7设置为开漏
MOV P2M2,#0C0H
ACALL CCU_INIT ;CCU模块初始化,用以产生38KHz调制信号
ACALL UART_INIT
MAIN_L1:
MOV R7,#01H
ACALL DELAY
ACALL RCV_DATA ;接收16字节数据
MOV R7,#02H
ACALL DELAY
ACALL SEND_DATA ;把接收到的16字节数据发送出去
AJMP MAIN_L1
;*********************************************
; 名称: SEND_DATA
; 功能: 通过UART连续发送16字节数据(0~15)
; 入口参数: bpuf--发送缓冲区首地址
; 出口参数: 无
; 注意: 此程序采用查询方式发送
;*********************************************
SEND_DATA:
MOV R7,#10H
MOV R0,#RCV_BUF
CLR TI
CLR A
SEND_DL1:
MOV A,@R0
MOV SBUF,A
JNB TI,$
CLR TI
INC R0
DJNZ R7,SEND_DL1
RET
;*********************************************************************
; 名称: RCV_DATA
; 功能: 通过UART连续接收16字节数据
; 入口参数: pbuf--用于接收数据的缓冲区首地址
; 出口参数: 接收到的16字节数据位于接收缓冲区
; 注意: 此程序采用查询方式进行接收。由于采取半双工通信,所以接收
; 数据之前要打开接收允许,接收完毕之后要关闭接收允许。
;*********************************************************************
RCV_DATA:
MOV R7,#10H
MOV R0,#RCV_BUF
SETB REN
CLR FE
CLR RI
RCV_DL1:
JNB RI,$
CLR RI
MOV A,SBUF
MOV @R0,A
INC R0
DJNZ R7,RCV_DL1
CLR REN
RET
;*********************************************************************
; 名称: CCU_INIT
; 功能: CCU模块初始化,使OCA(P2.7)输出38KHz,50%占空比的PWM波,
; 作为红外线的载波
; 使用6MHz晶振时,CCU频率=((6000000/2)/6)*32=16MHz
; 定时器重装值=CCU频率/红外线载频=16000000/38000=421=01A5H
;*********************************************************************
CCU_INIT:
MOV TOR2H,#01H ;定时器重装值
MOV TOR2L,#0A5H
MOV OCRAH,#00H ;(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比为50%
MOV OCRAL,#0D2H
MOV TCR21,#85H ;PLL预分频为5+1
MOV CCCRA,#01H ;非反相的PWM
MOV TCR20,#00H
SETB PLEEN
NOP
JNB PLEEN,$
ORL TCR20,#03H ;启动定时器,对称PWM模式
RET
;**************************************
; 名称: UART_INIT
; 功能: UART初始化,波特率2400bit/s
;**************************************
UART_INIT:
MOV PCON,#00H
MOV SSTAT,#00H ;双缓冲禁止,中断禁止,采用查询方式发送和接收
MOV SCON,#40H ;串口模式1,接收禁止
ORL PCON,#40H ;SMOD0=1,SCON的位7作为FE
MOV BRGCON,#00H
MOV BRGR1,#BRGR1_DATA
MOV BRGR0,#BRGR0_DATA
MOV BRGCON,#03H ;启动UART的波特率发生器
RET
;*****************************************************
; 名称: DELAY
; 功能: 延时(R7*0.1)秒(振荡器为6MHz)
; 入口参数:R7--延时时间
; 出口参数:无
; 注意: 如果入口参数R7等于0,则不延时而直接返回。
;*****************************************************
DELAY:
MOV A,R7
JZ DELAY_RTN
DELAY_L1:
MOV R6,#0C8H ;延时0.1S
DELAY_L2:
MOV R5,#0FAH
DELAY_L3:
NOP
NOP
NOP
NOP
DJNZ R5,DELAY_L3
DJNZ R6,DELAY_L2
DJNZ R7,DELAY_L1
DELAY_RTN:
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -