AVR單片機(jī)串口USART與PC通訊實(shí)例和中斷程序分析_第1頁
AVR單片機(jī)串口USART與PC通訊實(shí)例和中斷程序分析_第2頁
AVR單片機(jī)串口USART與PC通訊實(shí)例和中斷程序分析_第3頁
AVR單片機(jī)串口USART與PC通訊實(shí)例和中斷程序分析_第4頁
AVR單片機(jī)串口USART與PC通訊實(shí)例和中斷程序分析_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、“并行”通訊:是指8位數(shù)據(jù)同時通過并行線進(jìn)行傳送,這樣數(shù)據(jù)傳送速度大大提高,但并行傳送的線路長度受到限制,因?yàn)殚L度增加,干擾就會增加,數(shù)據(jù)也就容易出錯?!按小蓖ㄓ崳盒稳菀幌戮褪且粭l車道,而并口就是有8個車道同一時刻能傳送8位(一個字節(jié))數(shù)據(jù)。但是并不是并口快,由于8位通道之間的互相干擾。傳輸時速度就受到了限制。而且當(dāng)傳輸出錯時,要同時重新傳8個位的數(shù)據(jù)。串口沒有干擾,傳輸重發(fā)一位就可以了。所以要比并口快。串行通訊協(xié)議較多,單片機(jī)常用的有USART,SPI,TWI,1-Wire 等。串行通訊有分為同步和異步通訊:通俗講 同步就是你叫我去吃飯,我聽到了就和你去吃飯;如果沒有聽到,你就不停的叫,直

2、到我告訴你聽到了,才一起去吃飯。異步就是你叫我,然后自己去吃飯,我得到消息后可能立即走,也可能等到下班才去吃飯。同步通訊:收信發(fā)信雙方在使用同步時鐘,在同一時刻傳輸線上的數(shù)據(jù)就是要傳輸?shù)男畔ⅰ?異步通訊:以字符為傳輸單位,字符與字符之間是異步的,而字符的位是同步的 USART:異步串行通訊,常用與單片機(jī)和單片機(jī),單片機(jī)和PC電腦間的數(shù)據(jù)傳輸。 波特率:表征通訊速度的參數(shù),單位是位/秒(b/s),即每秒鐘傳輸?shù)亩M(jìn)制位數(shù),如波特率9600,表示每秒鐘傳輸9600個二進(jìn)制位數(shù)據(jù)。收發(fā)雙方必須采用同樣的波特率。波特率不同將無法正常通訊。全雙工通訊:指是的是可以同時發(fā)送和接收數(shù)據(jù)。半雙工通訊:指的是在

3、同一時刻只能發(fā)送或只能接收數(shù)據(jù)。單片機(jī)與PC通訊的電平轉(zhuǎn)換:單片機(jī)的電壓一般是TTL電平,電壓0v-5v,PC機(jī)串口采用的是RS-232協(xié)議,它的的電壓范圍是-15-+15v,電平不同,無法通訊。要實(shí)現(xiàn)通訊,必須進(jìn)行電平和邏輯關(guān)系的轉(zhuǎn)換, 一般用 MAX232集成芯片進(jìn)行電平的轉(zhuǎn)換。ATmega16 串口結(jié)構(gòu):有一個全雙工的串行口,有兩條通訊線,TXD:數(shù)據(jù)發(fā)送線,RXD:數(shù)據(jù)接收線,對應(yīng)的單片機(jī)外部引腳為PD1,PD0相關(guān)寄存器:UDR 串口數(shù)據(jù)寄存器,UCSRA 串口控制與狀態(tài)寄存器AUCSRB 串口控制與狀態(tài)寄存器BUCSRC 串口控制與狀態(tài)寄存器CUBRRH,UBRRL 波特率寄存器發(fā)

4、生器對波特率發(fā)生器的輸出時鐘進(jìn)行2、8或16 的分頻,具體情況取決于工作模式,如下圖:如:系統(tǒng)時鐘頻率f=8MHZ,異步正常模式(16分頻),波特率9600則: UBRR=8000000/16*9600-1=52-1=51; 波特率寄存器賦值:UBRRH=0; UBRRL=51;/*10進(jìn)制寫法*/,或者UBRRH=0;UBRRL=0x33;/*16進(jìn)制寫法*/操作步驟:一、設(shè)置異步模式: UCSRC|=(1<<URSEL)|(1<<URMEL); /UCSRC和UBRRH寄存器共用一個地址,寫UCSRC時,URSEL應(yīng)置1二、設(shè)置數(shù)據(jù)幀格式: 8位數(shù)據(jù)位,一位停止位,

5、UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);三、設(shè)置波特率寄存器: UBRRL=51;UBRRH=0;四、使能發(fā)送接收: UCSRB|=(1<<TXEN)|(1<<RXEN);五、中斷總使能: ;/函數(shù)功能:通過PC 串口向單片發(fā)送數(shù)據(jù),單片機(jī)接收數(shù)據(jù)后,送到PA口顯示,再送回到PC機(jī)#include<iom16v.h>#include<macros.h>#define fosc 8000000 /晶振8MHZ#define baud 9600 /波特率定義/*端口初始化函數(shù)

6、*/void init(void)PORTA = 0xFF; /PA口輸出高電平DDRA = 0xFF; /PA口設(shè)置為輸出PORTD = 0X00; /USART的發(fā)送接收端口分別為PD0和PD1DDRD|=(1<<PD1); /PD0為接收端口置為輸入;PD1為發(fā)送端口置為輸出/*串口初始化函數(shù)*/void uart_init(void)UCSRB = 0x00;UCSRA = 0x00;UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); /異步,數(shù)據(jù)格式8,N,1/UCSRC寄存器與UBRRH寄存器

7、共用相同的I/O地址,寫 UCSRC時,URSEL應(yīng)設(shè)置為1。UBRRL=51; /設(shè)置波特率寄存器 10進(jìn)制的寫法UBRRH=0;UCSRB |= (1 << TXEN)|(1 << RXEN); /發(fā)送接收使能/*發(fā)送數(shù)據(jù)函數(shù)*/void send(unsigned char i)while(!(UCSRA&(1<<UDRE); /只有數(shù)據(jù)寄存器為空時才能發(fā)送數(shù)據(jù)UDR=i;/*以下是接收數(shù)據(jù)函數(shù)*/unsigned char receive(void)while(!(UCSRA&(1<<RXC); /等待接收完成return

8、 UDR;/*主函數(shù)*/void main(void)unsigned char temp;init();uart_init();while(1)temp=receive(); /接收數(shù)據(jù)PORTA=temp; /將接收的數(shù)據(jù)取反后送PA口顯示send(temp); /向PC機(jī)發(fā)送數(shù)據(jù)1. 范例描述按下按鍵0,LED0亮。直到松手,其他按鍵才能起作用按下按鍵1,LED1亮。其他按鍵隨時都能起作用按下按鍵2,LED0/1都熄滅。直到松手,其他按鍵才能起作用2. 電路圖設(shè)計(jì) :.4. 代碼設(shè)計(jì)與說明 :本程序簡單的示范了如何使用ATMEGA16的外部中斷中斷的設(shè)置 按鍵的簡單延時防抖動 中斷的嵌套

9、 變量在中斷中的應(yīng)用-如果變量會在中斷服務(wù)程序中被修改,須加volatile限定本范例可直接使出廠狀態(tài)的新M16芯片,無需對芯片的熔絲位進(jìn)行配置。出于簡化程序考慮,各種數(shù)據(jù)沒有對外輸出,學(xué)習(xí)時建議使用JTAG ICE硬件仿真器關(guān)于外部中斷作喚醒源的條件:(將會在后面的電源管理和睡眠模式范例中應(yīng)用) 而INT0和INT1的邊沿觸發(fā)中斷只能在 空閑模式起作用,即 CLKI/O不停止INT0和INT1的低電平中斷,INT2在各種睡眠模式下都可以,因?yàn)檫@幾種中斷工作 于異步模式,不需要時鐘驅(qū)動官方的M16中文手冊對外部中斷的描敘存在多處錯誤,請參考英文原版。*/#include <avr/io.

10、h>#include <avr/delay.h>#include <avr/signal.h>#include <avr/interrupt.h>/*宏INTERRUPT 的用法與SIGNAL 類似,區(qū)別在于SIGNAL 執(zhí)行時全局中斷觸發(fā)位被清除、其他中斷被禁止INTERRUPT 執(zhí)行時全局中斷觸發(fā)位被置位、其他中斷可嵌套執(zhí)行中斷服務(wù)程序的編寫具有一定的格式,在不同編譯環(huán)境下各不相同,在WINAVR(GCC)環(huán)境下有兩種方式,分別是:第一種中斷服務(wù)程序的編寫格式:SIGNAL(中斷向量名) /中斷服務(wù)程序內(nèi)容第一種中斷服務(wù)程序的編寫格式:ISR(中斷

11、向量名 ) /中斷服務(wù)程序內(nèi)容在這兩種方式中,需要分別添加頭文件:#include <avr/signal.h>和#include <avr/interrupt.h>。 另外avr-libc 提供兩個API 函數(shù)用于置位和清零全局中斷觸發(fā)位,它們是經(jīng)常用到的。分別是:void sei(void) 和void cli(void) 由interrupt.h定義 */注: 內(nèi)部函數(shù)_delay_ms() 最高延時 262.144mS1MHz/* 該函數(shù)可以實(shí)現(xiàn)較精確的定時,但用JTAG仿真時較麻煩-會進(jìn)入機(jī)器碼窗口(Disassembeler) .注意跳開該語段。一旦JTAG

12、仿真進(jìn)入該內(nèi)部函數(shù)語句,會變得像"死機(jī)"一樣(其實(shí)在運(yùn)行中),可以先break,然后 在后面的C語句設(shè)breakpoint,RUN跳過*/ for()/while()語句計(jì)算延時時間較麻煩。/ 為了使 _delay_ms()函數(shù)的延時正確,須在makefile中設(shè)定F_CPU為實(shí)際的系統(tǒng)時鐘頻/ 本范例為1MHz內(nèi)部RC振蕩器 即 F_CPU=1000000/*C:WinAVRavrincludeavr目錄包括所有芯片的定義和其他頭文件其中iom16.h 定義ATMEGA16芯片的特性(中斷向量,寄存器,位定義.)包括下面中斷服務(wù)程序的常量 SIG_INTERRUPTx ,

13、PORTx,GICR.*/管腳定義#define EXT_INT0 2 /PD2 按鍵0#define EXT_INT1 3 /PD3 按鍵1#define EXT_INT2 2 /PB2 按鍵2#define LED0 0 /PB0#define LED1 1 /PB1#define LED2 3 /PB3/宏定義#define LED0_ON() PORTB|= (1<<LED0) /輸出高電平,燈亮#define LED0_OFF() PORTB&=(1<<LED0) /輸出低電平,燈滅#define LED1_ON() PORTB|= (1<<

14、;LED1)#define LED1_OFF() PORTB&=(1<<LED1)#define LED2_ON() PORTB|= (1<<LED2)#define LED2_OFF() PORTB&=(1<<LED2)/51系列的高電平輸出能力很弱,低電平也僅能點(diǎn)亮LED.所以常見輸出低電平才燈亮的接法。 /AVR芯片的高低驅(qū)動能力都很強(qiáng),甚至能推動8字?jǐn)?shù)碼管的公共極,怎么接都沒問題。 /全局變量#define has_volatile 1 /這里是條件編譯/可以修改has_volatile=1或0來看程序運(yùn)行的效果#if has_vol

15、atilevolatile unsigned char FLAG; /全局變量,會在中斷服務(wù)程序中被修改,須加volatile限定 #elseunsigned char FLAG; /全局變量.#endif/仿真時在watch窗口,監(jiān)控這些變量。SIGNAL(SIG_INTERRUPT0) /INT0中斷服務(wù)程序/硬件自動清除INTF0標(biāo)志位_delay_ms(10); /延時if (PIND&(1<<EXT_INT0)=0) /重復(fù)檢測,防抖動LED0_ON(); /點(diǎn)亮LED0loop_until_bit_is_set(PIND,EXT_INT0); /等待按鍵釋放(變

16、為高電平) _delay_ms(10); /延時 按鍵釋放時也會抖動。/ 即使同時發(fā)生其它的中斷事件,如果在這里把相應(yīng)的中斷標(biāo)志位清除,那么該中斷將 不能觸發(fā)進(jìn)入中斷服務(wù)/* 注意讀端口用 PINx寫端口用 PORTx */INTERRUPT(SIG_INTERRUPT1) /INT1中斷服務(wù)程序/硬件自動清除INTF1標(biāo)志位/這里全局中斷被打開,將允許其他中斷嵌套執(zhí)行_delay_ms(10);if (PIND&(1<<EXT_INT1)=0)LED1_ON(); /點(diǎn)亮LED1loop_until_bit_is_set(PIND,EXT_INT1);_delay_ms(

17、10);SIGNAL(SIG_INTERRUPT2) /INT2中斷服務(wù)程序/硬件自動清除INTF2標(biāo)志位_delay_ms(10);if (PINB&(1<<EXT_INT2)=0)LED0_OFF(); /熄滅LED0LED1_OFF(); /熄滅LED1loop_until_bit_is_set(PINB,EXT_INT2); FLAG=!FLAG; /修改全局變量_delay_ms(100);int main(void)/上電默認(rèn)DDRx=0x00,PORTx=0x00 輸入,無上拉電阻PORTA =0xFF; /不用的管腳使能內(nèi)部上拉電阻。PORTC =0xFF;

18、PORTD =0xFF;DDRB = (1<<LED2)|(1<<LED1)|(1<<LED0); /輸出 PORTB =(1<<LED2)|(1<<LED1)|(1<<LED0); /低電平,燈滅 /外部中斷INT0,1,2 做按鍵輸入,使能內(nèi)部上拉,就可以不用外接電阻了MCUCR=(1<<ISC11)|(0<<ISC10)|(1<<ISC01)|(0<<ISC00); /注意該寄存器有多個功能/*ISCx1:0=00 INTx引腳為低電平時產(chǎn)生中斷請求ISCx1:0=01 INTx引腳上任意的邏輯電平變化都將引發(fā)中斷ISCx1:0=10 INTx引腳的下降沿產(chǎn)生中斷請求ISCx1:0=11 INTx引腳的上升沿產(chǎn)生中斷請求MCUCSR&=(1<<ISC2); /注意該寄存器有多個功能/* ISC2=0 INT2引腳的下降沿產(chǎn)生異步中斷請求ISC2=1 INT2引腳的上升沿產(chǎn)生異步中斷請求GIFR=(1<<INTF1)|(1<<INTF0)|(1<<INTF2);/寫1清除標(biāo)志位,在使能中斷前最好先把對應(yīng)的標(biāo)志位清除,以免誤觸發(fā)GICR=(1<<INT1)|(1<<

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論