51串口通讯非模块化

2019-03-24 17:49发布

#include<reg52.h>

sbit PIN_RXD = P3^0;
sbit PIN_TXD = P3^1;

bit RxdEnd = 0;//接收结束判断
bit RxdOrTxd = 0;//判断是接收还是发送
bit TxdEnd = 0;//发送结束判断
unsigned char RxdBuf = 0;//发送缓冲区
unsigned char TxdBuf = 0;//接收缓冲区

void ConfigUART(unsigned int baud);
void StartRXD();
void StartTXD(unsigned char dat);

void main()
{
        EA = 1;
        ConfigUART(9600);
       
        while(1)
        {
                while(PIN_RXD);
                StartRXD();
                while(!RxdEnd);
                StartTXD(RxdBuf+1);
                while(!TxdEnd);
        }
       
}


void ConfigUART(unsigned int baud) //波特率修改
{
        TMOD &= 0xF0; //低四位置0
        TMOD |= 0x02; //使用定时器0,方式2
        TH0 = 256 - (11059200/12)/baud;
}

void StartRXD()//接送数据
{
        TL0 = 256-((256-TH0)>>1);//延时波特率分之一秒的一半读取接送开始位
        ET0 = 1;
        TR0 = 1;
        RxdEnd = 0;
        RxdOrTxd = 0;
}

void StartTXD(unsigned char dat)//发送数据
{
        TxdBuf = dat;
        TL0 = TH0;
        ET0 = 1;
        TR0 = 1;
        PIN_TXD = 0;
        TxdEnd = 0;
        RxdOrTxd = 1;
}

void Timer0_Interrupt() interrupt 1
{
        static unsigned char cnt = 0;

        if(RxdOrTxd)
        {
                 cnt++;
                if(cnt <= 8)
                {
                        PIN_TXD = TxdBuf & 0x01;
                        TxdBuf >>= 1;
                }
                else if(cnt == 9)
                {
                        PIN_TXD = 1;
                }
                else
                {
                        cnt = 0;
                        TR0 = 0;
                        TxdEnd = 1;
                }
        }
        else
        {
                if(cnt == 0)
                {
                        if(!PIN_RXD)
                        {
                                RxdBuf = 0;
                                cnt++;
                        }
                        else
                        {
                                TR0 = 0;
                        }
                }
                else if(cnt <= 8)
                {
                        RxdBuf >>= 1;
                        if(PIN_RXD)
                        {
                                RxdBuf |= 0x80;
                        }
                        cnt++;               
                }
                else
                {
                        cnt = 0;
                        TR0 = 0;
                        if(PIN_RXD)
                        {
                                RxdEnd = 1;
                        }       
                }
               
        }
}
这个程序运行为什么错误,假如发送一个16进制数03,返回04,为什么有时变成84;高四位发生错误,求解


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
dcexpert
1楼-- · 2019-03-25 00:16
看看时钟频率是否有较大误差,程序没有太大问题。

一周热门 更多>