AVR單片機串口程序的編寫(xiě) Atmega8單片機的串口具支持多種數據幀結構、有三個(gè)完全獨立的中斷(接收完成、發(fā)送完成、發(fā)送數據寄存器空)等特點(diǎn),同時(shí)也支持多機通訊模式。本實(shí)驗就以Atmega8為例來(lái)介紹AVR單片機串口的編程。 單片機串口在使用前必須對其進(jìn)行初始化。初始化內容如下: 1.串口接收器和發(fā)送器的使能設置:首先我們要根據需要,使能M8串口的接收器或者發(fā)射器,這樣I/O口(PD1:TXD,PD2:RXD)才能為USART工作。 2.串口中斷工作方式的設置:如果需要串口工作于中斷方式,則要根據需要設置USART的中斷設置,如果工作于查詢(xún)方式,那么中斷設置就沒(méi)有必要了。本實(shí)驗中串口設置為響應接收完成中斷,即接收器接收到一個(gè)完整的數據幀后,將觸發(fā)一次接收完成中斷。 3.波特率設置:也就是設置串口的數據傳輸速率,兩個(gè)串口之間要正常通訊就必須要保證波特率相同。本實(shí)驗設置的波特率為9600,系統使用內置8MHZ時(shí)鐘源,可以直接查表(《Atmega8原理及應用手冊》129頁(yè))得到UBRR=51。 4.數據幀結構設置:本實(shí)驗設置為8位數據位+1位停止位。 因此,本實(shí)驗的串口初始化程序如下: void UART_init(void) { UCSRB = BIT(RXCIE)| BIT(RXEN) |BIT(TXEN); //允許串口發(fā)送和接收,并響應接收完成中斷 UBRR = 51; //設置串口波特率為9600 UCSRC = BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0); //幀結構為8位數據+1位stop位 } 如果你對AVR單片機串口的設置還不是太熟悉的話(huà),也可以使用ICC編譯器中的應用向導直接生成串口的相關(guān)代碼。操作方法如下: 1.在ICC中新建一個(gè)文件; 2.點(diǎn)擊Tools菜單中的Application Builder子菜單,將彈出以下界面,然后根據需要選擇CPU為M8,晶振頻率為8MHZ。 3.點(diǎn)擊上面界面中的UART菜單,出現下面界面。然后按下圖選項選擇使能接收和發(fā)送、波特率9600、數據位8位、接收完成中斷。 4.點(diǎn)擊OK后,在剛才新建的文件中即生成了完整代碼,其中串口初始化的代碼如下: //UART0 initialize // desired baud rate: 9600 // actual: baud rate:9615 (0.2%) // char size: 8 bit // parity: Disabled void uart0_init(void) { UCSRB = 0x00; //disable while setting baud rate UCSRA = 0x00; UCSRC = BIT(URSEL) | 0x06; UBRRL = 0x33; //set baud rate lo UBRRH = 0x00; //set baud rate hi UCSRB = 0x98; } 大家看看使用ICC自動(dòng)生成的代碼和我們自己編寫(xiě)的代碼中UCSRC、UBRR、UCSRB是不是一樣的呢? 通訊協(xié)議及命令(2004-10-29) 為了保證單片機和PC機的正?煽康耐ㄓ,避免系統出現誤動(dòng)作,我們需要制訂一個(gè)簡(jiǎn)單的通訊協(xié)議,同時(shí)還要定義能夠讓PC和單片機理解的命令。這里我們簡(jiǎn)單定義如下: 1.PC機發(fā)送的繼電器控制指令采用4個(gè)字符組成的字符串格式“s” S1S0 “p”,如“s00p”。 其中s和p字符用于數據的簡(jiǎn)單校驗,也就是說(shuō)當單片機收到的串口數據中如果第一位是“s”第四位是“p”,則單片機接收到的命令有效,否則指令無(wú)效。 S1是單片機地址識別,如果單片機接收到的S1字符等于自己的地址碼,則單片機執行命令,否則無(wú)效。通過(guò)這個(gè)字符我們就可以通過(guò)一個(gè)PC機串口和多個(gè)單片機進(jìn)行通訊,這種通訊方式的設置我們會(huì )在后面闡述。S0對應繼電器編碼,指定相應繼電器的吸合或者釋放,如果S0=“a”,則該板的所有繼電器全部吸合,如果是“b”則全部釋放。 2.單片機返回給PC機的指令也同樣采用4個(gè)字符串格式S2S1S0 “t”,如“000t”。 其中“t”為校驗碼。S2為單片機地址碼,S1、S0對應繼電器編碼。返回指令用于PC機判斷單片機是否執行了發(fā)出的指令。S1S0的二進(jìn)制數據中,每一位對應一個(gè)繼電器的狀態(tài),如果為1表示繼電器吸合,為0表示繼電器釋放。 3.通訊檢測。當后臺程序啟動(dòng)后,PC機先發(fā)送“s00t”命令,如果PC機在6秒以?xún)饶軌蚴盏絾纹瑱C返回的繼電器狀態(tài)(該狀態(tài)是讀取控制繼電器的I/O口的電平獲得的),則PC機判斷通訊正常,可以正常使用,否則PC機提示串口通訊不正常。 此后,PC機還會(huì )每隔5秒鐘自動(dòng)請求一次繼電器狀態(tài),并且按鍵對繼電器進(jìn)行操作以后,控制板也會(huì )主動(dòng)向PC機發(fā)送狀態(tài)字。 4.軟件升級指令。當需要升級單片機軟件時(shí),PC機發(fā)送該指令讓單片機進(jìn)入BOOT load程序區,準備更新軟件版本。該指令格式為“su” S0 “p”,S0為單片機地址碼。 當單片機進(jìn)入BOOT區后,向PC機發(fā)送S0 “upd”指令,S0為單片機地址碼,通知PC機軟件升級已經(jīng)準備好。然后PC機關(guān)閉串口,提示您打開(kāi)ISP下載軟件進(jìn)行升級。 5.單片機復位指令。當單片機在線(xiàn)升級完成以后,PC機可以通過(guò)發(fā)送復位指令讓單片機復位重新進(jìn)入應用程序區。 Atmega8的IAP應用我們將在后面進(jìn)行闡述。 后臺PC程序及使用介紹 后臺程序使用VB6.0編寫(xiě),其中利用VB的MSComm控件完成PC和單片機的通訊。界面如下: 4.點(diǎn)擊OK后,在剛才新建的文件中即生成了完整代碼,其中串口初始化的代碼如下: //UART0 initialize // desired baud rate: 9600 // actual: baud rate:9615 (0.2%) // char size: 8 bit // parity: Disabled void uart0_init(void) { UCSRB = 0x00; //disable while setting baud rate UCSRA = 0x00; UCSRC = BIT(URSEL) | 0x06; UBRRL = 0x33; //set baud rate lo UBRRH = 0x00; //set baud rate hi UCSRB = 0x98; } 大家看看使用ICC自動(dòng)生成的代碼和我們自己編寫(xiě)的代碼中UCSRC、UBRR、UCSRB是不是一樣的呢? 通訊協(xié)議及命令(2004-10-29) 為了保證單片機和PC機的正?煽康耐ㄓ,避免系統出現誤動(dòng)作,我們需要制訂一個(gè)簡(jiǎn)單的通訊協(xié)議,同時(shí)還要定義能夠讓PC和單片機理解的命令。這里我們簡(jiǎn)單定義如下: 1.PC機發(fā)送的繼電器控制指令采用4個(gè)字符組成的字符串格式“s” S1S0 “p”,如“s00p”。 其中s和p字符用于數據的簡(jiǎn)單校驗,也就是說(shuō)當單片機收到的串口數據中如果第一位是“s”第四位是“p”,則單片機接收到的命令有效,否則指令無(wú)效。 S1是單片機地址識別,如果單片機接收到的S1字符等于自己的地址碼,則單片機執行命令,否則無(wú)效。通過(guò)這個(gè)字符我們就可以通過(guò)一個(gè)PC機串口和多個(gè)單片機進(jìn)行通訊,這種通訊方式的設置我們會(huì )在后面闡述。S0對應繼電器編碼,指定相應繼電器的吸合或者釋放,如果S0=“a”,則該板的所有繼電器全部吸合,如果是“b”則全部釋放。 2.單片機返回給PC機的指令也同樣采用4個(gè)字符串格式S2S1S0 “t”,如“000t”。 其中“t”為校驗碼。S2為單片機地址碼,S1、S0對應繼電器編碼。返回指令用于PC機判斷單片機是否執行了發(fā)出的指令。S1S0的二進(jìn)制數據中,每一位對應一個(gè)繼電器的狀態(tài),如果為1表示繼電器吸合,為0表示繼電器釋放。 3.通訊檢測。當后臺程序啟動(dòng)后,PC機先發(fā)送“s00t”命令,如果PC機在6秒以?xún)饶軌蚴盏絾纹瑱C返回的繼電器狀態(tài)(該狀態(tài)是讀取控制繼電器的I/O口的電平獲得的),則PC機判斷通訊正常,可以正常使用,否則PC機提示串口通訊不正常。 此后,PC機還會(huì )每隔5秒鐘自動(dòng)請求一次繼電器狀態(tài),并且按鍵對繼電器進(jìn)行操作以后,控制板也會(huì )主動(dòng)向PC機發(fā)送狀態(tài)字。 4.軟件升級指令。當需要升級單片機軟件時(shí),PC機發(fā)送該指令讓單片機進(jìn)入BOOT load程序區,準備更新軟件版本。該指令格式為“su” S0 “p”,S0為單片機地址碼。 當單片機進(jìn)入BOOT區后,向PC機發(fā)送S0 “upd”指令,S0為單片機地址碼,通知PC機軟件升級已經(jīng)準備好。然后PC機關(guān)閉串口,提示您打開(kāi)ISP下載軟件進(jìn)行升級。 5.單片機復位指令。當單片機在線(xiàn)升級完成以后,PC機可以通過(guò)發(fā)送復位指令讓單片機復位重新進(jìn)入應用程序區。 Atmega8的IAP應用我們將在后面進(jìn)行闡述。 后臺PC程序及使用介紹 后臺程序使用VB6.0編寫(xiě),其中利用VB的MSComm控件完成PC和單片機的通訊。界面如下: 界面中的每一個(gè)小按鈕控制實(shí)驗板上的每一個(gè)LED和繼電器。如果串口通訊正常的話(huà),按一下,實(shí)驗板上對應的LED將點(diǎn)亮繼電器吸合,再按一下,LED又被關(guān)閉繼電器釋放。而全開(kāi)按則控制實(shí)驗板上所有的LED和繼電器開(kāi)或者關(guān)。 下面的PC指令框是顯示PC機發(fā)出的每一個(gè)控制指令,而返回結果框將顯示實(shí)驗板返回的執行結果。 最下面的軟件升級按鈕是執行實(shí)驗板的在線(xiàn)升級控制。如果需要對單片機進(jìn)行軟件升級,我們這里就沒(méi)有必要再使用ISP下載程序了。點(diǎn)擊軟件升級,單片機獲得升級指令后將會(huì )返回升級準備好的命令,程序就會(huì )自動(dòng)關(guān)閉串口,然后提示你使用SL的下載軟件下載程序。 當軟件升級完畢后,CPU是不會(huì )自動(dòng)進(jìn)入應用程序區的,這是你可以復位單片機或者點(diǎn)擊前臺復位按鍵讓CUP自動(dòng)復位進(jìn)入應用程序區。 實(shí)際應用 在本實(shí)驗的實(shí)際應用中,增加了繼電器控制電路和鍵盤(pán)電路。既可以通過(guò)PC機來(lái)控制也可以用過(guò)按鍵來(lái)控制電器的開(kāi)關(guān) |