本帖最后由 ningling_21 于 2009-12-17 09:51 编辑
AVR MEGA8 芯片,C语言程序,为何打开T/C0中断后,不知为何中断返回就使程序复位?
程序的功能很简单,就是开始让三个灯依次亮,然后都熄灭,进入主循环后灯不亮,等待中断,中断里点亮一个灯,中断返回让这个灯熄灭;
现象:上电后,总是三个灯依次亮,又不停的在这段循环,就像程序不停被复位了。
还请指点迷津...
代码如下:
#include <iom8v.h>
#define uint unsigned int
#define uchar unsigned char
void delay_1ms(void);
void delay_nms(unsigned int n);
/*-------------------
主函数
----------------------*/
void main(void)
{
uchar ik,ij;
uchar zifu[20]={"abcdefghijklmno"};
DDRB=0XFF; // 初始化,依次点亮三个LED
PORTB=0XFF;
DDRD=0XFF;
PORTD=0XFF;
PORTB=0XFE; // LED1 亮
delay_nms(5000);
PORTB=0XFF;
PORTB=0XFD; // LED2 亮
delay_nms(5000);
PORTB=0XFF;
PORTD=0XDF; // LED3 亮
delay_nms(5000);
PORTD=0XFF; // LED1,2,3 全不亮
// 定时器初始化
TCCR0=0X04; // T/C0 时钟源 256分频
TIMSK=0X01; // T/C0溢出中断使能;
TIFR =0X01; // T/CO溢出标志位;
SREG =0X80; // 开全局中断允许;
while(1)
{
delay_nms(5000);
PORTD=0xFF;
}
}
/*-------------------
TC0溢出中断服务函数
----------------------*/
interrupt[8] void timer0_overflow(void)
{
TIFR|=0X01; //清除中断标志,也可以由硬件清除
PORTD=0XFD; //点亮LED
}
/*-------------------
延时1毫秒函数
----------------------*/
void delay_1ms(void)
{
uint i;
for(i=0;i<150;i++)
{}
}
/*-------------------
延时n毫秒函数
----------------------*/
void delay_nms(unsigned int n) //n ms
{
uint i;
for(i=0;i<n;i++)
delay_1ms();
} |