ATMEGA128 相关例程 自己学 avr 单片机已经有相当一段时间了,一开始用的是 atmega128,觉得不是很好用。于是自己去买了一块16L 的芯片,觉得还行。一开始用的是 ICC AVR,应为它用起来比较简单,不像 winavr 那样,要写个 Makefie ,比较的麻烦,但 icc avr 的缺点是太过于简陋,调试程序时,感觉不是很好。后来经同学介绍,用起了winavr,其实也是比较的简单,只不过要加一个 makefile 而已,其实 makefile 可以用软件自带的组建自动生成,只需修改几个参数就可以用。后来又用起了 code vision avr,虽然不太习惯,也谈不上不好用. 需要注意的是,三个不同的软件所带的同文件不一样。icc avr 是 iom128v.h(姑且以 128 为例),winavr 是avr/io.h,不过 makefile 中要设置芯片为 atmega128.而 cvavr 则是 mega128.h。 记得一开始的时候,我对这些不同的同文件不是很理解,是从一个学长那里了解到,才弄明白的。其实前两个软件只需把头文件稍微改一下基本上可以通用。而最后一个软件的中断的写法似乎不太一样,因而和钱两个软件的兼容性是最差的。 总体说winavr 给人的感觉是比较专业 1、流水灯 /* 硬件环境:atmega128 开发板 软件环境:CodeVisionAVR-C */ #include #define uchar unsigned char #define uint unsigned int uchar cnt; void timer1_init() { TCCR1B=0X00; //先停止定时器 1 TCNT1H=0XF0; // 设定定时器初值 TCNT1L=0XBE; TCCR1A=0X00; //启动定时器 1 TCCR1B=0X05; // 使用 1024 分频 } interrupt [TIM1_OVF] void timer1_ovf_isr(void) { TCNT1H=0XF0; //重载定时器初值 TCNT1L=0XBE; DDRE|=1<<2; PORTE|=1<<2; DDRA=0xff; PORTA=cnt; //输出 led 的值到端口 B cnt++; if(cnt==255) cnt=0; } void main() { //DDRB=0XFF; SREG|=0X80; TIMSK=0X04; timer1_init(); while(1) {; } } 2、AD 转换+数码管显示 /***************************************************************************/ /*ADC 测试程序 */ /*目标器件:ATmega128 */ /*晶振:RC 8MHZ */ /*编译环境:ICCAVR 7.13A */ /*E-Mail:number007cool@163.com */ /*时间:2010 年 11 月 13 日 */ //Aref 接 AVCC(+5V),采用 Aref 作参考电压 /*用数码管显示 AD 转换的结果*/ /*******************************...