PIC微控制器精通_非同步串列埠通訊例項與細節
1.前言
PIC16F876a非同步串列埠通訊的定義以及暫存器控制,這裡不再多談,前面已經進行過詳細的分析。這裡注意集中在幾個關鍵點上。
串列埠中斷服務程式應該注意什麼?
利用串列埠助手進行除錯應該注意什麼?
串列埠助手接收不到資料的幾種可能因素?
2.例項分析
PIC微控制器與上位機握手程式如下:
/********************************************************/ /*Author: Chunxu Shen; All Rights Reserved! /*Tsinghua University 2016-11-19 /*Serial Test Low Speed ********************************************************/ #include <pic.h> __CONFIG(0x3ffa); #define BAUD 9600 #define FOSC 9216000L #define DIVIDER ((int)(FOSC/(16UL * BAUD) -1)) unsigned char Rece_flag ; //初始化,串列埠接受標誌 void main(void) { //初始化埠程式 TRISC7 = 1; //RX埠設為輸入有效 TRISC6 = 0; //TX埠設為輸出有效 //初始化串列埠設定 SPBRG = DIVIDER; //波特率設定 TXSTA = 0x24; //內部波特率-8bit-允許傳送-非同步通訊 空-低速模式-傳送暫存器滿空-無奇偶校驗 RCSTA = 0x90; //串列埠使能-不接收單字元-允許禁止連續接收 //中斷設計 GIE = 1; //開啟中斷總開關 PEIE = 1; //允許外圍裝置觸發中斷 RCIE = 1; //允許接收訊號觸發中斷 RCIF = 0; //等待PC機觸發中斷 while(1) { if('E' == Rece_flag) //對應上位機“結束”按鍵 {//給PC機反饋訊號“END” TXREG = 'E'; while( TRMT == 0 ) continue; //檢驗傳送是否結束 TXREG = 'N'; while(TRMT==0) continue; TXREG = 'D'; while(TRMT==0) continue; } else if( 'S' == Rece_flag ) { //給PC機反饋訊號“OK” TXREG = 'O'; while(TRMT==0) continue; TXREG = 'K'; while(TRMT==0) continue; } else //其他訊號不響應 { ; } } } //接收上位機送發的訊號 void interrupt usart(void) { if( RCIF ) { RCIF = 0; //軟體清零 Rece_flag = RCREG; } }
3.經驗總結
1.編寫中斷服務程式時,一定要注意接收中斷標誌位這個事兒!RCIF這個標誌位,硬體不會自動清空。因此,一旦我們編寫中斷服務程式時,先把RCIF清零!!!
2.利用串列埠助手進行除錯的時候,關注埠號!!!(計算機->管理->裝置管理器->埠)確定你選擇的埠是與PIC微控制器是相連的,否則即使協議很正確,埠號沒對上,也白扯。
3.波特率很關鍵,看好高低速,把初值算對很重要。
4.感想
曾經下過決心,不碰硬體,可是呢,有的時候你不去做就沒有人做,這不得不說是一種悲哀!接下來的軟體,瞧!看我飛起~~~