80C51单片机的定时器/计数器介绍

定时器/计数器介绍
定时/计数器t0和t1分别是由两个8位的专用寄存器组成,即定时/计数器t0由th0和tl0组成,t1由th1和tl1组成。此外,其内部还有2个8位的特殊功能寄存器tmod和tcon,tmod负责控制和确定t0和t1的功能和工作模式,tcon用来控制t0和t1启动或停止计数,同时包含定时/计数器的状态。
tf1:定时器1溢出标志。定时/计数器溢出时由硬件置位。中断处理时由硬件清除。或用软件清除。
tf0:定时器0溢出标志。定时/计数器溢出时由硬件置位。中断处理时由硬件清除,或用软件清除。
在现在很多新mcu中,不只有两个 定时/计数器,例如stc15系列就有四个定时/计数器,但是在使用上操作上是大同小异的。
定时器内部框图和结构介绍
定时器/计数器有定时器0(简称t0),定时器1(简称t1),定时器方式寄存器tmod和定时器控制寄存器tcon四部分组成。该逻辑框图如下所示。
红线
tmod(工作方式寄存器):从该命名就可也知道,该寄存器控制的是选择哪一个定时器,t0或者t1。用什么方式,作为定时器使用,还是作为计数器使用。这个都将由tmod对应的位决定。
由tmod的2位的c/t和6位的c/t位决定。
蓝色
tcon(控制寄存器):控制寄存器的高四位负责管理定时器/计数器和中断申请,低四位则是负责与外部中断有关的设置。选择了定时器的工作方式之后,就需要由一个寄存器来允许它是否可以工作,tcon就是这个功能。
黄色
则是外部计数,外部每产生一个脉冲,计数器加1,当计数器都为一,产生一次溢出。由th0,tl0(值得是定时器0的高八位和低八位)或者th1,th0(值得是定时器1的高八位和低八位
进行累计。就比如需要一个计数器,则就需要由该io进行计数。
紫色
当定时器1和定时器0计数器累计加一,当计数器全为一的时候,长生一次溢出,向tcon中的tf0或者tf1置1。
绿色
由tcon向cpu申请中断。
黑色
则是外部中断直接向cpu进行中断申请;
寄存器介绍
工作方式寄存器tmod
gate:门控卫,当gate=0时候,只需要在软件上使tcon置tr0或者tr1为1,既可以启动定时器/计数器。当gate=1时,不仅需要在软件上使tcon置tr0或者tr1为1,还需要由外部中断引脚int0————或int1————为高电平的时候,才能启动定时器/计数器。
c/t-: 定时器/计数器选择位, c/t-=1时,为计数模式。c/t-=0时,为定时模式。
m1、m0:工作方式设置位。四种工作方式由m1、m0进行设置。如下表
控制寄存器
tcon的高四位用于控制定时/计数器的启动和中断申请。低四位与外部中断相关,在前面的中断中已经做了介绍。
tf1:t1中断溢出中断请求位。计数溢出时由硬件自动置tf1为1。cpu响应中断了之后,tf1由硬件自动清0。在t1工作的时候,cpu可以随时查询tf1的状态。
tr1:t1运行控制位。当tr1为1时,则表示t1开始工作。当tr1为0时,则表示t1停止工作。tr1需要由软件置1或者0;
tf0:t0中断溢出中断请求位。功能与tf1相同。
tr0: t0运行控制位。功能与tf1相同。
定时/计数器的工作方式
在新的8051结构的单片机中,2个定时/计数器都有四种工作模式,既通过tmod的m1和m0选择。但是在传统的intel 8051的单片机中,t0有四种工作方式(方式0、1、2、3),t1有三种工作方式(方式0、1、2),以上除了所使用的寄存器,有关的控制位,标志位不同外,在操作方式上是一样的。以下就以参见的工作方式1(既计数位数是16位)为例。
方式1
方式1的计数方式是16位,th0作为高八位, tl0作为第八位。其逻辑结构图如所示。组成了16位的加一计数器,计数个数和计数初值的关系为:
计数的初值在0 ~ 65535之间,计数范围为1~65536 。
例如,若要求定时器在t0 的工作模式下,定时时间为1ms。当晶振为6mhz的时,求送入th0和tl0的值。由于晶振为6mhz,所以该机械周期为=12/晶振频率,即为2us。
将x值写入th0和tl0时,分别将x值得高八位赋值给th0,第八位赋值给tl0,格式如下:
th0=(65536-5000)/256 //定时器的高八位赋值
tl0=(65536-5000)%256 //定时器的第八位赋值
所以一个该程序部分代码为:
tmod=0x01;th0=(65536-500)/256;tl0=(65536-500)%256;tf0=0;tr0=1使用方式1的工作模式,进行1s的延时,通过led的闪烁呈现出来。
写法一
#include typedef unsigned char u8;typedef unsigned int u16;sbit led=p2^0;void delay_1s(){ u8 num=0; tmod=0x01; tr0=1; while(1) { th0=(65536-18432)/256; tl0=(65536-18432)%256; num++; do { tf0=0; }while(!tf0); if (num==25) { num=0; break; } }}int main() { while(1) { led=~led; delay_1s(); } }写法二
#include typedef unsigned char u8;typedef unsigned int u16;sbit led=p2^0;u8 num;void tim0init(void){ tmod=0x01; //设置定时器0为工作方式0 th0=(65536-18432)/256; tl0=(65536-18432)%256; ea=1; //开总中断 et0=1; //开定时器中断 tr0=1; //启动定时器0}void t0_time() interrupt 1 { th0=(65536-18432)/256;//重装初值,如果不重装,中断只触发一次 tl0=(65536-18432)%256; num++;}/*interrupt 0 指明是外部中断0;interrupt 1 指明是定时器中断0; interrupt 2 指明是外部中断1;interrupt 3 指明是定时器中断1;interrupt 4 指明是串行口中断;函数名字可以随便起,但定时器0的中断号是固定为1的*/void main(){ tim0init(); while(1) { if(num==25) //如果到了25,说明一秒时间到 { num=0; led=~led; //让发光管状态取反 } }}

雷军:巨资定制小米11最顶级屏幕
Pinnacle Imaging Systems携手安森美半导体推出基于Xilinx技术低成本的HDR视频监控方案
斯巴鲁BRZ自动挡上手体验评测
芯片级封装有助于便携式医疗设备减小尺寸并减轻重量
基于多路单端反激式开关电源的设计方案
80C51单片机的定时器/计数器介绍
激光雷达传感器技术简介
GGII预测至2025年,中国储能锂电池出货量将达到58GWh
信号分列反射的具体表现
详解如何验证PAM编码千兆位级串行链路当信号
体声波技术改变MCU系统设计方式,让下一代工业和电信应用成为现实
远距离WiFi模块连接USB接口摄像头的演示操作说明,干货值得收藏!
智能变送器的优缺点
提高电动汽车采用率的高能效主驱逆变器方案解析
一文带您了解氢内燃机技术及发展历程
到底什么是SDWAN服务
华米发布了旗下首款组合型家庭健身设备
详细剖析汉云通信——人工智能语音交互系统
物联网设备是否都需要传感器技术
SIMATIC S7-1500 PLC加减计数器简述