电开开发板的UART模块串口通信程序
关键是在配置串口波特率上
按照计算方法应该写:TH1 = 256 - (32768000/12/32)/baud;
实际上(32768000/12/32)/baud 这一部分的值为8.888888 8循环的一个数
由于baud是整数 所以最后 TH1 = 256 - 8;
所以少减去了0.888888个机器周期
实测这样的误差影响很大,接收值百分百不正确
所以直接TH1 = 255 - (32768000/12/32)/baud;
这时候还是有一点误差,实测是不影响的
代码如下:
#include <STC12C5A60S2.H>
sbit ENLED = P1^1;
unsigned char code LedChar[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[7] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
unsigned char T0RH = 0;
unsigned char T0RL = 0;
unsigned char RxdByte = 0;
void ConfigTimer0(unsigned int ms);
void ConfigUART(unsigned int baud);
void main()
{
EA = 1;
ENLED = 0;
AUXR = 0x80;
ConfigTimer0(1);
ConfigUART(9600);
while(1)
{
LedBuff[5] = LedChar[RxdByte & 0x0F];
LedBuff[4] = LedChar[RxdByte >> 4];
}
}
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;
tmp = 32768000/1;
tmp = (tmp * ms)/1000;
tmp = 65536 - tmp;
T0RH = (unsigned char)(tmp>>8);
T0RL = (unsigned char)tmp;
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = T0RH;
TL0 = T0RL;
ET0 = 1;
TR0 = 1;
}
void ConfigUART(unsigned int baud)
{
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TH1 = 255 - (32768000/12/32)/baud;
TL1 = TH1;
ET1 = 0;
ES = 1;
TR1 = 1;
}
void LedScan()
{
static unsigned char i = 0;
P0 = 0xFF;
P2 = (P2 & 0xF8)|i;
P0 = LedBuff;
if(i<6)
i++;
else
i = 0;
}
void InterruptTimer0() interrupt 1
{
TH0 = T0RH;
TL0 = T0RL;
LedScan();
}
void InterruptUART() interrupt 4
{
if(RI)
{
RI = 0;
RxdByte = SBUF;
SBUF = RxdByte;
}
if(TI)
{
TI = 0;
}
}
|