单片机学习小组
直播中

旧念

9年用户 856经验值
擅长:可编程逻辑 电源/新能源 光电显示
私信 关注

定时/计数器的工作原理是什么

51中断系统是由哪些部分组成的?
定时/计数器的工作原理是什么?




回帖(1)

苏丹

2022-2-23 13:43:10
51中断系统的组成




定时/计数器的基本原理



逻辑开关闭合后,脉冲信号将对加1计数器充值。若计数器的容量为2 n (n为整数),则当数值达到满计数值后将产生溢出,使中断请求标志TFx(x为0或1)进位为1,同时加1计数器清零。
如果在启动计数之前将TFx清零,并将一个称为计数初值a的整数先置入加1计数器,则当观察到TFx为1时表明已经加入了(2n - a)个脉冲,如此便能计算出脉冲的的到达数量了。



  • 如果上述脉冲信号时来自单片机的外部信号,则可通过这一方法进行计数统计,即可作为计数器使用。
  • 如果上述脉冲信号是来自单片机内部的时钟信号,则由于单片机的振荡周期非常精准,故而溢出时统计的脉冲数便可换算成定时时间,因此可作为定时器使用

定时/计数器工作原理



系统时钟(系统内部振荡器)经12分频后的脉冲(即机器周期)(12分频为12除以频率)信号和来自外部引脚Tx的脉冲信号,通过逻辑
   

定时/计数器的结构



由上图可知,T0和T1分别由高8位和低8位两个特殊功能寄存器组成,即



  • T0由TH0(字节地址8CH)、TL0(字节地址8AH)
  • T1由TH1(字节地址8DH)、TL1(字节地址8BH)

定时/计数器的控制是通过两个特殊功能寄存器实现的,其中,



  • TMOD是定时/计数器的工作方式寄存器,由它确定定时/计数器的工作方式和功能


  • TCON是定时/计数器的控制寄存器,用于管理T0和T1的启停、溢出和中断


电路图




要求


D1~D8灯间隔1s闪烁

完整程序


#include
unsigned char t;
void main()
{
        TMOD=0x01;//0000 00|01|  M1=0,M0=1,定时器T0模式1,16位计数器
        EA=1;//中断总允许
        ET0=1;//定时器T0的中断开关
        TR0=1;//启动定时器0
        while(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 1100
        TH0=(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中。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分