基于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--);
}
}