/*
程序名 (programname): 守时器程序 (LED准确一秒闪耀)
芯片名(chip name): 艾特梅尔公司 MEGA16A 芯片;
概述: 使用8位守时器0 完结准确守时,其间,守时器0溢出 重设初始值和溢出位清零很重要,
一旦守时器溢出,溢出标志位不会主动清零,留意!此刻需要向守时器0溢出标志位位TOV0
写”1″,它就会主动清零;TOV0在TIFR寄存器的末位,溢出位不能位寻址(不能位操作);
完结(finish time) : 2014年2月28日13:50:14
噢 ,,,主码 时刻了,,,
*/
#include <avr/io.h>
#include interrupt.h> //中止头文件..
typedef unsigned char uint8;
typedef unsigned int uint16;
io() //初始化一切IO口函数;
{
DDRA=0Xff;
PORTA=0Xff;
DDRB=0XFF;
PORTB=0X00;
DDRC=0XFF;
PORTC=0X00;
DDRD=0XFF;
PORTD=0XFF;
}
mcu() //
{
TCNT0=0x6A;//守时器初始值寄存器,设置 初始值 (此寄存器的值自增到255再加一便是0了);
TCCR0=0x02;//守时器0分频设置寄存器 守时器8分频.
//守时器公式: 256 – (12兆(机器频率) ÷ 分频) X (溢出时刻) =初始值;
}
int main(void)
{
uint16 i=0,j=0;
io(); //初始化一切io口;
mcu(); //设置守时器分频和初始值;
PORTB=0X04; //LED共阳极使能;
while(1)
{
if((TIFR&0X01)==1) //假如守时器溢出;
{
j++;
TCNT0=0x6a; //重设初始值,溢出时刻是0.0001秒;
TIFR|=0X01; //!!!!!!!!!这个很重要,必定要将溢出方位一,它就会自己清零;
}
if(j ==9932)//溢出一次用时100奇妙,变量j加一,加一万次用时1秒,逻辑分析仪捕捉到
{ //PA口跳变时刻有一点差错,稍作调整,,
j=0;
PORTA^=0XFF;
}
}
}