/*
程序名 (program name): 定時器程序 (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 <avr/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;
}
}
}