#include <avr/io.h>
#include <utIL/delay.h>
#include <avr/interrupt.h>
#define uchar unsigned char;
#define uint unsigned int;
volatile unsigned char Counter500us;
unsigned char jiaodu;
ISR(TIMER0_OVF_vect )
{
TCNT0 = 248; //重装计数初值
if(Counter500us <jiaodu) //判断0.5ms的次数是否小于角度标识
{
PORTB = 0x01; //小于,则继续发送高电平
}
else
{
PORTB = 0x00; //大于,则输出低电平
}
Counter500us++; //0.5ms次数加1
Counter500us = Counter500us % 40; //0.5ms次数始终为40,既保持脉冲周期为20ms
}
int main(void)
{
//没有用到的管脚全部设置为输入脚,使能内部上拉电阻
DDRB = 0x01;
PORTB = 0xfe;
DDRC = 0x00;
PORTC = 0xff;
DDRA = 0x00;
PORTA = 0xff;
//T/C0定时中断设置
TIMSK |= 0x01; //T/C0溢出中断允许
TCCR0 |= 0x07; // T/C0工作于普通模式,1024分频
TCNT0 = 248; //定时初值设置,定时时间 = (256-250)/12M*1024=500us
Counter500us = 0; // 500us计时变量清零
jiaodu = 0;
SREG|=0X80; //使能全局中断
while(1){
jiaodu=jiaodu%4;
jiaodu++;
_delay_ms(1000);
}
}
#include <utIL/delay.h>
#include <avr/interrupt.h>
#define uchar unsigned char;
#define uint unsigned int;
volatile unsigned char Counter500us;
unsigned char jiaodu;
ISR(TIMER0_OVF_vect )
{
TCNT0 = 248; //重装计数初值
if(Counter500us <jiaodu) //判断0.5ms的次数是否小于角度标识
{
PORTB = 0x01; //小于,则继续发送高电平
}
else
{
PORTB = 0x00; //大于,则输出低电平
}
Counter500us++; //0.5ms次数加1
Counter500us = Counter500us % 40; //0.5ms次数始终为40,既保持脉冲周期为20ms
}
int main(void)
{
//没有用到的管脚全部设置为输入脚,使能内部上拉电阻
DDRB = 0x01;
PORTB = 0xfe;
DDRC = 0x00;
PORTC = 0xff;
DDRA = 0x00;
PORTA = 0xff;
//T/C0定时中断设置
TIMSK |= 0x01; //T/C0溢出中断允许
TCCR0 |= 0x07; // T/C0工作于普通模式,1024分频
TCNT0 = 248; //定时初值设置,定时时间 = (256-250)/12M*1024=500us
Counter500us = 0; // 500us计时变量清零
jiaodu = 0;
SREG|=0X80; //使能全局中断
while(1){
jiaodu=jiaodu%4;
jiaodu++;
_delay_ms(1000);
}
}