LPC900系列单片机UART和CCU模块实现红外通信程序
$INCLUDE (REG932.INC)
;变量定义
BEEP BIT P2.7
KEY1 BIT P0.0
FE BIT SCON.7
PLEEN BIT TCR20.7
RCV_BUF DATA 30H ;接收缓冲区首地址(30H~3FH)
BRGR1_DATA DATA 09H ;波特率设为2400bit/s
BRGR0_DATA DATA 0B4H
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:
JB KEY1,$
ACALL SEND_DATA ;发送16字节数据
MOV R7,#01H
ACALL DELAY
ACALL RCV_DATA ;接收16字节数据
ACALL COMPARE ;比较接收到的数据和发送的数据
JZ MAIN_L2
CLR BEEP ;如果正确则蜂鸣器短响一声
MOV R7,#01H
ACALL DELAY
SETB BEEP
AJMP MAIN_L1
MAIN_L2:
CLR BEEP ;如果错误则蜂鸣器长响一声
MOV R7,#05H
ACALL DELAY
SETB BEEP
AJMP MAIN_L1
;********************************************
; 名称: SEND_DATA
; 功能: 通过UART连续发送16字节数据(0~15)
; 入口参数:无
; 出口参数:无
; 注意: 此程序采用查询方式发送。
;********************************************
SEND_DATA:
MOV R7,#10H
CLR TI
CLR A
SEND_DL1:
MOV SBUF,A
JNB TI,$ ;等待一字节发送完毕
CLR TI
INC A
DJNZ R7,SEND_DL1
RET
;********************************************************************
; 名称: RCV_DATA
; 功能: 通过UART连续接收16字节数据
; 入口参数: RCV_BUF--用于接收数据的缓冲区首地址
; 出口参数: 接收到的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
;*********************************************
; 名称: COMPARE
; 功能: 比较缓冲区中的内容是否为0~15
; 入口参数: RCV_BUF--需要比较的缓冲区首地址
; 出口参数: ACC--比较正确则返回1,否则返回0。
;*********************************************
COMPARE:
MOV R7,#10H
MOV R0,#RCV_BUF
MOV R1,#00H
CLR A
COMP_L1:
MOV A,@R0
CJNE A,01H,COMP_RTN ;ACC与R1(01H)比较
INC R0
INC R1
DJNZ R7,COMP_L1
MOV A,#01H ;比较结果正确,返回01H
RET
COMP_RTN:
CLR A ;比较结果错误,返回00H
上一篇:LED电子屏字符显示器程序