可用的定时器1例程MEGA8

ATMEGA8定时器计数器1可以定时一秒。

ATMEGA8有T/C0、T/C1、T/C2,其中T/C0、T/C2是8位定时器;T/C1是16位定时器

一般我们在设计程序时,都是要求定时多少时间,可见,时间(妙S)是个已知条件,而单片机的的时钟频率一般在设计的最初也是已经确定下来的,所以,频率(HZ)也是一个已经条件,现在我们要求的就是比较值的大小了

公式如下:

比较值(次)=频率(次/S)* S     

上式中的频率是T/C频率,并不是单片机时钟频率,如单片机时钟是8000000Hz,T/C的时钟是系统时钟的1024分频,那么

T/C时钟频率=8000000/1024=7812.5Hz,约=7812

假设我们要定时1秒钟,那么

比较值=7812(次/S) * 1S=7812次

可见,8位(255)的T/C0,T/C2是不能满足要求的,只有16位(65535)才能满足要求

程序如下

#include <mega8.h>
interrupt [8] void timer1_ovf_isr(void) //为什么是9?请看M8中文数据手册的43页
{
//请在这里添加你的中断代码
PORTB=255;//测试代码
PORTB=0;
TCNT1H=0; //先写H 计数器重新开始计数
TCNT1L=0; //后写L
}

void main(void)
{
TCCR1A=4;   //启用通道B强制比较功能
TCCR1B=5;   //1024分频,一旦时钟设置成功,计数器就开始计数
TIMSK =4;   //定时器1通道B比较匹配中断使能
OCR1BH=30; //设定通道B的比较值,写16位寄存器要先写H,再写L
OCR1BL=162; //OCR1AH+OCR1AL=7812
TIMSK=8;    //通道B比较中断使能
SREG=128;   //打开全局中断
while (1)
      {
        //请在这里添加你的程序代码
      }
}

引用自:

http://hi.baidu.com/sy451/blog/item/dfd471d9cb44b4ed39012f15.html

Leave a comment

0 Comments.

Leave a Reply


[ Ctrl + Enter ]