/*********************************************
开 发 环 境: ICCAVR 7.22
硬件平台:ATmega8
**********************************************/
#include<iom8v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char
//--------------1ms延时子程序----------------
void delay_nms(uint x)
{
uint i;
while(x--)
for(i=0; i<800; i++)
{
;
}
}
/*******************************************
IO初始化
/********************************************/
void Port_Init(void)
{
PORTB = 0x00;
DDRB = 0xFF;
DDRD=0X00;
PORTD=0XFF;
}
/*******************************************
外部中断0ATmega8_4脚
/********************************************/
void Power_Init(void)
{
MCUCR |= 0X20;//掉电模式,外部中断0低电平触发
GICR |= 0X40; //外部中断0使能
SREG |= 0X80;//使能总中断
}
//*********************************************
//T2初始化:CTC模式,匹配中断频率:32768/128=256Hz
//*********************************************
void Timer2_init(void)
{
TCCR2 = 0x00; //T/C控制寄存器-TCCR2
ASSR = 0x08; //器ASSR的AS2置位,定时器在T2睡眠时继续运行。
TCNT2 = 0x00; //计数器的数值TCNT2
OCR2 = 0x7f;//0x7f;/输出比较寄存器 OCR2
TCCR2 = 0x09; //start
while(ASSR&0X07);
}
/*******************************************
4 定时器 /计数器2比较匹配
5 定时器 /计数器2溢出
/********************************************/
#pragma interrupt_handler Timer2:5
void Timer2(void)
{
unsigned char i;
for (i=0;i<3;i++)
{
PORTB |= BIT(0); //ATmega8 _14脚
delay_nms(600);
PORTB &= ~BIT(0);
delay_nms(600);
}
}
//**********外部中断0的服务函数*************
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
unsigned char i;
for (i=0;i<5;i++)
{
PORTB |= BIT(0); //ATmega8 _14脚
delay_nms(600);
PORTB &= ~BIT(0);
delay_nms(600);
}
}
/*******************************************
函数 名称: Device_Init
功 能: 器件初始化
/********************************************/
void Device_Init(void)
{
Port_Init(); //IO端口初始化
Power_Init(); //外部中断,省电模式,初始化
Timer2_init; //定时器2中断,省电模式,初始化
}
/*******************************************
函数 名称: main
/********************************************/
void main(void)
{
unsigned char i;
Device_Init();
while(1)
{
for (i=0;i<10;i++)
{
PORTB |= BIT(1); //ATmega8_15脚
delay_nms(300);
PORTB &= ~BIT(1);
delay_nms(300);
}
MCUCR |= BIT(SE)|BIT(SM1)|BIT(SM0);//省电模式休眠初始
化
// MCUCR |= 0x80; //空闲模式休眠初始化
asm("sleep"); //使能休眠
for (i=0;i<5;i++)
{
PORTB |= BIT(2); //ATmega8_16脚
delay_nms(300);
PORTB &= ~BIT(2);
delay_nms(300);
}
}
}
此帖出自
小平头技术问答
一周热门 更多>