ATMEGA128相关例程自己学avr单片机已经有相当一段时间了,一开始用的是atmega128,觉得不是很好用。于是自己去买了一块16L的芯片,觉得还行。一开始用的是ICCAVR,应为它用起来比较简单,不像winavr那样,要写个Makefie,比较的麻烦,但iccavr的缺点是太过于简陋,调试程序时,感觉不是很好。后来经同学介绍,用起了winavr,其实也是比较的简单,只不过要加一个makefile而已,其实makefile可以用软件自带的组建自动生成,只需修改几个参数就可以用。后来又用起了codevisionavr,虽然不太习惯,也谈不上不好用.需要注意的是,三个不同的软件所带的同文件不一样。iccavr是iom128v.h(姑且以128为例),winavr是avr/io.h,不过makefile中要设置芯片为atmega128.而cvavr则是mega128.h。记得一开始的时候,我对这些不同的同文件不是很理解,是从一个学长那里了解到,才弄明白的。其实前两个软件只需把头文件稍微改一下基本上可以通用。而最后一个软件的中断的写法似乎不太一样,因而和钱两个软件的兼容性是最差的。总体说winavr给人的感觉是比较专业自己学习时多总结吧!1、流水灯/*硬件环境:atmega128开发板软件环境:CodeVisionAVR-C*/#includemega128.h#defineucharunsignedchar#defineuintunsignedintucharcnt;voidtimer1_init(){TCCR1B=0X00;//先停止定时器1TCNT1H=0XF0;//设定定时器初值TCNT1L=0XBE;TCCR1A=0X00;//启动定时器1TCCR1B=0X05;//使用1024分频}interrupt[TIM1_OVF]voidtimer1_ovf_isr(void){TCNT1H=0XF0;//重载定时器初值TCNT1L=0XBE;DDRE|=12;PORTE|=12;DDRA=0xff;PORTA=cnt;//输出led的值到端口Bcnt++;if(cnt==255)cnt=0;}voidmain(){//DDRB=0XFF;SREG|=0X80;TIMSK=0X04;timer1_init();while(1){;}}2、AD转换+数码管显示/***************************************************************************//*ADC测试程序*//*目标器件:ATmega128*//*晶振:RC8MHZ*//*编译环境:ICCAVR7.13A*//*E-Mail:number007cool@163.com*//*时间:2010年11月13日*///Aref接AVCC(+5V),采用Aref作参考电压/*用数码管显示AD转换的结果*//***************************************************************************//*********************************包含头文件********************************/#includeiom128v.h#includemacros.h/********************************数码管段码表*******************************/externconstunsignedchartab[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/*********************************全局变量**********************************/unsignedintadc_rel=0;/****************************************************************************函数功能:ADC初始化函数入口参数:出口参数:****************************************************************************/voidadc_init(void){DDRF&=0XFE;//PORTF0设置为输入,即作为ADC0口输入模拟电压PORTF&=0XFE;//PORTF0设置为输入低电平ADCSRA=0x00;//关ADCADMUX=0X00;//采用Aref作为参考电压,ADC0单端输入,右对齐ACSR=(1ACD);ADCSRA=(1ADEN)|(1ADSC)|(1ADATE)|(1ADIE)|(1ADPS2)|(1ADPS1);//ADEN,启动ADC;ADSC,ADC开始转换;ADIE,ADC中断使能;ADPSx,设置分频因子64}/****************************************************************************函数功能:ADC中断函数入口参数:出口参数:****************************************************************************/#pragmainterrupt_handleradc_isr:iv_ADCvoidadc_isr(void){//intdata_h,data_l;//data_l=ADCL;//data_h=ADCH;ADCSRA=0x00;ADCSRA=(1ADEN)|(1ADSC)|(1ADIE);adc_rel=ADC;/*if(adc_rel0x1ff){PORTA|=12;}elsePORTA&=~(12);*/}/****************************************************************************函数功能:延时子程序入口参数:出口参数:****************************************************************************/voiddelay(void){inti;for(i=0;i1800;i++);}/****************************************************************************函数功能:显示子程序入口参数:k出口参数:****************************************************************************/voiddisplay(unsignedintk)//发光二极管显示初始化{DDRE|=12;PORTE|=12;DDRA=0XFF;PORTA=k;}#defineSS0#defineSCK1#defineMOSI2#defineMISO3#defineSS_H()PORTB|=(1SS)#defineSS_L()PORTB&=~(1SS)#defineled0_en(){DDRB|=14;PORTB|=(14);}//开第一个数码管的位选#defineled0_dis(){DDRB|=14;PORTB&=~(14);}//关第一个数码管的位选#defineled1_en(){DDRB|=15;PORTB|=(15);}#defineled1_dis(){DDRB|=15;PORTB&=~(15);}#defineled2_en(){DDRB|=16;PORTB|=(16);}#defineled2_dis(){DDRB|=16;PORTB&=~(16);}#defineled3_en(){DDRB|=17;PORTB|=(17);}#defineled3_dis(){DDRB|=17;PORTB&=~(17);}#defineOE7#definepoint3#definedp7#includeiom128v.h#includemacros.hconstunsignedchartable[]={0x3F,0x06,0x5B,0x4F,0x66,//0,1,2,3,40x6D,0x7D,0x07,0x7F,0x6F,//5,6,7,8,90x77,0x7C,0x39,0x5E,0x79,0x71,0x00};//a,b,c,d,e,fvolatileunsignedcharled_buffer[4];voiddelay_1us(void)//1us延时函数{asm(nop);}voiddelay_nus(unsignedintn)//Nus延时函数{unsignedinti=0;for(i=0;in;i++)delay_1us();}voiddelay_1ms(void)//1ms延时函数{unsignedinti;for(i=0;i1140;i++);}voiddelay_nms(unsignedintn)//Nms延时函数{unsignedinti=0;for(i=0;in;i++)delay_1ms();}/*完成spi的初始化*/voidspi_init(void){DDRB|=(1MOSI)|(1SCK)|(1SS);//设置MOSI,SCK输出SPCR=(1SPE)|(1MSTR)|(1SPR0)|(1SPR1);//使能SPI,主机模式}/*spi主机传送数据*/voidSPI_MasterTransmit(charData){/*启动数据传输*/SPDR=Data;/*等待传输结束*/while(!(SPSR&(1SPIF)));}/*完成对HC595的初始化*/voidHC_595_init(void){DDRC|=(1OE);//设置PORTC7为输出PORTC&=(1OE);//输出高电平,使能595PORTB=0x0F;//同时打开四个数码管的位选spi_init();led_buffer[0]=16;//初始化数码管段码led_buffer[1]=16;led_buffer[2]=16;led_buffer[3]=16;}/*HC595完成传送数据*/voidHC_595_OUT(unsignedchardata){SS_L();SPI_MasterTransmit(data);SS_H();}voidleddis_update(void){/*最低位数码管,第四个数码管*/if(point==0)HC_595_OUT(table[led_buffer[3]]|(1dp));elseHC_595_OUT(table[led_buffer[3]]);led0_en();delay_nus(60);led0_dis();if(point==1)HC_595_OUT(table[led_buffer[2]]|(1dp));elseHC_595_OUT(table[led_buffer[2]]);led1_en();delay_nus(60);led1_dis();if(point==2)HC_595_OUT(table[led_buffer[1]]|(1dp));elseHC_595_OUT(table[led_buffer[1]]);led2_en();delay_nus(60);led2_dis();/*最高位数码管,第一个数码管*/if(point==3)HC_595_OUT(table[led_buffer[0]]|(1dp)