初学串口通信,有不足之处,还望大师们指正,辛苦了!

/***********************************
 电脑向MCU发一串字符后,原样返还电脑
************************************/

#include <reg52.h>

#define uchar unsigned char

bit g_NewRec = 0;                                //接收到数据标志
bit g_TranEnd = 1;                               //发送完毕标志
uchar g_UartBuff;                                //字符缓存变量

void InitUart();                                  //串口通信初始化函数

void main()
{
    InitUart();
    while (1)
    {
        if ((1 == g_NewRec) && (1 == g_TranEnd))      //确定接收到新数据且上次数据以发送完毕
        {
            SBUF = g_UartBuff;                        //将接收到的数据发送出去
            g_NewRec = 0;                             //对标志清零
            g_TranEnd = 0;
        }   
    }
}

void InitUart()
{
    TMOD &= 0x0F;                  //清空T1的控制位
    TMOD |= 0x20;                  //配置T1工作模式为2,即自动重装模式;
    TH1 = 0xFD;                    //晶振为11.0592MHZ,波特率为9600
    TL1 = TH1;                     //将TH1中的数据添加到TL1中
    PCON = 0x00;                   //波特率正常不倍增
    SCON = 0x50;                   //配置串口工作模式为1,且开启接收功能
    TR1 = 1;                       //串口的波特率发生器由T1(T2)产生,开启定时器T1; 
    ES = 1;                        //开启串口中断
    EA = 1;                        //开启总中断
}

void UartIRQ() interrupt 4         //串口中断
{
    if (1 == RI)
    {
        g_UartBuff = SBUF;         //从接收缓冲器中读取字符
        RI = 0;                    //接收中断标志们清零
        g_NewRec = 1;   
    }
    if (1 == TI)
    {
        TI = 0;                   //发送中断标志们清零
        g_TranEnd = 1;            //发送标志置1
    }
}

猜你喜欢

转载自blog.csdn.net/u012780337/article/details/52403964