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,所以要能够测量更高的频率,必须使用前置分频器,对更高频率的待测输入信号进行预分频!。

  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闪烁一次 //恢复初始状态
相关文档
最新文档