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

📄 通用同步和异步串行接收器和转发器(usart).txt

📁 USART在单片机里的通用c程序
💻 TXT
📖 第 1 页 / 共 5 页
字号:
    ldi ZL,USARTAI_RCOMI            ;置接收命令作业标志值
    sts USARTAI_RXCOM,ZL
    rcall USART_RXData_Process      ;调用接收数据处理子程序
    clr ZL                          ;清除接收作业己更新标志
    sts USARTAI_RXUPD,ZL
    clr ZL                          ;清除允许处理接收数据标志
    sts DataUPD_RXALW,ZL
    rjmp USART_RXD_Data_RET         ;返回
USART_RXD_Data_Error:
    rcall USART_RXD_Error           ;调用接收错误处理子程序
USART_RXD_Data_RET:
    ret                             ;子程序返回

;*** 此段程序用于对从 USART 端口上接收到的数据进行处理操作
USART_RXData_Process:


;此处插入接收数据处理程序


    ret                             ;子程序返回


;*******************************************************************************
;*
;* 向 USART 端口上发送数据更新子程序 - “USART_TXD_Data”
;*
;* 说明:
;*   本子程序用于更新向 USART 端口上上发送数据,本子程序中包含有数据循环
;* 冗余检测校验子程序。
;*   本子程序要在主程序中不间断循环查询运行。
;*
;* SRAM 中标志字节用法:
;*   入口标志:本子程序将检查这个标志,只有这个标志置值后才允许更新数据。
;*               允许更新发送数据(DataUPD_TXALW)= $c0(DataUPD_TALWI)
;*   出口标志:更新发送数据操作得到执行后,将对下面这个标志置值。
;*               允许更新发送数据(DataUPD_TXALW)= $00
;*
;*******************************************************************************
USART_TXD_Data:
    lds ZL,DataUPD_TXALW            ;检查是否允许更新发送数据?
    cpi ZL,DataUPD_TALWI              ;是,则继续
    brne USART_TXD_Data_RET           ;否,直接返回
    lds ZL,USARTAI_TXEnd            ;发送作业是否全部结束?
    cpi ZL,USARTAI_TEndI              ;是,继续
    brne USART_TXD_Data_RET           ;否,返回,等待发送作业结束
    rcall USART_TX_COMM_AskTX       ;发送“向对方请求发送”命令
    rcall USART_TXData_Process      ;调用更新发送数据子程序
USART_TXD_Data_Check:
    lds ZL,USARTAI_TXDAA            ;取发送的数据长度值
    adiw ZL,$03                       ;发送的总长度=发送的数据长度值+
    sts USARTAI_TXDAA,ZL              ;1 个长度字符字节+ 2 个校验字节
    mov USARTAI_TEMP2,ZL
    ldi ZL,Low(USARTAI_TXDAA-2)     ;发送数据的校验字节在发送数据序列
    ldi ZH,High(USARTAI_TXDAA-2)      ;尾部后两个字节
    clr USARTAI_TEMP
    add ZL,USARTAI_TEMP2            ;Z 指针指向发送数据的校验字节
    adc ZH,USARTAI_TEMP
    clr USARTAI_TEMP
    st Z+,USARTAI_TEMP              ;清除发送数据的尾部后两个字节
    st Z+,USARTAI_TEMP                ;的校验字节值
    ldi ZL,Low(USARTAI_TXDAA)       ;Z 指针指向发送数据首个字节
    ldi ZH,High(USARTAI_TXDAA)
    lds DCRC2B_DLength,USARTAI_TXDAA;置校验的数据长度初值
    call DataCheck_CRC2B            ;生成发送数据序列的 CRC 码
    clr ZL                          ;清除允许更新发送数据标志
    sts DataUPD_TXALW,ZL
USART_TXD_Data_RET:
    ret                             ;子程序返回

;*** 此段程序用于向 USART 端口上发送数据的更新操作
USART_TXData_Process:


;此处插入更新发送数据程序


; 此段程序为示例数据的更新操作
    mov USARTAI_TEMP,r3
    ldi USARTAI_TEMP2,$fc
    sts USARTAI_TXDAA,USARTAI_TEMP2
    ldi YL,Low(USARTAI_TXDAA+1)       ;置接收作业地址指针为
    ldi YH,High(USARTAI_TXDAA+1)        ;首个接收数据地址指针
USART_TXData_Process1:
    st Y+,USARTAI_TEMP
    inc USARTAI_TEMP
    dec USARTAI_TEMP2
    brne USART_TXData_Process1
    inc r3
; 示例程序结束

    ret                             ;子程序返回


;*******************************************************************************
;*
;*  USART 通信发生错误处理子程序 - “USART_Error”
;*
;* 说明:
;*   本子程序用于当 USART 通信发生错误时的处理。
;*
;*******************************************************************************
USART_Error:
    push ZL                         ;压入寄存器中的数值到堆栈
    push ZH
    in ZL,SREG                      ;压状态寄存器中的标志值到堆栈
    push ZL
    ldi ZH,(1<<RXCIE)|(1<<UDRIE)|(1<<RXEN)|(1<<TXEN)
    com ZH                          ;禁止接收器和发送器,禁止 USART 
    in ZL,UCSRB                       ;接收结束中断和数据寄存器空中断
    and ZL,ZH
    out UCSRB,ZL


;此处插入错误处理程序
;此处插入从头开始重新进行数据处理操作程序


    ldi ZH,(1<<FE)|(1<<DOR)|(1<<PE)
    com ZH                          ;清除帧错误(FE)、数据溢出(DOR)
    in ZL,UCSRA                       ;及奇偶校验错误(UPE)标志
    and ZL,ZH
    out UCSRA,ZL
    ldi ZH,(1<<UDRE)
    in ZL,UCSRA                     ;置数据寄存器空(UDRE)标志
    or ZL,ZH
    out UCSRA,ZL
    call USART_AINT_INI             ;重新初始化 USART 异步中断接收和发送
    call USART_TX_COMM_REPINI       ;向对方发送“要求其重新初始化”命令
USART_Error_RET:
    pop ZL
    out SREG,ZL                     ;弹出堆栈中的标志值到状态寄存器
    pop ZH                          ;弹出堆栈中的数值到寄存器
    pop ZL
    ret                             ;子程序返回


;*******************************************************************************
;*
;* 所有通信协议命令开头标识字符串 - “COMAgreement_Head”
;*
;*******************************************************************************
COMAgreement_Head:
.DB $03,"COM"                       ;通信协议命令开头标识字符(COM)
;   │   │
;   │   通信协议命令开头标识字符(COM)
;   本指令字符串字符长度数值(不包括自已在内共 3 个字符)


;*******************************************************************************
;*
;* 向对方请求发送命令字符串 - “USART_AskTX”
;*
;*******************************************************************************
USART_AskTX:
.DB "ATX"                           ;向对方请求发送命令字符串(ATX)

;*******************************************************************************
;*
;* 允许对方发送命令字符串 - “USART_OKRX”
;*
;*******************************************************************************
USART_OKRX:
.DB "YET"                           ;允许对方发送命令字符串(YET)

;*******************************************************************************
;*
;* 要求对方重新发送命令字符串 - “USART_REPTX”
;*
;*******************************************************************************
USART_REPTX:
.DB "RPT"                           ;要求对方重新发送命令字符串(RPT)

;*******************************************************************************
;*
;* 接收数据正确命令字符串 - “USART_DataOK”
;*
;*******************************************************************************
USART_DataOK:
.DB "OKD"                           ;接收数据正确命令字符串(OKD)

;*******************************************************************************
;*
;* 要求对方发送指定数据的命令字符串 - “USART_DCOMTX”
;*
;*******************************************************************************
USART_DCOMTX:
.DB "STD"                           ;要求对方发送指定数据的命令字符串(STD)

;*******************************************************************************
;*
;* 要求对方重新初始化 USART 端口状态命令字符串 - “USART_REPINI”
;*
;*******************************************************************************
USART_REPINI:
.DB "RII"                           ;要求对方重新初始化状态命令字符串(RII)

;*******************************************************************************
;*
;* 重新初始化 USART 端口状态完成命令字符串 - “USART_RINIOK”
;*
;*******************************************************************************
USART_RINIOK:
.DB "YRI"                           ;重新初始化状态完成命令字符串(YRI)

;*******************************************************************************
;*
;* 从 USART 端口传送控制操作指令命令字符串 - “USART_CTRLCOM”
;*
;*******************************************************************************
USART_CTRLCOM:
.DB "CIT"                           ;从端口传送控制操作指令命令字符串(CIT)


;*******************************************************************************
;*
;*  USART 异步通信中断接收与发送协议命令和数据处理子程序 - “USART_INT_ACOM”
;*
;* 说明:
;*   本子程序用于 USART 异步通信中断接收与发送协议命令和数据处理。
;*   本子程序要在主程序中不间断地循环运行。
;*
;*******************************************************************************
USART_INT_ACOM:
    in ZL,SREG                      ;压状态寄存器中的标志值到堆栈
    push ZL
    call USART_RXD_COMM             ;接收通信协议命令处理程序
    call USART_RXD_Data             ;调用接收数据处理程序
    call USART_TXD_Data             ;调用更新发送数据程序
    pop ZL                          ;弹出堆栈中的标志值到状态寄存器
    out SREG,ZL
    ret                        

⌨️ 快捷键说明

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