单片机 > 单片机程序设计 > 详情

51单片机汇编学习例程(5)——USART串口篇

发布时间:2022-04-21 发布时间:
|

5.ASM5_USART:    串口发送0-9及换行,接收任意数据并显示

/**

******************************************************************************

*         @file            USART.asm

*         @author          Alex——小白

*         @version         V1.0

*         @date            2019.9.1

*         @brief           自动发送数据0-9和换行,接收的数据会打印该数据

******************************************************************************

*         @attention        All Rights Reserved  

**/

        

                ORG         0000H                        ;程序执行的起始地址                

                LJMP         Main                        ;跳转到main函数        

                ORG         0023H                        ;串口中断地址

                LJMP         UARTInterrupt        ;声明UART是中断4函数名称


                ORG     0100H                        ;程序跳转到0100H开始执行

        Main:

                MOV         SP,#60H

                LCALL         InitUART               ;初始化串口参数

                MOV         DPTR,#Num_Tab            ;DPTR指向数组

                MOV         R0,#00H                  ;变量清零

        While:

                MOV                A,R0              ;变量赋值

                MOVC        A,@A+DPTR                ;读取数组数据

                LCALL         SendOneByte            ;串口打印数据

                LCALL        Delay                   ;延时1s

                INC                R0                ;变量自加

                CJNE        R0,#0CH,Next     ;判断是否为12,是清零,否则跳转

                MOV         R0,#00H

        Next:                

                SJMP        While


        InitUART:

                MOV         TMOD,#20H                ;2400bps

                MOV         SCON,#50H                ;设置波特率重装值(256-12000000/12/32/2400)=243=F3

                MOV         TH1,#0F3H                ;赋初值

                MOV         TL1,TH1

                MOV         PCON,#00H

                SETB         EA                                ;总中断开启

                SETB         ES                                ;串口中断开启

                SETB         TR1                               ;定时器1中断开启

                RET


        UARTInterrupt:

                PUSH         ACC               ;ACC值押栈,避免主循环使用冲突

                JB                 RI,Is_Receive    ;判断是否在接收数据

                CLR         TI                      ;否则清除发送标志位

                RETI

        Is_Receive:

                CLR         RI                           ;清除接收标志位

                MOV         A,SBUF                       ;将获取的数据储存到A

                LCALL         SendOneByte                ;接收数据,再发送出去

                POP         ACC                          ;AC值释放

                RETI


        SendOneByte:

                CLR         ES                            ;关闭串口中断

                CLR         TI                            ;清除发送标志位

                MOV         SBUF,A                        ;将数据A发送出去

        SendFinish:

                JNB         TI,SendFinish        ;判断是否发送完毕

                CLR         TI                                ;是,则清除标志位

                SETB         ES                               ;开启串口中断

                RET        


        Delay:                      ;t=t1*8=1s,修改R5的值即可更改时间(不精准)

                MOV                R5, #08H                ;单周期,8次

        D1:                                                        ;t1=t2*250=500*250=125000

                MOV                R6, #0FAH                

        D2:                                                

                MOV                R7, #0FAH                ;t2=250*2=500

        D3:                

                DJNZ        R7, D3       ;R7=250自减,直到为0跳出循环,双周期



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

热门文章 更多
ARM JTAG 调试原理