| 
 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,延时短了也不行,为什么需要延时???我记得串口不需要延时的?谢谢 
 |