|
定时器与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事件做出处理=========================
//==================================================================
}
}
|
|