美文网首页我爱编程
EX5 AVR ATmega8A16位定时器 TC1 norma

EX5 AVR ATmega8A16位定时器 TC1 norma

作者: 山前雨1 | 来源:发表于2018-06-14 10:27 被阅读9次

//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();

}

相关文章

网友评论

    本文标题:EX5 AVR ATmega8A16位定时器 TC1 norma

    本文链接:https://www.haomeiwen.com/subject/rhbeeftx.html