| #include <avr/io.h> #include <avr/interrupt.h>
 #include "user.h"
 
 /*端口初始化*/
 void  Port_init(void)
 {
 PORTA = 0x00;  //输出时,低电平
 DDRA  = 0xFF;   //输出模式
 PORTB = 0x00;
 DDRB  = 0xFF;  //输出模式
 PORTC = 0x00;
 DDRC  = 0xFF;  //输出模式
 PORTD = 0x00;
 DDRD  = 0xFF; //输出模式
 }
 /*器件的初始化*/
 void init_devices(void)
 {
 cli();        //禁止所有中断   MCUCR的低4位为INT0(ISC01、ISC00)和INT1(ISC11、ISC10)中断触发类型控制位
 /*** SM2  SE  SM1  SM0  ISC11   ISC10  ISC01 ISC00  ***/
 MCUCR  = 0x00;     /***  0    0    0    0     0       0       0    0    ***/
 /***MCUCSR寄存器用于提供导致MCU重置的重置源信息 ***/
 MCUCSR = 0x80; //禁止JTAG
 //通用中断控制寄存器— GICR: INT1  INT0 INT2 — — — IVSEL IVCE
 GICR   = 0x00; //
 Port_init();
 timer0_init();
 sei();        //开全局中断
 }
 
 /*定时器T0初始化*/
 void timer0_init(void)
 {
 TCCR0  = 0x00;  //停止定时器
 TCNT0  = 0x06;  //初始值
 OCR0   = 0xFF;  //匹配值,未使用
 TIMSK |= 0x01;  //中断允许
 TCCR0  = 0x03;  //模式:普通; 匹配时:不与OC0相连接  ;8MHz的64分频 ;启动定时器
 }
 
 //T0溢出中断服务程序
 //#pragma interrupt_handler timer0_ovf_isr:10
 //void timer0_ovf_isr(void)
 SIGNAL(TIMER0_OVF_vect)      //到2000us
 {
 static  uint  flash_count;
 TCNT0 = 0x06;
 if(++flash_count>=250 )  //若定时到0.5s
 {
 flash_count=0;
 PORTB ^= (1<<PB0);  // PB0口取反闪烁
 //PORTB^=BIT(0)|BIT(6)|BIT(5);//翻转PB0/PB6/PB5口,实现3个LED灯的0.5s间隔亮灭
 }
 
 }
 
 //1ms延时,准确性较高
 
 void delay1ms(unsigned int i)
 {
 while(i--)
 {
 unsigned int j;
 for(j=1;j<=613;j++)
 ;
 }
 }
 
 
 /* 测试T0 溢出中断    */
 #include <avr/io.h>
 #include "user.h"
 
 int main(void)
 {
 init_devices( );
 while(1)
 {
 NOP( );
 }
 
 }
 
 |