ATmega128幾個常用程序例子_第1頁
ATmega128幾個常用程序例子_第2頁
ATmega128幾個常用程序例子_第3頁
ATmega128幾個常用程序例子_第4頁
ATmega128幾個常用程序例子_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論