
AVR單片機串口程序的編寫
Atmega8單片機的串口具支持多種數(shù)據(jù)幀結(jié)構(gòu),、有三個完全獨立的中斷(接收完成,、發(fā)送完成,、發(fā)送數(shù)據(jù)寄存器空)等特點,同時也支持多機通訊模式,。本實驗就以Atmega8為例來介紹AVR單片機串口的編程,。
單片機串口在使用前必須對其進行初始化。初始化內(nèi)容如下:
1.串口接收器和發(fā)送器的使能設置:首先我們要根據(jù)需要,,使能M8串口的接收器或者發(fā)射器,,這樣I/O口(PD1:TXD,PD2:RXD)才能為USART工作。
2.串口中斷工作方式的設置:如果需要串口工作于中斷方式,,則要根據(jù)需要設置USART的中斷設置,,如果工作于查詢方式,那么中斷設置就沒有必要了,。本實驗中串口設置為響應接收完成中斷,,即接收器接收到一個完整的數(shù)據(jù)幀后,將觸發(fā)一次接收完成中斷,。
3.波特率設置:也就是設置串口的數(shù)據(jù)傳輸速率,,兩個串口之間要正常通訊就必須要保證波特率相同。本實驗設置的波特率為9600,,系統(tǒng)使用內(nèi)置8MHZ時鐘源,,可以直接查表(《Atmega8原理及應用手冊》129頁)得到UBRR=51。
4.數(shù)據(jù)幀結(jié)構(gòu)設置:本實驗設置為8位數(shù)據(jù)位+1位停止位,。
因此,,本實驗的串口初始化程序如下:
void UART_init(void){UCSRB = BIT(RXCIE)| BIT(RXEN) |BIT(TXEN); //允許串口發(fā)送和接收,并響應接收完成中斷UBRR = 51; //設置串口波特率為9600 UCSRC = BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0); //幀結(jié)構(gòu)為8位數(shù)據(jù)+1位stop位}
如果你對AVR單片機串口的設置還不是太熟悉的話,,也可以使用ICC編譯器中的應用向?qū)е苯由纱诘南嚓P代碼,。操作方法如下:
1.在ICC中新建一個文件;
2.點擊Tools菜單中的Application Builder子菜單,,將彈出以下界面,,然后根據(jù)需要選擇CPU為M8,晶振頻率為8MHZ,。

3.點擊上面界面中的UART菜單,,出現(xiàn)下面界面,。然后按下圖選項選擇使能接收和發(fā)送、波特率9600,、數(shù)據(jù)位8位,、接收完成中斷。

4.點擊OK后,,在剛才新建的文件中即生成了完整代碼,,其中串口初始化的代碼如下:
//UART0 initialize// desired baud rate: 9600// actual: baud rate:9615 (0.2%)// char size: 8 bit// parity: Disabledvoid uart0_init(void){UCSRB = 0x00; //disable while setting baud rateUCSRA = 0x00;UCSRC = BIT(URSEL) | 0x06;UBRRL = 0x33; //set baud rate loUBRRH = 0x00; //set baud rate hiUCSRB = 0x98;}
大家看看使用ICC自動生成的代碼和我們自己編寫的代碼中UCSRC、UBRR,、UCSRB是不是一樣的呢,?
通訊協(xié)議及命令(2004-10-29)
為了保證單片機和PC機的正常可靠的通訊,,避免系統(tǒng)出現(xiàn)誤動作,,我們需要制訂一個簡單的通訊協(xié)議,同時還要定義能夠讓PC和單片機理解的命令,。這里我們簡單定義如下:
1.PC機發(fā)送的繼電器控制指令采用4個字符組成的字符串格式“s” S1S0 “p”,,如“s00p”。
其中s和p字符用于數(shù)據(jù)的簡單校驗,,也就是說當單片機收到的串口數(shù)據(jù)中如果第一位是“s”第四位是“p”,,則單片機接收到的命令有效,否則指令無效,。
S1是單片機地址識別,,如果單片機接收到的S1字符等于自己的地址碼,則單片機執(zhí)行命令,,否則無效,。通過這個字符我們就可以通過一個PC機串口和多個單片機進行通訊,這種通訊方式的設置我們會在后面闡述,。S0對應繼電器編碼,,指定相應繼電器的吸合或者釋放,如果S0=“a”,則該板的所有繼電器全部吸合,,如果是“b”則全部釋放,。
2.單片機返回給PC機的指令也同樣采用4個字符串格式S2S1S0 “t”,如“000t”,。
其中“t”為校驗碼,。S2為單片機地址碼,S1,、S0對應繼電器編碼,。返回指令用于PC機判斷單片機是否執(zhí)行了發(fā)出的指令。S1S0的二進制數(shù)據(jù)中,,每一位對應一個繼電器的狀態(tài),,如果為1表示繼電器吸合,,為0表示繼電器釋放。
3.通訊檢測,。當后臺程序啟動后,,PC機先發(fā)送“s00t”命令,如果PC機在6秒以內(nèi)能夠收到單片機返回的繼電器狀態(tài)(該狀態(tài)是讀取控制繼電器的I/O口的電平獲得的),,則PC機判斷通訊正常,,可以正常使用,否則PC機提示串口通訊不正常,。
此后,,PC機還會每隔5秒鐘自動請求一次繼電器狀態(tài),并且按鍵對繼電器進行操作以后,,控制板也會主動向PC機發(fā)送狀態(tài)字,。
4.軟件升級指令。當需要升級單片機軟件時,,PC機發(fā)送該指令讓單片機進入BOOT load程序區(qū),準備更新軟件版本,。該指令格式為“su” S0 “p”,,S0為單片機地址碼。
當單片機進入BOOT區(qū)后,,向PC機發(fā)送S0 “upd”指令,,S0為單片機地址碼,通知PC機軟件升級已經(jīng)準備好,。然后PC機關閉串口,,提示您打開ISP下載軟件進行升級。
5.單片機復位指令,。當單片機在線升級完成以后,,PC機可以通過發(fā)送復位指令讓單片機復位重新進入應用程序區(qū)。
Atmega8的IAP應用我們將在后面進行闡述,。
后臺PC程序及使用介紹
后臺程序使用VB6.0編寫,,其中利用VB的MSComm控件完成PC和單片機的通訊。界面如下:
4.點擊OK后,,在剛才新建的文件中即生成了完整代碼,,其中串口初始化的代碼如下:
//UART0 initialize// desired baud rate: 9600// actual: baud rate:9615 (0.2%)// char size: 8 bit// parity: Disabledvoid uart0_init(void){UCSRB = 0x00; //disable while setting baud rateUCSRA = 0x00;UCSRC = BIT(URSEL) | 0x06;UBRRL = 0x33; //set baud rate loUBRRH = 0x00; //set baud rate hiUCSRB = 0x98;}
大家看看使用ICC自動生成的代碼和我們自己編寫的代碼中UCSRC、UBRR,、UCSRB是不是一樣的呢,?
通訊協(xié)議及命令(2004-10-29)
為了保證單片機和PC機的正常可靠的通訊,,避免系統(tǒng)出現(xiàn)誤動作,,我們需要制訂一個簡單的通訊協(xié)議,,同時還要定義能夠讓PC和單片機理解的命令。這里我們簡單定義如下:
1.PC機發(fā)送的繼電器控制指令采用4個字符組成的字符串格式“s” S1S0 “p”,,如“s00p”,。
其中s和p字符用于數(shù)據(jù)的簡單校驗,也就是說當單片機收到的串口數(shù)據(jù)中如果第一位是“s”第四位是“p”,,則單片機接收到的命令有效,,否則指令無效。
S1是單片機地址識別,,如果單片機接收到的S1字符等于自己的地址碼,,則單片機執(zhí)行命令,否則無效,。通過這個字符我們就可以通過一個PC機串口和多個單片機進行通訊,,這種通訊方式的設置我們會在后面闡述。S0對應繼電器編碼,,指定相應繼電器的吸合或者釋放,,如果S0=“a”,則該板的所有繼電器全部吸合,如果是“b”則全部釋放,。
2.單片機返回給PC機的指令也同樣采用4個字符串格式S2S1S0 “t”,,如“000t”。
其中“t”為校驗碼,。S2為單片機地址碼,,S1、S0對應繼電器編碼,。返回指令用于PC機判斷單片機是否執(zhí)行了發(fā)出的指令,。S1S0的二進制數(shù)據(jù)中,每一位對應一個繼電器的狀態(tài),,如果為1表示繼電器吸合,,為0表示繼電器釋放。
3.通訊檢測,。當后臺程序啟動后,,PC機先發(fā)送“s00t”命令,如果PC機在6秒以內(nèi)能夠收到單片機返回的繼電器狀態(tài)(該狀態(tài)是讀取控制繼電器的I/O口的電平獲得的),,則PC機判斷通訊正常,,可以正常使用,否則PC機提示串口通訊不正常,。
此后,,PC機還會每隔5秒鐘自動請求一次繼電器狀態(tài),并且按鍵對繼電器進行操作以后,,控制板也會主動向PC機發(fā)送狀態(tài)字,。
4.軟件升級指令,。當需要升級單片機軟件時,PC機發(fā)送該指令讓單片機進入BOOT load程序區(qū),,準備更新軟件版本,。該指令格式為“su” S0 “p”,S0為單片機地址碼,。
當單片機進入BOOT區(qū)后,,向PC機發(fā)送S0 “upd”指令,S0為單片機地址碼,,通知PC機軟件升級已經(jīng)準備好,。然后PC機關閉串口,提示您打開ISP下載軟件進行升級,。
5.單片機復位指令,。當單片機在線升級完成以后,PC機可以通過發(fā)送復位指令讓單片機復位重新進入應用程序區(qū),。
Atmega8的IAP應用我們將在后面進行闡述,。
后臺PC程序及使用介紹
后臺程序使用VB6.0編寫,其中利用VB的MSComm控件完成PC和單片機的通訊,。界面如下:

界面中的每一個小按鈕控制實驗板上的每一個LED和繼電器,。如果串口通訊正常的話,按一下,,實驗板上對應的LED將點亮繼電器吸合,再按一下,,LED又被關閉繼電器釋放,。而全開按則控制實驗板上所有的LED和繼電器開或者關。
下面的PC指令框是顯示PC機發(fā)出的每一個控制指令,,而返回結(jié)果框?qū)@示實驗板返回的執(zhí)行結(jié)果,。
最下面的軟件升級按鈕是執(zhí)行實驗板的在線升級控制。如果需要對單片機進行軟件升級,,我們這里就沒有必要再使用ISP下載程序了,。點擊軟件升級,單片機獲得升級指令后將會返回升級準備好的命令,,程序就會自動關閉串口,,然后提示你使用SL的下載軟件下載程序。
當軟件升級完畢后,,CPU是不會自動進入應用程序區(qū)的,,這是你可以復位單片機或者點擊前臺復位按鍵讓CUP自動復位進入應用程序區(qū)。
實際應用
在本實驗的實際應用中,,增加了繼電器控制電路和鍵盤電路,。既可以通過PC機來控制也可以用過按鍵來控制電器的開關
線路:

gdfgdff.pdf
應用程序:

fsfe.rar
boot程序:

dsadas.rar
NIH232CP資料下載
MAX232CPE資料下載