欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

AVR定時器0完全資料

作者:huqin   來源:本站原創   點擊數:  更新時間:2014年04月01日   【字體:

Atmega16

      

       

 


 

于定時器0相關的寄存器有 SREG 全局中斷  bit7   I

TIMSK中斷屏蔽寄存器    bit  0:1   TOIE0  OCIE0

 


TOIE0
中斷溢出允許標志位   

OCIE0輸出比較允許標志位

TCCR0  timer0控制寄存器 bit0:7

 


FOC0
強制輸出比較;僅在非PWM模式有效

WGM00:WGM01 模式控制位;

COM01:COM00 各PWM模式中 具體設置位:

 





CS00 CS01 CS02 
時鐘選擇位   于定時器2公用

 


TCNT0  
定時器0寄存器八位放置定時器初值

OCR0    定時器0比較匹配寄存器與TCNT0值比較

TIFR   中斷標志寄存器 

 


TOV0  
定時器0溢出中斷標志位

OCF0   比較匹配中斷標志位

下邊我們編程先從簡單的定時器計數開始

           程序部分

#include<iom16v.h>
#include"dis.h"     //595驅動顯示頭文件
unsigned  char  i,temp;
void   inittimer0(void)//定時器0初始化函數
{
TCCR0|=(1<<CS00)|(1<<CS02);//普通計數模式,1024分頻
TCNT0=0X00;                //賦值
SREG=0X80;               //全局中斷打開
TIMSK|=(1<<TOIE0);        //定時器0溢出中斷使能
}
void   main(void)
{
DDRC|=0X07;       //595控制端口初始化
inittimer0();     //定時器初始化
dis(0);       //顯示函數
while(1){ }
}
#pragma interrupt_handler timer0_ovf:10
void  timer0_ovf(void)///定時器中斷
{ 
  i++;
  if(i>=4)
  {
    i=0;
    temp++;dis(temp);//數值自加,顯示;
    }
}               仿真部分

 



T0輸入產生中斷程序及仿真

下邊源碼中更改TCCR0的配置可決定那種跳變沿觸發

下降沿觸發 TCCT0|=(1<<CS02)|(1<<CS01);

上升沿觸發 TCCT0|=(1<<CS02)|(1<<CS01)|(1<<CS00);

注意這里的上升沿是T0口處于低電平狀態,發生了高電平的跳變,配置不需要改變,上升沿下降沿端口配置是一樣的

//通過T0引腳觸發中斷
#include<iom16v.h>
void   initTimer0(void)
{
     TCCR0|=(1<<CS02)|(1<<CS01); //下降沿觸發,(1<<CS00)上升沿觸發
     TCNT0=0XFE;      //賦值通過按鍵將寄存器值填滿產生中斷
     TIMSK|=(1<<TOV0);  //定時器0溢出中斷
     SREG|=0X80;      //全局中斷
     PORTD|=(1<<PD0);      //初始化T0引腳
     DDRC=0XFF;      //中斷產生動作端口初始化
}
void  main(void)
{
initTimer0();
while(1);
}
#pragma interrupt_handler timer0_ovf:10
void timer0_ovf(void)
{
  TCNT0=0XFE;    //寄存器重裝
  PORTC=~PORTC;    //動作
} 

 




下邊介紹定時器0 的PWM功能,通過上邊對定時器的了解下邊也會很簡單的掌握。選擇相位修正模式,WGM00=1;WGM01=0;無分頻,CS02=0;CS01=0;CS00=1;

比較匹配選擇在升序計數發生比較匹配將清零OC0,降序計數發生時比較匹配將OC0置位.相應控制位COM00=0,COM01=1;TCCR0|=(1<<WGM00)|(1<<COM01)|(1<<CS00);

比較匹配寄存器賦值,比較匹配中斷向量為:20

#include<iom16v.h>           
void  initpwmt0(void)          //編寫人張小強日期13,09,17
{
TCCR0|=(1<<WGM00)|(1<<COM01)|(1<<CS00);//相位修正PWM
TIMSK|=(1<<OCIE0);            //輸出匹配使能
SREG|=0X80;              //全局中斷使能
TCNT0=0X00;              //定時器寄存器
OCR0=0X80;                //比較匹配寄存器
DDRB|=(1<<DDB3);            //比較匹配輸出引腳初始化
}
void delaymsPWM(unsigned  int  z)
{
unsigned  int  x,y;
for(x=1000;x>0;x--)
  for(y=z;y>0;y--);
}
void  main()
{
initpwmt0();              
while(1)
{   
  OCR0++;delaymsPWM(10);         //定時自加
}
}                     //比較匹配中斷
#pragma interrupt_handler timer0_comp:20
void timer0_comp(void)
{}





至此定時器0大體應用功能講解完畢,

關閉窗口

相關文章