定时器——89c51

定时器

       定时器是单片机的内部资源,它就存在于单片机中中,而在开发板上,类似于矩阵键盘、数目显示屏这些都属于外接的硬件设备,是通过I\O口(Input \ Output)外接的,图中红圈部分的叫晶振晶振有固定的频率,在达到一定时间后会发送一段脉冲信号,这段脉冲由计数器接收,并记录接受脉冲的次数,能够达到计时的效果,定时器的计数和计时功能都依赖晶振

作用:

  1. 可实现软件计时或使程序每隔一固定时间完成一项操作
  2. 替代长时间的延时函数Delay,因为延时函数其实就是通过让CPU卡在循环中,这样虽然能够起到延时的作用,但是这时候假如你按下按键,但是CPU并不能检测你按键的状态,因为他正在运行延时函数的内容,属于一种浪费,而定时器在运行时不会浪费CPU的资源,CPU仍然能够从寄存器中读取其中信息或是写入或者做其他的事情

       不同的单片机拥有的定时器个数不同,但STC89c51类型的单片机都会有两个或两个以上的定时器,基础的定时器为T0和T1(Timer0/1),接下来的讲解也只涉及两个定时器。

定时器T0和T1均有四种工作模式:

  • 模式0:13位定时器/计数器
  • 模式1:16位~
  • 模式2:8位自动重装模式
  • 模式3:两个8位计数器

不同的工作模式有不同的电路,我们常用的为模式1

       定时器运行时,根据时钟的输出信号,每隔一个特定的时间,计数单元的数值就加一,当计数单元数值增加到最大时就会产生“溢出”,“溢出”后计数单元就会向中断系统发出中断申请,然后单片机就会跳转去执行中断程序,执行完后再回到中断处的下一步程序继续执行。

       我们能够知道,在单片机所控制的硬设中,如判断是否溢出或是按键是否按下,就是CPU在读取相应的寄存器的信息,例如没溢出时定时器0的计数单元对应的寄存器TCON中的TF0的值为0,溢出后就会变为1,然后向CPU发送中断申请,当CPU响应其中断请求时TF0又会被硬件清0,按键的状态同理。通过对相应的寄存器进行检测,就能够知道特定的信息,然后做对应的事情,如,没溢出就不中断,溢出就中断,或是按键按下就亮灯之类的是事情。

       时钟对应下图的红圈部分计数单元绿圈中断系统黄圈,中断系统还有自己的中断电路图片中没有展示,两个图片均来自哔哩哔哩up主江协科技的51单片机教程视频,我认为它讲的挺好的,网课可以看他的,笔记可以收藏我的博客 

时钟:

       时钟可由系统时钟(SYSclk)提供,也可以由外部引脚T0 Pin(黑圈)提供,当有外部引脚(T0 Pin)来提供时钟时,定时器作计数器使用。 

       SYSclk(红圈):系统时钟,即晶振周期,我的51单片机上的晶振频率为12MHz,51单片机应该都是一样的,一般写在晶振表面

        分频(黄圈):把较高频率变为其整数分之一低频率的方法,例如选择12分频(➗12),就是把12MHz的系统时钟发出的脉冲信号转换为1MHz的脉冲信号输出,也就是大约1us

       C / T(蓝圈):选择定时器的功能,T上面有一横线表示低电平,即如果C/T位置0,那么开关就上拨,接上面的线路作定时器,如果置1,那么开关下拨,就接下面的线路作计数器。

计数单元的计数系统:

 

       计数器(TL0\TH0)在计数单元中,也就是绿圈内的一部分,TL(Timer Low)为低位,TH为高位,它们是两个8位寄存器0表示它是T0定时器的计数系统,而这个计数系统高位和低位的存储大小都是8bit的,计数系统左边的时钟每一定时间就会发出一个脉冲信号,而计数系统每接收一个脉冲信号,它的值就会加1,也就是说它们能从0一直增到65535(11111111 11111111),当达到65535时再来一个脉冲信号时,计数器就会变为0,然后产生溢出,然后计数器(TL0\TH0)右边的TF0(Timer Flag)就会被置1,TF0就是定时器0的溢出标志位,也叫中断请求标志位,信号发送至中断系统,中断系统产生中断

中断系统:

       中断系统是为使CPU具有对外接紧急事件的实时处理能力而设置的。

       当中央处理器CPU正在处理某件事的时候,外界发生了紧急事件请求(中断源),要求CPU暂停当前工作,转而去处理这个紧急事件,处理完以后再回到原来被中断的地方,继续原来的工作,这样的过程被称为中断,实现这一功能的部件称为中断系统

       微型机MCU的中断系统一般允许多个中断源,每一个中断源都有优先级别,CPU会优先响应中断优先级最高的中断请求。因此当CPU响应某一中断请求然后正在处理某一个紧急事件时(执行相应的中断服务程序),如果有一个更高优先级的中断源发出中断请求,那么CPU就会暂停当前的工作去响应优先级更高的中断请求,处理完以后,再回到原先低优先级的中断服务程序继续运行,这一过程称为中断嵌套,能够实现中断嵌套功能的中断系统称为多级中断系统,不能的称为单级中断系统

中断程序流程:

        Interrupt为中断入口,和C语言函数的格式差不多,只不过多了一个中断入口

       单片机通过配置寄存器来控制内部线路的连接,通过内部线路的不同连接方式来实现不同的功能。

下面是定时器/计数器还有中断系统的相关寄存器:

 

       在图2中有一条黄线,这条黄线就是一条定时器实现某个功能时的线路,而其中的一些开关的位置,是上拨还是下拨,是闭合还是断开,就通过配置寄存器来实现控制。

定时器/计数器控制寄存器TCON(Timer Control):

        TCON为定时器T0、T1的控制寄存器,同时也锁存(能够存储数据并且外部没有输入的时候可以保持稳定状态)T0、T1溢出的中断源和外部请求中断源等。

TCON的格式如下:

       可位寻址理解为,可以通过寻找寄存器中的某一位的地址,对该地址进行写入或读取,如单独对B0位的IT0进行写入,IT0 = 1;

TF 0/1(Timer Flag):

       定时器/计数器0或1的溢出标志位,如当定时器1(T1)被允许计数后,从初值开始加1计数,当加至最高位产生溢出时由硬件将TF1置1,向CPU请求中断,一直保持到CPU响应中断时(锁存),才由硬件清0,即TF1变为0。

TR 1/0(Timer Run):

       定时器1或0的运行控制位,该位由软件置位和清零,定时器1或0是否允许或禁止计数,要通过看TR 1/0与GATE(门控端)的值,如GATE = 0,TR1 = 1时就允许定时器1开始计数。这可以通过看前面计数单元的电路图部分,其中设计或与非门,可通过网上查询了解运算规则。

IE 1/0(Interrupt Enable):

       外部中断1或0请求原标志。如IE1= 1,外部中断向CPU请求中断,当CPU响应中断时由硬件将IE1清零。

IT 0/1(Iterrupt Touch):

       外部中断0或1出发方式控制位。如IT1 = 0时,外部中断1为低电平触发方式。

定时器/计数器工作模式寄存器TMOD(Timer Mode):

       定时和计数功能由特殊功能寄存器TMOD的控制位C/T进行选择,两个定时器/计数器有4种操作模式,通过TMOD的M1和M0进行选择。

TMOD寄存器的各位信息:

        不可位寻址就是配置该寄存器不能够对其中单独一位的地址(如只对M0进行写入,M0 = 1)然后对该地址进行写入等操作,也就是说,在配置寄存器TMOD时,只能对其整个地址进行操作,即只能对从89H这个地址开始往后数八位的这一整块区域(该寄存器是八位寄存器)进行写入等操作

M 1/0:

定时器1或0的模式选择:

       M1       M0

       0          0       13位定时器/计数器,兼容8048定时模式(一种老的定时模式),TL0只用低五位参与分频,TH0全用

       0          1       16位定时器/计数器,TL0、TH0全用

       1          0       8位自动重装载定时器,即当溢出时将TH0存放的值自动重装入TL0

       1          1       双8位定时器/计数器

C / T:

       选择定时器的功能T上面有一横线表示低电平,即如果这C/T位置0,那么开关就上拨,接上面的线路作定时器,如果置1,那么开关下拨,就接下面的线路作计数器。

GATE(门控端):

       与外部引脚INT共同控制定时器,哪些情况下打开和关闭定时器就需要看电路图了,这里涉及或与非门的内容,http://t.csdn.cn/zLQUH这是我在CSDN上找到的一个关于或与非门的博客,如果忘记了可以进去看一看,我觉得挺好的。

        当GATE = 0时由TR1/0单独控制定时器的开闭,如当TR0 = 0时那么蓝圈的结果为0,定时器0关闭,TR0 = 1时则为1,定时器0打开。 (当GATE = 1时则必须考虑外部引脚INT的情况)它们控制着蓝圈部分的开关,结果为0则开关断开,线路断开,结果为1则开关闭合,线路接通。

中断寄存器:

 IE(Interrupt Enable)中断允许寄存器:

EA(Enable All):

       CPU的总中断允许控制位,从上面的中断电路图可以看出,当EA = 1时,开关闭合,线路接通,CPU开放中断,反之EA  = 0,CPU屏蔽所有中断申请,各中断源首先受EA控制,其次还受各中断源自己的中断允许控制位控制

ET 1/ 0(Enable Timer)和EX1/0:

       定时器 T1/T0的溢出中断允许位。即,若ET1 = 1,开关关闭,线路接通,允许定时器T1中断,反之则禁止定时器T1中断,EX 1/0是外部中断1 / 0中断允许位

IP(Iterrupt Priority)中断优先级控制寄存器:

(上面的中断系统电路图中只有两个优先级,由PT 1/0单独控制)

  PT 1/0H       PT1/0         优先级  

       0                0              1

       0                1              2

       1                0              3

       1                1              4

注:H是high的意思,1 / 0表示是定时器1或0,上面两位二进制(PT 1/0H 与 PT 1/0所组成的,高H位在左)的值越大,优先级就越高,某一个中断源优先级越高,CPU就会优先响应其中断请求

总结:

       以上就是相关的寄存器的简单介绍,而我们想要实现定时器的功能的时候,就是需要根据电路图来配置相关的寄存器,然后接通电路,需要注意的就是,要区分可位寻址不可位寻址的寄存器,对于不可位寻址的寄存器,在配置时需要检查配置的结果是否和你想要的相同。

       下一篇博客将会利用定时器实现按键控制LED流水灯模式定时器时钟

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,这是一个关于AT89C51单片机的定时器和中断处理的问题,需要进行程序设计。下面是我的回答,仅供参考。 首先,需要设置定时器1的工作模式和时间常数。按照题目要求,方式1工作时需要得到1秒的定时,方式2工作时需要得到8ms的定时。设置方式1时,TMOD寄存器中需要将T1M1和T1M0位清零,表示选择模式1。设置方式2时,同样需要将T1M1和T1M0位清零,表示选择模式2,并将TH1和TL1寄存器的数值设置为0xF8和0x30,即65536-8000的高8位和低8位,以得到8ms的定时。 接着,需要设置中断系统的相关位。由于只有定时器中断,IP寄存器不需要设置。IE寄存器中,需要将EA位设置为1,表示打开总中断使能;ET1位设置为1,表示打开定时器1中断。TCON寄存器中,需要将TR1位设置为1,表示启动定时器1。此时,定时器1开始计数,并在定时结束时触发中断服务程序。 中断服务程序需要完成两个任务:计时和动态显示。计时的方法是在定时器1的中断服务程序中,每次触发中断时将一个计数器加1,表示已经过去的定时周期数。动态显示的方法是在主程序中使用循环扫描的方式,将计数器的值转换为数码管的显示码,并输出到数码管上。另外,需要扩展一个按键,实现“开启/暂停/清零”的功能。具体实现方法可以使用外部中断或定时器中断,在按键按下时检测按键状态,并根据不同状态执行相应的操作。 下面是伪代码示例: ``` // 定义全局变量 unsigned int counter = 0; // 计时器 unsigned char display[2] = {0x00, 0x00}; // 数码管显示码 // 定时器1中断服务程序 void timer1_isr() interrupt 3 { counter++; // 计数器加1 } // 初始化程序 void init() { TMOD &= 0x0F; // 清零T1M1和T1M0位,选择方式1 TH1 = 0xFC; // 设置定时器1时间常数,得到1秒的定时 TL1 = 0x66; EA = 1; // 打开总中断使能 ET1 = 1; // 打开定时器1中断 TR1 = 1; // 启动定时器1 } // 主程序 void main() { init(); // 初始化程序 while (1) { // 动态显示计数器的值 display[0] = counter / 10; // 转换高位数码 display[1] = counter % 10; // 转换低位数码 // 输出显示码到数码管 // ... // 检测按键状态,执行相应操作 // ... } } ``` 以上是一个简单的示例程序,具体实现需要根据硬件平台和实际需求进行调整。希望能对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

手打猪大屁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值