版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、ATMEGA128相關(guān)例程自己學(xué)avr單片機已經(jīng)有相當(dāng)一段時間了,一開始用的是atmega128,覺得不是很好用。于是自己去買了一塊16L的芯片,覺得還行。一開始用的是ICC AVR,應(yīng)為它用起來比較簡單,不像winavr那樣,要寫個Makefie,比較的麻煩,但icc avr的缺點是太過于簡陋,調(diào)試程序時,感覺不是很好。后來經(jīng)同學(xué)介紹,用起了winavr,其實也是比較的簡單,只不過要加一個makefile而已,其實makefile可以用軟件自帶的組建自動生成,只需修改幾個參數(shù)就可以用。后來又用起了code vision avr,雖然不太習(xí)慣,也談不上不好用.需要注意的是,三個不同的軟件所帶的
2、同文件不一樣。icc avr 是iom128v.h(姑且以128為例),winavr是avr/io.h,不過makefile中要設(shè)置芯片為atmega128.而cvavr則是mega128.h。記得一開始的時候,我對這些不同的同文件不是很理解,是從一個學(xué)長那里了解到,才弄明白的。其實前兩個軟件只需把頭文件稍微改一下基本上可以通用。而最后一個軟件的中斷的寫法似乎不太一樣,因而和錢兩個軟件的兼容性是最差的??傮w說winavr給人的感覺是比較專業(yè)自己學(xué)習(xí)時多總結(jié)吧!1、流水燈/*硬件環(huán)境:atmega128開發(fā)板軟件環(huán)境:CodeVisionAVR-C*/#include <mega128.h
3、>#define uchar unsigned char#define uint unsigned intuchar cnt;void timer1_init() TCCR1B=0X00; /先停止定時器1 TCNT1H=0XF0; /設(shè)定定時器初值 TCNT1L=0XBE; TCCR1A=0X00; /啟動定時器
4、1 TCCR1B=0X05; /使用1024分頻interrupt TIM1_OVF void timer1_ovf_isr(void) TCNT1H=0XF0; /重載定時器初值 TCNT1L=0XBE; DDRE|=1<<
5、2; PORTE|=1<<2; DDRA=0xff; PORTA=cnt; /輸出led的值到端口B cnt+; if(cnt=255) cnt
6、=0;void main() /DDRB=0XFF; SREG|=0X80; TIMSK=0X04; timer1_init(); while(1) ; 2、AD轉(zhuǎn)換+數(shù)碼管顯示/*/*ADC測試程序
7、160; */*目標(biāo)器件:ATmega128
8、160; */*晶振:RC 8MHZ
9、 */*編譯環(huán)境:ICCAVR 7.13A */*E-Mail:number007cool
10、60; */*時間:2010年11月13日
11、60; */Aref接AVCC(+5V),采用Aref作參考電壓/*用數(shù)碼管顯示AD
12、轉(zhuǎn)換的結(jié)果*/*/*包含頭文件*/#include <iom128v.h>#include <macros.h>/*數(shù)碼管段碼表*/extern const unsigned char tab=0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, &
13、#160; 0x7F,0x6F;/*全局變量*/unsigned int adc_rel=0;/*函數(shù)功能:ADC初始化函數(shù)入口參數(shù):出口參數(shù):*/void adc_init(void)DDRF&=0XFE; /PORTF0設(shè)置為輸入,即作為ADC0口輸入模擬電壓PORTF&=0XFE; /PORTF0設(shè)置為輸入低電平ADCSRA=0x00; /關(guān)ADCADMUX = 0X00;
14、; /采用Aref作為參考電壓,ADC0單端輸入,右對齊ACSR=(1<<ACD);ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);/ADEN,啟動ADC;ADSC,ADC開始轉(zhuǎn)換;ADIE,ADC中斷使能;ADPSx,設(shè)置分頻因子64/*函數(shù)功能:ADC中斷函數(shù)入口參數(shù):出口參數(shù):*/#pragma interrupt_handler adc_isr:iv_ADCvoid adc
15、_isr(void) /int data_h,data_l; /data_l=ADCL; /data_h=ADCH; ADCSRA = 0x00; ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE); adc_rel=ADC; /* if(adc_rel>0x1ff) PORTA|=1<<2; else &
16、#160; PORTA&=(1<<2); */ /*函數(shù)功能:延時子程序入口參數(shù):出口參數(shù):*/void delay(void) int i; for(i=0;i<1800;i+);/*函數(shù)功能:顯示子程序入口參數(shù):k出口參數(shù):*/void display(unsigned int k)/發(fā)光二極管顯示初始化 DDRE|=1<<2; PORTE|=1<<2; DDRA=0X
17、FF; PORTA=k;#define SS 0#define SCK 1#define MOSI 2#define MISO 3#define SS_H() PORTB|=(1<<SS)#define SS_L() PORTB&=(1<<SS)#define led0_en() DDRB|=1<<4;PORTB|=(1<<4); /開第一個數(shù)碼管的位選#define led0_dis() DDRB|=1<<4;PORTB&=(1<&l
18、t;4); /關(guān)第一個數(shù)碼管的位選#define led1_en() DDRB|=1<<5;PORTB|=(1<<5);#define led1_dis() DDRB|=1<<5;PORTB&=(1<<5);#define led2_en() DDRB|=1<<6;PORTB|=(1<<6);#define led2_dis() DDRB|=1<<6;PORTB&=(1<<6);#define led3_en
19、() DDRB|=1<<7;PORTB|=(1<<7);#define led3_dis() DDRB|=1<<7;PORTB&=(1<<7);#define OE 7#define point 3#define dp 7#include <iom128v.h>#include <macros.h>const unsigned char table=0x3F,0x06,0x5B,0x4F,0x66, &
20、#160; /0,1,2,3,4 0x6D,0x7D,0x07,0x7F,0x6F,
21、 /5,6,7,8,9 0x77,0x7C,0x39,0x5E,0x79,0x71,0x00; /a,b,c,d,e,fvolatile unsigned char led_buffer4;v
22、oid delay_1us(void) /1us延時函數(shù) asm("nop"); void delay_nus(unsigned int n) /N us延時函數(shù) unsigned int i=0; fo
23、r (i=0;i<n;i+) delay_1us(); void delay_1ms(void) /1ms延時函數(shù) unsigned int i; for (i=0;i<1140;i+); void delay_nms(unsigned int n)
24、0; /N ms延時函數(shù) unsigned int i=0; for (i=0;i<n;i+) delay_1ms(); /*完成spi的初始化*/void spi_init(void) DDRB |= (1<<MOSI)|(1<<SCK)|(1<<SS);/設(shè)置MOSI,SCK輸出 SPCR = (1<<SPE)|(1<<M
25、STR)|(1<<SPR0)|(1<<SPR1);/使能SPI,主機模式/*spi主機傳送數(shù)據(jù)*/void SPI_MasterTransmit(char Data) /* 啟動數(shù)據(jù)傳輸 */ SPDR = Data; /* 等待傳輸結(jié)束 */ while(!(SPSR & (1<<SPIF) ;/*完成對HC595的初始化*/void HC_595_init(void) DDRC |= (1<<OE);
26、60; /設(shè)置PORTC7為輸出 PORTC &= (1<<OE); /輸出高電平,使能595 PORTB = 0x0F; /同時打開四個數(shù)碼管的位選 spi_init(); led_buffer0=16; /初始化數(shù)碼管段碼 led_buffer1=16; led_buffer2=16; led_buffer3=16;/*HC595完成傳送數(shù)據(jù)*/void HC_595_OUT(unsigned char d
27、ata) SS_L(); SPI_MasterTransmit(data); SS_H();void leddis_update(void) /*最低位數(shù)碼管,第四個數(shù)碼管*/ if(point=0) HC_595_OUT(tableled_buffer3|(1<<dp); else HC_595_OUT(tableled_buffer3); led0_en(); delay_nus(60); led0_dis();
28、0; if(point=1) HC_595_OUT(tableled_buffer2|(1<<dp); else HC_595_OUT(tableled_buffer2); led1_en(); delay_nus(60); led1_dis(); if(point=2) HC_595_OUT(tableled_buffer1|(1<<dp); else HC_595_OUT(tableled_buffe
29、r1); led2_en(); delay_nus(60); led2_dis(); /*最高位數(shù)碼管,第一個數(shù)碼管*/ if(point=3) HC_595_OUT(tableled_buffer0|(1<<dp); else HC_595_OUT(tableled_buffer0); led3_en(); delay_nus(60); led3_dis();void display_led(unsigned int data)
30、 if(data>9999) HC_595_OUT(0xFF);/當(dāng)計數(shù)大于9999時,四個數(shù)碼管同時輸出8 PORTB|=(1<<4)|(1<<5)|(1<<6)|(1<<7); else if(data>999) led_buffer0=data/1000; led_buffer1=(data%1000)/100;
31、; led_buffer2=(data%100)/10; led_buffer3=data%10; leddis_update(); else if(data>99) led_buffer0=data/1000; /關(guān)閉最高位的那個數(shù)碼管 led_buffer1=(data%1000)/100; led_buffer2=(data%100)/10; led_buffer3=da
32、ta%10; leddis_update(); else if(data>9) led_buffer0=data/1000; led_buffer1=16; led_buffer2=(data%100)/10; led_buffer3=data%10; leddis_update();
33、60;else led_buffer0=data/1000; led_buffer1=16; led_buffer2=16; led_buffer3=data%10; leddis_update(); volatile unsigned int countnum=0; void timer1_init(void)
34、;TCCR1B = 0x00; /stop TCNT1H = 0x8F; /setup TCNT1L = 0x81; OCR1AH = 0x70; OCR1AL = 0x7F; OCR1BH = 0x70; OCR1BL = 0x7F; OCR1CH = 0x70; OCR1CL = 0x7F; ICR1H = 0x70; ICR1L = 0x7F; TCCR1A = 0x00; TCCR1B = 0x04; /start Timer#pragma i
35、nterrupt_handler timer1_ovf_isr:15void timer1_ovf_isr(void) TCNT1H = 0x8F; /reload counter high value TCNT1L = 0x81; /reload counter low value countnum+; if(countnum>9999) countnum=0;void init_devices(void) CLI(); /disable all interrupts timer1_init(); TIMSK = 0
36、x04; /timer interrupt sources SEI(); /re-enable interrupts/*函數(shù)功能:主程序入口參數(shù):出口參數(shù):*/void main(void) init_devices(); HC_595_init(); adc_init(); SEI();/開全局中斷變量 display(0); while(1) delay(); display_led(adc_rel/1024.0*5*10
37、00); 3、對EEPROM進行讀寫操作 /*文件:main.c用途:注意:內(nèi)部8M晶振*/#include "config.h"/*向EEPROM里面寫入數(shù)據(jù)輸入量:地址,數(shù)據(jù)*/void EEPROM_write(unsigned int uiAddress,unsigned char ucData) while(EECR&(1<<EEWE); /等待上一次寫操作結(jié)束 EEAR = uiAddress; /地址 EE
38、DR = ucData; /數(shù)據(jù) EECR |=(1<<EEMWE); /置位EEMWE,主機寫使能 EECR |=(1<<EEWE); /置位EEWE,寫使能,啟動寫操作/*從EEPROM指定的地址里面讀出相應(yīng)的數(shù)據(jù)*/unsigned char EEPROM_read(unsigned int uiAddress) while(EECR&(1<<EEWE);
39、60; /等待上一次寫操作結(jié)束 EEAR = uiAddress; /設(shè)置地址寄存器 EECR |=(1<<EERE); /讀使能 return EEDR; /返回讀入EEDR里面的數(shù)據(jù)void main(void) unsigned char temp=123;
40、0;unsigned char data; HC_595_init(); EEPROM_write(0x01,temp); data=EEPROM_read(0x01); while(1) Seg7_Led_display(data); /調(diào)用顯示函數(shù)將寫入的數(shù)據(jù)又讀出來 文件:eeprom12.rar大小:40KB下載:下載4、定時器0(輪循方式)/*定時器0和2(均為八位的定時計數(shù)器)有四種工作模式,此例是工作在普通模式。在此模式下,計數(shù)器不斷的累加,當(dāng)計數(shù)到最大值0x
41、ff后返回到0x00重新開始,在TCNT0為0 的同時,T/C溢出標(biāo)志TOV0置位*/使用輪循方式,當(dāng)TIFR溢出時,uc_led加1,輸出到led時期發(fā)光/TIFR中斷標(biāo)志寄存器#include <iom128v.h>#define uchar unsigned charuchar uc_led,k;void main()/設(shè)置數(shù)碼管輸出高電平 DDRE|=1<<2; PORTE|=1<<2; DDRA=0XFF; PORTF=0XFF; TCN
42、T0=0X00;/設(shè)定定時計數(shù)器的初值為0 TCCR0=0X05;/使用1024分頻(共有7種時鐘) uc_led=0; k=0; while(1) while(!(TIFR&0X01);/循環(huán)檢測TIFR中的溢出標(biāo)志是否有效 /PORTA=uc_led; uc_led+; if(uc_led=255) uc_led=0; k+; if(k=255) k=0; PORTA=k;
43、60; TIFR|=0X01; /寫1到TIFR的TOV0位清除溢出標(biāo)志為TOV0 5、定時器0中中斷/*/*定時器T0測試程序 */*
44、目標(biāo)器件:ATmega128 */*晶振:RC 8MHZ
45、160; */*編譯環(huán)境:ICCAVR 7.13
46、 */*E-Mail:number007cool
47、 */*時間:2010年3月14日 &
48、#160; */*TCCRn定時計數(shù)器控制寄存器 TCNTn計數(shù)器,不斷的計數(shù) TIMSK定時計數(shù)器中斷屏蔽寄存器 TIFR中斷標(biāo)志寄存器*/*/*包含頭文件*/#include <iom128v.h>#include <macros.h>/*全局變量*/int k;/*函數(shù)功能:端口初
49、始化程序入口參數(shù):出口參數(shù):*/void port_init (void) DDRE|=1<<2; PORTE|=1<<2; DDRA=0XFF; PORTA=0XFF;/*函數(shù)功能:定時器初始化程序入口參數(shù):出口參數(shù):*/void timer0_init(void) TCCR0 = 0x00; /stop ASSR = 0x00; /set async mode TCNT0 = 0x3c; OCR
50、0 = 0x00; TCCR0 = 0x05; /1024分頻/*函數(shù)功能:定時中斷服務(wù)程序入口參數(shù):出口參數(shù):*/#pragma interrupt_handler timer0_ovf_isr:17void timer0_ovf_isr(void) TCNT0 = 0x3c; k=k+1; if(k>150) k=0; PORTA = 0x01; /*函數(shù)功能:主程序入口參數(shù):出口
51、參數(shù):*/void main (void) CLI(); /disable all interrupts port_init(); timer0_init(); MCUCR = 0x00; TIMSK = 0x01; /T0溢出使能 SEI(); /enable interrupts
52、6、定時器1測試程序/*/*定時器T1測試程序 */*/*包含頭文件*/#include <iom128v.h>#include <mac
53、ros.h>/*全局變量*/int k;/*函數(shù)功能:端口初始化程序入口參數(shù):出口參數(shù):*/void port_init (void) DDRE|=1<<2; PORTE|=1<<2; DDRA=0XFF; PORTA=0XFF;/*函數(shù)功能:定時器初始化程序入口參數(shù):出口參數(shù):*/void timer1_init(void) TCCR1B = 0x00; /stop,關(guān)掉 TCNT1H = 0xFF; /setup 0.2s
54、設(shè)置高4位初值 TCNT1L = 0x3D; /設(shè)置低四位初值 OCR1AH = 0x00; OCR1AL = 0xC3; OCR1BH = 0x00; OCR1BL = 0xC3; OCR1CH = 0x00; OCR1CL = 0xC3; ICR1H = 0x00; ICR1L = 0xC3; TCCR1A = 0x00; TCCR1B = 0x05; /start Timer 102
55、4/*函數(shù)功能:定時中斷服務(wù)程序入口參數(shù):出口參數(shù):*/#pragma interrupt_handler timer1_ovf_isr:15void timer1_ovf_isr(void) TCNT1H = 0xFF; /reload counter high value TCNT1L = 0x3D; /reload counter low value k=k+1; if(k>40) k=0; PORTA = 0x0
56、1; /*函數(shù)功能:主程序入口參數(shù):出口參數(shù):*/void main (void) CLI(); /disable all interrupts port_init(); timer1_init(); MCUCR = 0x00; TIMSK = 0x04; /T0溢出使能 SEI(); /enab
57、le interrupts 7、定時器1測試程序之二/*/*定時器T1測試程序 */*定時時間為1秒
58、60; */*/*包含頭文件*/#include <iom128v.h>#include <macros.h>/*全局變量*/int countnum;/*函數(shù)功能:端口初始化程序入口參數(shù):出口參數(shù):*/void port_init (void) DDRE|=1<<2; PORTE|=1<<2;
59、160; DDRA=0XFF; PORTA=0XFF;/*函數(shù)功能:定時器初始化程序入口參數(shù):出口參數(shù):*/void timer1_init(void) TCCR1B = 0x00; /stop TCNT1H = 0x8F; /setup TCNT1L = 0x81; OCR1AH = 0x70; OCR1AL = 0x7F; OCR1BH = 0x70; OCR1BL = 0x7F; OCR1CH = 0x70; OCR1CL = 0x7F; ICR1H
60、160; = 0x70; ICR1L = 0x7F; TCCR1A = 0x00; TCCR1B = 0x04; /start Timer/*函數(shù)功能:定時中斷服務(wù)程序入口參數(shù):出口參數(shù):*/#pragma interrupt_handler timer1_ovf_isr:15void timer1_ovf_isr(void) TCNT1H = 0x8F; /reload counter high value TCNT1L = 0x81; /reload counter low value countnum+;
61、if(countnum=256) countnum=0;/*函數(shù)功能:主程序入口參數(shù):出口參數(shù):*/void main (void) CLI(); /disable all interrupts port_init(); timer1_init(); TIMSK = 0x04; /T0溢出使能 SEI(); /enable interrupts
62、 while(1) PORTA=countnum; 8、串口通信(USART0) /*/*串口0測試程序
63、 */*目標(biāo)器件:ATmega128 */*晶振:RC 8MHZ
64、0; */*編譯環(huán)境:ICCAVR 7.13A &
65、#160; */*時間:2010年3月14日*/*E-Mail:number007cool
66、60; */*/*包含頭文件*/#include<iom128v.h>#include<macros.h>/*宏定義*/#define fosc 8000000 /晶振8MHZ#define baud 2400 /波特率/*函數(shù)功能:uart0初始化程序入口參數(shù):出
67、口參數(shù):*/void uart0_init(void) UCSR0B = 0x00; /關(guān)閉UART00 UCSR0A = 0x00;
68、 /不使用倍速發(fā)送(異步) UCSR0C =(1<<UCSZ01)|(1<<UCSZ00); /數(shù)據(jù)位為8位 UBRR0L=(fosc/16/(baud+1)%256; /異步正常情況下的計算公式 UBRR0H=(fosc/16/(baud+1)/256; UCSR0B =(1<<RXEN0)|(1<<TXEN0);
69、/接收使能和發(fā)送使能/*函數(shù)功能:uart0發(fā)送單字節(jié)數(shù)據(jù)入口參數(shù):c出口參數(shù):*/void putchar0(unsigned char c) while (!(UCSR0A&(1<<UDRE0);/表明發(fā)送器已經(jīng)準(zhǔn)備就緒 UDR0=c; /將要發(fā)送的數(shù)據(jù)裝入UDR0寄存器 /*函數(shù)功能:uart0接收單字節(jié)數(shù)據(jù)入口參數(shù):出口參數(shù):*/unsigned char getc
70、har0(void) while(!(UCSR0A& (1<<RXC0);/表明已經(jīng)接收完畢 return UDR0; /*函數(shù)功能:uart0發(fā)送字符串?dāng)?shù)據(jù)入口參數(shù):*s出口參數(shù):*/ void puts0(char *s) while (*s) putchar0(*s); s+; putchar0(0x0a);/回車換行 /putchar0(0x0d); /*函數(shù)功能:主程序入口參數(shù):出口參數(shù):*/v
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- HO-PEG3-CH2-6-Cl-生命科學(xué)試劑-MCE-6427
- CP-LC-0743-生命科學(xué)試劑-MCE-6886
- 5-Hydroxy-9-S-hexahydrocannabinol-生命科學(xué)試劑-MCE-2639
- 二零二五年度互聯(lián)網(wǎng)醫(yī)療企業(yè)股權(quán)并購協(xié)議
- 二零二五年度白酒新品全國市場推廣與銷售代理協(xié)議
- 2025年度二零二五年度終止股權(quán)轉(zhuǎn)讓終止協(xié)議
- 二零二五年度終止體育賽事組織勞務(wù)終止合同
- 二零二五年度蔬菜大棚租賃與農(nóng)業(yè)循環(huán)經(jīng)濟合作協(xié)議
- 施工現(xiàn)場施工防生物戰(zhàn)爭威脅制度
- 施工圍蔽項目特征描述
- 沈陽市第一屆“舒心傳技 莘紳向陽”職業(yè)技能大賽技術(shù)工作文件-27-全媒體運營師
- 安全生產(chǎn)網(wǎng)格員培訓(xùn)
- 統(tǒng)編版語文三年級下冊第三單元綜合性學(xué)習(xí)中華傳統(tǒng)節(jié)日 活動設(shè)計
- 降低順產(chǎn)產(chǎn)婦產(chǎn)后2小時失血率PDCA成果匯報書
- 小學(xué)數(shù)學(xué)分?jǐn)?shù)四則混合運算300題帶答案
- 林下野雞養(yǎng)殖建設(shè)項目可行性研究報告
- 心肺復(fù)蘇術(shù)課件2024新版
- 苜蓿青貯料質(zhì)量分級DB41-T 1906-2019
- 新鮮牛肉購銷合同模板
- 2024年內(nèi)蒙古呼和浩特市中考文科綜合試題卷(含答案)
- 大型商場招商招租方案(2篇)
評論
0/150
提交評論