×
嵌入式 > 技术百科 > 详情

LPC900系列单片机UART和CCU模块实现红外通信程序

发布时间:2020-06-19 发布时间:
|

LPC900系列单片机UART和CCU模块实现红外通信程序

$INCLUDE (REG932.INC) 

;变量定义 
BEEP        BIT     P2.7 
KEY1        BIT     P0.1

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 
    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,$             ;等待锁相环(PLL)稳定 
    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 

 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
FPGA及CPLD应用领域不断拓展