avr單(dan)片機(ji)教程,讓(rang)你快速學avr單(dan)片機(ji)
時間:2018-08-29 來源:未知
嵌入式可以說是IT領域發(fa)展最快的(de)技術之(zhi)一了(le),嵌入式包括的(de)很廣(guang),有(you)什(shen)么(me)軟件啦,有(you)什(shen)么(me)硬件啦,還有(you)今天我們要了(le)解(jie)的(de)單片(pian)機(ji),很多人都在問單片(pian)機(ji)應該怎么(me)樣學(xue)習啊,尤其(qi)(qi)是avr單片(pian)機(ji)呢,其(qi)(qi)實avr單片(pian)機(ji)學(xue)習還是比較容易的(de),只要你掌握好下面的(de)方法,你就不會迷茫而無所得了(le)。
首先(xian)要(yao)知道(dao),avr單片機(ji)是(shi)什么?不然不了解這個,那接下(xia)來的學習也(ye)是(shi)白瞎,AVR單片機(ji)是(shi)1997年(nian)由ATMEL公司研發(fa)出的增強型內(nei)置(zhi)Flash的RISC(Reduced Instruction Set CPU) 精簡指(zhi)令集高速8位(wei)單片機(ji)。可以廣泛(fan)應用于計算機(ji)外部設(she)備(bei)、工業(ye)實時控制、儀器(qi)儀表(biao)、通訊設(she)備(bei)、家用電器(qi)等(deng)各個領域。

學習avr單片機那你(ni)就需要知道avr單片機的特點(dian)有哪些:
1、131條機器指令,且(qie)大(da)多數指令的執行時間為單(dan)個系統時鐘周期;
2、32個8位通用工作寄(ji)存器;
3、工(gong)作在16MHz時(shi)具有16MIPS的性能;
4、配備只需要2個時鐘周期(qi)的硬件乘法(fa)器。
avr單片(pian)機是(shi)我們很(hen)常(chang)用的,你(ni)知道是(shi)為(wei)什(shen)么嗎(ma)?所以這又是(shi)一個學習的點,你(ni)要了解avr單片(pian)機的優點有哪(na)些:
1、程序存儲器為(wei)價格低(di)廉、可擦寫1萬次(ci)以上(shang)、指令長度(du)(du)單(dan)元為(wei)16位(字)的FlashROM(即(ji)程序存儲器寬(kuan)度(du)(du)為(wei)16位,按8位字節計算時應(ying)乘(cheng)2)。而數(shu)據存貯器為(wei)8位。因此AVR還是屬于8位單(dan)片機(ji)。
2、采(cai)用(yong)CMOS技術和RISC架構,實現高速(su)(su)(50ns)、低功耗(μA)、具有SLEEP(休眠)功能(neng)。AVR的一(yi)(yi)條指(zhi)令(ling)執行(xing)速(su)(su)度可達(da)50ns(20MHz),而耗電(dian)則在(zai)1uA~2.5mA間。AVR采(cai)用(yong)Harvard結構,以及一(yi)(yi)級(ji)流水線的預取(qu)指(zhi)令(ling)功能(neng),即對(dui)程(cheng)序的讀取(qu)和數據(ju)的操作使用(yong)不同(tong)的數據(ju)總線,因此,當執行(xing)某(mou)一(yi)(yi)指(zhi)令(ling)時,下一(yi)(yi)指(zhi)令(ling)被(bei)預先從程(cheng)序存儲器中(zhong)取(qu)出,這使得指(zhi)令(ling)可以在(zai)每一(yi)(yi)個時鐘(zhong)周期內(nei)被(bei)執行(xing)。
3、工業(ye)級產(chan)品。具(ju)有(you)大電(dian)(dian)流10~20mA(輸出電(dian)(dian)流)或40mA(吸電(dian)(dian)流)的特點,可直接驅動LED、SSR或繼電(dian)(dian)器(qi)。有(you)看門狗定時器(qi)(WDT)安(an)全保(bao)護(hu),可防止(zhi)程序(xu)走(zou)飛(fei),提高產(chan)品的抗干擾能力。
4、通用(yong)數字(zi)I/O口(kou)(kou)(kou)的(de)(de)輸(shu)入輸(shu)出特(te)性與PIC的(de)(de)HI/LOW輸(shu)出及三態高阻抗HI-Z輸(shu)入類同(tong),同(tong)時可設(she)定類同(tong)與8051結構內(nei)部有上拉電阻的(de)(de)輸(shu)入端功能(neng)(neng),便(bian)于作(zuo)為各種應用(yong)特(te)性所(suo)需(多功能(neng)(neng)I/O口(kou)(kou)(kou)),AVR的(de)(de)I/O口(kou)(kou)(kou)是真正的(de)(de)I/O口(kou)(kou)(kou),能(neng)(neng)正確反(fan)映I/O口(kou)(kou)(kou)的(de)(de)輸(shu)入/輸(shu)出的(de)(de)真實情況(kuang)。
5、像(xiang)(xiang)8051一樣,有多個固定中斷向(xiang)量入口(kou)地址(zhi),可快速響應中斷,而不是(shi)像(xiang)(xiang)PIC一樣所有中斷都(dou)在同一向(xiang)量地址(zhi),需要以程序判別后才可響應,這(zhe)會浪費(fei)且失(shi)去控制時機(ji)(ji)的最(zui)隹機(ji)(ji)會。
學(xue)avr單片機當然少不了(le)(le)的(de)就是要勤(qin)于動手(shou),多做例子(zi),在(zai)這(zhe)里就給(gei)你舉了(le)(le)例子(zi)來(lai)學(xue)習更透徹,慢慢練習,對學(xue)avr單片機還是很不錯(cuo)的(de)。
系統時鐘:
ATmega16的(de)(de)片(pian)內含有4種頻(pin)率(lv)(1/2/4/8M)的(de)(de)RC振(zhen)蕩源,可(ke)直接(jie)作為(wei)系統(tong)(tong)的(de)(de)工(gong)作時(shi)鐘使(shi)用。同時(shi)片(pian)內還設(she)有一個由反向放(fang)大器所構成的(de)(de)OSC(Oscillator)振(zhen)蕩電路(lu),外(wai)圍引腳XTAL1和(he)XTAL2分別為(wei)OSC振(zhen)蕩電路(lu)的(de)(de)輸入(ru)端(duan)和(he)輸出端(duan),用于外(wai)接(jie)石英晶體等,構成高(gao)精(jing)度的(de)(de)或其(qi)它(ta)標稱頻(pin)率(lv)的(de)(de)系統(tong)(tong)時(shi)鐘系統(tong)(tong)。
為(wei)ATmega16提供系統(tong)時(shi)(shi)鐘源時(shi)(shi),有三種主(zhu)要的(de)選擇:(1)直接(jie)(jie)使(shi)用片(pian)內(nei)(nei)的(de)1/2/4/8M的(de)RC振(zhen)(zhen)蕩(dang)源;(2)在引腳XTAL1和XTAL2上外接(jie)(jie)由石英(ying)晶(jing)體和電容組成的(de)諧振(zhen)(zhen)回路(lu)(lu),配合片(pian)內(nei)(nei)的(de)OSC(Oscillator)振(zhen)(zhen)蕩(dang)電路(lu)(lu)構成的(de)振(zhen)(zhen)蕩(dang)源;(3)直接(jie)(jie)使(shi)用外部的(de)時(shi)(shi)鐘源輸出(chu)的(de)脈沖信號。方式2和方式3的(de)電路(lu)(lu)連接(jie)(jie)見圖2-6(a)和2-6(b)。

內部看門狗:
在AVR片(pian)(pian)內(nei)還集成了(le)一個(ge)1MHz獨立的(de)時鐘電(dian)路,它(ta)僅供片(pian)(pian)內(nei)的(de)看門狗(gou)(gou)定時器(WDT)使(shi)用。因此,AVR片(pian)(pian)內(nei)的(de)WDT是獨立硬件形式(shi)的(de)看門狗(gou)(gou),使(shi)用AVR可以省掉外部的(de)WDT芯(xin)片(pian)(pian)。使(shi)用WDT可以有(you)效(xiao)的(de)提高系統(tong)的(de)可靠行。
avr單(dan)片(pian)機(ji)的工作流程:
AVR CPU的(de)(de)工作是由(you)系統(tong)時(shi)(shi)鐘直接(jie)驅(qu)動的(de)(de),在(zai)(zai)片(pian)內不再進行(xing)(xing)(xing)分頻。圖(tu)2-7所示為(wei)Harvard結構(gou)和(he)快速訪問寄(ji)存(cun)器組(zu)的(de)(de)并(bing)行(xing)(xing)(xing)指(zhi)(zhi)(zhi)令(ling)存(cun)取(qu)和(he)指(zhi)(zhi)(zhi)令(ling)執行(xing)(xing)(xing)時(shi)(shi)序。CPU在(zai)(zai)啟動后第一個(ge)時(shi)(shi)鐘周(zhou)(zhou)期(qi)T1取(qu)出第一條(tiao)指(zhi)(zhi)(zhi)令(ling),在(zai)(zai)T2周(zhou)(zhou)期(qi)便(bian)執行(xing)(xing)(xing)取(qu)出的(de)(de)指(zhi)(zhi)(zhi)令(ling),并(bing)同(tong)時(shi)(shi)又取(qu)出第二條(tiao)指(zhi)(zhi)(zhi)令(ling),依次(ci)進行(xing)(xing)(xing)。這種(zhong)基于流水線形式的(de)(de)取(qu)指(zhi)(zhi)(zhi)方式,使(shi)AVR可以(yi)以(yi)非常(chang)高的(de)(de)速度(du)執行(xing)(xing)(xing)指(zhi)(zhi)(zhi)令(ling),獲(huo)得高達1MIPS/MHz的(de)(de)效率。
存儲器:
所有的(de)(de)I/O寄(ji)存器(qi)(qi)可(ke)以通過(guo)IN(I/O口輸(shu)入)和(he)OUT(輸(shu)出到I/O口)指(zhi)(zhi)(zhi)令訪(fang)問,這些(xie)指(zhi)(zhi)(zhi)令是在(zai)32個通用(yong)寄(ji)存器(qi)(qi)與I/O寄(ji)存器(qi)(qi)空間(jian)之(zhi)(zhi)間(jian)傳輸(shu)交換(huan)數據,指(zhi)(zhi)(zhi)令周(zhou)期(qi)為1個時鐘周(zhou)期(qi)。此(ci)外,I/O寄(ji)存器(qi)(qi)地址(zhi)范圍在(zai)$00-$1F之(zhi)(zhi)間(jian)的(de)(de)寄(ji)存器(qi)(qi)(前32個)還可(ke)通過(guo)指(zhi)(zhi)(zhi)令實現(xian)bit位(wei)操作和(he)bit位(wei)判斷(duan)跳(tiao)(tiao)轉。SBI(I/O寄(ji)存器(qi)(qi)中指(zhi)(zhi)(zhi)定(ding)(ding)位(wei)置1)和(he)CBI(I/O寄(ji)存器(qi)(qi)中指(zhi)(zhi)(zhi)定(ding)(ding)位(wei)清零)指(zhi)(zhi)(zhi)令可(ke)直(zhi)接對I/O寄(ji)存器(qi)(qi)中的(de)(de)每一(yi)(yi)位(wei)進(jin)行(xing)(xing)位(wei)操作。使(shi)用(yong)SBIS(I/O寄(ji)存器(qi)(qi)中指(zhi)(zhi)(zhi)定(ding)(ding)位(wei)為1跳(tiao)(tiao)行(xing)(xing))和(he)SBIC(I/O寄(ji)存器(qi)(qi)中指(zhi)(zhi)(zhi)定(ding)(ding)位(wei)為0跳(tiao)(tiao)行(xing)(xing))指(zhi)(zhi)(zhi)令能夠(gou)對這些(xie)I/O寄(ji)存器(qi)(qi)中的(de)(de)每一(yi)(yi)位(wei)的(de)(de)值進(jin)行(xing)(xing)檢驗判斷(duan),實現(xian)跳(tiao)(tiao)過(guo)一(yi)(yi)條(tiao)指(zhi)(zhi)(zhi)令執行(xing)(xing)下一(yi)(yi)條(tiao)指(zhi)(zhi)(zhi)令的(de)(de)跳(tiao)(tiao)轉。

在(zai)I/O寄(ji)存器專用指令IN、OUT、SBI、CBI、SBIS和SBIC中使用I/O寄(ji)存器地址$OO~$3F。
當(dang)以SRAM方式尋(xun)址I/0寄存器時,必須(xu)將該其地(di)(di)址加上(shang)$0020,映射成(cheng)在數據存儲(chu)器空間的地(di)(di)址。
兩個(ge)重要的寄存器(qi):狀(zhuang)態寄存器(qi)SREG和堆棧指針寄存器(qi)SP
堆(dui)(dui)棧(zhan)是數據(ju)結(jie)構中(zhong)所(suo)使用(yong)的(de)(de)專用(yong)名詞(ci),它是由一(yi)塊連(lian)續的(de)(de)SRAM空間和一(yi)個堆(dui)(dui)棧(zhan)指針寄(ji)存(cun)(cun)器(qi)組成,主要應用(yong)于快速便捷的(de)(de)保(bao)存(cun)(cun)臨時數據(ju)、局(ju)部(bu)變量和中(zhong)斷調用(yong)或子程(cheng)(cheng)序(xu)調用(yong)的(de)(de)返回(hui)地(di)址。堆(dui)(dui)棧(zhan)在(zai)系統程(cheng)(cheng)序(xu)的(de)(de)設計和運(yun)行中(zhong)起(qi)者非常重要的(de)(de)作用(yong),只要程(cheng)(cheng)序(xu)中(zhong)使用(yong)了中(zhong)斷和子程(cheng)(cheng)序(xu)調用(yong),就必(bi)須正(zheng)確(que)的(de)(de)設置(zhi)堆(dui)(dui)棧(zhan)指針寄(ji)存(cun)(cun)器(qi)SP,在(zai)SRAM空間建立堆(dui)(dui)棧(zhan)區。
處在(zai)I/O地址空間的$3E($005E)和$3D($005D)的兩(liang)個8位(wei)寄存(cun)器構成了AVR單片(pian)機的16位(wei)堆棧指針寄存(cun)器SP。AVR單片(pian)機復位(wei)后堆棧寄存(cun)器的初始值為SPH=$00、SPL=$00,因(yin)此建(jian)議用(yong)戶(hu)程序(xu)必須首先對堆棧指針寄存(cun)器SP進行初始化(hua)設置。
AVR的(de)(de)(de)堆棧區是建立在SRAM空間的(de)(de)(de),16位的(de)(de)(de)SP寄(ji)存器可以(yi)尋(xun)址的(de)(de)(de)空間為64K。
由于AVR的(de)堆(dui)棧是向(xiang)下增(zeng)長(chang)的(de),即新(xin)數(shu)(shu)據(ju)進入堆(dui)棧時棧頂指針(zhen)的(de)數(shu)(shu)據(ju)將減小(注(zhu)意:這里與51不(bu)同,51的(de)堆(dui)棧是向(xiang)上增(zeng)長(chang)的(de),即進棧操(cao)作時棧頂指針(zhen)的(de)數(shu)(shu)據(ju)將增(zeng)加),所以盡管原則上堆(dui)棧可以在SRAM的(de)任(ren)何區域中,但通常初(chu)始化時將SP的(de)指針(zhen)設在SRAM最高處。
對(dui)于具體的(de)(de)(de)ATmega16芯片,堆棧指(zhi)針必須指(zhi)向高于$0060的(de)(de)(de)SRAM 地址空間(jian),因為(wei)低于$0060的(de)(de)(de)區域為(wei)寄(ji)存器(qi)空間(jian)。ATmega16片內集(ji)成有1K的(de)(de)(de)SRAM,不支持外部擴展SRAM,所(suo)以堆棧指(zhi)針寄(ji)存器(qi)SP的(de)(de)(de)初(chu)始值應設在SRAM的(de)(de)(de)最高端:$045F處。
根(gen)據(ju)上面所講述,AVR的(de)(de)SP堆(dui)棧(zhan)指針(zhen)寄存(cun)器指示了(le)在(zai)數(shu)(shu)(shu)據(ju)SRAM中堆(dui)棧(zhan)區域的(de)(de)棧(zhan)頂(ding)地(di)(di)址(zhi),一些臨時數(shu)(shu)(shu)據(ju)、局(ju)部(bu)變量(liang),以及子程(cheng)序返(fan)回地(di)(di)址(zhi)和(he)中斷返(fan)回地(di)(di)址(zhi)將被放置在(zai)堆(dui)棧(zhan)區域中。在(zai)數(shu)(shu)(shu)據(ju)SRAM中,該(gai)堆(dui)棧(zhan)空間的(de)(de)頂(ding)部(bu)地(di)(di)址(zhi)必須在(zai)系統(tong)程(cheng)序初始(shi)化(hua)時由初始(shi)化(hua)程(cheng)序定義和(he)設置。
當(dang)執(zhi)(zhi)行(xing)PUSH指(zhi)令,一(yi)個字節(jie)的(de)數(shu)據(ju)被(bei)壓(ya)入堆(dui)棧(zhan),堆(dui)棧(zhan)指(zhi)針(zhen)(zhen)(SP中(zhong)的(de)數(shu)據(ju))將(jiang)自(zi)動減1;當(dang)執(zhi)(zhi)行(xing)子程序調用(yong)指(zhi)令CALL或CPU響應中(zhong)斷時,硬件會自(zi)動把(ba)返(fan)(fan)(fan)回(hui)(hui)地址(16位數(shu)據(ju))壓(ya)入堆(dui)棧(zhan)中(zhong),同(tong)時將(jiang)堆(dui)棧(zhan)指(zhi)針(zhen)(zhen)自(zi)動減2。反(fan)之(zhi),當(dang)執(zhi)(zhi)行(xing)POP指(zhi)令,從堆(dui)棧(zhan)頂部(bu)彈出(chu)一(yi)個字節(jie)的(de)數(shu)據(ju),堆(dui)棧(zhan)指(zhi)針(zhen)(zhen)將(jiang)自(zi)動加(jia)1;當(dang)執(zhi)(zhi)行(xing)從子程序RET返(fan)(fan)(fan)回(hui)(hui)或從中(zhong)斷RETI返(fan)(fan)(fan)回(hui)(hui)指(zhi)令時,返(fan)(fan)(fan)回(hui)(hui)地址將(jiang)從堆(dui)棧(zhan)頂部(bu)彈出(chu),堆(dui)棧(zhan)指(zhi)針(zhen)(zhen)自(zi)動加(jia)2。
從了解avr單片機到用例子來練習avr單片機,這樣循序漸進的來學習,對學avr單片機是一個很不錯的方法,不要覺得很難,你掌握了不就不難了嗎,這些方法你都了解了嗎,尤其是這個例子,對學習avr單片機還是很有用的,記得勤加練習哦。
相關推薦:單(dan)片機學習

