//EX5//author:QI小米粥//data:2018.3.13//normal模式没有OCR1功能,#include#includeint a=0;
double b=0;
//计时器1的初始化
void init_tc1(void)
{
DDRD |=0XC0;//用来模拟溢出中断,该引脚闪烁
PORTD &=~0XC0;
DDRB &=0XFE;
PORTB |=0X01;
SFIOR &=~BIT(2);
SREG |=BIT(7);//开全局中断
TCCR1B |=0X03; //时钟初始化,预定标64,系统时钟128K0
TCCR1B &=~0x04;
TIMSK |=BIT(2);//overflow溢出中断置位
TIMSK |=BIT(5);//输入捕获中断
ACSR &=~BIT(2);//选择外部的捕获源
TCCR1B |=BIT(7);//输入消噪
TCCR1B &=~BIT(7);//输入捕捉的下降沿触发
TCCR1A &=~0X03;//TC1的工作模式选择
TCCR1B &=~0X0C;
}
void delay(void)
{
int a,b,c;
for(a=0;a<2048;a++)
{
for(b=0;b<1024;b++){ }
}
}
//下一行不能有空格
#pragma interrupt_handler tc1_cap:6
void tc1_cap(void)
{
b=0x8000;//改变TCNT1的初始值从而使频率增大一倍
PORTD |=BIT(6);//令PB6变高
delay();//延时大约2s
PORTD &=~BIT(6); //PB6恢复到低电平
}
#pragma interrupt_handler tc1_overflow:9
void tc1_overflow(void)
{
TCNT1=b; //16位的寄存器读写有顺序,具体应该参考ATmega8A datasheet 21.3节
//不建议对TCNT1L=0x?? TCNT1H=0x??分别赋值,整体赋值TCNT1=0x????不会有问题
a=PIND;
a &=BIT(7);
if(a) //实现反转功能
{PORTD &=~BIT(7);}
else
{PORTD |=BIT(7);}
}
void main(void)
{
init_tc1();
}
网友评论