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

📄 uart_ir_slave.asm

📁 利用LPC900系列单片机的UART和CCU模块实现红外通信. * 此程序为从机程序,当接收到16字节数据后,再把接收的数据 * 返回给主机.
💻 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 + -