標題: 51單片機定時器0演示程序-與PCA計數的區(qū)別 [打印本頁]

作者: hujia    時間: 2015-2-18 01:09
標題: 51單片機定時器0演示程序-與PCA計數的區(qū)別
定時器與PCA計數的區(qū)別:
定時計數器從零或指定值自加到溢出后產生中斷,后自動或程序加載指定值到計數器,PCA有和定時器
相同的溢出中斷,但在多數情況下使用比較裝載值相等的方式產生中斷,比較產生中斷能根據設定狀態(tài)
,由硬件自動執(zhí)行特定位翻轉或PWM
//數據類型定義
struct Times
{//定時器結構數據類型
unsigned int    Match;    //重裝值容器
unsigned int    Dou;      //擴展精度自加容器
unsigned int    Doub;     //擴展精度終點容器
}Times0;                  //結構變量名
==========================================================================================*/
void Times0_Setup()
{
//設定計數脈沖模式================
    //AUXR|= 0x80;   //定時器0工作在1T模式
    AUXR&= 0x7F;   //定時器0工作在12T模式
//設定工作方式====================
    TMOD&=0xF0;    //清除定時器0的所有狀態(tài),隱含13位計數器
    //TMOD|=0x0C;    //使用外部中斷INT0做計數脈沖
    TMOD|=0x01;    //16位定時
    //TMOD|=0x02;    //8位自動重裝模式
    //TMOD|=0x03;    //雙8位定時
//裝入重裝值======================
//13位定時器
    //TL0 = Times0.Match;         //低8位裝載
    //TH0 = Times0.Match >> 5;    //高5位裝載
//16位軟件重裝定時器
    TL0 = Times0.Match;         //低8位裝載
    TH0 = Times0.Match >> 8;    //高8位裝載
//8位重裝定時器
    //TH0 = TL0 = Times0.Match;
//開始定時
    ET0=1;         //開定時器0中斷
    TR0=1;         //定時器0開始運行
    EA=1;          //開總中斷
}

//中斷函數()
void tm0_isr() interrupt 1 using 1
{
//16位模式需要軟件重裝
      TL0 = Times0.Match;
      TH0 = Times0.Match >> 8;
//Times0.Match是ms級,加入判斷Times0.Dou變量自減或自加可以達到秒或分鐘級
      if (Times0.Dou-- == 0)
      {//Dou自減,直到等于0
          Times0.Dou = Times0.Doub;    //Doub重裝
//=======================Times0事件做出處理=========================
//==================================================================
      }
}



作者: 123@diper    時間: 2015-9-24 22:40
先看看




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1