目录
0 引言
其实,这个是可以通过软件延时计算器来生成自己需要的延时程序,而且效果非常好,但是既然要学习单片机,我们的目的就是要搞清楚硬件系统的知识,所以必须要学会如何用软件(程序)去控制硬件(处理器)。
1 定时的原理
1.1 生活中的定时
我们每个人都用过“定时”这个功能。比如说闹钟,我们需要学习1小时,然后定个1小时的闹钟,然后闹钟从59:59:59开始倒计时,直到00:00:00结束,闹钟响铃,学习结束,这个从我们的角度看来它是倒计时。单片机里的定时器原理也是这个,但是用的是正计时哈。
1.2单片机中的定时器
单片机的定时器,它是从某个值(你可以设定)加到某个值后停止。
这里要提到两个概念:①时钟周期;②机器周期。(下面用人话讲一下,可能不太严谨)
①时钟周期T:单片机上面有一个晶振,通电后它会产生一个工作频率f(我用的C51是11.0592MHz,板子不同频率可能不同,可以用放大镜看一下,他的参数刻在晶振的上面了),这个评率的倒数就是你用的这个板子的时钟周期,单位:s。
T = 1/f
②机器周期:一个机器周期 = n×时间周期;不同的板子,n的取值不同,C51系列的n是12(那我就以12说明了),单位也是:s。
说完这两个,开头说单片机的定时器的工作就是不停地加,而且是加1(计一个数),而每次+1,就要消耗一个机器周期(所有这就是我为啥要先解释①②),或者讲每隔一个机器周期就寄存器就会+1。
知道这个有啥用呢?因为我们要算出来,我们打算让LED隔多长时间闪一次啊,这就是目的。
现在我们打算让灯泡每隔0.05秒闪一次,即:
0.05 (s) = m × n/f (s)
n和f刚才提到了,我用我的板子的参数代进去举个例子吧。
0.05 (s) = m × 12/11059200(s)
m = 46080(次)
也就是说,寄存器加了四万多个1,所用时长大约0.05s。
闹钟是从你设定的某个值倒计时至00:00后停止计时,单片机中寄存计时是你设置某个值后不断+1,直到加到某个值后停止,那加到哪个数值才能停止呢?
51系列标准的单片机内部是有两个寄定时器T0和T1,每一个定时器(也就是寄存器)有16bit,最大可以存储2^16bit的数据,换成16进制就是可以储存0x00到0xFF,超过这个数值,就会发生溢出(overflow),从0xFF进位后再次变成0x00,所以如果我们可以检测到有进位的情况,说明我们设置的初值经过不断+1,到了最大值(是不是很像闹钟计时到了终值00:00呢),此时LED闪一次。
这就是所需的原理部分。下面讲一下如何将原理通过c程序的方式实现目标。