51单片机定时器和计数器

8051单片机内部有两个定时/计数器t0及t1,具有定时和计数两种功能。t0及t1在计数过程中不需要cpu参与,也不影响cpu的其他工作。当计数溢出后,定时/计数器给出中断信号,申请cpu停止当前的工作,去处理预先设定的中断事件。
一、t1内部结构
定时器工作模式:对内部时钟信号计数。由于时钟频率是定值,所以可根据计数值计算出定时时间。
计数器工作模式:是对加在t1(p3.5)引脚上的外部脉冲进行计数。
二、计数功能计数器用于统计从to(p3.4)和tl(p3.5)两个引脚输入脉冲的负跳变数量。负跳变是指前一个机器周期采样为高电平,后一个机器周期为低电平。每输入一个脉冲负跳变,计数器加1。
输入脉冲的高电平与低电平至少应保持一个机器周期时间,以确保正确采样,因此输入脉冲的频率最高为单片机内部脉冲频率的一半。如果内部脉冲频率为1 mhz,则最高计数频率为0.5 mhz。
三、定时功能定时功能是单片机通过对内部机器脉冲信号计数实现的,计数值乘以机器周期就是相应的时间。例如,如果单片机采用12 mhz的晶振,则机器内部脉冲频率为1 mhz,则机器周期为1us,若共计数1000,则用时为1ms时间。
四、工作方式工作方式寄存器tmod
工作方式寄存器tmod用于控制定时/计数器的工作方式和工作模式,长度为一个字节,只能按字节整体赋值。
(1)ml和m0用于设置to(t1)的工作方式。
(2)c/t用于设置tro(tr1)是工作于计数器或定时器模式。
c/t—计数器模式和定时器模式选择位0:定时器工作模式,对单片机的晶体振荡器12分频后的脉冲进行计数。
1:计数器工作模式,计数器对外部输入引脚t0(p3.4)或t1(p3.5)的外部脉冲(负跳变)计数。
(3)gate(门控制位)用于设置to(t1)的启动方式。
gate—门控位。
0:仅由运行控制位trx(x =0,1)来控制定时器/计数器运行。
1:用外中断引脚int0(或int1 )上的电平与运行控制位trx共同来控制定时器/计数器运行。
例:设定时器1为定时工作方式,按方式2工作,定时器0为计数方式,按方式1工作,均由程序单独控制启动和停止,请给出tmod控制字。
解:
定时器1做定时器使用则d6=0;按方式2工作则d5=1,d4=0;由程序单独控制启停则d7=0 。定时器0做计数器使用则d2=1;按方式1工作则d0=0,d1=1;由程序单独控制启停则d3=0。因此命令字tmod的值应为00100101b,即25h。
定时器控制寄存器tcon (timer controller)
tcon也是8位寄存器,与tmod不同的是它可按位单独赋值,其各位的意义见下表。
1、tf1、tf0—计数溢出标志位。
当计数器计数溢出时,该位置“1”。
使用中断方式时,此位作为中断请求标志位,标志位由硬件自动清“0”。使用查询方式时,应注意查询有效后使用软件及时将该位清“0”。
2、tr1、tr0—计数运行控制位。
tr1位(或tr0位)=1,启动定时器/计数器工作的必要条件。
tr1位(或tr0位)=0,停止定时器/计数器工作。
4.1、工作方式0方式0是13位的定时/计数器,它由tl的低5位和th的8位构成。
4.2、工作方式1方式1是16位的定时/计数器,由th的8位和tl的8位构成。方式0和方式1的工作原理基本相同。
方式0和方式1的特点:
t1启动后,在tl1和th1中存储的计数初值基础上进行加“1”计数,直至溢出。溢出时t1寄存器被清零,tf1被置位,并申请中断。此后,若t1重新启动,则从零重新开始计数。若希望t1从某一数值开始计数,则应给计数器赋初值。
若所需计数长度为n,则计数初值x=2m-n(1≤n≤2m),其中当工作于方式0时,m=13,当工作于方式1时,m=16。在为计数器赋初值时,应将初值拆成高低两部分字节,分别送入tl1和th1。
实例:欲采用8051单片机控制8个led同时以1s为周期闪烁,设计电路原理图并编写程序。
设置定时/计数器的过程:
1)先初始化工作方式寄存器tmod
2)为定时/计数器赋初值
3)通过控制寄存器tcon中的tro或trl实现启动或停止。
#include // 将8051单片机头文件包含到文件中main(void ){ unsigned char counter; //设置无符号字符型变量,存储定时器中断次数。 tmod=0x01; //设t0为定时模式,由tr0控制启动和停止,且工作于方式1 th0=(65536-46083)/256; //初始化t0的高8位 tl0=(65536-46083)%256; //初始化t0的低8位 tf0=0; //初始化定时器溢出标志 p0=0xff; //关闭led counter=0; //从0开始计数 tr0=1; //启动定时器0 while(1) { while(tf0==1) //如果定时器溢出 { counter++; //计时次数加1 if(counter==20) //计时时间达到1s { p0=~p0; // p0所有位取反,使led闪烁 counter=0; //重新从0开始计数 } th0=(65536-46083)/256; //重新初始化t0的高8位 tl0=(65536-46083)%256; //重新初始化t0的低8位 tf0=0; //重新初始化定时器溢出标志 } }}方式0和方式1的特点:
t1启动后,在tl1和th1中存储的计数初值基础上进行加“1”计数,直至溢出。溢出时t1寄存器被清零,tf1被置位,并申请中断。此后,若t1重新启动,则从零重新开始计数。若希望t1从某一数值开始计数,则应给计数器赋初值。
若所需计数长度为n,则计数初值x=2m-n(1≤n≤2m),其中当工作于方式0时,m=13,当工作于方式1时,m=16。在为计数器赋初值时,应将初值拆成高低两部分字节,分别送入tl1和th1。
实例:欲采用8051单片机控制8个led同时以1s为周期闪烁,设计电路原理图并编写程序。
设置定时/计数器的过程:
1)先初始化工作方式寄存器tmod
2)为定时/计数器赋初值
3)通过控制寄存器tcon中的tro或trl实现启动或停止。
#include // 将8051单片机头文件包含到文件中main(void ){ unsigned char counter; //设置无符号字符型变量,存储定时器中断次数。 tmod=0x01; //设t0为定时模式,由tr0控制启动和停止,且工作于方式1 th0=(65536-46083)/256; //初始化t0的高8位 tl0=(65536-46083)%256; //初始化t0的低8位 tf0=0; //初始化定时器溢出标志 p0=0xff; //关闭led counter=0; //从0开始计数 tr0=1; //启动定时器0 while(1) { while(tf0==1) //如果定时器溢出 { counter++; //计时次数加1 if(counter==20) //计时时间达到1s { p0=~p0; // p0所有位取反,使led闪烁 counter=0; //重新从0开始计数 } th0=(65536-46083)/256; //重新初始化t0的高8位 tl0=(65536-46083)%256; //重新初始化t0的低8位 tf0=0; //重新初始化定时器溢出标志 } }4.3、工作方式2方式2的特点是能自动加载计数初值。16位计数器被分为两部分,以tl0作为计数器,以th0作为存储器。初始化时把计数初值分别加载至tl0和th0中,当计数溢出时,由存储器th0自动给计数器tl0加载计数初值。若所需计数长度为n,则计数初值x=28-n(1≤n≤256)。
实例:下图是产品包装生产线的计数系统,每个产品经过计数装置时由机械杆碰合按键s1一次。当第一次计满一包(5个)则d1亮,计满第二包则d2亮…,计满第八包则d1~d8全亮,八包包装成一箱,此后重复以上过程。编写程序实现此功能。
#include // 包含51单片机寄存器定义的头文件unsigned char counter; //计数初值main(void ){ tmod=0x60; //使用t1的工作方式2 th1=256-5; // t1的高8位赋初值 tl1=256-5; // t1的低8位赋初值 counter=0; tr1=1; //启动t1 while(1) { while(tf1==1) //如果计满 { tf1=0; //计数器溢出后,将tf1清0 counter++; //计数加1 switch (counter) //检查中断计数值 { case 1: p0=0xfe; break; //则第1个灯亮 case 2: p0=0xfd; break; //第2个灯亮 case 3: p0=0xfb; break; //第3个灯亮 case 4: p0=0xf7; break; //第4个灯亮 case 5: p0=0xef; break; //第5个灯亮 case 6: p0=0xdf; break; //第6个灯亮 case 7: p0=0xbf; break; //第7个灯亮 case 8: p0=0x00; counter=0; break; //8个灯全亮 } } } }4.4、工作模式3to被拆成两个独立的8位计数器tlo和tho,tl0独占t0的各控制位、引脚和中断源,既可以用作定时器也可作计数器。th0只能作为定时器使用,且需要占用t1的控制位tr1和tf1实现启停和中断。
两个定时/计数器的使用方法与方式0或1相似。工作方式3只适用于t0,不适用于t1。若将t1强行设置为模式3,将使t1立即停止计时或计数,相当于使tr1=0。
当t0作方式3时,t1仍可以设置为除工作方式3外的其它工作方式,但由于它的tr1和tf1已被t0占用,因此无法按正常计时/计数器工作,常用于串行通信时的波特率发生器,以控制传输数据的速度。
单片机的p0口接了8个发光二极管,要求使用定时器t0中断实现流水灯操作,流水频率为每0.5秒钟更替一次(假设单片机外接11.0592mhz的晶振)。
#includeunsigned char cnt=0; //用于中断次数计数unsigned char led =0xfe; //初始化流水灯int main(void){ tmod=0x01; //16位定时方式 th0=(65536-46083)/256; //初始化t0的高8位 tl0=(65536-46083)%256; //初始化t0的低8位 ea=1; et0=1; //开中断 tr0=1; //启动t0工作 while(1);}void t0_int(void) interrupt 1 { cnt++; if( cnt==10 ) //0.5秒钟的时间到了 { cnt=0; //清除次数统计 led =(led <<1)|1; //更新流水灯数据 if(led ==0xff) { led =0xfe; } p0=led; //显示流水灯 } th0=(65536-46083)/256; //初始化t0的高8位 tl0=(65536-46083)%256; //初始化t0的低8位}

格力的工业机器人已达国际水平,为将来工业机器人制造奠定了基础
Linux进程基础
来看看人工智能最火爆的应用有哪些
一千元以下的手机这五款性价比超值!性能首选红米note4x!
石墨烯+C60+六方氮化硼=未来的晶体管=不会碎屏幕的智能设备
51单片机定时器和计数器
谈谈电容器的元件基础
赛灵思应用简介
红旗定制版华为P40披露,或将进行采用全新设计
折叠屏概念如此火热那么折叠屏手机值得购买吗
5G+高清监控的价值有多大
VR未来趋势预测:2.0时代或将迎来这五大改变
造车新势力“四小龙”成形 传威马汽车拟登陆科创板
2018年将为全球供应链数码化分水岭
中国电信发布天翼对讲3.0平台
圈内热点┃智能穿戴物联网2.0时代的机遇与挑战
未来过十字路口时,自动驾驶车辆无需减速或停车
第六期(上海)半导体交流会丨主题公布
用笔记本也需有“本”事
人工智能会让画家提前下岗吗