單片機(一)51單片機串口接收、發送通信

這次做課設整體不太順利,因爲學校的開發板真的是……一言難盡

這裏就選擇性的分享一點代碼方面,有據可循,不那麼玄學的問題。

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 ; 
}

上面是對串口方面的淺薄認識,還請指教!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章