首先,什么时定时器,简单来说可以比喻为一个闹钟,当你把他打开以后,他就会每秒动一下,+1,+1,+1,+1,如果你设置了某一个时间点闹钟会向以后,那么当闹钟的时间点+1,+1,+1,+到了你设置的时间的就会进入中断----也就是闹钟响了。 下面正式介绍定时器怎么用* 首先你要用这个闹钟,你要先给他装电池,设置时间,也就是配置他,然后打开他那么怎么打开呢, /以下是配置定时器部分*******/ 先上两张图 图片是51手册上截取的,首先第一步就是配置TMOD也就是定时器/计数器的工作模式,在这里我们选择的是定时器/计数器0模式选择工作方式1也就是M1,M0=01(16位定时器计数器) 然后我们要给定时器赋初值,那么,初值怎么算呢,以我们的51单片机为列子,晶振12MHZ,12MHZ经过12分频12/12=1MHZ,也就是说一秒=1000000次机器周期。 假如给定时器定时1ms(1 毫秒 = 0.001 秒),1ms=1000次机器周期。 65536-1000=64536(转为16进制为FC18)
把他们分别放进TH0和TL0当中,TH0=0xfc,TL0=0x18,至此我们已经给定时器赋初值了
接下来我们开始打开开关 ET0=1;//打开定时器0中断允许 ET0:T0中断溢出允许位,ET0=1允许中断 TR0=1;//打开定时器 TR0:定时器T0运行控制位,置1打开 EA=1;//打开总中断
至此,我们要打开一个定时器要配置的东西都配置完成了,我们用一个模块函数把他封装起来 void Timer0Init() { TMOD=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许 ET0:T0中断溢出允许位,ET0=1允许中断
TR0=1;//打开定时器 TR0:定时器T0运行控制位,置1打开
EA=1;//打开总中断
}
好的,我们现在闹钟给他装好电池,基础配置都配置好了,那我们怎么才才能让他“响”呢,所谓响,就是定时器滴答滴答+1,到达了你设置的时间,那么到大了这个时间你要让他干嘛呢? /以下是设置定时器中断函数********/ 假设我们要用定时器让LED灯每1秒钟闪烁一次吧, 首先我们知道我们已经给定时器定时1MS,也就是1MS加一次,我们知道1000MS=1s,也就是说定时器加1000次就是1秒钟, 还有一个东西要说的, 中断号,就是interrupt 后面的数字,比如你要用外部中断0那就是interrupt 0,要用定时器中断0那就是interrupt 1;请注意了,下面会用到,等会可以回来查
那我们以此写一个封装函数 void Timer0() interrupt 1//这里interrupt 千万别写错,可以回去查表求证了 { static u16 i; //STACK静态声明函数,只可意会不可言传 TH0=0XFC; //给定时器赋初值,定时1ms TL0=0X18;//这两句是重新赋值,别问,问就是规矩 i++;//开始进入++环节,加到1000会进入下面的if语句 if(i==1000) { i=0;//i归零为下一次++做准备 led=~led; } } 至此,我们已经配置好定时器,并且设置了定时器要做什么事了,接下面我们只要做一件事,把他放进main函数里面,经常while循环即可 void main() { Timer0Init(); //定时器0初始化 while(1); }
|