关于51单片机学习中计数器/定时器中断的理解

发布者:柔情细语最新更新时间:2020-05-18 来源: eefocus关键字:51单片机  计数器  定时器中断 手机看文章 扫描二维码
随时随地手机看文章

对于单片机初学者来说,为了达到延时控制时间等目的,常常让单片机计算for循环函数,随着学习的深入,不可避免的,我们开始逐渐接触到了定时器/计数器中断来控制时间,这里针对定时器/计数器中断,专门作出如下讨论:


定时器/计数器是什么?


众所周知,一块单片机的基本由 中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中 断系统、定时器/计数器 构成,


定时器/计数器在单片机中的脚管位置,如图

STC89C51RC单片机脚管示意图

我们可以看到,在P3系列的脚管中,P3.4,P3.5脚管上标注着T0,T1;它们分别代表着单片机内部的定时/计数器0,1,也就是英文 Timer 0,Timer 1,从图上看,一块80C51单片机上有着两个Timer,Timer既有计时的功能,又有计数的功能,通过设置与他们相关的特殊功能寄存器可以选择启用定时功能或者记数功能,关于功能的实现将在第三点讲,现在我们主要研究 Timer是什么 。


下面是Timer的结构框图:

这里写图片描述

我们可以看到,Timer是一个十六位的加一计数器,TCON(Timer control)指的是Timer的控制寄存器,TMOD(Timer Mode)则是timer的工作方式寄存器;


为什么要去实现Timer的中断


原因很简单,1.提高代码的工作效率,由于Timer是单片机中的一个独立的单元,不会去占用CPU的运行速 度,单独运行,自然提高效率

2.精确的控制时间,下面就以keil4中的for循环的delay( )函数和中断函数做对比,来控制蜂鸣器每500ms响一次,通过debug中的运行时间计算,来看看中断时如何精确的控制时间的;


for的代码


#include

#define uint unsigned int

#define uchar unsigned char


sbit beep=P2^3;

void delay(uint);


int main(void)

{   


  while(1)'

{   


    beep=1;

    delay(500);

    beep=0;

    delay(500);

}


return 0;

}

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

    for(y=110;y>0;y--); 

}

这里写图片描述

从图中看,delay(500)函数执行用了485ms

再看Timer中断,还是调试蜂鸣器


代码如下:


#define uint unsigned int 

#define uchar unsigned char 

#include


sbit beep=P2^3;

uchar num;


int main(void)

{   


    TMOD=0x01;

    TH0=(65535-45872)/256;

    TL0=(65535-45872)%256;

    EA=1;

    ET0=1;

    TR0=1;


     while(1);


return 0;

}


void T0_time()interrupt 1

{

    TH0=(65536-45872)/256;

    TL0=(65535-45872)%256;

       num++;


        if(num==20)

        {

            num =0;

            beep=~beep;

        }

}


什么?关于它的运行时间是多少? …… 我也不会用keil4来做,本人小菜鸡哈,求教大神帮忙试一下。没关系我会算:

机器周期=12*时钟周期(我的晶振的频率是11.0592MHZ),我们想让计数器记的数N=t/机器周期,

t是自己设定的,比如我们需要设定的是50ms,那么N=50 000/1.09 =45872,OK,误差在微秒级上,你说哪个精确?


怎么实现Timer中断?

我们还是要从头说起,第一点,要说一下51单片机的中断级别,废话不说,直接上图

这里写图片描述

这张图直接以由高到低的顺序解释了52单片机的中断级别(52与51类似,除了没有T2)C语言用的序号是什么意?

很简单,看上面的蜂鸣器中断的代码:下面是不是有一个interrupt 1 ? 这个1就代表该序号级别的中断,与图中对应,可以看出,那个函数表示的是Timer0的中断。


还是那张图,先来说说TCON(Timer Control),TCON可以被寻址,也就是说没必要用一个类似于0xff之类的十六进制的数字来控制每个位,再说每个位的内容

TF1(Timer1 Filled):也就是Timer1 数据溢出了,此时它会向CPU提出中断请求,是单片机自动的,没必要控制1!

TR1(Timer1 Run): 字面意思,就像那句Run Forrest ! 需要你去声明,例如TR1=1,就是 RUN! TIMER1! 那个Timer就工作了。。

TF0,TR0,那个同上,只不过是角标不一样而已;


在说说TMOD(Timer Mode),Timer Mode没法被寻址,所以必须用一个十六进制数如0xff来控制每一位,进而完成功能实现

1,GATE(基本上没特殊要求的话,GATE这个位直接取0)

GATE=0:Timer启动与停止仅仅受TCON寄存器中的TRX(Timer Run 0或者1 , X是角标),控制 ; GATE=1:由TRX和外部中断引脚 INT0或INT1上的电平控制


2 , C/T(cacluate or time ),定时器模式和计数器模式的选择位,作为Timer中断来说,这位通常取0;

C/T=1:计数器模式

C/T=0:定时器模式


3, M1M2,工作方式选择位,由这两个位共同决定Timer的工作方式,基本上我们都是用 0 1,废话不说,直接上图

这里写图片描述

开始分析刚刚上的那个蜂鸣器的中断代码:


    int main(void)

{   


    TMOD=0x01;    //0000_0001,相当于只打开了Timer0,并且把它的工作状态设为16位的Timer

    TH0=(65535-45872)/256;//45872上次的运算结果,就是那个控制50ms的那个数据,除法,将数据

    TL0=(65535-45872)%256;//储存进高八位,取余将数据储存进第八位

    EA=1;//打开总中断,首要步骤

    ET0=1;//打开定时器0中断

    TR0=1;//启动定时器0


     while(1);


return 0;

}


void T0_time()interrupt 1

{

    TH0=(65536-45872)/256;

    TL0=(65535-45872)%256;

       num++;//不断地累加,到num=20时,重置,20×50ms = 1s


        if(num==20)

        {

            num =0;

            beep=~beep;

        }

}   


总的来说,就是

1,设定TMOD → 2,装入初值(THx,TLx, 45872)→3.打开总中断 EA=1 →4.开启定时器中断→5.启动定时器(TRx)→设定中断函数 (void Tx_time( ) interrupt y, x表示定时器编号,y表示中断序列)

关键字:51单片机  计数器  定时器中断 引用地址:关于51单片机学习中计数器/定时器中断的理解

上一篇:51单片机的中断和定时器、计数器
下一篇:51单片机-定时器1中断

推荐阅读最新更新时间:2024-11-19 04:34

基于51单片机实现短距离无线通信
1 引言 短距离无线传输具有抗干扰性能强、可靠性高、安全性好、受地理条件限制少、安装灵活等优点,在许多领域有着广泛的应用前景。低功耗、微型化是用户对当前无线通信产品尤其是便携产品的实际需求,短距离无线通信逐渐引起广泛关注。常见的短距离无线通信有基于802.11的无线局域网WLAN、蓝牙 (blueTooth)、HomeRF及欧洲的HiperLAN(高性能无线局域网),但其硬件设计、接口方式、通信协议及软件堆栈复杂,需专门的开发系统,开发成本高、周期长,最终产品成本也高。因此这些技术在嵌入式系统中并未得到广泛应用。普通RF产品不存在这些问题,且短距离无线数据传输技术成熟,功能简单、携带方便,使其在嵌入式短程无线产品中得到了
[单片机]
基于<font color='red'>51单片机</font>实现短距离无线通信
51单片机存储器小结
存储器分为程序存储器(ROM)和数据存储器(RAM),两种又都可以分为片内和片外,片外即需要自己在单片机外部扩展。 8051单片机的片内程序存储器有4K,片内数据存储器有256个字节,其中又分为高128字节位特殊功能寄存器区,真正用户能用的RAM只有低128字节。 8052单片机有8K片内程序存储器,而数据存储器除了低128字节外还有扩展的高128字节,地址上跟特殊功能寄存器一样,但物理上是独立的,寻址方式不一样,扩展的高128字节只能间接寻址。 Keil中变量的存储类型: 存储类型 说明 code 程序空间(无需改变的变量) data 直接访问的内部数据存储器(速度最快) idata 间接访问
[单片机]
<font color='red'>51单片机</font>存储器小结
51单片机学习:定时器1实验
实验名称:定时器1实验 接线说明: 实验现象:下载程序后,D1指示灯间隔1s闪烁 注意事项: ***************************************************************************************/ #include reg52.h typedef unsigned int u16; //对系统默认数据类型进行重定义 typedef unsigned char u8; //定义LED1管脚 sbit LED1=P2^0; /********************************************************************
[单片机]
MCS-51单片机中断响应的三种方法解析
MCS-51单片机的中断响应延迟时间,取决于其它中断服务程序是否在进行,或取决于正在执行的是什么样的指令。单中断系统中的中断响应时间为3~8个机器周期[1]。无论是哪一种原因引起的误差,在精确定时的应用场合,必须考虑它们的影响,以确保精确的定时控制。根据定时中断的不同应用情况,应选择不同的精确定时编程方法。 文中以定时器T1工作在定时方式1为例,晶振频率为12MHz。 1 方法1 在定时器溢出中断得到响应时,停止定时器计数,读出计数值(反映了中断响应的延迟时间),根据此计数值算出到下一次中断时,需多长时间,由此来重装载和启动定时器。例如定时周期为1ms,则通常定时器重装载值为-1000(0FC18H)。下面的程序在计算每个
[单片机]
MCS-<font color='red'>51单片机</font><font color='red'>中断</font>响应的三种方法解析
51单片机交通灯程序以及仿真
#include #define uint unsigned int #define uchar unsigned char sbit red_nb = P0^0; sbit green_nb = P0^1; sbit yellow_nb = P0^2; sbit red_dx = P0^3; sbit green_dx = P0^4; sbit yellow_dx = P0^5; unsigned char code Disp_Tab = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制 unsigned char code disp
[单片机]
注释非常详细的51单片机IIC源程序
自己写的IIC程序,因为初学,还是有借鉴的地方,但是所有程序均为手打,每一行都有详细的注释 单片机源程序如下: #include reg52.h #include iic.h sbit IIC_SDA=P2^6; //声明IIC总线的数据线接在单片机的P2.6端口。 sbit IIC_SCL=P2^7; //声明IIC总线的时钟线接在单片机的P2.5端口。 //void delay(unsigned int t) //{//延时函数 // while(t){t--;}; //延时循环计数 //} //-----------------------------------------
[单片机]
keil5编译开发51单片机操作步骤
安装好keil 5 mdk 之后,从keil官网下载 c51v960.exe, 具体操作步骤 1.进入官网 2 3.点击C51之后,会让填写一个个人信息,没啥障碍,正常填写就好了,填写好之后就会出现下面的界面,点击下载就好了 4. 下载之后,运行,安装路径选择原来 keil5 MDK的安装路径 安装完毕之后就大功告成了
[单片机]
keil5编译开发<font color='red'>51单片机</font>操作步骤
51单片机设计测距仪原理及其应用
5l系列 单片机 中典型芯片(AT89C51)采用40引脚双列直插封装(DIP)形式,内部由CPU,4kB的ROM,256 B的RAM,2个16b的定时/计数器TO和T1,4个8 b的工/O端I:IP0,P1,P2,P3,一个全双功串行通信口等组成。特别是该系列单片机片内的Flash可编程、可擦除只读存储器(E~PROM),使其在实际中有着十分广泛的用途,在便携式、省电及特殊信息保存的仪器和系统中更为有用。该系列单片机引脚与封装如图1所示。 5l系列 单片机 提供以下功能:4 kB存储器;256 BRAM;32条工/O线;2个16b定时/计数器;5个2级中断源;1个全双向的串行口以及时钟 电路 。 空闲方式:CPU停止工
[单片机]
<font color='red'>51单片机</font>设计测距仪原理及其应用
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved