u16 add;
void UART_init()
{ //初始化串行口和波特率发生器
SCON =0xE0; //选择串口工作方式3,打开接收允许
TMOD =0x20; //定时器1工作在方式2,定时器0工作在方式1
TH1 =0xF8; //实现波特率而计算的填充值
TL1 =0XFA; //实现波特率9600(系统时钟30MHZ)
TR1 =1; //启动定时器T1
ET1 =0;
//AUXR=64; //加上此句波特率可以加倍12倍
ES=1; //允许串行口中断
PS=1; //设计串行口中断优先级
EA =1; //单片机中断允许
}
void uart_isr() interrupt 4
{
if(RI)
{ RI=0;
add=SBUF;
}
}
void Send(u8 a) //发送单字数据
{
TI=0;
SBUF=a;
while(TI==1);
TI=0;
}
/*void Send_n() //发送多数据
{
u8 i;
ES=0;
for(i=0;i<8;i++)
{
Send();
}
ES=1;
} */
void SendString(u8 *s)
{
while (*s!='\0') //判断字符串结束标志
{
Send(*s); //发送字符
s++;
DelayMs(100);
}
}
void main(void)
{
UART_init();
Send('b');
DelayMs(100);
SendString("ad");
DelayMs(100); //每发送一个字节都需要延时
Send('k');
}
程序大概就这样,刚开始只能打印第一个b,调了一下午都不行,结果我一加延时程序就能把后面的都打印完了。如果我不加delayms延时0.1s,那么串口调试助手就只能接受第一个b,延时短了也不行,为什么需要延时???我记得串口不需要延时的?谢谢
|