相關(guān)元件pdf下載:fs323 max232 gub232 通過本實(shí)驗(yàn)學(xué)習(xí)pc機(jī)串口與avr單片機(jī)串口之間相互通訊的基本硬件接口電路和軟件編程方法,并且達(dá)到使用pc機(jī)來控制led的簡(jiǎn)單應(yīng)用。pc機(jī)串口大家都不會(huì)陌生了吧!我們可以使用串口電纜直接連接兩臺(tái)pc機(jī)的串口,實(shí)現(xiàn)兩臺(tái)pc機(jī)的串口通訊。但是pc機(jī)和單片機(jī)的通訊卻不能夠用電纜直接進(jìn)行連接,原因是pc機(jī)rs232串口的電平標(biāo)準(zhǔn)和單片機(jī)的ttl電平不一致,因此單片機(jī)和pc機(jī)之間的串口通訊必須要有一個(gè)rs232/ttl電平轉(zhuǎn)換電路。通常這個(gè)電路都選擇專用的rs232接口電平轉(zhuǎn)換集成電路進(jìn)行設(shè)計(jì),如max232、hin232等。本實(shí)驗(yàn)采用nih232cp芯片來完成串口接口電路,nih232和max232可以直接互換。當(dāng)然,我們也可以使用分立元件來搭建rs232電平轉(zhuǎn)換電路以供我們實(shí)驗(yàn)使用,下圖給出了一個(gè)常見電路,只要器件完好,電路焊接完畢后即可正常工作,經(jīng)實(shí)際使用,效果良好。 avr單片機(jī)串口程序的編寫atmega8單片機(jī)的串口具支持多種數(shù)據(jù)幀結(jié)構(gòu)、有三個(gè)完全獨(dú)立的中斷(接收完成、發(fā)送完成、發(fā)送數(shù)據(jù)寄存器空)等特點(diǎn),同時(shí)也支持多機(jī)通訊模式。本實(shí)驗(yàn)就以atmega8為例來介紹avr單片機(jī)串口的編程。單片機(jī)串口在使用前必須對(duì)其進(jìn)行初始化。初始化內(nèi)容如下:1.串口接收器和發(fā)送器的使能設(shè)置:首先我們要根據(jù)需要,使能m8串口的接收器或者發(fā)射器,這樣i/o口(pd1:txd,pd2:rxd)才能為usart工作。2.串口中斷工作方式的設(shè)置:如果需要串口工作于中斷方式,則要根據(jù)需要設(shè)置usart的中斷設(shè)置,如果工作于查詢方式,那么中斷設(shè)置就沒有必要了。本實(shí)驗(yàn)中串口設(shè)置為響應(yīng)接收完成中斷,即接收器接收到一個(gè)完整的數(shù)據(jù)幀后,將觸發(fā)一次接收完成中斷。3.波特率設(shè)置:也就是設(shè)置串口的數(shù)據(jù)傳輸速率,兩個(gè)串口之間要正常通訊就必須要保證波特率相同。本實(shí)驗(yàn)設(shè)置的波特率為9600,系統(tǒng)使用內(nèi)置8mhz時(shí)鐘源,可以直接查表(《atmega8原理及應(yīng)用手冊(cè)》129頁)得到ubrr=51。4.數(shù)據(jù)幀結(jié)構(gòu)設(shè)置:本實(shí)驗(yàn)設(shè)置為8位數(shù)據(jù)位+1位停止位。因此,本實(shí)驗(yàn)的串口初始化程序如下:void uart_init(void){ucsrb = bit(rxcie)| bit(rxen) |bit(txen); //允許串口發(fā)送和接收,并響應(yīng)接收完成中斷ubrr = 51; //設(shè)置串口波特率為9600 ucsrc = bit(ursel)|bit(ucsz1)|bit(ucsz0); //幀結(jié)構(gòu)為8位數(shù)據(jù)+1位stop位}如果你對(duì)avr單片機(jī)串口的設(shè)置還不是太熟悉的話,也可以使用icc編譯器中的應(yīng)用向?qū)е苯由纱诘南嚓P(guān)代碼。操作方法如下:1.在icc中新建一個(gè)文件;2.點(diǎn)擊tools菜單中的application builder子菜單,將彈出以下界面,然后根據(jù)需要選擇cpu為m8,晶振頻率為8mhz。3.點(diǎn)擊上面界面中的uart菜單,出現(xiàn)下面界面。然后按下圖選項(xiàng)選擇使能接收和發(fā)送、波特率9600、數(shù)據(jù)位8位、接收完成中斷。 4.點(diǎn)擊ok后,在剛才新建的文件中即生成了完整代碼,其中串口初始化的代碼如下://uart0 initialize// desired baud rate: 9600// actual: baud rate:9615 (0.2%)// 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自動(dòng)生成的代碼和我們自己編寫的代碼中ucsrc、ubrr、ucsrb是不是一樣的呢?通訊協(xié)議及命令(2004-10-29)為了保證單片機(jī)和pc機(jī)的正??煽康耐ㄓ?,避免系統(tǒng)出現(xiàn)誤動(dòng)作,我們需要制訂一個(gè)簡(jiǎn)單的通訊協(xié)議,同時(shí)還要定義能夠讓pc和單片機(jī)理解的命令。這里我們簡(jiǎn)單定義如下:1.pc機(jī)發(fā)送的繼電器控制指令采用4個(gè)字符組成的字符串格式“s”+s1s0+“p”,如“s00p”。其中s和p字符用于數(shù)據(jù)的簡(jiǎn)單校驗(yàn),也就是說當(dāng)單片機(jī)收到的串口數(shù)據(jù)中如果第一位是“s”第四位是“p”,則單片機(jī)接收到的命令有效,否則指令無效。s1是單片機(jī)地址識(shí)別,如果單片機(jī)接收到的s1字符等于自己的地址碼,則單片機(jī)執(zhí)行命令,否則無效。通過這個(gè)字符我們就可以通過一個(gè)pc機(jī)串口和多個(gè)單片機(jī)進(jìn)行通訊,這種通訊方式的設(shè)置我們會(huì)在后面闡述。s0對(duì)應(yīng)繼電器編碼,指定相應(yīng)繼電器的吸合或者釋放,如果s0=“a”,則該板的所有繼電器全部吸合,如果是“b”則全部釋放。2.單片機(jī)返回給pc機(jī)的指令也同樣采用4個(gè)字符串格式s2s1s0+“t”,如“000t”。其中“t”為校驗(yàn)碼。s2為單片機(jī)地址碼,s1、s0對(duì)應(yīng)繼電器編碼。返回指令用于pc機(jī)判斷單片機(jī)是否執(zhí)行了發(fā)出的指令。s1s0的二進(jìn)制數(shù)據(jù)中,每一位對(duì)應(yīng)一個(gè)繼電器的狀態(tài),如果為1表示繼電器吸合,為0表示繼電器釋放。3.通訊檢測(cè)。當(dāng)后臺(tái)程序啟動(dòng)后,pc機(jī)先發(fā)送“s00t”命令,如果pc機(jī)在6秒以內(nèi)能夠收到單片機(jī)返回的繼電器狀態(tài)(該狀態(tài)是讀取控制繼電器的i/o口的電平獲得的),則pc機(jī)判斷通訊正常,可以正常使用,否則pc機(jī)提示串口通訊不正常。此后,pc機(jī)還會(huì)每隔5秒鐘自動(dòng)請(qǐng)求一次繼電器狀態(tài),并且按鍵對(duì)繼電器進(jìn)行操作以后,控制板也會(huì)主動(dòng)向pc機(jī)發(fā)送狀態(tài)字。4.軟件升級(jí)指令。當(dāng)需要升級(jí)單片機(jī)軟件時(shí),pc機(jī)發(fā)送該指令讓單片機(jī)進(jìn)入boot load程序區(qū),準(zhǔn)備更新軟件版本。該指令格式為“su”+s0+“p”,s0為單片機(jī)地址碼。當(dāng)單片機(jī)進(jìn)入boot區(qū)后,向pc機(jī)發(fā)送s0+“upd”指令,s0為單片機(jī)地址碼,通知pc機(jī)軟件升級(jí)已經(jīng)準(zhǔn)備好。然后pc機(jī)關(guān)閉串口,提示您打開isp下載軟件進(jìn)行升級(jí)。5.單片機(jī)復(fù)位指令。當(dāng)單片機(jī)在線升級(jí)完成以后,pc機(jī)可以通過發(fā)送復(fù)位指令讓單片機(jī)復(fù)位重新進(jìn)入應(yīng)用程序區(qū)。atmega8的iap應(yīng)用我們將在后面進(jìn)行闡述。后臺(tái)pc程序及使用介紹后臺(tái)程序使用vb6.0編寫,其中利用vb的mscomm控件完成pc和單片機(jī)的通訊。界面如下:4.點(diǎn)擊ok后,在剛才新建的文件中即生成了完整代碼,其中串口初始化的代碼如下://uart0 initialize// desired baud rate: 9600// actual: baud rate:9615 (0.2%)// 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自動(dòng)生成的代碼和我們自己編寫的代碼中ucsrc、ubrr、ucsrb是不是一樣的呢?通訊協(xié)議及命令(2004-10-29)為了保證單片機(jī)和pc機(jī)的正??煽康耐ㄓ?,避免系統(tǒng)出現(xiàn)誤動(dòng)作,我們需要制訂一個(gè)簡(jiǎn)單的通訊協(xié)議,同時(shí)還要定義能夠讓pc和單片機(jī)理解的命令。這里我們簡(jiǎn)單定義如下:1.pc機(jī)發(fā)送的繼電器控制指令采用4個(gè)字符組成的字符串格式“s”+s1s0+“p”,如“s00p”。其中s和p字符用于數(shù)據(jù)的簡(jiǎn)單校驗(yàn),也就是說當(dāng)單片機(jī)收到的串口數(shù)據(jù)中如果第一位是“s”第四位是“p”,則單片機(jī)接收到的命令有效,否則指令無效。s1是單片機(jī)地址識(shí)別,如果單片機(jī)接收到的s1字符等于自己的地址碼,則單片機(jī)執(zhí)行命令,否則無效。通過這個(gè)字符我們就可以通過一個(gè)pc機(jī)串口和多個(gè)單片機(jī)進(jìn)行通訊,這種通訊方式的設(shè)置我們會(huì)在后面闡述。s0對(duì)應(yīng)繼電器編碼,指定相應(yīng)繼電器的吸合或者釋放,如果s0=“a”,則該板的所有繼電器全部吸合,如果是“b”則全部釋放。2.單片機(jī)返回給pc機(jī)的指令也同樣采用4個(gè)字符串格式s2s1s0+“t”,如“000t”。其中“t”為校驗(yàn)碼。s2為單片機(jī)地址碼,s1、s0對(duì)應(yīng)繼電器編碼。返回指令用于pc機(jī)判斷單片機(jī)是否執(zhí)行了發(fā)出的指令。s1s0的二進(jìn)制數(shù)據(jù)中,每一位對(duì)應(yīng)一個(gè)繼電器的狀態(tài),如果為1表示繼電器吸合,為0表示繼電器釋放。3.通訊檢測(cè)。當(dāng)后臺(tái)程序啟動(dòng)后,pc機(jī)先發(fā)送“s00t”命令,如果pc機(jī)在6秒以內(nèi)能夠收到單片機(jī)返回的繼電器狀態(tài)(該狀態(tài)是讀取控制繼電器的i/o口的電平獲得的),則pc機(jī)判斷通訊正常,可以正常使用,否則pc機(jī)提示串口通訊不正常。此后,pc機(jī)還會(huì)每隔5秒鐘自動(dòng)請(qǐng)求一次繼電器狀態(tài),并且按鍵對(duì)繼電器進(jìn)行操作以后,控制板也會(huì)主動(dòng)向pc機(jī)發(fā)送狀態(tài)字。4.軟件升級(jí)指令。當(dāng)需要升級(jí)單片機(jī)軟件時(shí),pc機(jī)發(fā)送該指令讓單片機(jī)進(jìn)入boot load程序區(qū),準(zhǔn)備更新軟件版本。該指令格式為“su”+s0+“p”,s0為單片機(jī)地址碼。當(dāng)單片機(jī)進(jìn)入boot區(qū)后,向pc機(jī)發(fā)送s0+“upd”指令,s0為單片機(jī)地址碼,通知pc機(jī)軟件升級(jí)已經(jīng)準(zhǔn)備好。然后pc機(jī)關(guān)閉串口,提示您打開isp下載軟件進(jìn)行升級(jí)。5.單片機(jī)復(fù)位指令。當(dāng)單片機(jī)在線升級(jí)完成以后,pc機(jī)可以通過發(fā)送復(fù)位指令讓單片機(jī)復(fù)位重新進(jìn)入應(yīng)用程序區(qū)。atmega8的iap應(yīng)用我們將在后面進(jìn)行闡述。后臺(tái)pc程序及使用介紹后臺(tái)程序使用vb6.0編寫,其中利用vb的mscomm控件完成pc和單片機(jī)的通訊。界面如下:界面中的每一個(gè)小按鈕控制實(shí)驗(yàn)板上的每一個(gè)led和繼電器。如果串口通訊正常的話,按一下,實(shí)驗(yàn)板上對(duì)應(yīng)的led將點(diǎn)亮繼電器吸合,再按一下,led又被關(guān)閉繼電器釋放。而全開按則控制實(shí)驗(yàn)板上所有的led和繼電器開或者關(guān)。下面的pc指令框是顯示pc機(jī)發(fā)出的每一個(gè)控制指令,而返回結(jié)果框?qū)@示實(shí)驗(yàn)板返回的執(zhí)行結(jié)果。最下面的軟件升級(jí)按鈕是執(zhí)行實(shí)驗(yàn)板的在線升級(jí)控制。如果需要對(duì)單片機(jī)進(jìn)行軟件升級(jí),我們這里就沒有必要再使用isp下載程序了。點(diǎn)擊軟件升級(jí),單片機(jī)獲得升級(jí)指令后將會(huì)返回升級(jí)準(zhǔn)備好的命令,程序就會(huì)自動(dòng)關(guān)閉串口,然后提示你使用sl的下載軟件下載程序。當(dāng)軟件升級(jí)完畢后,cpu是不會(huì)自動(dòng)進(jìn)入應(yīng)用程序區(qū)的,這是你可以復(fù)位單片機(jī)或者點(diǎn)擊前臺(tái)復(fù)位按鍵讓cup自動(dòng)復(fù)位進(jìn)入應(yīng)用程序區(qū)。實(shí)際應(yīng)用在本實(shí)驗(yàn)的實(shí)際應(yīng)用中,增加了繼電器控制電路和鍵盤電路。既可以通過pc機(jī)來控制也可以用過按鍵來控制電器的開關(guān)線路:gdfgdff.pdf應(yīng)用程序:fsfe.rarboot程序:dsadas.rarnih232cp資料下載max232cpe資料下載