分享

avr单片机8位定时器LED精确1秒闪烁程序

 共同成长888 2015-07-19

avr单片机8位定时器LED精确1秒闪烁程序 

 /*
      程序名 (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; 

 }


}


}
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多