|
我的問題是:
①在初始化函數(shù)InitUART()中SCON設(shè)置為了01010000,TI和RI都被設(shè)置為0,所以不能向單片機申請中斷,然后在初始化函數(shù)InitUART()之后又緊接著設(shè)置發(fā)送一串字符,發(fā)送函數(shù)中有 while(!TI);TI=0;這么兩行,但是因為TI最開始就設(shè)為0了,而且串口中斷ES是在后面打開的,那么理論上TI就是一直為0,while(!TI)就是個死循環(huán)啊,為什么還會傳出數(shù)據(jù)?
②為什么用通用的串口調(diào)試工具就能發(fā)送漢字,而用德飛萊(我買的單片機牌子)自己的串口調(diào)試工具就能發(fā)送漢字呢?
串口1.png (71.58 KB, 下載次數(shù): 27)
下載附件
發(fā)送漢字成功
2019-5-19 16:37 上傳
串口2.png (80.56 KB, 下載次數(shù): 32)
下載附件
發(fā)送漢字失敗
2019-5-19 16:37 上傳
/*****************************下面是單片機代碼********************************************/
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
void SendStr(uchar *s);
void InitUART();//初始化通用異步收發(fā)傳輸器
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;
}
}
|
|