标题: 51单片机定时器0演示程序-与PCA计数的区别 [打印本页]

作者: hujia    时间: 2015-2-18 01:09
标题: 51单片机定时器0演示程序-与PCA计数的区别
定时器与PCA计数的区别:
定时计数器从零或指定值自加到溢出后产生中断,后自动或程序加载指定值到计数器,PCA有和定时器
相同的溢出中断,但在多数情况下使用比较装载值相等的方式产生中断,比较产生中断能根据设定状态
,由硬件自动执行特定位翻转或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的所有状态,隐含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.51hei.com/bbs/) Powered by Discuz! X3.1