1.细节
上一讲里,我们知道TH0和TL0合成的“16位的变量”的初值最小要为0,不能是负数,
所以我们要满足:65536-( x/(12/11059200) )>=0。
解得x<= 0.071111秒=71.111毫秒。
也就是用定时器的工作模式1最长的定时时间为71毫秒左右而已。
2.定时器开关
首先定时器也是有开关的,这个相当于我们的导管是否打开让水流进“试管”里。
因为我们用的是定时器0,TCON^4这个位就是控制定时器0是否打开或关闭,所以“TR0=1;”就是打开了定时器开始计时,“TR0=0;”是关闭了定时器计时功能。
只要打开了定时器,TH0和TL0合成的“16位的变量”就会每过(12/11059200)秒就自加1,直到定时器溢出。
3.溢出标志
我们的定时器0一旦溢出,TCON^5就会被置1(TF0==1),如果我们不使用中断函数也是可以在主函数里等待判断“if(TF0==1)”。TF0跟外部中断0的IE0一样,被置1了需要软件清零。
4.工作模式1的代码
这里我们用定时器0来实现间隔50ms的流水灯实验
#include <reg52.h> #include <function.h>//详见第六章第8讲 void main() { u8 i=0; LED_Init(); //初始化LED硬件模块 TMOD = 0x01; //设置定时器0为工作模式1 TH0 = 0x4C; //设置定时时间为50ms TL0 = 0x00; TR0 = 1; //启动定时器0 while(1) { if (TF0 == 1) //判断定时器0是否溢出,每隔50ms就可以进入一次这个if语句 { TF0 = 0; //定时器0溢出后,清0溢出标志 TH0 = 0x4C; //重新赋初值,保证下次溢出间隔时间还是50ms TL0 = 0x00; P0=~(0x01<<i);//每盏灯的点亮时间都保持着50ms i++; } if(i>=8)i=0; } }
5.定时器1的使用
如果我们用定时器1实现上处代码同样的功能,那么TMOD只要初始化为“TMOD=0x10;”
还有把TH0,TL0,TR0,TF0这些全部改为TH1,TL1,TR1,TF1即可,所以说这两个定时器的工作原理都是一样的。
#include <reg52.h> #include <function.h>//详见第六章第8讲 void main() { u8 i=0; LED_Init(); //初始化LED硬件模块 TMOD = 0x10; //设置定时器1为工作模式1 TH1 = 0x4C; //设置定时时间为50ms TL1 = 0x00; TR1 = 1; //启动定时器1 while(1) { if (TF1 == 1) //判断定时器1是否溢出,每隔50ms就可以进入一次这个if语句 { TF1 = 0; //定时器1溢出后,清0溢出标志 TH1 = 0x4C; //重新赋初值,保证下次溢出间隔时间还是50ms TL1 = 0x00; P0=~(0x01<<i);//每盏灯的点亮时间都保持着50ms i++; } if(i>=8)i=0; } }
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程