C51单片机04(定时器)讲解

合集下载

C51定时器计数器

C51定时器计数器

TH1=0x63;
EA=1;
TL1=0x18;
ET1=1;
}
三、定时器/计数器工作方式
2、工作方式1 ➢M1M0= 01? 作定时器:TMOD= 0?0000001=0x01 作计数器:TMOD= 0?0000101=0x05
➢16位计数器 TH:8位 TL:8位
三、定时器/计数器工作方式
2、工作方式1
16位计数器,逻辑结构框图如下:
振荡器 ÷12 C/T=0
T0 TR0
GATE INT0端
C/T=1 &
l ≥l
控制
TH0 TL0
(8位) (8位)
TF0
EA
&
ET0
中断 &
方式1使用范例
例1:已知单片机晶振频率6MHz,利用T0的方 式1在P1.0引脚输出周期为500us的方波
例2:单片机晶振频率12MHz,利用T1的方式1 实现1s延时,每隔1s时间P1.0引脚翻转一次
T0和T1的设置和使用不同
4.工作方式3
振荡器 ÷12 C/T=0
T0端
GATE INT0端
C/T=1TR0Leabharlann &l ≥l
振荡器 ÷12
仅作定时 TR1 器用!
控制
TL0 (8位)
T0中断
TF0
&
EA & ET0
控制
TH0 (8位)
TF1 T1中断
4、工作方式3
fosc T0 TR0 GATE INT0
2、定时/计数器的工作原理
振荡器 ÷12 C/T=0
TX端
C/T=1
加1 计数器
TFx
申请 中断

51单片机定时器的使用和详细讲解__特别是定时器2

51单片机定时器的使用和详细讲解__特别是定时器2

2021/7/1
23
图8-7 方式3结构图
2021/7/1
24
T0和T1的应用举例
例 若fOSC=26.67MHz,T1工作于方式1,产生45ms的定 时中断,TF1为其中断源标志。试编写主程序和中断服务 程序,使P1.0产生周期为90ms的方波。(忽略中断响应 时间和指令执行时间)
解:
让P1.0每45ms取反一次即可实现。定时器的单次定时时间 不可能达到45ms,如果设定16位的工作模式1,最大定时 时间也才为4.9152ms。
2021/7/1
5
XC866单片机有三个16位的定时器——定时器0、 定时器1和定时器2。
定时器0、1各具有四种工作模式;定时器2有两 种工作模式。
定时器0、1和定时器2的任何一种工作模式均可 通过程序对相应寄存器进行设置来选择。
定时器在定时时间到时,可以由程序决定是否产 生中断请求信号,进而判断是否执行中断程序。
具体应用步骤:
1)根据需要的定时时间,结合单片机的晶振频率, 计算出寄存器的初始值
2)根据需要开中断
3)启动定时器
若已规定用软件启动,则可把TR0、TR1或TR2置“1”; 若已规定由外中断引脚电平启动,则需给外引脚步加启动 电平。当实现了启动要求后,定时器即按规定的工作方式 和初值开始计数或定时。
在工作模式2中,定时器的定时时间由下式确定:
T(25 -X 6)Tcy
只有T0可工 作于此模式
2021/7/1
21
模式2的结构图如图8-6所示。
8位加法 计数器
2021/7/1
图8-6 方式2结构图
初值寄 存器
22
4.工作模式3
当T0M(T1M)=11时定时器设定为工作模式3,只有定 时器0可以工作在工作模式3下。如把定时器1设置为工 作模式3,则定时器1停止工作。

C51单片机定时计数器应用编程归纳总结

C51单片机定时计数器应用编程归纳总结

C51 T and C● 80C51单片机内部有两个定时/计数器T0和T1,其核心是计数器,基本功能是加1。

● 对外部事件脉冲(下降沿)计数,是计数器;对片内机周脉冲计数,是定时器。

● 计数器由二个8位计数器组成。

● 定时时间和计数值可以编程设定,其方法是在计数器内设置一个初值,然后加1计满后溢出。

调整计数器初值,可调整从初值到计满溢出的数值,即调整了定时时间和计数值。

● 定时/计数器作为计数器时,外部事件脉冲必须从规定的引脚Tx(P3.4、P3.5)输入。

且外部脉冲的最高频率不能超过时钟频率的1/24一、定时/计数器的结构定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。

TMOD 是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON 是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。

二、定时/计数器的工作原理加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。

每来一个脉冲计数器加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON 中TF0或TF1置1,向CPU 发出中断请求(定时/计数器中断允许时)。

如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。

可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。

设置为定时器模式时,加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数频率为晶振频率的1/12)。

计数值N 乘以机器周期Tcy 就是定时时间t 。

设置为计数器模式时,外部事件计数脉冲由T0或T1引脚输入到计数器。

在每个机器周期的S5P2期间采样T0、T1引脚电平。

当某周期采样到一高电平输入,而下一周期又采样到一低电平时,则计数器加1,更新的计数值在下一个机器周期的S3P1期间装入计数器。

由于检测一个从1到0的下降沿需要2个机器周期,因此要求被采样的电平至少要维持一个机器周期。

51单片机定时器的使用和详细讲解__特别是定时器2 PPT

51单片机定时器的使用和详细讲解__特别是定时器2 PPT

T1
T0
00:模式0
方式 01:模式1 方式
选择
10:模式2 11:模式3
选择
图8-2 模式寄存器组成
3.控制寄存器(TCON)
TCON高4位用于控制定时器0、1的运行;低4位用于控 制外部中断,与定时器无关。
定时器0、1运行控 制位TR0(TR1): TR0(TR1)=1 启动 TR0(TR1)=0 停止
T0加法计数器的高8位和低8位分别用TH0、TL0表 示
T1加法计数器的高8位和低8位分别用TH1、TL1 表示
高8位和第8为可分别单独使用
当定时器工作时,加法计数器对内部机器周期脉 冲Tcy计数。
Tcy
2.模式寄存器(TMOD)
TMOD用来选择定时器0、1的工作模式,低4位 用于定时器0,高4位用于定时器1,其组成如图 8-2所示。
专用硬件电路定时:可实现精确的定时和计数,但参数 调节不便。
可编程定时器/计数器:不占用CPU时间,能与CPU并行 工作,实现精确的定时和计数,又可以通过编程设置其 工作方式和其它参数,因此使用方便。
定时器的基本工作原理是:利用计数器对固定周 期的脉冲计数,通过寄存器的溢出来触发中断。
具体应用步骤:
51单片机定时器的使用和详细讲解__特别 是定时器2
章节概述 很棒
8.1 概述 8.2 定时器T0和T1的结构 8.3 定时器工作模式 8.4 定时器T2
8.1 概述
定时器是单片机的重要功能模块之一,在检测、 控制领域有广泛应用。
定时器常用作定时时钟,以实现定时检测、定 时响应、定时控制,并且可用于产生ms宽的 脉冲信号,驱动步进电机
加法计数器对机器周期脉冲Tcy计数,每个机器周 期TL0加1。

第5章定时器计数器的C51编程

第5章定时器计数器的C51编程

5.1.1
结构
• 计数功能: • 是指对外部事件进行计数:计数信号来 自T0(P3.4)、T1(P3.5)引脚。 • 定时功能: • 也是通过计数器的计数功能来完成的, 不过此时的计数脉冲来自单片机内部: 机器周期。
5.1.2
控制寄存器
• 与定时器/计数器应用有关的控制寄存 器有2个,分别为TCON、TMOD、TH、TL。
3.模式2:
计数与定时范围:
• • • • • • • • • • 计数器的计数值范围是:1~256(28) 当为计数器工作方式时: 计数器的初值范围为:0~28-1; 当为定时工作方式时: 定时时间=(28-计数初值)×定时周期 若晶振频率为12MHz,其定时周期1μs: 则最短定时时间为: Tmin=[28-(28-1)] ×1μs =1(μs) 最长定时时间为: Tmax=(28-0) ×1μs =256(μs)
模式2:
• • • • • •
TMOD=0x06; TH0=-100; TL0=-100; EA=1; ET0=1; TR0=1;
【例5-2】定时器工作方式初始化示例:
• 外接晶振频率fosc=12MHz,T1工作于定 时方式,且允许中断,定时时间为20ms, 令其工作在模式1。
• • • • • • TMOD=0x01; //设置定时器工作方式 TH0=(65536-20000)/256; //高8位TH0赋初值 TL0=(65536-20000)%256; //低8位TL0赋初值 ET0=1; //开计数器中断 EA=1; TR0=1; //启动计数器
【例5-1】计数器工作方式初始化示例:
• 定时器/计数器0工作于计数方式,且允 许中断,计数值n=100,分别令其工作 在模式1和模式2,初始化编程。 • 模式1:

51单片机 定时器 c语言

51单片机 定时器 c语言

51单片机定时器 c语言51单片机是目前较为流行的一种单片机芯片,定时器是其重要的功能之一,可以用于实现各种定时任务,而c语言则是51单片机常用的编程语言之一。

下面将结合实例,阐述51单片机定时器在c语言中的使用方法。

一、引入头文件及定义定时器首先需要引入头文件“reg51.h”,然后需要定义一个定时器变量和一个计数变量。

在本文中,我们将使用定时器0,所以定义如下:```c#include<reg52.h>sbit led = P2^0; //定义led信号端口P2.0unsigned char count = 0; //计数变量unsigned char timerVal = 56; //定时器初值```需要注意的是,定时器初值的计算方法如下:$$定时器初值 = 256 - \frac{所需延时时间× 晶振频率}{12}$$在本例中,晶振频率为11.0592MHz,所需延时时间为0.001秒,则计算得到定时器初值为56。

二、设置定时器参数设置定时器参数前,需要先关闭定时器0。

设置完成后,再通过TR0位将定时器0启动。

```cvoid initTimer(){TMOD &= 0xF0; //定时器0, 方式1TMOD |= 0x01;TH0 = timerVal; //定时器初值高位TL0 = timerVal; //定时器初值低位ET0 = 1; //打开定时器0中断EA = 1; //打开总中断}void main(){initTimer(); //初始化定时器0while(1){if(count >= 100){led = !led; //LED翻转count = 0; //计数器清零}}}void timerHandler() interrupt 1{TH0 = timerVal;TL0 = timerVal;count++; //计数器+1}```在上述代码中,通过设置TMOD寄存器,将定时器工作在方式1。

51单片机定时器实验内容

51单片机定时器实验内容

51单片机定时器实验内容
51单片机定时器实验的内容可以根据不同的需求和目的进行调整,以下是
一些可能的实验内容:
1. 定时器初始化实验:实验目标是了解如何初始化51单片机的定时器,包括设置定时器的工作模式、计数值、初始值等。

实验中可以编写代码,让定时器在初始化后自动开始计时,并在达到指定时间后产生中断或输出信号。

2. 定时器中断实验:实验目标是了解如何使用51单片机的定时器中断功能,实现定时器在达到指定时间后自动触发中断,并在中断服务程序中执行特定的操作。

实验中可以编写代码,让定时器在达到指定时间后自动进入中断服务程序,并在其中执行特定的操作,如点亮LED灯等。

3. 定时器PWM输出实验:实验目标是了解如何使用51单片机的定时器PWM输出功能,实现定时器输出PWM波形。

实验中可以编写代码,让定时器输出不同占空比的PWM波形,并通过调整占空比来控制LED灯的亮
度等。

4. 定时器与外部事件同步实验:实验目标是了解如何使用51单片机的定时器与外部事件同步,实现定时器在外部事件发生时自动开始计时或停止计时。

实验中可以编写代码,让定时器在外部事件发生时自动开始计时或停止计时,并在达到指定时间后执行特定的操作。

以上是一些常见的51单片机定时器实验内容,通过这些实验可以深入了解51单片机的定时器工作原理和用法,并提高编程技能和硬件控制能力。

51单片机的定时器_计数器的C51编程

51单片机的定时器_计数器的C51编程

51单片机的定时器_计数器的C51编程相关知识点:1、单片机的定时器/计数器,实质是按一定时间间隔、自动在系统后台进行计数的。

2、当被设定工作在定时器方式时,自动计数的间隔是机器周期(12个晶振振荡周期),即计数频率是晶振振荡频率的1/12;3、当定时器被启动时,系统自动在后台,从初始值开始进行计数,计数到某个终点值时(方式1时是65535),产生溢出中断,自动去运行定时中断服务程序;注意,整个计数、溢出后去执行中断服务程序,都是单片机系统在后台自动完成的,不需要人工干预!4、定时器的定时时间,应该是(终点值-初始值)x机器周期。

对于工作在方式1和12MHz时钟的单片机,最大的计时时间是(65535-0)x1uS=65.535ms。

这个时间也是一般的51单片机定时器能够定时的最大定时时间,如果需要更长的定时时间,则一般可累加多定时几次得到,比如需要1秒的定时时间,则可让系统定时50ms,循环20次定时就可以得到1s的定时时间。

5、定时器定时得到的时间,由于是系统后台自动进行计数得到的,不受主程序中运行其他程序的影响,所以相当精确;6、使用定时器,必须先用TMOD寄存器设定T0/T1的工作方式,一般设定在方式1的情况比较多,所以可以这样设定:TMOD=0x01(仅设T0为方式1,即16位)、TMOD=0x10(仅设T1为方式1,即16位)、TMOD=0x11(设T0和T1为方式1,即都为16位)。

7、使用定时器,必须根据需要的定时时间,装载相应的初始值,而且在中断服务程序中,很多情况下得重新装载初始值,否则系统会从零开始计数而引起定时失败;8、要使用定时器前,还必须打开总中断和相应的定时中断,并启动之:EA=1(开总中断)、ET0=1(开定时器0中断)、TR0=1(启动定时器0)、ET1=1(开定时器1中断)、TR1=1(启动定时器1);9、注意中断服务程序尽可能短小精干,不要让它完成太多任务,尤其尽量避免出现长延时,以提高系统对其他事件的响应灵敏度.//定时器基本例程-1(未使用定时器,一个灯每隔500ms亮灭一次)//这是个特意安排的例程,以便与下面的例程2进行对比#include <reg52.h>sbit led=P2^7;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led=1; //上电初始化,led灯不亮while(1){led=!led;delay_ms(500);}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------//定时器基本例程-2(使用定时器,一个灯每隔500ms亮灭一次)#include <reg52.h>sbit led=P2^7;unsigned char num;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led=1; //上电初始化,led灯不亮TMOD=0x01; //设定定时器0为工作方式1TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL0=(65536-50000)%256; //EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0while(1){delay_ms(8000);}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void led_flash() interrupt 1 //使用了定时中断0的led闪烁子函数{ TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000 TL0=(65536-50000)%256; //num++;if(num==10){num=0;led=!led;}}////定时器基本例程-3//(使用定时器T1,单片机整个口接的8个灯每隔500ms亮灭一次)#include <reg52.h>#define led_port P0 //宏定义,具体的端口尽量不要出现在主函数和主函数中unsigned char num;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led_port=0xff; //上电初始化,所有led灯不亮TMOD=0x10; //设定定时器1为工作方式1(16位方式)TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //EA=1; //开总中断ET1=1; //开定时器1中断TR1=1; //启动定时器1while(1){delay_ms(8000); //这句表明定时中断的运行是在系统后台自动运行的,不需要主函数“操心”}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void led_flash() interrupt 3 //使用了定时中断1的8灯闪烁子函数{ TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //num++; //计数if(num==10) //计够10次,时间就是10x50ms=500ms{num=0; //清零,以便进行下一次500ms的10次计数led_port=~led_port; //整个口接的led灯亮灭状态翻转}}//-------------------------------------------------//定时器基本例程-4//(同时使用定时器T0和定时器T1,单片机某个口的灯和某个口接的8个灯每隔500ms亮灭一次)#include <reg52.h>sbit led=P2^7;#define led_port P0 //宏定义,具体的端口尽量不要出现在主函数和主函数中unsigned char num_0,num_1;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led=1; //上电初始化,led灯不亮led_port=0xff; //上电初始化,该口所有led灯不亮TMOD=0x11; //设定定时器0和定时器1都为工作方式1(16位方式)TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL0=(65536-50000)%256; //TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0ET1=1; //开定时器1中断TR1=1; //启动定时器1while(1){delay_ms(8000); //这句表明定时中断的运行是在系统后台自动运行的,不需要主函数“操心”}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void led_flash() interrupt 1 //使用了定时中断0的led闪烁子函数{ TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL0=(65536-50000)%256; //num_0++; //计数if(num_0==10) //计够10次,时间就是10x50ms=500ms{num_0=0; //清零,以便进行下一次500ms的10次计数led=!led; //led灯亮灭状态翻转}}//-------------------------------------------------void led_all_flash() interrupt 3 //使用了定时中断1的8灯闪烁子函数{ TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //num_1++; //计数if(num_1==10) //计够10次,时间就是10x50ms=500ms{num_1=0; //清零,以便进行下一次500ms的10次计数led_port=~led_port; //整个口接的led灯亮灭状态翻转}}//-------------------------------------------------//定时器基本例程-5//设定定时器T0工作在方式1的计数应用状态,//单片机T0口(P3.4)接一个按键充当外部脉冲源,//系统对进来的脉冲(每按一次键得一脉冲)进行计数,//计数的结果用接在单片机P0口的8个LED灯表示出来//(大家也可以改成用1602LCD来显示,这样更直观)//广西民大物电学院李映超2010年4月14日#include <reg52.h>#define led_port P0 //宏定义,具体的端口尽量不要出现在主函数和主函数中//=================================================void main(){TMOD=0x05; //设定定时器0为工作方式1、计数器TH0=0; //清零TL0=250; //TR0=1; //启动定时器0进行计数while(1){led_port=TL0; //将计数结果送去显示(用8个LED灯显示),//这里仅显示16位计数器的低8位}}定时器0仍旧工作在计数器状态,增加定时器1工作在定时状态,得到1s的定时时间,定时时间到后,将定时器0计数得到的脉冲数去显示,则这个脉冲数就是所输入的外部信号的频率,从而构成一个简单而准确的频率计!!不过,这个简单的“频率计”能够计量的信号频率(脉冲数),受单片机中断响应速度的影响,一般只能达到单片机系统时钟晶振的1/24,所以要能够测量更高的频率,必须使用前置分频器,对更高频率的待测输入信号进行预分频!。

单片机定时器的使用-讲义

单片机定时器的使用-讲义

工作方式0和工作方式1的最大特点就是计数溢出后, 计数器为全0,因而循环定时或循环计数应用时就存在 反复设置初值的问题,这给程序设计带来许多不便,同 时也会影响计时精度。
工作方式2就针对这个问题而设置,它具有自动重 装载功能,即自动加载计数初值,所以也称为自动重加 载工作方式。
在这种工作方式中,16位计数器分为两部分, 即以TL0为计数器,以TH0作为预置寄存器,初始化 时把计数初值分别加载至TL0和TH0中,当计数溢出 时,不再象方式0和方式1那样需要“人工干预”,由 软件重新赋值,而是由预置寄存器TH以硬件方法自 动给计数器TL0重新加载。
6.1 定时器/计数器的结构及工作原理
定时器/计数器: Timer/Counter
本质上都是加法计数器,当对固定周期的脉冲信号 计数时是定时器,对脉冲长度不确定的信号计数时是计 数器。
每接收到一个计数脉冲,加法计数器的值就加一, 当计满时发生溢出,并从0开始继续计数。
加法计数器的计满溢出信号就是定时/计数器的输出, 该信号使TCON的某位(TF0或TF1位)置一,作为定时 器/计数器的溢出中断标志。
由于TL0既能作定时器也能作计数器使用,而 TH0只能作定时器使用而不能作计数器使用,因此在 方式3模式下,定时/计数器0可以构成二个定时器或 者一个定时器和一个计数器。
如果定时/计数器0工作于工作方式3,那么定时/ 计数器1的工作方式就不可避免受到一定的限制,因 为自己的一些控制位已被定时/计数器借用,只能工 作在方式0、方式1或方式2下,如果设置T1工作在方 式3,则T1停止工作,相当于其他方式时令TR1=0。
C/T位:计数器模式和定时器模式的选择位。
C/T=0,为定时器模式,内部计数器对晶振脉冲12分频 后的脉冲计数,该脉冲周期等于机器周期,所以可以理 解为对机器周期进行计数。从计数值可以求得计数的时 间,所以称为定时器模式。

51定时器的使用流程

51定时器的使用流程

51定时器的使用流程1. 引言在嵌入式系统设计中,定时器是非常重要的模块之一。

而51系列单片机中的定时器,可以帮助我们实现各种定时任务。

本文将介绍51定时器的使用流程,以帮助大家更好地理解和应用这一功能。

2. 51定时器的种类51单片机中,常用的定时器包括定时器0和定时器1。

其中,定时器0是一个8位定时器,而定时器1是一个16位定时器。

它们各自有不同的特点和应用场景。

3. 51定时器的工作原理51定时器的工作原理是通过计数器来实现的。

定时器会根据设定的预分频值、初始计数值以及工作模式进行计数,并在计数满足条件时产生中断或输出相应的事件。

4. 51定时器的使用步骤使用51定时器通常需要以下几个步骤:4.1 设置预分频值定时器的预分频值决定了计数器的工作频率,可以通过寄存器配置来设置。

常见的预分频值有12、4、2以及不分频。

4.2 设置初始计数值定时器的初始计数值决定了定时器开始计数的起点。

可以通过寄存器配置来设置初始计数值。

4.3 选择工作模式定时器的工作模式有多种,可以根据具体需求选择。

常见的工作模式包括定时模式、计数模式以及自动重装模式。

4.4 启动定时器在配置好预分频值、初始计数值和工作模式之后,我们需要将定时器启动。

通过设置相应的寄存器来启动定时器即可。

4.5 处理定时器中断如果我们需要在定时器满足条件时产生中断,我们还需要编写中断服务程序来处理定时器中断。

5. 51定时器的应用场景51定时器在嵌入式系统设计中有广泛的应用。

一些典型的应用场景包括:•测量时间间隔:通过定时器,可以方便地测量两个事件之间的时间间隔。

•脉冲计数器:通过定时器,可以实现脉冲的计数,并根据计数结果进行相应的处理。

•定时触发器:通过定时器,可以实现定时触发某一事件或任务。

•PWM生成器:通过定时器的占空比控制功能,可以生成脉冲宽度调制信号。

6. 总结本文介绍了51定时器的使用流程,包括了定时器的种类、工作原理、使用步骤以及应用场景。

51单片机的定时器_计数器的C51编程

51单片机的定时器_计数器的C51编程

51单片机的定时器_计数器的C51编程相关知识点:1、单片机的定时器/计数器,实质是按一定时间间隔、自动在系统后台进行计数的。

2、当被设定工作在定时器方式时,自动计数的间隔是机器周期(12个晶振振荡周期),即计数频率是晶振振荡频率的1/12;3、当定时器被启动时,系统自动在后台,从初始值开始进行计数,计数到某个终点值时(方式1时是65535),产生溢出中断,自动去运行定时中断服务程序;注意,整个计数、溢出后去执行中断服务程序,都是单片机系统在后台自动完成的,不需要人工干预!4、定时器的定时时间,应该是(终点值-初始值)x机器周期。

对于工作在方式1和12MHz时钟的单片机,最大的计时时间是(65535-0)x1uS=65.535ms。

这个时间也是一般的51单片机定时器能够定时的最大定时时间,如果需要更长的定时时间,则一般可累加多定时几次得到,比如需要1秒的定时时间,则可让系统定时50ms,循环20次定时就可以得到1s的定时时间。

5、定时器定时得到的时间,由于是系统后台自动进行计数得到的,不受主程序中运行其他程序的影响,所以相当精确;6、使用定时器,必须先用TMOD寄存器设定T0/T1的工作方式,一般设定在方式1的情况比较多,所以可以这样设定:TMOD=0x01(仅设T0为方式1,即16位)、TMOD=0x10(仅设T1为方式1,即16位)、TMOD=0x11(设T0和T1为方式1,即都为16位)。

7、使用定时器,必须根据需要的定时时间,装载相应的初始值,而且在中断服务程序中,很多情况下得重新装载初始值,否则系统会从零开始计数而引起定时失败;8、要使用定时器前,还必须打开总中断和相应的定时中断,并启动之:EA=1(开总中断)、ET0=1(开定时器0中断)、TR0=1(启动定时器0)、ET1=1(开定时器1中断)、TR1=1(启动定时器1);9、注意中断服务程序尽可能短小精干,不要让它完成太多任务,尤其尽量避免出现长延时,以提高系统对其他事件的响应灵敏度.//定时器基本例程-1(未使用定时器,一个灯每隔500ms亮灭一次)//这是个特意安排的例程,以便与下面的例程2进行对比#include <reg52.h>sbit led=P2^7;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led=1; //上电初始化,led灯不亮while(1){led=!led;delay_ms(500);}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------//定时器基本例程-2(使用定时器,一个灯每隔500ms亮灭一次)#include <reg52.h>sbit led=P2^7;unsigned char num;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led=1; //上电初始化,led灯不亮TMOD=0x01; //设定定时器0为工作方式1TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL0=(65536-50000)%256; //EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0while(1){delay_ms(8000);}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void led_flash() interrupt 1 //使用了定时中断0的led闪烁子函数{ TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000 TL0=(65536-50000)%256; //num++;if(num==10){num=0;led=!led;}}////定时器基本例程-3//(使用定时器T1,单片机整个口接的8个灯每隔500ms亮灭一次)#include <reg52.h>#define led_port P0 //宏定义,具体的端口尽量不要出现在主函数和主函数中unsigned char num;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led_port=0xff; //上电初始化,所有led灯不亮TMOD=0x10; //设定定时器1为工作方式1(16位方式)TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //EA=1; //开总中断ET1=1; //开定时器1中断TR1=1; //启动定时器1while(1){delay_ms(8000); //这句表明定时中断的运行是在系统后台自动运行的,不需要主函数“操心”}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void led_flash() interrupt 3 //使用了定时中断1的8灯闪烁子函数{ TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //num++; //计数if(num==10) //计够10次,时间就是10x50ms=500ms{num=0; //清零,以便进行下一次500ms的10次计数led_port=~led_port; //整个口接的led灯亮灭状态翻转}}//-------------------------------------------------//定时器基本例程-4//(同时使用定时器T0和定时器T1,单片机某个口的灯和某个口接的8个灯每隔500ms亮灭一次)#include <reg52.h>sbit led=P2^7;#define led_port P0 //宏定义,具体的端口尽量不要出现在主函数和主函数中unsigned char num_0,num_1;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led=1; //上电初始化,led灯不亮led_port=0xff; //上电初始化,该口所有led灯不亮TMOD=0x11; //设定定时器0和定时器1都为工作方式1(16位方式)TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL0=(65536-50000)%256; //TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0ET1=1; //开定时器1中断TR1=1; //启动定时器1while(1){delay_ms(8000); //这句表明定时中断的运行是在系统后台自动运行的,不需要主函数“操心”}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void led_flash() interrupt 1 //使用了定时中断0的led闪烁子函数{ TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL0=(65536-50000)%256; //num_0++; //计数if(num_0==10) //计够10次,时间就是10x50ms=500ms{num_0=0; //清零,以便进行下一次500ms的10次计数led=!led; //led灯亮灭状态翻转}}//-------------------------------------------------void led_all_flash() interrupt 3 //使用了定时中断1的8灯闪烁子函数{ TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //num_1++; //计数if(num_1==10) //计够10次,时间就是10x50ms=500ms{num_1=0; //清零,以便进行下一次500ms的10次计数led_port=~led_port; //整个口接的led灯亮灭状态翻转}}//-------------------------------------------------//定时器基本例程-5//设定定时器T0工作在方式1的计数应用状态,//单片机T0口(P3.4)接一个按键充当外部脉冲源,//系统对进来的脉冲(每按一次键得一脉冲)进行计数,//计数的结果用接在单片机P0口的8个LED灯表示出来//(大家也可以改成用1602LCD来显示,这样更直观)//广西民大物电学院李映超2010年4月14日#include <reg52.h>#define led_port P0 //宏定义,具体的端口尽量不要出现在主函数和主函数中//=================================================void main(){TMOD=0x05; //设定定时器0为工作方式1、计数器TH0=0; //清零TL0=250; //TR0=1; //启动定时器0进行计数while(1){led_port=TL0; //将计数结果送去显示(用8个LED灯显示),//这里仅显示16位计数器的低8位}}定时器0仍旧工作在计数器状态,增加定时器1工作在定时状态,得到1s的定时时间,定时时间到后,将定时器0计数得到的脉冲数去显示,则这个脉冲数就是所输入的外部信号的频率,从而构成一个简单而准确的频率计!!不过,这个简单的“频率计”能够计量的信号频率(脉冲数),受单片机中断响应速度的影响,一般只能达到单片机系统时钟晶振的1/24,所以要能够测量更高的频率,必须使用前置分频器,对更高频率的待测输入信号进行预分频!。

51单片机定时器详细全解.上

51单片机定时器详细全解.上

51单片机定时器详细全解.上看了很多几本单片机的书,对51定时器的认识又有了一些新的变化。

开局一张图(一个简单的单片机程序),其实文章也是来解释这个代码的写法。

在此,后面也会对STC官方的库,做详细的解读和使用我们使用串口,设置它的寄存器一共4种模式,八位的可变2位,4个状态B6位为0的时候,B7用于帧错误检测,当检测到一个无效的停止位的时候,UART设置它,软件清0.这个方式0,是使用一个专用的SBUF发送的TI标志位发送完以后,自动的变1,相对于有了一个中断。

然后中断系统处理,处理完以后就要把状态变回去。

RI也是,一发一收接收的一个函数这里是注意的编程要点这里要开启UART的中断,先开启大中断,接着开启串口的中断REN是收发功能的开关1,2,3都是异步通信,0是移位寄存器接下来配置定时器只有两个寄存器,灵活使用要TCON是这样的TR1,相对于是使能位关于定时器不得不说,而且最近看了几本相对古老的书,真的很清晰,现在的书比喻一堆也不知道想说什么。

对51来说,其实是只有4种方式:1、51单片机计数器的脉冲输入脚。

主要的脉冲输入脚有Px,y,也指对应T0的P3.4和对应T1的P3.5,主要用来检测片外来的脉冲。

而引脚18和19则对应着晶振的输入脉冲,脉冲的频率和周期为:F = f/12 = 11.0592M/12 = 0.9216MHZ T = 1/F = 1.085us2、定时器有两种工作模式,分别为计数模式和定时模式。

对Px,y 的输入脉冲进行计数为计数模式。

定时模式,则是对MCU的主时钟经过12分频后计数。

因为主时钟是相对稳定的,所以可以通过计数值推算出计数所经过的时间。

所谓的定时器就是恒定的数数。

3、51计数器的计数值存放于特殊功能寄存器中。

T0(TL0-0x8A, TH0-0x8C), T1(TL1-0x8B, TH1-0x8D)其实就是容器,存放脉冲数的这是我们单片机的4种定时器模式4、TLx与THx之间的搭配关系以下的进制,就是向前进位的意思。

单片机原理及接口技术(C51编程)定时器计数器的工作原理及应用

单片机原理及接口技术(C51编程)定时器计数器的工作原理及应用
图7-5 方式1的逻辑结构框图
7.2.2 方式1
方式1和方式0差别仅仅 在于计数器的位数不同,方 式1为16位计数器,由THx高 8位和TLx低8位构成(x = 0, 1),方式0则为13位计数器, 有关控制状态位含义(GATE、 C/T* 、TFx、TRx)与方式0 相同。
7.2.3 方式2
方式0和方式1最大特点是计数溢出后,计数器为全0。 因此在循环定时或循环计数应用时就存在用指令反复装入计 数初值的问题,这会影响定时精度,方式2就是为解决此问 题而设置的。
7.2.1 方式0
GATE位状态决定定时器/计数器运行控制取决于TRx一 个条件,还是取决于TRx和INTx*引脚状态两个条件。
GATE=0时,A点(见图7-4)电位恒为1,B点电位仅 取决于TRx状态。TRx=1,B点为高电平,控制端控制 电子开关闭合,允许T1(或T0)对脉冲计数。TRx=0, B点为低电平,电子开关断开,禁止T1(或T0)计数。
【例7-1】 在AT89S51的 P1口上接有8只 LED,原理电路 见图7-13。采 用T0方式1的定 时中断方式,使 P1口外接的8只 LED每0.5s闪亮 一次。
图7-13 方式1定时 中断控制LED闪亮
7.4.1 P1口控制8只LED每0.5s闪亮一次
(1)设置TMOD寄存器
T0工作在方式1,应使TMOD寄存器的M1、M0=01; 应设置C/T*=0,为定时器模式;对T0的运行控制仅由TR0 来控制,应使相应的GATE位为0。定时器T1不使用,各相关 位均设为0。所以,TMOD寄存器应初始化为0x01。
T0;TR0=0,则停止定时器T0定时。
7.4.1 P1口控制8只LED每0.5s闪亮一次
参考程序:
#include<reg51.h> char i=100; void main () {

C51定时器计数器详细讲解

C51定时器计数器详细讲解

多数情况下 不能满足要求
如何加大 延时时间
答案通Leabharlann 软件模拟成为 更多位数的定时器定时器每中断一次, 软件变量值增加1
定时器0/1
软件变量

定时器使用步骤
1
配置 定时器
2
设定时 器初值
3
启动 定时器
4
中断检 测
设定TMOD 设置THx和 寄存器中的相关位 TLx的初始值
将TCON中 的TFx位清0并 将TRx位置1
00:模式0 01:模式1 10:模式2 11:模式3
模式寄存器TMOD设置举例
现需要设置T0具有以下功能:
选择模式1 选择定时器功能 INT0引脚不参与启停控制
如何设置 TMOD
位号
位名
Bit7
GATE
Bit6
C/T
Bit5
M1
Bit4
M0
Bit3
GATE
Bit2
C/T
Bit1
M1
Bit0
„„
响应
中断程序的编写
中断的编程方法 配置中断
设定TMOD的相关位和THx、TLx的初始值


使能中断
编写ISR
TRx = 1,EA = 1
按照规则编写
ISR编写规则
函数名称 表明是中断服务函数
Warning!
不可直接调用ISR 必须让main函数 “看到”ISR原型
void isrName(void) interrupt n using i
8AH 8BH 8CH 8DH
复位值
00H 00H 00H 00H
定时/计数器模式0
当M1M0 = 00时,定时/计数器工作于模式0,使用TLx的低5位和THx 构成13位的加法计数器。

51单片机定时器工作原理

51单片机定时器工作原理

51单片机定时器工作原理在嵌入式系统中,定时器是一个非常重要的模块,它可以用来进行定时操作、计数操作等。

而在51单片机中,定时器也是一个核心的功能模块。

本文将介绍51单片机定时器的工作原理,希望能够帮助大家更好地理解和应用定时器功能。

首先,我们来看一下51单片机中定时器的基本结构。

51单片机中有定时器/计数器T0和T1两个,它们都是16位的定时器/计数器。

每个定时器/计数器都有一个相关的控制寄存器,用来设置定时器的工作模式、计数初值等。

此外,定时器还有一个相关的中断控制寄存器,用来允许或禁止定时器中断。

定时器的工作原理主要包括定时器的工作模式、工作时钟源以及定时器的中断功能。

定时器的工作模式有4种,分别是模式0、模式1、模式2和模式3。

在不同的工作模式下,定时器可以实现不同的功能,比如定时器功能、计数功能等。

工作时钟源可以是外部时钟源,也可以是内部时钟源。

通过设置相关的控制寄存器,可以选择合适的工作时钟源。

定时器的中断功能可以在定时器溢出时产生中断请求,通过设置中断控制寄存器,可以允许或禁止定时器中断。

接下来,我们将详细介绍51单片机定时器的工作模式。

模式0是最简单的工作模式,定时器工作在方式0下时,定时器每次溢出都会产生一个中断请求。

模式1是定时器的13位工作模式,定时器每次溢出都会产生一个中断请求。

模式2是定时器的8位自动重装载模式,定时器每次溢出都会重新装载初值,并产生一个中断请求。

模式3是定时器的两个8位计数器工作在方式3下时,定时器可以实现两个独立的计数功能。

此外,定时器的工作时钟源也是非常重要的。

在51单片机中,定时器的工作时钟源可以是系统时钟、外部时钟或者定时器自己的时钟。

通过设置相应的控制寄存器,可以选择合适的工作时钟源。

最后,我们来介绍一下定时器的中断功能。

在51单片机中,定时器的中断功能可以在定时器溢出时产生中断请求,通过设置中断控制寄存器,可以允许或禁止定时器中断。

定时器中断可以在定时器溢出时执行一段中断服务程序,实现定时操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

sbit LED0=P0^0;
char i;
void main()
{
TMOD=0x01;
TH0=0xd8; TL0=0xf0;
EA=1;
ET0=1;
i=0;
TR0=1;
while(1);
}
void time0_int(void) interrupt 1
{
TH0=0xd8; TL0=0xf0;
i++;
使用定时/计数器的步骤
• 方式选择——TMOD • 初值设置——TH0、TL0( TH1、TL1 ) • 中断允许——EA、ET0( ET1 ) • 启动操作——TR0(TR1)
定时/计数器的方式寄存器TMOD
• 可以一次定义两个定时/计数器的工作方式
D7 D6 D5 D4 D3 D2 D1 D0
51系列单片机
第4讲 定时器/计数器
Atmel AT89C51
Atmel AT89C52
定时器/计数器的主要特性
• C51系列有2个定时/计数器(T0、T1) • C52系列有3个定时/计数器(T0、T1、T2) • 通过编程设置,每个定时器/计数器可以根
据系统时钟实现定时,也可以对外部信号 计数(T0/P3.4、T1/P3.5) • 每个定时器/计数器都有多种工作方式 • 每个定时器/计数器都会在预设定时计数时 间到时产生溢出,可以通过查询或中断方 式处理
计数初值=256 - 200 / 2 =156 (0x9c)
TH0=0x9c; TL0=0x9c;
在P1.0端口输出周期为500μs的方波
//中断方式
#include<reg52.h>
sbit P1_0=P1^0;
void main()
{
TMOD=0x02;
//T0设置为方式2
TH0=0x06;
TL0=0x06;
GATE C / T M1 M0 GATE C / T M1 M0
定时器1
定时器0
M1 M0 工作方式
方式说明
00
0
13 位定时/计数器
01
1
16 位定时/计数器
10
2
8 位自动重置定时/计数器
11
3
两个8 位定时/计数器(仅T0有此方式)
定时/计数器的方式寄存器TMOD
• C/T=1 计数方式 • C/T=0 定时方式 • GATE —— 控制定时/计数器的启动是否
{
TH0=0x3c; TL0=0xb0;
i++;
if(i==4)
{
LED0=!LED0;
i=0;
}
}
//方式1,16位定时/计数 // 0x3cb0 = 15536 计数初值,定时50ms
D7 D6 D5 D4 D3 D2 D1 D0 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
外部中断控制
方式2——自动重置8位计数
• M1M0 = 10 • TL0——计数(最大定时256μs) • TH0——保存初值,便于自动重置
例: • TH0=0x06 • TL0=0x06 • TL0计数到256发生溢出,计数值为250 • 然后重新置入0x06,继续计数
EA=1;
//中断允许总控
ET0=1;
//允许定时器T0中断
TR0=1;
//启动定时器
while(1);
//等待中断的发生
}
void time0_int(void) interrupt 1 //定时器T0对应interrupt 1
{
P1_0=!P1_0;
}
LED0以200ms间隔闪烁(方法一)
#include<reg52.h>
//启动定时器T0
while(1)
{ if(TF0==1)
//如果检测到溢出,意味着定时时间到
{
TF0=0;
//取消溢出标志
P1_0=!P1_0; //输出高/低电平转换
}
}
}
说明
• 晶振频率12MHz,作为定时/计数器的基准 信号
• 定时/计数器进行12分频,定时工作频率 1MHz,定时工作周期1us
LED0以200ms间隔闪烁(方法二)
#include<reg52.h>
sbit LED0=P0^0;
char i;
void main()
Hale Waihona Puke {TMOD=0x01;
TH0=0x3c; TL0=0xb0;
EA=1;
ET0=1;
i=0;
TR0=1;
while(1);
}
void time0_int(void) interrupt 1
受外部中断请求信号的影响 • GATE=1 —— 外部中断请求高电平启动计
数 • GATE=0 —— 定时/计数器启动与外部中
断请求无关
一般情况下GATE=0
定时/计数器的控制寄存器TCON
用于控制定时/计数器的启动与溢出 • TF1——溢出标志 • TR1——启动位(=1:启动 =0:停止) • TF0——溢出标志 • TR0——启动位(=1:启动 =0:停止)
• TMOD=0x02(00000010B)
– T0工作于方式2(8位自动重置定时) – 定时器方式
D7 D6 D5 D4 D3 D2 D1 D0
GATE C / T M1 M0 GATE C / T M1 M0
定时器1
定时器0
• TL0=0x06 • TH0=0x06
说明
• 计数从6开始,每个工作周期(1us)加1,经 过250us之后产生溢出,TF0==1
• 方式2为自动重置,将TH0的值再次装入 TL0 ,继续计数
• 每次检测到TF0==1,就使P1^0的状态改变 一次,从而产生了周期为500us的对称方波
思考
• 设单片机晶振频率为12MHz,对于前例, 如果要求T0输出的方波周期为200μs,计 数初值应该怎样设置?
机器周期=时钟周期*12 =12 / 晶振频率 =1μs
在P1.0端口输出周期为500μs的方波
//查询方式(晶振频率12MHz) 250μs
#include<reg52.h>
sbit P1_0=P1^0;
void main() {
TMOD=0x02;
250μs
//定时器T0设置为方式2
TH0=0x06;
//256-6=250,定时250μs
TL0=0x06; TR0=1;
if(i==20)
{
LED0=!LED0;
i=0;
}
}
//LED0接在P0^0端口
//方式1,16位定时/计数 // 0xd8f0 = 55536 计数初值,定时10ms //定时器T0允许中断 //启动定时器T0
//定时器T0对应的就是interrupt 1 //恢复计数初值,继续延时 //每计数一次,延时10ms //若满足200ms //LED0闪烁一次 //恢复初始状态
相关文档
最新文档