單片機片上開發(fā)方法(ATmega16為例)_第1頁
單片機片上開發(fā)方法(ATmega16為例)_第2頁
單片機片上開發(fā)方法(ATmega16為例)_第3頁
單片機片上開發(fā)方法(ATmega16為例)_第4頁
單片機片上開發(fā)方法(ATmega16為例)_第5頁
已閱讀5頁,還剩91頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

2023/2/51單片機片上開發(fā)方法

(ATmega16為例)王浩98ID:wootE-mail:wanghao@SOC2023/2/522023/2/53你現在有這些麻煩嗎?我根本不知道怎么把單片機用在機器人上我在自學,而且找了書在看,但越看越亂我看了一些方案的實例,對機械部分和電路部分有感覺了,但就是不知道他們是怎樣工作的我只會用仿真器,到現在還不知道如何把寫好的程序“燒”進一片真實的單片機中只要和單片機有一點關系的電路我們就不敢設計,這讓我們在寫方案的過程中阻力很大。我學過C,但是不會用它寫單片機的程序我到底是用匯編還是用C……2023/2/54要解決麻煩,首先假設你……會使用電腦(比如安裝WindowsXP的PC)已經學過或對C語言有一定的了解能看得懂一些簡單的電路和元器件符號充滿激情和渴望,而且有毅力和敢于動手2023/2/55我去電子市場買來一片單片機!我能且只能這樣看著它——

數數它的腿,瞅瞅它上面的印字!40引腳DIP封裝ATmega16L-8ATmega16-16或2023/2/56從DATASHEET中了解更多ATMEL公司為他的所有單片機產品都提供了一份超級詳細的datasheet說明書,而且對常用的系列進行了中文翻譯,這將是我們接下來進行各種實驗環(huán)節(jié)的第一手資料!2023/2/57從DATASHEET中了解更多現在很多單片機內部有三種存儲器:FlashEEPROMSRAM/RAM存放程序和靜態(tài)數據,單片機在工作過程中一般不能修改一般不會使用,使用時通過特殊的命令讀寫,其特點是掉電不丟失存放變量,特點是掉電丟失2023/2/58其實你還需要很多……最起碼(如果想完成這里的最少一個實驗的話),你還需要準備:一支電烙鐵、電烙鐵架子、一小卷含鉛的0.8mm焊錫和一塊足夠大的萬用焊接電路板一些單芯帶絕緣皮的鍍錫銅導線一個40DIP插座和幾根杜邦排針8只1K的電阻和8只LED燈一根AVR的下載線(比如USBASP線)最好還有一個萬用表2023/2/59USBASP下載線CC98上有人在做:8/dispbbs.asp?boardID=251&ID=23514972023/2/510下載一個開發(fā)資料包(woot整理)AVR_DEV.rar解壓后請關注論壇,即時會掛在臨時ftp上并給出連接2023/2/511做好心理準備

接下來我們將為mega16單片機搭建一個最基本的電路,可以稱它為一個“最小系統”,這個系統只能向單片機中下載程序并讓其開始工作,然后我們會按照實驗的順序逐漸增加并完善這個系統,并讓它最終成為SLOWLY機器人的一個標準系統。在這個過程中,我們會邊講、邊試,不知不覺中學會使用datasheet,學會在Windows上開發(fā)平臺的搭建、單片機C語言編程基礎、程序的下載、延時程序、LED點燈程序、I/O操作、PWM功能、定時器功能、A/D功能等片上功能的使用……2023/2/512ATmega16單片機的管腳排列PB0PB1PB2PB3PB4PB5PB6PB7RESETVCCGNDXTAL2XTAL1PD0PD1PD2PD3PD4PD5PD6PA0PA1PA2PA3PA4PA5PA6PA7AREFGNDAVCCPC7PC6PC5PC4PC3PC2PC1PC0PD7ATmega16010203040506070809101112131415161718192040393837363534333231302928272625242322212023/2/513從datasheet上快速知道管腳定義AVR_DEV\datasheet\cn_mega16-16L.pdf的第2頁(P2)2023/2/514搭建ATmega16的“最小系統”(MOSI)PB5(MISO)PB6(SCK)PB7RESETVCCGNDGNDAVCCATmega1601020304050607080910111213141516171819204039383736353433323130292827262524232221USBASP下載頭插座(板子正面)VCCGNDMOSIMISOSCKRESET+5V+5V2023/2/515建議的“最小系統”(MOSI)PB5(MISO)PB6(SCK)PB7RESETVCCGNDXTAL2XTAL1AREFGNDAVCCATmega1601020304050607080910111213141516171819204039383736353433323130292827262524232221USBASP下載頭插座(板子正面)VCCGNDMOSIMISOSCKRESET+5V+5V10422pF22pF8MHz4K7+10uF+5VRESETXTAL2XTAL11002023/2/516增加8個LED燈用來指示(MOSI)PB5(MISO)PB6(SCK)PB7RESETVCCGNDXTAL2XTAL1AREFGNDAVCCPC7PC6PC5PC4PC3PC2PC1PC0ATmega1601020304050607080910111213141516171819204039383736353433323130292827262524232221USBASP下載頭插座(板子正面)VCCGNDMOSIMISOSCKRESET+5V+5V10422pF22pF8MHz4K7+10uF+5VRESETXTAL2XTAL1LED1K1002023/2/517實驗1:讓8個LED燈閃爍安裝ICC編譯器編寫讓8個LED燈閃爍的程序安裝USBASP下載線驅動使用USBASP給mega16下載寫好的程序更改mega16的熔絲位2023/2/518安裝ICC編譯器雙擊AVR_DEV\ICCAVR7.13C\Setup.exe之后的圖片使用ICC6.31A安裝時的界面,ICC7.13的界面與其相似2023/2/5192023/2/5202023/2/5212023/2/522C:\iccv7avr2023/2/5232023/2/5242023/2/5252023/2/5262023/2/5272023/2/528安裝ICC編譯器將AVR_DEV\ICCAVR7.13C\ICC.exe文件復制到C:\iccv7avr\bin\目錄下面。這里是默認的目錄,根據你的安裝情況使用安裝時設置的目錄。以后,我們可以通過雙擊這個文件運行ICC,可不受其30天試用期限制,但僅限于自己學習,不能用于其它用途!2023/2/529運行ICC使用剛才的ICC.exe運行ICC7.132023/2/530ICC的界面2023/2/531新建一個工程ProjectNew2023/2/532新建一個工程建議先建立一個文件夾,如LED_test2023/2/533新建一個工程在建立的LED_test文件夾內建立LED_文件,如圖點擊“保存(S)”2023/2/5342023/2/535在工程中建立一個LED.c文件FileNew2023/2/5362023/2/537在工程中建立一個LED.c文件FileSaveAs…2023/2/538在工程中建立一個LED.c文件在剛建立的LED_test文件夾內保存成LED.c2023/2/539將LED.c添加到工程中File(右擊)AddFile(s)…2023/2/540將LED.c添加到工程中選中剛才建立的LED.c文件,打開(O)2023/2/541將LED.c添加到工程中LED.c就成功添加到LED_project中了2023/2/542我們將會在這個區(qū)域里用C語言寫一個LED閃爍的程序……2023/2/543在開始之前設置ICC,使其配置成為可以開發(fā)ATmega16的編譯器環(huán)境2023/2/544設置你的ICCProjectOptions…2023/2/545設置你的ICC如圖在Target標簽中的DeviceConfiguration里選擇ATmega16單片機,點擊OK即可2023/2/546書寫程序程序將會被寫到這里,如果你是第一次使用,不妨先把下一頁PPT提供的寫好的程序復制到這里,熟悉一下流程先2023/2/547寫好的程序#include<iom16v.h>#include<macros.h>#include<stdio.h>voidInitPorts(void){DDRC=0xFF;PORTC=0xFF;}voiddelay_us(unsignedinttime){do{time--;}while(time>1);}voiddelay_ms(unsignedinttime){while(time!=0){delay_us(1000);time--;}}voidmain(void){InitPorts();delay_ms(50);while(1){PORTC=0x00;delay_ms(500);PORTC=0xFF;delay_ms(500);}}2023/2/548LED燈閃爍程序解釋#include<iom16v.h>//此頭文件包含了ATmega16的口位定義等#include<macros.h>//此頭文件包含了AVR系列通用口位定義等#include<stdio.h>/*此頭文件是C語言的標準頭文件,在這里不寫是沒關系的*/2023/2/549LED燈閃爍程序解釋//端口初始化函數voidInitPorts(){/***76543210***/DDRC=0xFF;

//PC口定義為輸出PORTC=0xFF;

//PC口置1(也叫“拉高”)//

11111111}2023/2/550LED燈閃爍程序解釋/*8MHz晶振下*///微秒級延時函數voiddelay_us(unsignedinttime){do{time--;}while(time>1);}//毫秒級延時函數voiddelay_ms(unsignedinttime){while(time!=0){delay_us(1000);time--;}}2023/2/551LED燈閃爍程序解釋voidmain(void)//主程序{InitPorts();//端口初始化

delay_ms(50);//延時一下,保證外部電路穩(wěn)定

while(1)//進入一個死循環(huán)

{PORTC=0x00;//C口的LED燈點亮

delay_ms(500);//延時500msPORTC=0xFF;//C口的LED燈熄滅

delay_ms(500);//延時100ms}}2023/2/552編譯BuildProject2023/2/553編譯成功2023/2/554編譯后的文件2023/2/555把程序寫入mega16單片機安裝USBASP下載線驅動使用USBASP給mega16下載寫好的程序2023/2/556安裝USBASP下載線驅動設置USBASP下載線的跳線跳線說明:+5V:連接時將通過USB接口為目標板供電。updata:連接時可以給USBasp進行固件升級(一般不使用)。這里我們連接+5,斷開updata+5Vupdata2023/2/557安裝USBASP下載線驅動給USBASP插上下載排線黑色插頭有突起的一側對著板子上有白色方框的這一側插入2023/2/558安裝USBASP下載線驅動先下載USBasp驅動:可以在CC98代理處下載8/uploadfile/2008/9/26/2064585665.rar也可以在AVR_DEV\progisp167\USB-Drive\下找到驅動不能直接雙擊安裝,先把USBASP下載線插入電腦的USB口2023/2/559安裝USBASP下載線驅動電腦顯示屏自動彈出下列提示框,用鼠標點擊選擇“是,僅這一次(Y)”,然后點擊“下一步(N)”

2023/2/560安裝USBASP下載線驅動當計算機屏幕顯示下列提示框后,點擊選擇“從列表或指定位置安裝(高級)(S)”,再點擊“下一步(N)”2023/2/561安裝USBASP下載線驅動屏幕出現下列提示框,點擊“瀏覽(R)”選擇USBASP驅動文件所在的文件夾(USBasp-Drive),然后點擊“下一步(N)”2023/2/562安裝USBASP下載線驅動2023/2/563安裝USBASP下載線驅動2023/2/564安裝USBASP下載線驅動2023/2/565使用progisp167下載軟件progisp167是一個免費綠色軟件,就在\AVR_DEV\progisp167目錄下雙擊progisp.exe就能運行軟件2023/2/566使用progisp167下載軟件(1)(2)(3)依次選擇好如圖設置ATmega16USBASPusb2023/2/567注意下載線另一頭與單片機的連接(MOSI)PB5(MISO)PB6(SCK)PB7RESETVCCGNDXTAL2XTAL1AREFGNDAVCCPC7PC6PC5PC4PC3PC2PC1PC0ATmega1601020304050607080910111213141516171819204039383736353433323130292827262524232221USBASP下載頭插座(板子正面)GNDVCCMOSIMISOSCKRESET+5V+5V10422pF22pF8MHz4K7+10uF+5VRESETXTAL2XTAL1LED1K1002023/2/568使用progisp167下載軟件點擊“調入Flash”(4)點擊“打開”2023/2/569使用progisp167下載軟件設置好編程方式,然后點擊“自動”(5)2023/2/570使用progisp167下載軟件說明程序已經下載成功了!2023/2/571為什么會這樣?LED燈閃爍得很慢,好像根本不是1秒一次!中間的4個LED燈根本就沒有被點亮過!2023/2/572設置ATmega16的熔絲位原因很有可能出在“熔絲位”上!2023/2/573設置ATmega16的熔絲位新手可能根本就看不懂,下面點“向導方式”2023/2/574設置ATmega16的熔絲位鉤選不選不選2023/2/575設置ATmega16的熔絲位設置好熔絲位,然后點擊“寫入”如果成功,這里會提示2023/2/576所有的LED燈都按照1s的節(jié)拍閃爍起來!2023/2/577端口初始化命令DDRA=0xF0;對端口A初始化,高4位作為輸出(1),低4位作為輸入(0)注:金黃色字體部分表示可以根據情況更改2023/2/578寫端口命令PORTA=0x0F;將端口A的8個I/O口寫為00001111,0表示I/O口拉低,1表示I/O口拉高。注:只有在A口相應的I/O口位被定義為輸出時才有實際作用2023/2/579寫端口命令P=PINA

;讀出端口A的8個I/O口上的高低電平狀態(tài),1表示高電平,0表示低電平,將其賦給P,P是無符號字節(jié)型變量(unsignedcharP;)注:只有在A口相應的I/O口位被定義為輸入時才有實際作用2023/2/580I/O操作應用舉例LED指示燈unsignedcharP;P=PINB;//B口值給PPORTC=P;/*C口按照P的值輸出。*/PB0PB1PB3PB5PB7PB2PB4PB6DDRB=0x00;//B口輸入DDRC=0xFF;//C口輸出PC7PC6PC5PC4PC3PC2PC1PC0AVRICC程序2023/2/581I/O口的一種位操作實現方法//輸出端口位操作(1為拉高,0為拉低)#defineset_bit(x,y) (x|=(1<<y))//將x端口的第y位設置成1/*例:*/set_bit(PORTB,0)#defineclr_bit(x,y) (x&=~(1<<y))//將x端口的第y位設置成0/*例:*/clr_bit(PORTB,0)2023/2/582I/O口的一種位操作實現方法//輸入端口位操作(1為高電平,0為低電平)#defineget_bit(x,y) ((x&(1<<y))?1:0)//得到x端口第y位的數據/*例:*/if(get_bit(PINC,7)==1)program1();2023/2/583實驗2:使用ATmega16的ADC將ATmega16的PA7(ADC7)口與一個光電開關連接,打開A/D轉換,并用LED指示燈指示轉換的高八位結果。2023/2/584實驗2:使用ATmega16的ADC電路連接(在第16張“最小系統”基礎上)+5VADC710050056K2023/2/585與ADC相關的寄存器DatasheetP7DatasheetP203DatasheetP2052023/2/586與ADC相關的寄存器DatasheetP2062023/2/587ICC程序(ADC)完整程序見備注voidADC_init(void){//ADC初始化

ADMUX|=(1<<ADLAR);//ADC結果左對齊

ADCSRA|=(1<<ADPS2)|(0<<ADPS1)|(1<<ADPS0);//ADC時鐘=clk/32ADCSRA|=(1<<ADEN);//ADC使能}voidADC_work(void){//8路共需要0.8ms左右

unsignedchari=0;for(i=0;i<8;i++){ADMUX&=0xF0;//第4位清零,事實上只清低3位就可以了

ADMUX|=i;//選擇ADC通道為ADCi

ADCSRA|=(1<<ADSC);//啟動ADC轉換

delay_us(80);adc[i]=ADCH;//讀取本路轉換結果,只讀高8位

}}2023/2/588實驗3:使用ATmega16的PWM(上)使用ATmega16的PWM對電機進行調速2023/2/589L298N電機控制電路PB4PB5PB6PB7OC0OC22023/2/590L298N真值表(以一個H橋為例)input1input2EN_AMOTOR_LXX0靜止101正轉011反轉001停止111制動2023/2/591ATmega16與PWM相關的寄存器DatasheetP7TCCR0OCR0TCCR2OCR2DatasheetP78DatasheetP80DatasheetP119DatasheetP121TCCR1ATCCR1BOCR1AOCR1BDatasheetP102DatasheetP105DatasheetP106DatasheetP1062023/2/592ICC程序(PWM上)voidpwm02_init(void){//PWM初始化

/*OC0的PWM初始化*/TCCR0=0x00;TCCR0|=(1<<WGM01)|(1<<WGM00);//選擇快速PWM方式

TCCR0|=(1<<COM01)|(0<<COM00);//PWM左對齊

TCCR0|=(0<<CS02)|(1<<CS01)|(1<<CS00);//clk/64分頻

OCR0=0;//OCR0的值:0~255用來控制占空比,初值為0

/*OC2的PWM初始化*/TCCR2=0x00;T

溫馨提示

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

評論

0/150

提交評論