c語言中ea = 1; //允許總中斷
es = 1; //允許串列埠中斷
彙編中可用
setb ea ;允許總中斷
setb es ;允許串列埠中斷
當微控制器接收到一幀資料後,ri會置1,向cpu申請中斷,若之前有中斷允許,則產生了中斷,進入中斷服務程式。當然,微控制器傳送完一幀資料,ti也會置1,同樣會產生中斷!
一般我們在傳送資料時要關中斷,因為一般你不用在傳送時不用處理資料;接收資料時要開中斷,以便你在中斷服務程式中將接收到的資料進行儲存並處理。
補充:其實,不管你有沒有允許中斷,上位機(此時即給微控制器傳送資訊的機器)只要給微控制器傳送資料,微控制器就會自動接收資料,並把它放在資料緩衝器sbuf中,如果你之前有允許序列口中斷,ri就會置1,向微控制器cpu申請中斷,並進入中斷服務程式,即你問題中的serial()函式,做完這個函式後就會自動返回斷點。如果你沒有允許中斷,便不會產生序列中斷。
其實,你的問題有個錯誤:別的中斷都是某個i/o口電平變化產生。這只是外部中斷產生條件,不過,你之前也需要用軟體允許外部中斷。另外,常見的51系列微控制器有5個中斷源三種中斷5:1、外部中斷0和1;2、定時器/計數器溢位中斷0和1;3、序列口中斷。另外,stc51系列還有定時器/計數器t2中斷,a/d轉換中斷,pwm中斷,序列中斷2等等。你還有什麼不懂的可以自己多翻一翻書,學到後面去了你就明白了。
你的問題中那個serial()函式中 p1=sbuf; 是把接收的資料送到並行p1口,然後那條 ri=0;是不可少的,這是用軟體清零ri,準備再次接受一幀資料產生中斷,如果你沒有這條語句,就會進入死迴圈,出不來了。
關於微控制器中斷
中斷 cpu停止當前任務,去處理中斷內容,處理完後自動恢復以前任務。微控制器有5個中斷源,2個中斷優先順序,中斷受兩級控制 1 cpu開總中斷 2 中斷源開中斷。中斷源 引起中斷事件的型別。5個中斷源 1 外部中斷請求0,由int0 p3.2 輸入 2 外部中斷請求1,由int1 p3.3 輸入 3...
關於微控制器通過串列埠傳送浮點數資訊
最近弄乙個小東西的時候,需要將ad採集的資料,通過串列埠傳送上位機。由於還得在下位機部分顯示出來,所以這個ad採集的資料轉換之後傳送到串列埠,比較容易點。但是問題來了,以前的串列埠,只有從gps模組接收的資訊是浮點型別外。其他的東西,都只是把字元型別或者字串型別的資料發到串列埠。查閱了一點資料,這裡...
微控制器串列埠配置
串列埠引數配置 usart initstructure.usart baudrate 115200 設定波特率為115200 usart initstructure.usart wordlength usart wordlength 8b 設定資料位為8位 usart initstructure.u...