STC12C5A60S2 串口中斷接收程序
int UART1_Recv_count; //接收計數(shù)
bit UART1_Overflow_Flag; //緩沖區(qū)滿標志
idata uchar UART1_Recv_BUF[UART0_BUF_LEN]; //串口接收緩沖區(qū)
//串口初始化
void Init_Uart()
{
UART1_Overflow_Flag=0;
UART1_Recv_count=0;
//22.1184M 晶振 115200波特率
PCON &= 0x7f;//波特率不倍速
SCON = 0x50;//8位數(shù)據(jù),可變波特率
BRT = 0xFA;//設(shè)定獨立波特率發(fā)生器重裝值
AUXR |= 0x04;//獨立波特率發(fā)生器時鐘為Fosc,即1T
AUXR |= 0x01;//串口1選擇獨立波特率發(fā)生器為波特率發(fā)生器
AUXR |= 0x10;//啟動獨立波特率發(fā)生器
ES = 1; //充許串口1中斷
}
//串口中斷接收程序
/*
說明:
(1)如果緩沖區(qū)接收滿了,則中斷接收程序不在接收數(shù)據(jù)。UART1_Recv_count=32
(2)如果接收到“回車符”、“換行符”,則中斷不在接收數(shù)據(jù)。UART1_Recv_count={實際接收到的數(shù)據(jù)個數(shù)}
以上2種情況觸發(fā)后 UART1_Overflow_Flag標志位置為1,等待MAIN函數(shù)(主程序處理)
*/
void UART1_Int(void) interrupt 4
{
if (RI == 1)
{
RI = 0;
if(UART1_Overflow_Flag==0)
{
if(UART1_Recv_count
UART1_Recv_BUF[UART1_Recv_count++] = SBUF;
if(SBUF==r || SBUF==n)
{
UART1_Overflow_Flag=1;
}
}
else
{
UART1_Overflow_Flag=1; // 關(guān)閉串口中斷,停止接收
}
}
LED2=~LED2;
}
}
int main()
{
char i;
TMOD=0x00;
AUXR=0x00;
LED1=0;
LED2=1;
Init_Uart();
EA=1; //開總中斷
printf("System is start...rn");
while(1)
{
if (UART1_Overflow_Flag==1) //串口中斷數(shù)據(jù)接收完畢,開始處理
{
for(i=0;i
Appcall(UART1_Recv_BUF,UART1_Recv_count);
printf("rn");
UART1_Recv_count = 0; //緩存清零
UART1_Overflow_Flag=0;//允許串口繼續(xù)接收數(shù)據(jù)
}
}
}
小知識:
[1]換行符、回車符的定義
ASIC | C語言編程描述 | |
回車符 | 0a(13) | r |
換行符 | 0d | n |
換行符、回車符的來歷:
在計算機還沒有出現(xiàn)之前,有一種叫做電傳打字機(Teletype Model 33)的玩意,每秒鐘可以打10個字符。但是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字符。要是在這0.2秒里面,又有新的字符傳過來,那么這個字符將丟失。于是,研制人員想了個辦法解決這個問題,就是在每行后面加兩個表示結(jié)束的字符。一個叫做“回車”,告訴打字機把打印頭定位在左邊界;另一個叫做“換行”,告訴打字機把紙向下移一行。這就是“換行”和“回車”的來歷,從它們的英語名字上也可以看出一二。 后來,計算機發(fā)明了,這兩個概念也就被般到了計算機上。那時,存儲器很貴,一些科學(xué)家認為在每行結(jié)尾加兩個字符太浪費了,加一個就可以。于是,就出現(xiàn)了分歧。 Unix系統(tǒng)里,每行結(jié)尾只有“<換行>”,即“n”; Windows系統(tǒng)里面,每行結(jié)尾是“<換行><回車>”,即“nr”;Mac系統(tǒng)里,每行結(jié)尾是“<回車>”。 在ascii中,回車和換行是不同的字符。0x0A是回車,即光標移動到本行的最左面; 0x0D是換行,即光標移動到下一行。 |
[2]常見的串口工具如何發(fā)生“換行符”
在用串口工具發(fā)送數(shù)據(jù)時,如果勾選了發(fā)送新行,串口工具就會在數(shù)據(jù)尾部添加“換行符”
[2] STC單片機波特率計算
STC單片機官網(wǎng)上有一個比較好用的波特率計算工具,大家都可以自己下載了使用。
選擇好晶振,波特率發(fā)生器、定時器時鐘后, 該程序就可以自動生成代碼了。非常方便。
STC官網(wǎng)地址:http://www.stcmcu.com/
[3]關(guān)于STC單片機獨立波特率發(fā)生器的理解
a. STC單片機有1個獨立的波特率發(fā)生器,雖然用獨立的波特率發(fā)生器就不需要用定時器了。但是要注意的時,獨立波特率發(fā)生器和“晶振”頻率還是有關(guān)的。
b. 如果要串口的數(shù)據(jù)收發(fā)誤碼率較低,還是要選用 11.0592 、22.1184 這些晶振。
注意看上圖,誤碼率為 0.00%
c. 6M、 12M 、24M 這些晶振如果在串口通信里,是不建議用的
d. 在STC單片機上,用 11.0592 晶振,是可以非常方便的上 115200 波特率高速傳輸?shù)?,這是普通的AT89S51單片機很難實現(xiàn)的。
只要讓單片機工作在1T的工作模式下,11.0592的晶振,也可以輕松跑到115200波特率。
評論