這次做課設整體不太順利,因爲學校的開發板真的是……一言難盡
這裏就選擇性的分享一點代碼方面,有據可循,不那麼玄學的問題。
1、中斷
只要開了中斷,一點要寫中斷函數,可以是
void timer0() interrupt 4
{
;
}
可以是這樣,先放一個空函數,不會有什麼玄學問題
不信,嘿嘿🤭,你試試
2、SBUF發送/接收寄存器
這是個串口收發寄存器,教科書裏面稀奇的是,接收、發送寄存器是兩個寄存器,分別是接收寄存器、發送寄存器,不過兩個寄存器的名字是一樣的。可能你會疑問,他們不衝突矛盾🐎?奇妙的是總線就是同時操作兩個的,但由於功能不同,就沒事了。比如接收,總線讓他們接收,但發送寄存器不會接收,就沒事了,很巧妙。
這個初衷是個人性化的設計,減少一點寄存器 的數量,可以少記一點,但事實卻是讓初學者一頭霧水。
教科書裏面這個是稀奇的,實操中,硬件纔是要命的,由於一些usb轉ttl芯片不能完全隔離兩邊的信號,當使用主機usb口供電的時候,主機信號就會越過轉換芯片影響串口的電平,導致串口數據錯誤。
這點很魔性,如果有人能告訴你這些,你要尊重他,因爲這都是淚水和肝。
3、收發機制
做課設,同學問我,爲什麼數據 放進寄存器,就能直接發送了,當時給他解釋,就是一個投餵機制,像餵狗一樣,肉包子扔那就行了,他不傻。
回來之後,覺得是很奇怪,就查了查。因爲有串口中斷啊。倒不是中斷就發送了,是因爲中斷裏面查詢判斷了寄存器的標誌位,對,就是標誌位,因爲這個纔會投餵發送的。
原來肉包子扔那不行,還得餵給她。
#include <reg52.h>
unsigned char RxBuff = 0xff ;
void uart_init()
{
SCON = 0x50;//´®¿Ú¹¤×÷·½Ê½1
TMOD = 0x21;//T1¹¤×÷·½Ê½2,T0¹¤×÷·½Ê½1
PCON = 0x00;//¼´SMOD=1£¬²¨ÌØÂʲ»¼Ó±¶
TH1 = 0xFD;//¼ÆÊýÆ÷T1³õÖµ£¬²¨ÌØÂÊ9600£¬¾§ÕñΪ11.0592MHz
TL1 = 0xFD;
TH0 = 0xFC;//T0¸³Öµ0XFC67,¶¨Ê±1ms
TH0 = 0x67;
ES = 1; //´®ÐпÚÖжÏÔÊÐí
ET0 = 1; //T0ÖжÏÔÊÐíλ
EA = 1;//ʹÄÜ×ÜÖжÏ
TR1 = 1;//Æô¶¯T1
TR0 = 1; //Æô¶¯T0
}
void putChar (unsigned char chr)
{
SBUF = chr;
led0 =~led0;
}
void Mode1()
{
unsigned char i = 0;
M485 = 1;
led1=~led1;
for(i = 0; i < 100; ++i)
{
putChar(i);
delayms(1000);
if(RxBuff != 0xff) disp(RxBuff);
}
return ;
}
void main()
{
uart_init();
while(1)
{
Mode1();
}
}
void timer1(void) interrupt 4
{
if( RI )
{
RI = 0;
RxBuff = SBUF;
}
if( TI )
{
TI = 0;
}
return ;
}
上面是對串口方面的淺薄認識,還請指教!!!