首页 基于iccavr的AVR128例程代码(全)

基于iccavr的AVR128例程代码(全)

举报
开通vip

基于iccavr的AVR128例程代码(全)基于iccavr的AVR128例程代码(全) iccavr atmega128 ________________________________________ 1、流水灯 #include #define uchar unsigned char #define uint unsigned int uchar cnt; void timer1_init() { TCCR1B=0X00; //先停止定时器1 TCNT1H=0XF0; //设定定时器初值 TCNT1L=0XBE; T...

基于iccavr的AVR128例程代码(全)
基于iccavr的AVR128例程代码(全) iccavr atmega128 ________________________________________ 1、流水灯 #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 */ //Aref接AVCC(+5V),采用Aref作参考电压 /*用数码管显示AD转换的结果*/ /***************************************************************************/ /*********************************包含头文件 ********************************/ #include #include /********************************数码管段码 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf *******************************/ extern const unsigned char tab[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F}; /*********************************全局变 量**********************************/ unsigned int adc_rel=0; /**************************************************************************** 函数功能:ADC初始化函数 入口参数: 出口参数: ****************************************************************************/ void adc_init(void) { DDRF&=0XFE; //PORTF0设置为输入,即作为ADC0口输入模拟电压 PORTF&=0XFE; //PORTF0设置为输入低电平 ADCSRA=0x00; //关ADC ADMUX = 0X00; //采用Aref作为参考电压,ADC0单端输入,右对齐 ACSR=(1<0x1ff) { PORTA|=1<<2; } else PORTA&=~(1<<2); */ } /*********************************************************************** ***** 函数功能:延时子程序 入口参数: 出口参数: ************************************************************************ ****/ void delay(void) { int i; for(i=0;i<1800;i++); } /*********************************************************************** ***** 函数功能:显示子程序 入口参数:k 出口参数: ************************************************************************ ****/ void display(unsigned int k)//发光二极管显示初始化 { DDRE|=1<<2; PORTE|=1<<2; DDRA=0XFF; PORTA=k; } #define SS 0 #define SCK 1 #define MOSI 2 #define MISO 3 #define SS_H() PORTB|=(1< #include const unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66, //0,1,2,3,4 0x6D,0x7D,0x07,0x7F,0x6F, //5,6,7,8,9 0x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; //a,b,c,d,e,f volatile unsigned char led_buffer[4]; void delay_1us(void) //1us延时函数 { asm("nop"); } void delay_nus(unsigned int n) //N us延时函数 { unsigned int i=0; for (i=0;i9999) { HC_595_OUT(0xFF);//当计数大于9999时,四个数码管同时输出8 PORTB|=((1<<4)|(1<<5)|(1<<6)|(1<<7)); } else if(data>999) { led_buffer[0]=data/1000; led_buffer[1]=(data%1000)/100; led_buffer[2]=(data%100)/10; led_buffer[3]=data%10; leddis_update(); } else if(data>99) { led_buffer[0]=data/1000; //关闭最高位的那个数码管 led_buffer[1]=(data%1000)/100; led_buffer[2]=(data%100)/10; led_buffer[3]=data%10; leddis_update(); } else if(data>9) { led_buffer[0]=data/1000; led_buffer[1]=16; led_buffer[2]=(data%100)/10; led_buffer[3]=data%10; leddis_update(); } else { led_buffer[0]=data/1000; led_buffer[1]=16; led_buffer[2]=16; led_buffer[3]=data%10; leddis_update(); } } volatile unsigned int countnum=0; 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 = 0x70; ICR1L = 0x7F; TCCR1A = 0x00; TCCR1B = 0x04; //start Timer } #pragma interrupt_handler timer1_ovf_isr:15 void 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 = 0x04; //timer interrupt sources SEI(); //re-enable interrupts } /*********************************************************************** ***** 函数功能:主程序 入口参数: 出口参数: ************************************************************************ ****/ void main(void) { init_devices(); HC_595_init(); adc_init(); SEI();//开全局中断变量 display(0); while(1) { delay(); display_led(adc_rel/1024.0*5*1000); } } ________________________________________ 3、对EEPROM进行读写操作 /************************************************ 文件:main.c 用途: 注意:内部8M晶振 ************************************************/ #include "config.h" /*向EEPROM里面写入数据 输入量:地址,数据*/ void EEPROM_write(unsigned int uiAddress,unsigned char ucData) { while(EECR&(1< #define uchar unsigned char uchar uc_led,k; void main() { //设置数码管输出高电平 DDRE|=1<<2; PORTE|=1<<2; DDRA=0XFF; PORTF=0XFF; TCNT0=0X00;//设定定时计数器的初值为0 TCCR0=0X05;//使用1024分频(共有7种时钟) uc_led=0; k=0; while(1) { while(!(TIFR&0X01));//循环检测TIFR中的溢出标志是否有效 //PORTA=uc_led; uc_led++; if(uc_led==255) {uc_led=0; k++; if(k==255) k=0; PORTA=k; } TIFR|=0X01; //写1到TIFR的TOV0位清除溢出标志为TOV0 } } ________________________________________ 5、定时器0中中断 /*********************************************************************** ****/ /*定时器T0测试程序 */ /*目标器件:ATmega128 */ /*晶振:RC 8MHZ */ /*编译环境:ICCAVR 7.13 */ /*E-Mail:number007cool@163.com */ /*时间:2010年3月14日 */ /*TCCRn定时计数器控制寄存器 TCNTn计数器,不断的计数 TIMSK定时计数器中断屏蔽寄存器 TIFR中断标志寄存器 */ /*********************************************************************** ****/ /*********************************包含头文件********************************/ #include #include /**********************************全局变量*********************************/ int k; /*********************************************************************** ***** 函数功能:端口初始化程序 入口参数: 出口参数: ************************************************************************ ****/ void port_init (void) { DDRE|=1<<2; PORTE|=1<<2; DDRA=0XFF; PORTA=0XFF; } /*********************************************************************** ***** 函数功能:定时器初始化程序 入口参数: 出口参数: ************************************************************************ ****/ void timer0_init(void) { TCCR0 = 0x00; //stop ASSR = 0x00; //set async mode TCNT0 = 0x3c; OCR0 = 0x00; TCCR0 = 0x05; //1024分频 } /*********************************************************************** ***** 函数功能:定时中断服务程序 入口参数: 出口参数: ************************************************************************ ****/ #pragma interrupt_handler timer0_ovf_isr:17 void timer0_ovf_isr(void) { TCNT0 = 0x3c; k=k+1; if(k>150) { k=0; PORTA ^= 0x01; } } /*********************************************************************** ***** 函数功能:主程序 入口参数: 出口参数: ************************************************************************ ****/ void main (void) { CLI(); //disable all interrupts port_init(); timer0_init(); MCUCR = 0x00; TIMSK = 0x01; //T0溢出使能 SEI(); //enable interrupts } 6、定时器1测试程序 /*********************************************************************** ****/ /*定时器T1测试程序 */ /*********************************************************************** ****/ /*********************************包含头文件********************************/ #include #include /**********************************全局变量*********************************/ int k; /*********************************************************************** ***** 函数功能:端口初始化程序 入口参数: 出口参数: ************************************************************************ ****/ void port_init (void) { DDRE|=1<<2; PORTE|=1<<2; DDRA=0XFF; PORTA=0XFF; } /*********************************************************************** ***** 函数功能:定时器初始化程序 入口参数: 出口参数: ************************************************************************ ****/ void timer1_init(void) { TCCR1B = 0x00; //stop,关掉 TCNT1H = 0xFF; //setup 0.2s设置高4位初值 TCNT1L = 0x3D; //设置低四位初值 OCR1AH = 0x00; OCR1AL = 0xC3; OCR1BH = 0x00; OCR1BL = 0xC3; OCR1CH = 0x00; OCR1CL = 0xC3; ICR1H = 0x00; ICR1L = 0xC3; TCCR1A = 0x00; TCCR1B = 0x05; //start Timer 1024 } /*********************************************************************** ***** 函数功能:定时中断服务程序 入口参数: 出口参数: ************************************************************************ ****/ #pragma interrupt_handler timer1_ovf_isr:15 void 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 ^= 0x01; } } /*********************************************************************** ***** 函数功能:主程序 入口参数: 出口参数: ************************************************************************ ****/ void main (void) { //disable all interrupts CLI(); port_init(); timer1_init(); MCUCR = 0x00; TIMSK = 0x04; //T0溢出使能 SEI(); //enable interrupts } ________________________________________ 7、定时器1测试程序之二 /*********************************************************************** ****/ /*定时器T1测试程序 */ /*定时时间为1秒 */ /*********************************************************************** ****/ /*********************************包含头文件********************************/ #include #include /**********************************全局变 量*********************************/ int countnum; /*********************************************************************** ***** 函数功能:端口初始化程序 入口参数: 出口参数: ************************************************************************ ****/ void port_init (void) { DDRE|=1<<2; PORTE|=1<<2; DDRA=0XFF; PORTA=0XFF; } /*********************************************************************** ***** 函数功能:定时器初始化程序 入口参数: 出口参数: ************************************************************************ ****/ 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 = 0x70; ICR1L = 0x7F; TCCR1A = 0x00; TCCR1B = 0x04; //start Timer } /*********************************************************************** ***** 函数功能:定时中断服务程序 入口参数: 出口参数: ************************************************************************ ****/ #pragma interrupt_handler timer1_ovf_isr:15 void timer1_ovf_isr(void) { TCNT1H = 0x8F; //reload counter high value TCNT1L = 0x81; //reload counter low value countnum++; if(countnum==256) countnum=0; } /*********************************************************************** ***** 函数功能:主程序 入口参数: 出口参数: ************************************************************************ ****/ void main (void) { CLI(); //disable all interrupts port_init(); timer1_init(); TIMSK = 0x04; //T0溢出使能 SEI(); //enable interrupts while(1) { PORTA=countnum; } } ________________________________________ 8、串口通信(USART0) /*********************************************************************** ****/ /*串口0测试程序 */ /*目标器件:ATmega128 */ /*晶振:RC 8MHZ */ /*编译环境:ICCAVR 7.13A */ /*时间:2010年3月14日*/ /*E-Mail:number007cool@163.com */ /*********************************************************************** ****/ /*********************************包含头文件 ********************************/ #include #include /***********************************宏定义 **********************************/ #define fosc 8000000 //晶振8MHZ #define baud 2400 //波特率 /*********************************************************************** ***** 函数功能:uart0初始化程序 入口参数: 出口参数: ************************************************************************ ****/ void uart0_init(void) { UCSR0B = 0x00; //关闭UART00 UCSR0A = 0x00; //不使用倍速发送(异步) UCSR0C =(1< #include /***********************************宏定义 **********************************/ #define fosc 8000000 //晶振8MHZ #define baud 9600 //波特率 **********************************************/************************* ***** 函数功能:uart1初始化程序 入口参数: 出口参数: ************************************************************************ ****/ void uart1_init(void) //USART1初始化 { UCSR1B = 0x00; //关闭USART1 UCSR1A = 0x00; //不适使用倍速发送 UCSR1C = (1< #include #define uint unsigned int #define uchar unsigned char void delay_ms(uint n) {uint i=0,j; while(i #include void port_init (void) { DDRA=0XFF; PORTA=0XFF; } const unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66, //0,1,2,3,4 0x6D,0x7D,0x07,0x7F,0x6F, //5,6,7,8,9 0x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; //a,b,c,d,e,f volatile unsigned char led_buffer[4]; void delay_1us(void) //1us延时函数 { asm("nop"); } void delay_nus(unsigned int n) //N us延时函数 { unsigned int i=0; for (i=0;i9999) { HC_595_OUT(0xFF); //当计数大于9999时,四个数码管同时输出8 PORTB|=((1<<4)5)|(1|(1<<<<6)|‎‎(1<<7)); } else if(data>999) { led_buffer[0]=data/1000; led_buffer[1]=(data%1000)/100; led_buffer[2]=(data%100)/10; led_buffer[3]=data%10; leddis_update(); } else if(data>99) { led_buffer[0]=16; //关闭最高位的那个数码管 led_buffer[1]=(data%1000)/100; led_buffer[2]=(data%100)/10; led_buffer[3]=data%10; leddis_update(); } else if(data>9) { led_buffer[0]=16; led_buffer[1]=16; led_buffer[2]=(data%100)/10; led_buffer[3]=data%10; leddis_update(); } else { led_buffer[0]=16; led_buffer[1]=16; led_buffer[2]=16; led_buffer[3]=data%10; leddis_update(); } } void init_devices(void) { CLI(); //disable all interrupts port_init(); //端口初始化 HC_595_init(); //595初始化 timer1_init(); //定时器1初始化 //TIMSK = 0x04; //定时器1中断溢出使能 //或者写成TIMSK|=(1< #include #include "config.h" /**********************************全局变量*********************************/ int k; volatile unsigned int cnt; /*********************************************************************** ***** 函数功能:定时器初始化程序 入口参数: 出口参数: ************************************************************************ ****/ void timer1_init(void) { TCCR1B = 0x00; //stop TCNT1H = 0xFF; //setup 1s TCNT1L = 0x3D; //(12*16+2)*40*1024/8000000=0.99328s OCR1AH = 0x00; OCR1AL = 0xC3; OCR1BH = 0x00; OCR1BL = 0xC3; OCR1CH = 0x00; OCR1CL = 0xC3; ICR1H = 0x00; ICR1L = 0xC3; TCCR1A = 0x00; TCCR1B = 0x05; //start Timer 1024 DDRE|=1<<2; PORTE|=1<<2; } /*********************************************************************** ***** 函数功能:定时中断服务程序 入口参数: 出口参数: ************************************************************************ ****/ #pragma interrupt_handler timer1_ovf_isr:15 void 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 ^= 0x01; cnt++; if(cnt==10000) cnt=0; } } /*********************************************************************** ***** 函数功能:主程序 入口参数: 出口参数: ************************************************************************ ****/ void main (void) { CLI(); //disable all interrupts init_devices(); MCUCR = 0x00; TIMSK = 0x04; //T0溢出使能 SEI(); //enable interrupts while(1) { display_led(cnt); } } ________________________________________ 定时器1:定时计数(1s) main.c文件: /*********************************包含头文件********************************/ #include #include #include "config.h" /**********************************全局变量*********************************/ int k; volatile unsigned int cnt; unsigned char fenpin[]={0x01,0x02,0x03,0x04,0x05}; //分频系数分别为:1,8,64,256,1024; /*********************************************************************** ***** 函数功能:定时器初始化程序 入口参数: 出口参数: ************************************************************************ ****/ void timer1_init(void) { TCCR1B = 0x00; //stop TCNT1H = 0xF0; //setup 1s TCNT1L = 0xBE; //(16*16*15+4*16)*1024/8000000*2=0.999424S TCCR1A = 0x00; TCCR1B = fenpin[4]; //start Timer 1024 DDRE|=1<<2; PORTE|=1<<2; } /*********************************************************************** ***** 函数功能:定时中断服务程序 入口参数: 出口参数: ************************************************************************ ****/ #pragma interrupt_handler timer1_ovf_isr:15 void timer1_ovf_isr(void) { TCNT1H = 0xF0; //reload counter high value TCNT1L = 0xBE; //reload counter low value cnt++; if(cnt==20000) cnt=0; } /*********************************************************************** ***** 函数功能:主程序 入口参数: 出口参数: ************************************************************************ ****/ void main (void) { CLI(); //disable all interrupts init_devices(); MCUCR = 0x00; TIMSK = 0x04; //T1溢出使能 SEI(); //enable interrupts while(1) { display_led(cnt/2); } } config.h文件: /*时间误差:0.00672秒每秒*/ #define SS 0 #define SCK 1 #define MOSI 2 #define MISO 3 #define SS_H() PORTB|=(1< #include void port_init (void) { DDRA=0XFF; PORTA=0XFF; } const unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66, //0,1,2,3,4 0x6D,0x7D,0x07,0x7F,0x6F, //5,6,7,8,9 0x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; //a,b,c,d,e,f volatile unsigned char led_buffer[4]; void delay_1us(void) //1us延时函数 { asm("nop"); } void delay_nus(unsigned int n) //N us延时函数 { unsigned int i=0; for (i=0;i9999) { HC_595_OUT(0xFF); //当计数大于9999时,四个数码管同时输出8 PORTB|=((1<<4)|(1<<5)|(1<<6)|(1<<7)); } else if(data>999) { led_buffer[0]=data/1000; led_buffer[1]=(data%1000)/100; led_buffer[2]=(data%100)/10; led_buffer[3]=data%10; leddis_update(); } else if(data>99) { led_buffer[0]=16; //关闭最高位的那个数码管 led_buffer[1]=(data%1000)/100; led_buffer[2]=(data%100)/10; led_buffer[3]=data%10; leddis_update(); } else if(data>9) { led_buffer[0]=16; led_buffer[1]=16; led_buffer[2]=(data%100)/10; led_buffer[3]=data%10; leddis_update(); } else { led_buffer[0]=16; led_buffer[1]=16; led_buffer[2]=16; led_buffer[3]=data%10; leddis_update(); } } void init_devices(void) { // CLI(); //disable all interrupts port_init(); //端口初始化 //595初始化 HC_595_init(); timer1_init(); //定时器1初始化 //TIMSK = 0x04; //定时器1中断溢出使能 //或者写成TIMSK|=(1< #include volatile unsigned char cnt=255; void initialize(void); #pragma interrupt_handler outinterrupt0:2//外部中断0 void outinterrupt0() { cnt=cnt-1; if(cnt==0) cnt=255; } #pragma interrupt_handler outinterrupt1:3//外部中断1 void outinterrupt1() { cnt=cnt-1; if(cnt==0) cnt=255; } #pragma interrupt_handler outinterrupt2:4//外部中断2 void outinterrupt2() { cnt=cnt-1; if(cnt==0) cnt=255; } #pragma interrupt_handler outinterrupt3:5//外部中断3 void outinterrupt3() { cnt=cnt-1; if(cnt==0) cnt=255; } int main(void) { initialize(); DDRD=0xf0;//将INT0-INT3设置为输入 while(1) { PORTA=cnt; } } void initialize(void) { EIMSK=0x0f; // 使用外部中断0-3 EICRA=0xaa; // 下降沿中断请求(异步) SEI(); // SREG的最高位置1 DDRE|=1<<2; //发光二极管片选 PORTE|=1<<2; DDRA=0XFF; } ________________________________________ 定时器3 pwm输出 /*====================================================== 使用定时器3,OCR3A,OCR3B,OCR3C三个管脚同时输出PWM波形 在快速PWM的模式下,top=0x03ff=1023 OCRnX在top时刻更新 频率=8000000/8/1023=977.5HZ =======================================================*/ #include int main () { unsigned int i,a=0,c=0; unsigned char b=0; TCCR3A=0xff; //通道A,B,C均设置为比较输出模式 TCCR3B=0x0A; //采用10位快速PWM模式,top值为0X03FF,决定pwm频率; TCNT3=0X0000; //设置定时器的初始值 TIMSK=0X00; ETIMSK=0X00; DDRE=0xff; while(1) { OCR3A=512; //决定OCR3A的占空比 OCR3B=256; //决定OC3B的占空比 OCR3C=OCR3C+1; //决定OC3C的占空比 c++; OCR3C=c; if(c>=0x03f0) {c=0;}; i=500; while(i--); } }
本文档为【基于iccavr的AVR128例程代码&#40;全&#41;】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_531654
暂无简介~
格式:doc
大小:118KB
软件:Word
页数:65
分类:企业经营
上传时间:2017-09-30
浏览量:49