#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;高四位发生错误,求解
此帖出自
小平头技术问答
一周热门 更多>