初级会员
- 积分
- 55
- 金钱
- 55
- 注册时间
- 2018-7-16
- 在线时间
- 10 小时
|
5金钱
程序如下,在中断服务函数中定义变量记录接收的数据位数,该变量为什么只能定义为char型,定义为int型数据接收错误
#include <reg52.h>
sbit PIN_RXD = P3^0; //接收 空闲为高电平
sbit PIN_TXD = P3^1; //发送 空闲为高电平
bit RxdEnd = 0; //接收完成标志位 1:接收完成
bit TxdEnd = 0; //发送完成标志位 1:发送完成
bit RxdOrTxd = 0; //1:发送模式 0:接收模式
unsigned char RxdBuf = 0; //接收缓冲区
unsigned char TxdBuf = 0; //发送缓冲区
void UARTConfig(unsigned int baud);
void StartRxd(void);
void StartTxd(unsigned char Data);
int main()
{
EA = 1; //开总中断
UARTConfig(9600);
while(1)
{
while(PIN_RXD);
StartRxd();
while(!RxdEnd);
StartTxd(RxdBuf+1);
while(!TxdEnd);
}
return 0;
}
void UARTConfig(unsigned int baud)
{
TMOD &= 0xF0; //清除T0配置
TMOD |= 0x02; //T0模式2:自动重装载模式
TH0 = 256 - 11059200/12/baud; //自动重装载的值为TH0中的数值
}
void StartRxd(void)
{
TL0 = 256- (256 - TH0)/2;
ET0 = 1; //T0溢出中断允许
TR0 = 1; //启动定时器0
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 InterruptTimer0() interrupt 1
{
static unsigned char cnt = 0; //该处只能用字符型数据,不能使用整形数据,否则接收数据错误
// static unsigned int cnt = 0;
if(RxdOrTxd) //发送8位数据
{
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) //接收8位数据
{
RxdBuf >>=1;
if(PIN_RXD)
{
RxdBuf |= 0x80;
}
cnt++;
}
else
{
cnt = 0;
TR0 = 0;
if(PIN_RXD) //第九位:停止位确认接收完成
{
RxdEnd = 1;
}
}
}
}
|
|