void UartInit(unsigned char baudrate)
{
ES = 0;
TR2 = 0;
bufwptr = 0; // 写指针
bufrptr = 0; // 读指针
PCON = 0x00; // 设置串口波特率, 时钟频率30MHZ
T2CON = 0x30; // 定时器2作为波特率发生器
SCON = 0x50; // 模式1
// n = 65536 - [fosc/baud*32]
// n = 65536 - 22118400/(57600*32) = 65536 - 12 = 65524 = 0xfff4
RCAP2H = 0xff;
RCAP2L = BAUD[baudrate]; // baud rate 57600
TH2 = 0xff;
TL2 = BAUD[baudrate];
IP = 0x10; // 串口中断优先级高
REN = 1;
TI = 0;
RI = 0;
TR2 = 1; // 启动定时器2
ES = 1; // 使能串口中断
}
#endif
/*
* 发送一个字节数据
*/
void SendChar(unsigned char ch)
{
SBUF = ch;
while(TI == 0);
TI = 0;
}
/*
* 发送字符串
*/
void SendString(char *str)
{
while(*str)
{
SendChar(*str);
str++;
}
}
void main(void)
{
/* 串口初始化 */
UartInit(BAUDRATE_38400);
SendString(" AT89s52,测试串口程序 ");
}
结果ok;
/**************************************************************************
/函数名称:InitUART
/入口参数:none
/出口参数:none
/函数功能:串口初始化函数,使用12M晶体
/
***************************************************************************/
void InitUART(void) //串口初始化函数,使用22.1184M晶体 9600 0XF4
{
EA=0;
TMOD&=0x0F;
TMOD|=0x20; //定时器1工作在模式2
SCON=0x50; //串口工作在模式1
TCON=0x05;
TH1=0xf4; ////Baud:4800 fosc=11.0592MHz 16M --0XEF 12M --0XF3
TL1=0xf4;
PCON=0x80; //串口波特率加倍
ES=1; //串行中断允许
TR1=1; //启动定时器1
REN=1; //允许接收
EA=1; //允许中断
}
/**************************************************************************
/函数名称:SendToComport
/入口参数:none
/出口参数:none
/函数功能:往串口发送一字节数据
/
***************************************************************************/
void SendToComport(UINT8 d) //往串口发送一字节数据
{
Sending=1;
SBUF=d;
while(Sending);
}
/**************************************************************************
/函数名称:prints
/入口参数:none
/出口参数:none
/函数功能:发送一个字符串
/
***************************************************************************/
void prints(UINT8 * pd,UINT8 line_feed)
{
while((*pd)!='\0')
{
SendToComport(*pd);
pd++;
}
if(line_feed)
{
SendToComport(13);
SendToComport(10);
}
}
void main(void)
{
/* 串口初始化 */
InitUART();
Prints(" AT89s52,测试串口程序 ");
}
结果也ok;
奇怪的是,上面两个初始化一替换,就不ok啦,
对比了好久i没看出问题在哪里,大侠帮我点拨一二,
谢谢! |