我的問題是:
①在初始化函數InitUART()中SCON設置為了01010000,TI和RI都被設置為0,所以不能向單片機申請中斷,然后在初始化函數InitUART()之后又緊接著設置發送一串字符,發送函數中有 while(!TI);TI=0;這么兩行,但是因為TI最開始就設為0了,而且串口中斷ES是在后面打開的,那么理論上TI就是一直為0,while(!TI)就是個死循環啊,為什么還會傳出數據?
②為什么用通用的串口調試工具就能發送漢字,而用德飛萊(我買的單片機牌子)自己的串口調試工具就能發送漢字呢?
發送漢字成功
發送漢字失敗
/*****************************下面是單片機代碼********************************************/
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
void SendStr(uchar *s);
void InitUART();//初始化通用異步收發傳輸器
void main()
{
InitUART();
SendStr("UART test,dmc");
ES = 1;//串口中斷允許位,ES=1允許
while(1)
{
}
}
void SendByte(uchar dat)
{
SBUF = dat;
while(!TI);
TI=0;
}
void SendStr(uchar *s)
{
while(*s != '\0')
{
SendByte(*s);
s++;
}
}
void InitUART()
{
SCON = 0x50;// SCON: 模式 1, 8-bit UART, 使能接收
TMOD = 0x20;// TMOD: timer 1, mode 2, 8-bit 重裝
TH1 = 0xFD;// TH1: 重裝值 9600 波特率 晶振 11.0592MHz
TR1 = 1;// TR1: timer 1 打開
EA = 1;//打開總中斷
}
void UART_SER() interrupt 4
{
uchar temp;
if(RI)
{
RI = 0;
temp = SBUF;
P1 = temp;
SBUF = temp;
}
if(TI)
{
TI = 0;
}
}
|