|
我现用定时器1做AT89C51串行口波特率发生器实验,程序如下:
#include
#define uchar unsigned char
#define uint unsigned int
uchar g_ucReceivedData; /* 保存串口发来的数据 */
void Delay(uint x)
{
while (x--);
}
/*--------定时器0 中断---------*/
void T0_interrupt() interrupt 1
{
TH0 = 0x00;
TL0 = 0x00;
}
/*--------定时器1 1中断---------*/
/*
void T1_interrupt() interrupt 3
{
TL1 = TH1 = 251;
} */
/*--------串口 中断------------*/
void Serial() interrupt 4
{
g_ucReceivedData = SBUF; /* 接收串口发来的数据 */
if (RI)
{
SBUF = g_ucReceivedData; /* 再发送刚收到的串口数据 */
RI = TI = 0;
}
}
void SysInit()
{
TMOD = 0x21; /* 定时器1 工作方式2:自动重装 */
TL1 = TH1 = 253; /* 38400 40MHZ晶振 */
TR1 = 1;
SCON = 0xd0; /* 串口方式3,自定义波特率 */
PCON = 0x00;
IE = 0x9a;
IP = 0x10;
TH0 = 0x00;
TL0 = 0x00;
TR0 = 1;
// TF1 = 0;
ET1 = 0; /* 屏蔽定时器1中断函数, 只让定时器1产生溢出脉冲但不进入中断函数 */
}
void main()
{
uchar i;
SysInit();
while (1)
{
i = i;
}
}
程序遇到的问题:波特率设置在19200及更慢的速度时,用串口调试工具可以看到收发数据保持相同,高于19200时数据出现不一样,比如我发送12,接收区显示是12 FF;速率调更高时会有接受不到的现象.
我用的波特率计算公式: 256 - 40000000/384×38400 = 253.287
请问高手是不是因为我的计算公式精度不够,误差大导致或是我接收用的算法不当所引起的呢?
谢谢!
|
|