单片机交流
直播中

王树林

7年用户 1663经验值
私信 关注
[问答]

51单片机与PC是如何进行通信的?

51单片机与PC是如何进行通信的?

回帖(1)

杜永强

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






/**
******************************************************************************
*         @file            USART.asm
*         @author          Alex——小白
*         @version         V1.0
*         @date            2019.9.1
*         @brief           自动发送数据0-9和换行,接收的数据会打印该数据
*        @store           有家Proteus仿真店子
*        @Link            https://shop484534014.taobao.com/
*        @Email                 844545015@qq.com
******************************************************************************
*         @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跳出循环,双周期
                DJNZ        R6, D2                        ;R6=250自减,直到为0跳出循环,双周期
                DJNZ        R5, D1                        ;R5=100自减,直到为0跳出循环,双周期
                RET
               
        Num_Tab:                                         ;0-9,0A0D换行
                DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,0AH,0DH       
        END


/*
                MOV                TMOD,#020H                        ;9600bps                               
                MOV           TL1,#0FDH           ;设置波特率重装值(256-11059200/12/32/9600)=253=FD
                MOV           TH1,#0FDH
*/
1、学习目的
学习51单片机与PC的串口通信技术。
2、学习内容
本实验单片机作发送方同时接收方,PC机作接收方同时发送方,单片机发送从0-9的数字,并在PC机上显示,并等待PC串口助手发数据。PC机上需要运行串口调试助手或直接使用Proteus虚拟串口。
串口波特率:根据晶振而变化,代码中给出了常见12M和11.0592M时钟的波特率2400、9600计算方法。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分