例項**
結尾與擴充套件
串列埠傳輸在51微控制器裡是非常重要的一點,這常常是在中斷、計數器後面學習,因為不可避免的需要用到中斷。51微控制器的串列埠,是個全雙工的串列埠,傳送資料的同時,還可以接收資料。
當序列傳送完畢後,將在標誌位 ti 置 1,同樣,當收到了資料後,也會在 ri 置 1。只要串列埠中斷處於開放狀態,微控制器都會進入串列埠中斷處理程式。在微控制器的中斷程式中,要區分出來究竟是傳送引起的中斷,還是接收引起的中斷,然後分別進行處理。
每當收到乙個新資料,就在中斷函式中,把 ri 清零,並用乙個變數,通知主函式,收到了新資料。
傳送資料時,很多的程式都是使用的「查詢方式」,就是執行 while(ti ==0); 這樣的語句來等待傳送完畢。沒有傳送完的時候就會一直在迴圈裡。
有人在傳送資料之前,先關閉了串列埠中斷!等待傳送完畢後,再開啟串列埠中斷。這樣,在傳送資料的等待期間內,如果收到了資料,將不能進入中斷函式,也就不會儲存的這個新收到的資料。這種處理方法,就會遺漏收到的資料。
有人在傳送資料之前,並沒有關閉串列埠中斷,當 ti = 1 時,是可以進入中斷程式的。但是,卻在中斷函式中,將 ti 清零! 這樣,在主函式中的while(ti ==0);將永遠等不到傳送結束的標誌。
還有人在中斷程式中,並沒有區分中斷的**,反而讓傳送引起的中斷,執行了接收中斷的程式。
自己常用的方法:
接收資料時,使用「中斷方式」,清除 ri 後,用乙個變數通知主函式,收到新資料。
傳送資料時,也用「中斷方式」,清除 ti 後,用另乙個變數通知主函式,資料傳送完畢。
這樣一來,收、發兩者基本一致,編寫程式也很規範、易懂。更重要的是,主函式中,不用在那兒死等傳送完畢,可以有更多的時間檢視其它的標誌。
#include
"reg52.h"
//此檔案中定義了微控制器的一些特殊功能暫存器
typedef
unsigned
int u16;
//對資料型別進行宣告定義
typedef
unsigned
char u8;
void
usartinit()
//設定串列埠
void
main()
void
usart
() interrupt 4
51微控制器串列埠通訊
1 並行通訊 傳送方和接收方用多根資料線連線,多位資料同時傳送。傳輸線多,長距離傳輸時成本大。2 序列通訊 單根資料線傳送資料,逐位傳送。長距離傳送成本低,但控制相對複雜。序列通訊又可分為 非同步序列通訊和同步序列通訊。非同步序列通訊 所謂 非同步 指的是雙方裝置使用各自的時鐘,以字元為單位傳輸,採...
51微控制器 eeprom 串列埠
按照相應的編碼格式,對串列埠資料進行編碼,傳送至微控制器,微控制器對資料進行解析,寫入或者讀取eeprom,再返回資料至微控制器串列埠。讀取資料0x03 且只需要傳入3個16進製制數即可,寫入資料0x06,具體不超過255個資料,要想多寫入資料,可以將資料長度的值增加到兩個16進製制數,程式也需要相...
51微控制器 UART串列埠通訊
使用半雙工通訊 使用硬體uart模組和串列埠中斷 include typedef unsigned int uint void configuart uint baud void main void configuart uint baud 中斷型別碼為4,中斷向量的位址 中斷型別碼 8 3 voi...