定时器1⼯作⽅式2c语⾔,定时器⼯作模式2
1.⼯作模式2的使⽤
这⾥我们顺便讲解⼀下定时器0的⼯作模式2,也就是使⽤“⼩试管”的⽅式,TMOD的初始化就为“TMOD=0x02;”。
我们知道⼯作模式2的最长溢出时间仅为256*(12/11059200)=0.000277秒=277微秒。
我们想实现间隔51ms的流⽔灯实验该怎么做,⾸先我们定义⼀个变量cnt⽤来记录每次的溢出次数,然后我们的定时时间为51微秒(因为最⼤定时只有278微秒),cnt记录的值等于1000的时候,证明时间已经过去了51ms,于是再去执⾏流⽔灯的任务。
我们已经知道⼯作模式2是不需要在溢出之后再填充初始值的,⽐如我们定时的时间为51微秒,那么计算出“距离溢出的刻度”就为47(实际计算出的是47.0016,所以定时为51微秒误差就不⼤)。
所以给TL0赋初值为256-47=209=0xD1。那么TH0也是给初值为0xD1,这是保证每次TL0溢出之后新的初始值是等于TH0的值的,所以定时器⼯作模式2⼜叫做8位⾃动重装载模式。相关概念还需读者再去另外学习这些理论知识。
2.⼯作模式2的代码#include
#include //详见第六章第8讲
void main()
{
u8 i;
u16 cnt;
LED_Init();  //初始化LED硬件模块
TMOD = 0x02;  //设置定时器0为⼯作模式2
TH0  = 0xD1;
TL0  = 0xD1;  //定时51us
TR0  = 1;    //启动定时器0
while(1)
{
if (TF0 == 1)    //每隔51us就可以进⼊⼀次这个if语句
{
TF0 = 0;    //定时器0溢出后,清零中断标志
cnt++;      //记录溢出次数
c语言如何去学
}
if(cnt>=1000)    //时间过去了51ms
{
cnt=0;
P0=~(0x01<
i++;
}
if(i>=8)i=0;
}
}
⼤家对照上⼀讲的⼯作模式1的代码会发现,⼯作模式2在while循环中不再出现TH0和TL0的⾝影,TL0每次溢出之后,初值⼜变为TH0初始时候的值了,所以定时时间在while循环之前就已经决定好了。
⼤家可以尝试着把“if(cnt>1000)”⾥的1000改为10000就是间隔510ms的流⽔灯了。
往后我们做的题⽬定时时间⼀般最少都是要定时1毫秒以上,所以⽤⼯作模式1的机会会很多,⽽⼯作模式2在我们前期教程⾥会很少运⽤,等学到串⼝通信相关知识时我们再重拾这个知识点。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。