AVRmega16基本程序_第1頁(yè)
AVRmega16基本程序_第2頁(yè)
AVRmega16基本程序_第3頁(yè)
AVRmega16基本程序_第4頁(yè)
AVRmega16基本程序_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、/* mcu: atmega16 外部晶振: 8mhz 程序功能: 4*4鍵盤(pán)識(shí)別,led七段數(shù)碼管顯示,密碼功能模塊,直流電機(jī)正反轉(zhuǎn)控制 ad轉(zhuǎn)換模塊, 模擬比較器,外部中斷應(yīng)用,12864液晶,c/t0 硬件設(shè)計(jì): 參考protues硬件仿真電路 調(diào)試: 所有程序主要功能都軟硬件仿真通過(guò),實(shí)際使用時(shí)要根據(jù)需要加入可靠性。 編譯環(huán)境: icc avr design by: wdw */#include<iom16v.h>#include<macros.h>#include<math.h> #define uchar unsigned char#define

2、 uint unsigned int#define set_1(a,b) a|=bit(b) /將寄存器a的第b位置1#define clr_0(a,b) a&=bit(b) /將寄存器a的第b位清0#program date code: const date=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,/共陽(yáng)數(shù)據(jù); 0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;#program duan code: const duan=0x20,0x10,0x08,0x04,0x02,0x01; /段選;char adchann

3、el; int dispbuf=0,0,0,0,0,0,; /顯示緩存;uchar securbuf=0,0,0,0,0,; /5位密碼緩存;/*名稱(chēng):ms延時(shí)子函數(shù)功能:延時(shí)指定的ms*/void delayms(int ms) int i,j;for(i=ms;i>0;i-) for(j=1722;j>0;j-); /8m時(shí)改為1141; /12m時(shí)為1722; /*名稱(chēng):us延時(shí)子程序功能:延時(shí)指定的us*/void delayus(uchar us) for(us;us<0;us-); /12m時(shí)單位t為1.45us /*單參數(shù)led 顯示硬件連接:數(shù)據(jù)portc-d

4、7d0 段選portd-d7d4*/void ledshow(long int shownum)uchar i,tmp,curnum;long int tmpnum;tmp = 0xfb;tmpnum = shownum;for(i=0;i<6;i+) /顯示的位數(shù)為5curnum = tmpnum % 10;tmpnum = tmpnum / 10;portd = tmp;portc = datecurnum;delayus(1);tmp = (tmp << 1) + 0x01; /補(bǔ)上移位造成的最右位為0; /*名稱(chēng):七段led共陽(yáng)數(shù)碼管,在指定數(shù)位上顯示指定的數(shù),雙參數(shù)

5、功能:在指定的位置上顯示制定的數(shù);硬件連接:pc口複用控制段選和位選,有2片573進(jìn)行數(shù)據(jù)鎖存;*/ void show(uchar dat,uchar num) /六位七段數(shù)碼管顯示程序ok; portc=datedat; portd|=bit(0); portd&=bit(0); /送數(shù)據(jù); delayus(2); portc=0x00; delayus(1); portc=duannum; portd|=bit(1); delayus(2); portd&=bit(1); delayus(2); /送選通信號(hào);/*名稱(chēng):mcu端口初始化功能:設(shè)置mcu端口初始方向?yàn)檩敵龀?/p>

6、始狀態(tài)為低*/void gpioinit0() ddra=0xff; porta=0x00; ddrb=0xff; portb=0x00; ddrc=0xff; portc=0x00; ddrd=0xff; portd=0x00; /*名稱(chēng):mcu端口初始化功能:設(shè)置mcu端口初始為輸出初始狀態(tài)為高 */void gpioinit1() ddra=0xff; porta=0xff; ddrb=0xff; portb=0xff; ddrc=0xff; portc=0xff; ddrd=0xff; portd=0xff; /*名稱(chēng):?jiǎn)味丝跍y(cè)試輸入:測(cè)試pc的任意端口號(hào)07功能:週期改變一個(gè)端口的電

7、平*/ void iotest(uchar num) ddrc|=bit(num); / while(1) / portc|=bit(num); delayms(50); portc&=bit(num); delayms(50); / /*名稱(chēng):按鍵動(dòng)作檢測(cè)子程序。功能:檢測(cè)4*4鍵盤(pán)是否有鍵按下;硬件連接:pb0pb3為行;pb4pb7為列;*/ uchar key_press() uchar key; ddrb=0xff; portb=0x0f; ddrb=0xf0; delayms(2); /此處要加上適當(dāng)延時(shí)否則讀不到端口信息; key=pinb; key&=0x0f;

8、 /按下返回1,否則為0; if(key=0x0f) return 0; else return 1; /* 名稱(chēng):4*4矩陣按鍵掃描子程序 功能:掃描一個(gè)4*4矩陣案件,比返回相應(yīng)按鍵值; 硬件連接:pb0pb3為行;pb4pb7為列;*/ uchar keyscan() /4*4鍵盤(pán)掃面程序,調(diào)試0k; uchar keycode,keynum; do while(key_press()=0); /按鍵是否按下? asm("nop"); asm("nop"); while(key_press()=1) ddrb=0xff; /pb0pb3為列,pb4

9、pb7為行;portb=0x0f; /列輸出高電平,行輸出低電平;ddrb=0xf0; delayus(10); /延時(shí)2毫秒,讀列狀態(tài);keycode=pinb;keycode&=0x0f; /讀列狀態(tài),屏蔽行狀態(tài);ddrb=0xff;portb=0xf0;ddrb=0x0f;delayus(10);pinb&=0xf0; /讀行狀態(tài),屏蔽列狀態(tài);keycode|=pinb;delayus(10); do while(key_press()=1); /按鍵是否釋放; switch(keycode) case 0xee: keynum=0; break; case 0xde:

10、keynum=1; break; case 0xbe: keynum=2; break; case 0x7e: keynum=3; break; case 0xed: keynum=4; break; case 0xdd: keynum=5; break; case 0xbd: keynum=6; break; case 0x7d: keynum=7; break; case 0xeb: keynum=8; break; case 0xdb: keynum=9; break; case 0xbb: keynum=10; break; case 0x7b: keynum=11; break; c

11、ase 0xe7: keynum=12; break; case 0xd7: keynum=13; break; case 0xb7: keynum=14; break; case 0x77: keynum=15; break; default : keynum=16; break; return keynum; /* 名稱(chēng):六位密碼輸入比對(duì)程序 功能:輸入六位數(shù)並與存儲(chǔ)密碼比對(duì),0k返回1,按錯(cuò)或者順序錯(cuò)返回0; 原始密碼654321*/uchar securtcom() /6位密碼輸入比對(duì)程序0k; uchar keycount=0; while(key_press()=1); delay

12、ms(3); do while(key_press()=1); delayms(1); while(key_press()=0); show(8,keycount); securbufkeycount+=keyscan(); while(keycount<6);if(securbuf0=6) /初始比對(duì),密碼654321; if(securbuf1=5) if(securbuf2=4) if(securbuf3=3) if(securbuf4=2) if(securbuf5=1); return 1; /密碼正確,返回1; else return 0; /密碼錯(cuò)誤,返回0; uchar

13、serset() /密碼設(shè)定子程序; uchar speci_keypress(uchar presstimes) /特殊按鍵f按下某一設(shè)定次數(shù)ok; uchar key_longpress(uchar prst) /按鍵長(zhǎng)按子程序 /*名稱(chēng): 直流蜂鳴器控制功能: 控制蜂鳴器鳴響時(shí)間硬件連接:pd5輸出控制信號(hào)*/ void dcbeep(uchar beeptime) /直流蜂鳴器,調(diào)試ok; uchar beep; ddrd|=bit(5); portd&=bit(5); portd|=bit(5); delayus(beeptime); portd&=bit(5); d

14、elayus(100-beeptime); /*名稱(chēng):直流電機(jī)全橋控制功能:fbw=1.正轉(zhuǎn);fbw=0,反轉(zhuǎn);硬件連接:pd6與pd7口組合輸出控制信號(hào);*/ void moto(uchar fbw) /直流電機(jī)正反轉(zhuǎn)程序,驅(qū)動(dòng)全橋; ddrd|=bit(6); ddrd|=bit(7); portd&=bit(6); portd&=bit(7); delayms(5); if(fbw=1) portd|=bit(6); delayms(500); portd&=bit(6); delayms(20); else if(fbw=0) portd|=bit(7); de

15、layms(500); portd&=bit(7); delayms(20); /* 名稱(chēng): ad單次轉(zhuǎn)換子程序; 功能: 採(cǎi)樣ad通路0的電壓,該函數(shù)輸出為ad 轉(zhuǎn)換後的數(shù)據(jù), 查詢(xún)工作方式*/void ad_init() admux=0xc0; /設(shè)置ad輸入通道為0通道,內(nèi)部2.56v參考電壓; adcsra=0x80; /使能adc,清中斷標(biāo)誌adif,查詢(xún)方式; ddra&=bit(0); /設(shè)置pa0口為輸入; porta&=bit(0); /pa0口清零; int ad_conv() /單次轉(zhuǎn)換子程序,ok; int addata;adcsra|=bit(

16、adsc); /啟動(dòng)一次轉(zhuǎn)換; while(!(adcsra&(bit(adif); /查詢(xún)等待轉(zhuǎn)換結(jié)束標(biāo)誌置位;adcsra&=bit(adif);addata=adcl; addata=addata+adch*256;return addata; int ad_aver() /轉(zhuǎn)換8次,做平均值濾波 int adaver,count; for(count=7;count>0;count-) adaver=ad_conv();adaver+=adaver;delayms(1); adaver=adaver/8; delayms(1); return adaver; /*

17、名稱(chēng):ad採(cǎi)樣功能:採(cǎi)樣ad0的電壓,內(nèi)部2.56v參考電壓,中斷工作方式*/void ad0_init() admux=0xc0; adchannel=0; adcsra=0x98; ddra&=bit(0); porta&=bit(0); sei(); #pragma interrupt_handler process:15 /interrupt process programvoid process() int adcode=0; adcsra&=bit(adie); adcode=adcl; adcode=(adch<<8)+adcode; /get

18、 adc value /* 中斷處理函數(shù) */ adcsra|=bit(adie); /*名稱(chēng):dac0832 da轉(zhuǎn)換輸入:有效分度0255輸出:無(wú)功能:對(duì)8為數(shù)字信號(hào)進(jìn)行da轉(zhuǎn)換,實(shí)際應(yīng)用需調(diào)試*/#define cs_low portd&=bit(0)#define cs_high portd|=bit(0)#define wr1_low portd&=bit(1)#define wr1_high portd|=bit(1)#define ile_high portd|=bit(2)#define ile_low portd&=bit(2)#define wr2_

19、low portd&=bit(3)#define wr2_high portd|=bit(3)#define xfer_low portd&=bit(5)#define xfer_high portd|=bit(5)void dac(int dadata) gpioinit1(); ddrd=0xff; ddrc=0xff; ile_high; /delayus(1); cs_low; wr1_low; /delayus(1); portc=dadata; /delayus(1); wr1_high; cs_high; / delayus(1); wr2_low; xfer_l

20、ow; / delayus(1); xfer_high; /*名稱(chēng): 數(shù)據(jù)拆分顯示函數(shù)功能: 將四位數(shù)據(jù)分別顯示到對(duì)應(yīng)的數(shù)碼管。*/ void addisplay(int addat) /轉(zhuǎn)換數(shù)據(jù)顯示,運(yùn)算ok; int a;a=addat;show(a/1000,3);delayms(2);show(a/100)%10,2);delayms(2);show(a/10)%10)/10,1);delayms(2); show(a%10,0);delayms(2); /*名稱(chēng):spi通信功能:應(yīng)用mega16自身spi通信模塊與外設(shè)進(jìn)行通信.查詢(xún)方式;*/ void spi_masterinit(

21、) ddrb|=bit(5)|bit(7); /設(shè)置mosi與sck為輸出 ddrb&=(bit(4)&bit(6); /設(shè)置miso與ss為輸入 spcr|=bit(4)|bit(3)|bit(1)|bit(0); /數(shù)據(jù)高位先發(fā)送,主機(jī)模式,空閒時(shí)鐘極性 /為高,sck起始沿採(cǎi)樣數(shù)據(jù),128分頻 spcr|=bit(6); /使能spi delayms(1); void spi_mastertransdata(uchar data) spdr=data; while(!(spsr&bit(7); void spi_slaveinit() void spi_slave

22、recive() /*名稱(chēng):比較匹配模式,中斷方式,調(diào)試ok功能:avr比較匹配模式應(yīng)用,當(dāng)ain大於ain1時(shí),上升沿產(chǎn)生中斷*/ void com_inti() sei(); /開(kāi)總中斷; ddrb&=(bit(2)&(bit(3); /設(shè)置pb2/3口為輸入;sfior&=bit(3); /設(shè)置ain1為模擬比較器反向輸入端;acsr&=bit(7); /使能模擬比較器,注意此處為低電平有效;acsr&=bit(6); /設(shè)置ain0為正極輸入端;acsr|=bit(3); /使能模擬比較器中斷; acsr|=(bit(1)|bit(0); /比較

23、器上升沿觸發(fā)中斷; #pragma interrupt_handler comp:17 /注意函數(shù)名後不加();void comp() /模擬比較器中斷服務(wù)程序; acsr&=bit(3); /* 此處加中斷處理函數(shù) */ acsr|=bit(3); /*名稱(chēng):外部中斷int0 調(diào)試ok功能:低電平觸發(fā)int0端口引起中斷,並響應(yīng)相關(guān)中斷服務(wù)程序*/ void int0_init() ddrd&=bit(2); /pd2/int0端口配置為輸入; mcucr&=(bit(0)&(bit(0); /int0觸發(fā)方式為低電平; gicr|=bit(6); /使能外部

24、中斷0; sei(); /開(kāi)總中斷; #pragma interrupt_handler int0:2void int0() /int0中斷服務(wù)函數(shù); gicr&=bit(6); /關(guān)閉外部int0; /* 此處加int0中斷處理函數(shù) */ gicr|=bit(6); /開(kāi)啟外部int0; /*名稱(chēng):外部中斷int1,功能:邊沿觸發(fā)int0端口引起中斷,並響應(yīng)相關(guān)中斷服務(wù)程序*/ void int1_init() ddrd&=bit(3); /將pd3口配置為輸入; portd&=bit(3); /pd3口初始值為0; mcucr|=(bit(3)|bit(2); /i

25、nt1上升沿觸發(fā)中斷; gicr|=bit(7); /使能int1中斷; sei(); /開(kāi)總中斷; #pragma interrupt_handler int1:3void int1() gicr&=bit(7); /關(guān)閉int1中斷; /* 此處加int1中斷服務(wù)函數(shù); */ gicr|=bit(7); /開(kāi)啟int1中斷; /* /*名稱(chēng):12864(ks0108)顯示應(yīng)用功能:圖形液晶使用*/ #define en_clr portd&=bit(0) /使能12864#define en_set portd|=bit(0) /關(guān)閉12864#define rw_read

26、 portd|=bit(1) /讀操作#define rw_write portd&=bit(1) /寫(xiě)操作#define rs_comm portd&=bit(2) /命令操作#define rs_data portd|=bit(2) /數(shù)據(jù)操作#define reset portd&=bit(3) /12864液晶複位#define reset_over portd|=bit(3) /12864液晶結(jié)束複位;#define cs1_en portd&=bit(4) /使能cs1,選擇左半屏幕;#define cs1_dis portd|=bit(4) /禁止

27、cs1#define cs2_en portd&=bit(5) /使能cs2,選擇右半屏幕;#define cs2_dis portd|=bit(5) /禁止cs2#define basic_com 0x30 /一次送8bit數(shù)據(jù),基本指令集;#define explo_com 0xc4 /擴(kuò)展指令集#define show_stitude 0x0f /顯示狀態(tài),整體顯示,游標(biāo)開(kāi),游標(biāo)位置開(kāi)#define cleanscreen 0x01 /顯示清零,ac歸零#define cursor 0x07 /寫(xiě)入/讀取時(shí),游標(biāo)右移,畫(huà)面左移#define ac_0 0x03 /ac歸0,不改變

28、ddram內(nèi)容const int char_0816= 0xe0,0x18,0x04,0x04,0x04,0x18,0xe0,0x00, 0x07,0x18,0x20,0x20,0x20,0x18,0x07,0x00 ;/*名稱(chēng):mcu端口初始化功能:設(shè)置mcu端口初始方向以及狀態(tài)*/void gpio_init() ddra=0xff; porta=0x00; ddrb=0xff; porta=0x00; ddrc=0xff; porta=0x00; ddrd=0xff; porta=0x00; /*名稱(chēng):輸入數(shù)據(jù)功能:mcu將數(shù)據(jù)送到總線*/ void set_data(uchar dat

29、a) delayus(3); portc=data; delayus(3); /*名稱(chēng):開(kāi)關(guān)顯示控制功能:開(kāi)啟與關(guān)閉顯示操作,1為開(kāi)顯示,0為關(guān)閉顯示*/void lcd_command_displayonoff(uchar onoff) rw_write; rs_comm; en_clr; set_data(0x3e + onoff); /onoff為1開(kāi)顯示,為0關(guān)顯示; en_set; delayus(2); en_clr; /*名稱(chēng): lcd顯示起始行設(shè)定功能:設(shè)置lcd顯示起始行位置,startline範(fàn)圍063*/ void lcd_command_setstartline(uch

30、ar startline) rw_write; rs_comm; en_clr; set_data(0xc0 + startline); /12864行地址為063之間設(shè)定; en_set; delayus(2); en_clr; /*名稱(chēng):設(shè)置顯示行頁(yè)地址功能:設(shè)置顯示行頁(yè)地址,12864為07*/void lcd_command_set_x(uchar x) rw_write; rs_comm; en_clr; set_data(0xb8+x); /設(shè)置12864行頁(yè)地址 x範(fàn)圍07; en_set; delayus(2); en_clr; /*名稱(chēng):設(shè)置顯示列地址功能:設(shè)置顯示列地址y,範(fàn)圍063;*/void lcd_command_set_y(uchar column) rw_write; rs_comm; en_clr; set_data(0x40+column); /設(shè)置顯示列地址y,範(fàn)圍063; en_set; dela

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論