1硬件连接定时器是单片机内部的特殊功能模块。
在控制系统中,常常要求有一些实时时钟以实现定时或者延时控制,如定时中断、定时检测、定时扫描等等,也往往要求有计数器,对外部事件进行计数。
要实现定时或者延时功能,一般有三种方法:软件定时,不可编程硬件定时,可编程硬件定时。
软件定时——让软件循环执行一段程序,程序本身并无执行目的,而是通过执行程序延时固定的时间,也就是以前的程序中经常使用的延时程序。这种方法降低了cpu的利用率。
不可编程硬件定时——如外部芯片555 时基电路,通过外部阻容,达到一定的延时功能,改变阻容大小可以改变延时长度。这种定时器取决于硬件,设定好以后不能通过软件更改。
可编程定时器——这种定时器的定时值可以通过软件确定和修改,使用灵活便捷。
本节所讲的定时器为第三种,可编程定时器,51单片机中t0/t1为2个相同的16位定时/计数器。
定时/计数器的结构:
图 1 定时/计数器的结构
tcon控制寄存器:
tcon用于控制外部中断和定时/计数器启动和中断,低4位用于控制外部中断,高4位用于控制定时/计数器t0和t1。
tcon.0~tcon.3(it0、ie0、it1、ie1)均为外部中断相关位,详见外部中断。
tr0(tcon.4):定时/计数器t0运行控制位。tr0=1时,t0开始工作;tr0=0时,t0停止工作。tr0由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。
tf0(tcon.5):定时/计数器t0溢出中断请求标志位。tf0=1时,申请进去定时器中断。t0计数溢出时由硬件自动置tf0为1。cpu响应中断后tf0由硬件自动清0。t0工作时,cpu可随时查询tf0的状态。所以,tf0可用作查询测试的标志。tf0也可以用软件置1或清0,同硬件置1或清0的效果一样。
tr1(tcon.6):定时/计数器t1运行控制位,其功能与tr0类同。
tf1(tcon.7):定时/计数器t1溢出中断请求标志位,其功能与tf0类同。
tmod模式控制寄存器:
图 3 tmod模式控制寄存器格式
tmod用于设置定时/计数器的工作方式,低四位用于t0,高四位用于t1
gate: 门控位。gate=0时,只要用软件使tcon中的tr0或tr1为1,就可以启动
定时/计数器工作;gata=1时,要用软件使tr0或tr1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。即此时定时器的启动多了一条件。
m1m0:工作方式设置位。定时/计数器有四种工作方式,由m1m0进行设置。
表1 定时/计数器工作方式表
2定时/计数器的工作方式一、方式0
方式0为13位计数,由tl0的低5位(高3位未用)和th0的8位组成。tl0的低5位溢出时向th0进位,th0溢出时,置位tcon中的tf0标志,向cpu发出中断请求。
图 4 方式0工作原理图
计数初值计算初值的公式为:
二、方式1
方式1的计数位数是16位,由tl0作为低8位、th0作为高8位,组成了16位加1计数器。
图 5 方式1工作原理图
计数个数与计数初值的关系为:
三、方式2
方式2为自动重装初值的8位计数方式。当tl0装满溢出时,系统自动将th0中的数值装给tl0,tlo重新开始计数。
图 6 方式2工作原理图
计数个数与计数初值的关系为:
四、方式3
方式3只适用于定时/计数器t0,定时器t1处于方式3时相当于tr1=0,停止计数。工作方式3将t0拆分成为两个独立的8位定时/计数器tl0和th0,两个计数器独立工作。
图 7 方式3工作原理图
计数个数与计数初值的关系为:
3定时器0#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit led=p1^2; //定义led端口/*------------------------------------------------ 定时器初始化子程序------------------------------------------------*/void init_timer0(void){ tmod |= 0x01; //使用模式1,16位定时器,使用|符号可以在使用多个定时器时不受影响 th0=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出 tl0=0x00; ea=1; //总中断打开 et0=1; //定时器中断打开 tr0=1; //定时器开关打开}/*------------------------------------------------ 主程序------------------------------------------------*/main(){ init_timer0(); while(1);}/*------------------------------------------------ 定时器中断子程序------------------------------------------------*/void timer0_isr(void) interrupt 1 using 1{ th0=0x00; //重新赋值 tl0=0x00; led=~led; //指示灯反相,可以看到闪烁}定时器0的程序代码
定时/计数器0 使用16位定时模式,计数初值为0,计数到65536 溢出,中断程序中led取反,led 以65536*2个时钟周期为周期闪烁。
计数个数与计数初值的关系为:
4定时器1#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit led=p1^3; //定义led端口/*------------------------------------------------ 定时器初始化子程序------------------------------------------------*/void init_timer1(void){ tmod |= 0x10; //使用模式1,16位定时器,使用|符号可以在使用多个定时器时不受影响 th1=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出 tl1=0x00; ea=1; //总中断打开 et1=1; //定时器中断打开 tr1=1; //定时器开关打开}/*------------------------------------------------ 主程序------------------------------------------------*/main(){ init_timer1(); while(1);}/*------------------------------------------------ 定时器中断子程序------------------------------------------------*/void timer1_isr(void) interrupt 3 using 1{ th1=0x00; //重新赋值 tl1=0x00; led=~led; //led闪烁}定时1的程序代码
5 产生1ms方波#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit out=p1^2; //定义out输出端口/*------------------------------------------------ 定时器初始化子程序------------------------------------------------*/void init_timer0(void){ tmod |= 0x01; //使用模式1,16位定时器,使用|符号可以在使用多个定时器时不受影响 th0=(65536-500)/256; //给定初值,这里使用定时器最大值从500开始计数一直到65535溢出 tl0=(65536-500)%256; //12m晶振计算指令周期1us,1ms方波半个周期500us,即定时500次 ea=1; //总中断打开 et0=1; //定时器中断打开 tr0=1; //定时器开关打开}/*------------------------------------------------ 主程序------------------------------------------------*/main(){ init_timer0(); while(1);}/*------------------------------------------------ 定时器中断子程序------------------------------------------------*/void timer0_isr(void) interrupt 1 using 1{ th0=(65536-500)/256; //重新赋值 tl0=(65536-500)*256; out=~out; //溢出然后输出端取反 //用示波器可看到方波输出}图 10 1ms方波的程序代码
示波器显示周期为1ms的方波信号。
6 产生多路不同频率的方波#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------ 定时器初始化子程序------------------------------------------------*/void init_timer0(void){ tmod |= 0x01; //使用模式1,16位定时器,使用|符号可以在使用多个定时器时不受影响 th0=(65536-500)/256; //给定初值,这里使用定时器最大值从500开始计数一直到65535溢出 tl0=(65536-500)%256; //12m晶振计算指令周期1us,1ms方波半个周期500us,即定时500次 ea=1; //总中断打开 et0=1; //定时器中断打开 tr0=1; //定时器开关打开}/*------------------------------------------------ 主程序------------------------------------------------*/main(){ init_timer0(); while(1);}/*------------------------------------------------ 定时器中断子程序------------------------------------------------*/void timer0_isr(void) interrupt 1 using 1{ static unsigned char i; th0=(65536-500)/256; //重新赋值 tl0=(65536-500)*256; i++; p1=i; //p1口8路输出不同频率,相当于一个分频器,高频用示波 //器测量,低频可以直接用led观测 //p1.0输出1ms方波,p1.1输出2ms,p1.2输出4ms,以此类推}图 11 多路不同频率方波的程序代码
中断部分,相当于一个分频器,在p1 口可以测量出8 路不同频率的方波。
p1 口测量不同频率方波,周期依次增大一倍。
荣耀HONORWatchMagic评测 能够充分满足生活中的各类需求
液晶电视的亮度
字节跳动旗下火山引擎自研的视频编解码芯片已出片
麒麟970和骁龙845到底有多大的差距
未来可期,中芯国际14nm贡献1%的营收
单片机定时/计数器的工作方式
CO的危害以及CO传感器的应用
曝Win10 v2004将有可视化UI出现在操作中心通知栏中 拟借助更人性化的调整变得更加友好
什么是测土配方施肥技术,它是如何做到精准测土的
MEC在自动驾驶领域的应用探讨
芯微AI芯片加持百度飞桨,携手加速AI应用落地
贝茵凯一次流片出三款大功率IGBT芯片,良率接近100%
无线连接技术领域龙头,布局这三大“黄金赛道”
34461A 6位半台式数字万用表的应用与特点
LG推出了具有旋转尺寸的独特双显示手机
美高森美提供用于电力线通信应用的高性能 HomePlug AV2 Class GH线路驱动器
芯文速读:高通骁龙8cx:首款7nmPC处理器,远超14nm酷睿和锐龙
国科微被授予“国家先进制造业集群核心企业”
MRAM与其他内存技术的相比,它具有的优势是什么
《流浪地球2》的冷思考:如何消除信息孤岛