#define GetSystemClock() (80000000ul) 这是多少晶震?8千万? 80M ?
下载一个软件自己生成一下都不想搞?还非要等别人给你生成好?
假定晶震是8MHZ的,很难产生一个准确的波特率,用定时器1
//////////////////////////////////////////////////////////////////////////
// 名称: SIO_Init
// 说明: 8.0MHZ晶震下初始化串口波特率为1200bps
// 8位数据位,1位停止位,无校验
// 返回: void
void SIO_Init(void)
{
//////////////////////////////////////
// 禁止串口中断
ES = 0;
//////////////////////////////////////
// SCON
// D7 D6 D5 D4 D3 D2 D1 D0
// SM0 SM1 SM2 REN TB8 RB8 TI RI
// 0 1 0 0 0 0 0 0
//
// SM0=0 SM1=1 -> 8位UART 波特率可变
SCON = 0x40;
//////////////////////////////////////
// TMOD
// D7 D6 D5 D4 D3 D2 D1 D0
// GATA C/T M1 M0 GATA C/T M1 M0
// 0 0 1 0 ? ? ? ?
//
// 定时器1定时方式2说明:
// 把16位计数器分为两部分,即以TL0为计数器,
// 以TH0作为预置寄存器。初始化时把计数初值分别
// 加载至TL和TH中。当计数溢出时,由预置寄存器TH
// 以硬件方法自动给计数器TL重新加载。
//
TMOD &= 0x0F;
TMOD |= 0x20;
TH1 = 0xDD;
TL1 = 0xDD;
//////////////////////////////////////
// PCON
// D7 D6 D5 D4 D3 D2 D1 D0
// SMOD - - - GF1 GF0 PDWN IDLE
PCON |= 0x80;
//////////////////////////////////////
TR1 = 1;// 启动定时器
REN = 1;// 允许串口接收数据
ES = 1;// 开启串口中断
//////////////////////////////////////
// EA
// D7 D6 D5 D4 D3 D2 D1 D0
// EA - ET2 ES ET1 EX1 ET0 EX0
//
// 建议在全部初始化完成后,在主程序中启用
// EA = 1;
//
}
复制代码
8M 用 1200bps 定时器1,还可以将就用一下, -0.83%的误差。
如果晶震本身再不准,估计就更难不乱码了