51单片机的定时/计数器是一种可编程部件。它的工作方式、计数初值以及启停操作均应在定时/计数器工作前进行初始化,即向相应的寄存器写入相应的控制字。
标准的51单片机内部有T0和T1两个定时器,与这两个定时器有关的特殊功能寄存器主要由定时值存储寄存器、定时器控制寄存器和定时器模式寄存器。
在使用定时器的时候,需要完成对定时器配置,配置步骤如下:
第一:设置特殊功能寄存器TMOD,配置好工作模式。
第二:设置计数寄存器TH0和TL0的初值。
第三:设置TCON,通过TRX置1来让定时器开始计数。
第四:判断TCON寄存器的TFX位,监测定时器溢出情况
这里TRX和TFX中的X指的是0或者1。
下面程序使用定时器0,工作模式1,实现20ms的定时功能,控制单片机的P1.0输出周期为40ms的方波信号。
1.首先设置特殊功能寄存器TMOD,配置定时器0工作在模式1。TMOD寄存器的各位如下表所示,根据要求,采用定时器0,而高四位是定时器1的控制位,所以TMOD的高四位置0,TMOD的低四位为定时0的控制位。根据要求定时器0工作在定时器模式,所以C/T(T0)位因该是置0,表示工作在定时模式。本定时器启动不受到单片机引脚INT0外部信号的控制,所以GATA(T0)为清零即可。要求定时器0工作在模式1,则M1(T0)位置0,M0(T0)位置1即可。因此通过以上分析,可知TMOD的各位如下TMOD=0B00000001即,TMOD=0X01.
2.设置计数寄存器TH0和TL0的初值,根据定时时间20ms,确定TH0和TL0的初值。单片机的晶振为11.0592M,时钟周期就是1/11059200,机器周期是12/11059200 秒,定时间20ms,就是要经过X个机器周期得到0.02秒,即X* 12/11059200=0.02,得到X=18432.16位定时器的溢出值是65536(因65535加1才是溢出),这样先给TH0和TL0一个初始值,让它们经过18432个机器周期后刚好达到65536溢出,溢出之后TF0置1,通过TF0就可以得知0.02秒时间到。那么初值y=65536-18432=47104,转换为十六进制就是0XB800;即TH0=0XB8;TL0=0X00;
3.设置TCON,通过TR0置1来让定时器开始计数,即通过TR0=1启动定时器。
4.判断TCON寄存器的TF0位,监测定时器溢出情况,TF0为1则定时器溢出,定时时间到,就可以做相应的处理,比如改变P10引脚电平状态实现40ms方波信号。
将上述定时器初始化设置的流程,封装成一个函数如下:
void timer0_init()
{
TMOD=0X01;
TH0=0XB8;
TL0=0X00;
TR0=1;
}
然后在主函数调用timer0_init()函数实现对定时器的初始化。并在主函数中查询定时器是否溢出,溢出说明定时间到,进行响应的处理,main函数如下
void main() //主函数
{
timer0_init();//调用定时器初始化函数
while(1)
{
if(1==TF0)//判断定时器是否溢出
{
TH0=0XB8;//
TL0=0X00;//对于定时器0工作1需要溢出之后,重新装入初始值
P10=~P10;//P10电平状态反转,实现高低电平切换
}
}
}
仿真结果如图所示,一个格子是10ms,一个方波周期是4个格子,正好是40ms。
这是一个定时器最简单的一个例子,通过这个例子掌握定时器的使用方法,稍加修改就可以实现一些功能,比如:赛事活动中使用的秒表、智能定时断电插座、通过对单片机端口引脚上输入的由外部事件产生的“触发脉冲信号”进行计数,从而根据计数结果实现相应的功能控制,比如频率计等。
关键字:STC89C52RC 定时器
引用地址:
STC89C52RC定时器的应用基本实例
推荐阅读最新更新时间:2024-10-30 12:16
ATmega128 定时器/计时器振荡器
对于拥有定时器/ 振荡器引脚(TOSC1 和TOSC2) 的AVR 微处理器,晶体可以直接与这 两个引脚连接,无需外部电容。此振荡器针对32.768 kHz 的钟表晶体作了优化。不建议 在TOSC1 引脚输入振荡信号。
[单片机]
51单片机程序——定时器控制蜂鸣器
#include reg52.h #define uint unsigned int sbit bb=P3^5; //位定义蜂鸣器接口 sbit led1=P0^0; //位定义LED接口 unsigned int i=0; void delay(uint z); //延迟函数声明 void main() { TMOD=0x01; //TMOD赋值,以确定T0和T1的工作方式 TH0=(65536-50000)/256; //计算初值,并将其写入TH0、TL0或TH1、TL1 TL0=(65536-50000)%6; E
[单片机]
关于PIC单片机的定时器精准计时的计算
在此用了16C711单片机的TMR0做定时中断,希望实现精准计时,在程序中,TMR0用了晶振的32分频,初值#0FCH,因此POPBEAR兄弟计算出每个定时中断的计时时间为(256-X)*32*4/32768=0.015625秒。注意,问题就在这里!实际上这个时间是TMR0的初值被置入后两个指令周期后(见PIC单片机定时器/计数器资料)到下一次中断发生时的时间。如果要用到定时器的精准定时,必须理解这一概念! 如采用32768Hz的晶振,每个指令周期为122us,在中断处理程序中,到TMR0的初值被置入,共有7条指令,加上TMR0的初值被置入后两个指令周期,如果中断处理程序不直接放在0004H地址而采用GOTO指令的两个周期,一
[单片机]
AVR单片机定时器计数
#include iom16v.h #include macros.h #define uchar unsigned char #define uint unsigned int uchar num1; #pragma interrupt_handler miao:9//它所对应的位置 #pragma data:code//定义程序存在ROM里面 const uchar table ={ 0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86, 0x8e }; /***********************************
[单片机]
S3C2440定时器4中断测试程序
__irq为一个标识,用来表示一个函数是否为中断函数。对于不同的编译器,__irq在函数名中的位置不一样,例如: ADS编译器中 : void __irq IRQ_Eint0(void); Keil编译器中 : void IRQ_Eint0(void) __irq; 但是其意义一样,它所完成的任务是标识该函数为中断函数,在编译器编译是调用此函数时,先保护函数入口现场,然后执行中断函数,函数执行完毕,恢复中断现场,这整个过程不需要用户重新编写代码来完成,由编译器自动完成。因而这也给不具备中断嵌套功能的ARM系统带来了问题,若使用 __irq 时有中断嵌套产生,这现场保护就会混乱。中断嵌套处理可以自己编写中断入口现场保护代码,并不使用
[单片机]
MCS-51单片机定时器/计数器、串行口、多机通讯
MCS-51单片机含有2个定时器/计数器,具有4种工作方式。具有两种工作模式(计数器模式和定时器模式) MCS-51单片机含有1个全双工串行口,具有4种工作方式。 TMOD - 定时器/计数器方式控制寄存器 TCON - 定时器/计数器控制寄存器 SMOD - 串行口波特率系数选择位 SCON - 串行口控制寄存器 SBUF - 串行口数据缓冲器 TH0 - 定时器/计数器0(高字节) TL0 - 定时器/计数器0(低字节) TH1 - 定时器/计数器1(高字节) TL1 - 定时器/计数器1(低字节) 一、定时器/计数器 定时器/计数器T0由特殊功能寄存器TH0、TL0构成 定时器/计数器T1由特殊功能寄存器TH1、TL1构成
[单片机]
电子温度报警器设计制作总结
制作方案: 本温度计采用一种智能温度传感器DS18B20作为检测元件。该元件测温范围为-55~125度,最高分辨率为0.0625度,完全满足本设计中分辨率为0.1度的要求!考虑到下载程序的方便和一些条件的限制我选了STC89C52RC这款单片机作为控制器!显示电路方面,我选择四位共阳LED数码管作为显示电路! 而鉴于单片机驱动力有限,所以P0,P2口均加一上拉排阻以提升其驱动力!P0,P2口均有一锁存器74HC573以使数据控制方便! 报警方面,当温度超过警界最高温度时,响报警音乐,红色发光二极管闪烁;当温度低于最低温度报警时,响报警音乐,黄色发光二级管闪烁!因为所选单片机可擦写次数达万次以上,为使电路的简化,其温度报警值已
[单片机]
51单片机汇编语言(五)
定时器 计数器 功能说明: 开始时接在单片机P1端口中的P1.7亮,用定时器延时60ms后P1.6亮,如此向右移动,移到最右端P1.0亮后,又回到最左端重新开始向右移动,不断循环。 程序:DS01.ASM 01: START: MOV R0, #8 ;设右移8次 02: MOV A, #01111111B ;存入开始点亮灯位置 03: LOOP: MOV P1, A ;传送到P1并输出 04: ACALL DELAY ;调延时子程序 05: RR A
[单片机]