51中断系统的组成
定时/计数器的基本原理
逻辑开关闭合后,脉冲信号将对加1计数器充值。若计数器的容量为2 n (n为整数),则当数值达到满计数值后将产生溢出,使中断请求标志TFx(x为0或1)进位为1,同时加1计数器清零。
如果在启动计数之前将TFx清零,并将一个称为计数初值a的整数先置入加1计数器,则当观察到TFx为1时表明已经加入了(2n - a)个脉冲,如此便能计算出脉冲的的到达数量了。
- 如果上述脉冲信号时来自单片机的外部信号,则可通过这一方法进行计数统计,即可作为计数器使用。
- 如果上述脉冲信号是来自单片机内部的时钟信号,则由于单片机的振荡周期非常精准,故而溢出时统计的脉冲数便可换算成定时时间,因此可作为定时器使用
定时/计数器工作原理
系统时钟(系统内部振荡器)经12分频后的脉冲(即机器周期)(12分频为12除以频率)信号和来自外部引脚Tx的脉冲信号,通过逻辑开关 C / T ‾ \overline{T} T 的切换可实现两种功能:
- C / T ‾ \overline{T} T =0 时为定时器方式
- C / T ‾ \overline{T} T =1 时为计数器方式
根据上述原理,定时器方式下的定时时间 t可表示为:
t =(计数器满计数值 - 计数初值a)× 机器周期
= (2 n - a)× 12 f o s c \frac{12}{f _{osc} } fosc12
可见,t 与 n,a, f o s c f_{osc} fosc(时钟频率,MHz)3个因素有关,在时钟频率 f o s c f_{osc} fosc和计数器容量n一定的情况下,定时时间与计数初值有关,计数初值越大,定时时间越短。
同理,计数器方式下的计数值 N 可表示为
N = 计数器满计数值 - 计数初值 = 2 n - a
定时/计数器的结构
由上图可知,T0和T1分别由高8位和低8位两个特殊功能寄存器组成,即
- T0由TH0(字节地址8CH)、TL0(字节地址8AH)
- T1由TH1(字节地址8DH)、TL1(字节地址8BH)
定时/计数器的控制是通过两个特殊功能寄存器实现的,其中,
-
TMOD是定时/计数器的工作方式寄存器,由它确定定时/计数器的工作方式和功能
-
TCON是定时/计数器的控制寄存器,用于管理T0和T1的启停、溢出和中断
电路图
要求
D1~D8灯间隔1s闪烁
完整程序
#include<reg51.h>
unsigned char t;
void main()
{TMOD=0x01;//0000 00|01| M1=0,M0=1,定时器T0模式1,16位计数器EA=1;//中断总允许ET0=1;//定时器T0的中断开关TR0=1;//启动定时器0while(1);
}
void timer() interrupt 1
{ //定时时间50000μs=(65536-a)×12/fosc fosc=11.0592≈12//一个较大的数字分成两部分,分别存入定时器T0的高八位和低八位//8位最大能表示数字256,高8位和低8位一起可表示一个最大数字256256//括号内的结果除以256将整数存入定时器T0的高8位TH0//括号内的结果取余256将余数存入定时器T0的低8位TL0//TH0=(65536-50000)/256;//得到整数部分存入高8位 60 0011 1100//TL0=(65536-50000)%256;//得到余数部分存入低8位 176 1011 0000//2的16次方=65536 ,单位时间50000μs=50ms,2的8次方=256 ,(65536-50000)/256=60 (60)binary=0011 1100TH0=(65536-50000)/256;//定时器T0的高8位 //(65536-50000)%256=176 (176)binary=1011 0000 TL0=(65536-50000)%256;//定时器T0的低8位 t++;//如果t累加到20,则执行if语句(即t=20时表示1秒) if(t==20) //20个50ms(定时时间)=1s{t=0;//t清零,以便进行下一次计数P1=~P1;//取反实现led的闪烁}
}
解释部分语句
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
如果你选的单片机的晶振一定,比如12MHZ来说吧,机器周期是1us,就是说每1us产生一次计数,就拿50ms来说,这是你想要的计时,意思是,对机器周期进行50000计数就可以得到我想要的,可T0是一个可以对机器周期能进行65536次计数,也就是说我想要的50MS不能让T0溢出,怎么办?那么先给这个定时器里面放些数,放多少,就是我们想要的50MS在加上一个多少就能等于65536,也就是65536和50000的差值,这个值就是我们说的初值。
为什么除以256,因为我们的计时器是两个8位组成的,那么要把那些差值装进这两个8位,那么低8位最多能装256个机器周期,那么256计满了就用高8位的,就是说低8位满一次高8位加1,那么高8位装多少,低8位就满了几次,算法就是用差值除一下256取其整数,剩下的,就是还剩了小于256次数的就放在低8位,就是差值的余数。如果我要放一个超过256的数,肯定是超过先放高八位,把剩下的部分放在低八位中了,TH0=(65536-50000)/256就是把TL0中放不下的部分放在THO中,再把剩下的部分放在TH0中。
该解释摘抄自:https://zhidao.baidu.com/question/172351721.html