关于C51单片机的定时器中断的使用方法

关于C51单片机的定时器基本认识

本文对C51单片机的定时器进行介绍,本文是本人在对C51单片机定时器的学习中的总结,适合想对51单片机定时器进行简单了解的同学。
定时器在单片机内部就像小闹钟一样,根据时钟的输出信号,每间隔”1s“,计数单元的数值就增加一。当计数单元数值增加到”设定的闹钟提醒时间“时,计数单元就会向中断系统发送中断请求,产生”响铃提示“,是程序跳转到中断服务程序中执行。
定时器的作用:1.用于计时系统,可用于软件的计时,可以使得程序每隔一段固定的时间进行一段操作。2:代替长时间的Delay,提高CPU的云运行效率和处理速度。

定时器的介绍及配置

51单片机中定时器的个数3个,分别是定时器0、定时器1和定时器2。本文中主要介绍的是定时器0和定时器1的用法。这两种定时器也是比较常用的。
定时器的工作模式主要有四种,分别是模式0、模式1、模式2、和模式3。本文章主要介绍的是模式1(16位的定时器)
其工作模式图为:定时器0模式1
此模式,定时器配置为16位定时器,由TL0和TH0的8位所构成。TL0的8位溢出向TH0进位,TH0计数溢出位置TCON中的溢出标志位TR0。因此,从上图中可以知道,当GATE=0(TMOD.3)时,经过非门,此时会输出1,再经过或门,由于或门的特性,就可以知道其信号经过或门之后会一直输出是1,因此与门的输出主要由TR0控制。因此在配置定时器的时候,可以将TR0=1
之后配置定时器的初值,初值主要由高八位TH0和低八位TL0决定。值的范围是0~65535。而在这个范围内,每隔数字加1就上升1us。因此总共是65535us,因此配置1ms的时候,因该从64535开始,但是,又因为前面可能有其他人的使用了定期器1,因此,不能直接赋值,因此在定义定时器0的时候,需要将TMOD&=0xF0,保持高位不变,TMOD|=0x01,定义定时器0。最后再将标志位置为0,即**TF0=0,**定时器配置完毕。

中断服务程序配置

在这里插入图片描述
由图可知,定时器T0的中断服务程序需要ET0=1和EA=1就能导通,PT0的含义是,是否将该主动设置位优先。因此,可以是0或者1,对应的就是优先级的关闭和打开。
中断函数:关键字interrupt
void Timer0_Routie() interrupt 1
{
要执行的函数
}

总结:

综上:需要完成打开定时器中断服务程序。实现步骤为:
1.配置定时器TMOD,设置要打开的定时器。
2.配置TCON,清除标志位和打开定时器使能。
3.根据自己的需要赋值初值。
4.配置定时器中断服务程序。
5.根据需要编写中断函数(尽量不要执行耗时任务)----记得将初值重新赋值,否则将重新从0开始计数。

例程程序

void Timer0Init() //1毫秒、12.000MHz
{
//配置定时器
TMOD &= 0xF0; //设置定时器模式(TMOD)
TMOD |= 0x01; //设置定时器模式
//配置TCON
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
//配置初值
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
///配置中断服务程序
ET0=1;
EA=1;
PT0=0; //优先级关闭

}

void Timer0_Routie() interrupt 1
{
static unsigned int T0Count; //静态局部变量,退出函数时候不丢失值
//重新赋初值
TL0 = 0x18; //设置定时初值(高位)
TH0 = 0xFC; //设置定时初值(低位)
T0Count++;
if(T0Count>=1000)
{
T0Count=0; //重新计数
}
}

PS:纯本人学习心得总结!!!老鸟不用理会。QQ:1151800181

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C51单片机有两个定时器,分别为Timer 0和Timer 1。定时器的主要功能是计时和延时,可以用于控制程序执行的时间。 以下是C51单片机定时器的基本操作步骤: 1. 设置定时器模式:选择定时器工作模式,如定时器模式或计数器模式。 2. 设置定时器计数值:确定计数器的初始值,即计时的时间。 3. 启动定时器:启动定时器开始计时。 4. 等待定时器计时结束:等待定时器计时结束,即达到设定的计数值。 5. 停止定时器:停止定时器计时。 以下是一个简单的C51单片机定时器示例程序: ``` #include<reg52.h> #define uint unsigned int #define uchar unsigned char void timer0_init(); //定时器0初始化函数 void main() { timer0_init(); //调用定时器0初始化函数 while(1) { //程序执行任务 } } void timer0_init() { TMOD &= 0xF0; //设置定时器0为模式1 TH0 = 0x3C; //给定时器赋初值,定时1ms TL0 = 0xAF; ET0 = 1; //打开定时器0中断允许 EA = 1; //打开总中断允许 TR0 = 1; //启动定时器0 } void timer0() interrupt 1 using 1 { TH0 = 0x3C; //给定时器赋初值,定时1ms TL0 = 0xAF; //中断执行任务 } ``` 在上面的程序,timer0_init()函数用于初始化定时器0,设置为模式1,计时1ms;timer0()函数是定时器0的中断处理函数,当定时器0计时结束后,会自动进入此函数进行中断处理。在这个函数,可以编写相应的任务执行代码。在主函数,通过while(1)循环不停地执行程序任务,而定时器0会在后台进行计时和中断处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值