设计与开发

51单片机 计数器程序 51单片机中的定时器和计数器

小编 2024-11-24 设计与开发 23 0

51单片机中的定时器和计数器

从上面定时器/计数器的结构图中我们可以看出,16位的定时/计数器分别由两个8位专用寄存器组成,即:T0由TH0和TL0构成;T1由TH1和TL1 构成。其访问地址依次为8AH-8DH。每个寄存器均可单独访问。这些寄存器是用于存放定时或计数初值的。此外,其内部还有一个8位的定时器方式寄存器 TMOD和一个8位的定时控制寄存器TCON。这些寄存器之间是通过内部总线和控制逻辑电路连接起来的。TMOD主要是用于选定定时器的工作方式; TCON主要是用于控制定时器的启动停止,此外TCON还可以保存T0、T1的溢出和中断标志。当定时器工作在计数方式时,外部事件通过引脚T0 (P3.4)和T1(P3.5)输入。

定时计数器的原理:

一、定时器/计数器为定时工作方式时,

计数器的加1信号由振荡器的12分频信号产生,即每过一个机器周期,计数器加1,直至计满溢出为止。显然,定时器的定时时间与系统的振荡频率有关。因一个机器周期等于12个振荡周期,所以计数频率fcount=1/12osc。如果晶振为12MHz,则计数周期为:

T=1/(12×106)Hz×1/12=1μs

这是最短的定时周期。若要延长定时时间,则需要改变定时器的初值,并要适当选择定时器的长度(如8位、13位、16位等)。

二、定时器/计数器为计数工作方式时,

通过引脚T0和T1对外部信号计数,外部脉冲的下降沿将触发计数。计数器在每个机器周期的S5P2期间采样引脚输入电 平。若一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1。此后的机器周期S3P1期间,新的计数值装入计数器。所以检测一个由1至0的跳 变需要两个机器周期,故外部事件的最高计数频率为振荡频率的1/24。例如,如果选用12MHz晶振,则最高计数频率为0.5MHz。虽然对外部输入信号 的占空比无特殊要求,但为了确保某给定电平在变化前至少被采样一次,外部计数脉冲的高电平与低电平保持时间均需在一个机器周期以上。

当CPU用软件给定时器设置了某种工作方式之后,定时器就会按设定的工作方式独立运行,不再占用CPU的操作时间,除非定时器计满溢出,才可能中断CPU 当前操作。CPU也可以重新设置定时器工作方式,以改变定时器的操作。由此可见,定时器是单片机中效率高而且工作灵活的部件。

综上所述,我们已知定时器/计数器是一种可编程部件,所以在定时器/计数器开始工作之前,CPU必须将一些命令(称为控制字)写入定时/计数器。将控制字写入定时/计数器的过程叫定时器/计数器初始化。在初始化过程中,要将工作方式控制字写入方式寄存器,工作状态字(或相关位)写入控制寄存器,赋定时/计 数初值。下面我们就提出的控制字的格式及各位的主要功能与大家详细的讲解。

控制寄存器 定时器/计数器T0和T1有2个控制寄存器-TMOD和TCON,它们分别用来设置各个定时器/计数器的工作方式,选择定时或计数功能,控制启动运行,以及作为运行状态的标志等。其中,TCON寄存器中另有4位用于中断系统。

基于proteus的51单片机开发实例16-简易秒表

1. 基于proteus的51单片机开发实例16-简易秒表

1.1. 实验目的

本实例中我们来加深对51单片机定时器/计数器的理解,及定时器定时功能的使用方法,利用定时功能来实现一个简易秒表,该秒表通过两位数码管显示0~99秒的计时,并且可以通过按键实现秒表的启动、停止、清零。

图1 简易秒表电路

1.2. 设计思路

之所以说是简易秒表,因为我们平时所见到的秒表不仅有秒时间的变化,还有毫秒的变化,如下面的动图所示。而我们实现的秒表只有秒数的变化,没有毫秒级的变化。

图2 更精确的秒表

本例的设计思路是使用一个按键来控制秒表的启动、停止、清零功能。具体实现过程是:第一次按下按键,秒表开始工作,两位数码管从00开始显示,每秒显示的数字加1,一直加到99,然后再从00开始显示;当第二次按下按键,数码管的显示停止,同时数码管正在显示的数字不再变化;第三次按下按键,数码管的数字清零,变为显示00。

1.3. 基础知识

本例设计的基础知识有定时器的工作原理;数码管的显示原理,按键检测识别原理,这些我们在之前已经学习过了。

本例的另一个重点是程序代码比之前的代码复杂了,代码中涉及了端口位定义,位变量定义,数组的定义及初始化,函数的定义,C语言中switch case语句的使用等等;我们将在代码部分一一解释。

1.4. 电路设计

本实例的电路图如图1所示。单片机的P0和P1口接两个共阳极数码管,用于秒表显示。按键连接到P3.4端口,P3.4口在按键未按下时处于高电平,按键按下后,变为低电平。

1.5. 程序设计

本实例的程序代码如下所示。

这个程序代码中有很多知识点,我们来学习一下。

1、头文件包含#include <AT89x52.h>

这个语句的作用是将预定义好的51单片机的端口定义、寄存器定义等各种信息包含进来。例如我们在程序中用到的P3^4,EA,TH0等,我们之所以可以直接使用这些名称,就是因为在这个头文件中已经帮我们定义好了。如果程序中没有这条头文件包含的语句,则凡是用到这些名称的语句都会报错。

图3 51单片机头文件部分内容

2、位定义

在程序中有这些语句sbit K1 = P3^4; bit Key_State; 这两个都是位定义语句,只不过两者还有些区别,sbit是定义端口的某一位,而bit则定义一个位数据,这个位数据只有两个值0或1。

3、数组的定义和初始化

看一下这个语句unsigned char DSY_CODE[]={

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90

}

这个语句实现的功能就是在定义的同时初始化了数组中各元素的值。细心的人可能会发现,这个数组中元素个数没有定义,这是C语言的一个特色:数组定义的同时初始化的话,如果不定义数组元素的个数,那么默认按照初始化的值的个数设置。

再看这个unsigned char ViewData[2]; 只是定义了数组,没有初始化数组元素的值,所以必须指明数组元素的个数,并且如果程序中要对这个数组赋值的话,只能一个一个的赋值,ViewData[0]=0xC0;ViewData[1]=0xC0;而不能直接这样赋值ViewData[2]={0xc0,0xc0};这就是数组定义的同时初始化和数组只定义不初始化时的区别。

4、全局变量

全局变量必须在所有函数之前定义,并且全局变量在程序运行期间,它的值是不变的,除非程序中人为改变了这个值。

5、函数的定义和声明

函数可以在调用之前先声明,然后再调用它的函数之后定义,也可以在声明的同时定义,本例中就是在声明的同时定义。函数的声明只要一句话,例如void Key_Event_Handle(void);而函数的定义是指将函数要实现的功能写出来,具体说就是把函数的内容补充完善。

6、switch case语句

switch case语句属于判断语句,switch后面括号中的变量就是判断条件,这个判断条件只能是整数,不能是小数。每个case语句后面的功能执行完后,最好加一个break语句,以跳出整个判断结构,否则只要下面的case条件满足,就一直执行,这样容易造成混乱。

关于51单片机C语言编程的一些知识,今天就先说到这里,后面我们会有更多了解。

1.6. 实例仿真

编译程序后,将生成的hex文件载入proteus电路的单片机中,开始仿真,仿真时随时按下按键(要默记按键是第几次按下),观察两位数码管显示数字的变化,充分理解该实例的功能实现。

下面视频是本实例的仿真过程。

视频加载中...

1.7. 总结

通过本实例的学习,我们更加熟悉了51单片机定时器/计数器的定时功能,同时也更多的了解了51单片机C语言程序设计中的端口位定义,位变量定义,数组的定义及初始化,函数的定义,C语言中switch case语句的使用等等编程方法,这对我们继续深入掌握编程知识很有用处。

相关问答

51单片机计数器 怎么编程?

编程51单片机计数器的步骤如下:1.首先,确定计数器的工作模式。51单片机有多种计数器模式可供选择,如定时器模式、计数器模式等。根据实际需求选择合适的模式...

51单片机 写一个简单的脉冲计数 程序 -ZOL问答

这个将输入接到T0或T1的输入端(P3.4或P3.5)T0或T1设置为计数器模式,就可以了。你是要记频率吗,用T1和T0分别做定时和计数,定时一秒钟,就可以了读T0的数值了就...

MCS- 51单片机 定时器/ 计数器 作定时和计数作用时,其计算脉冲分别由谁提供?其定时时间与哪些因素有关?

计数的脉冲由外部提供..定时时是由外部晶振提供..定时加1的周期为一个机器周期...定时时间与初值和晶振有关..计数的脉冲由外部提供..定时时是由外部晶振...

51单片机 计数原理?

单片机中,脉冲计数与时间之间的关系十分密切,每输入一个脉冲,计数器的值就会自动累加1,只要相邻两个计数脉冲之间的时间间隔相等,则计数值就代表了时间的流...

51单片机 计数器 初始值如何设定?

初始值是这样计算的,比如计数器是16位,65535长度。计数器是从16位里面的值开始计数,也就是初始值,比如可以先相里面写入100计数器就冲100开始计数,,比如晶...

51单片机 如何用 计数器 检测脉冲信号(高低电平), 程序 怎样做!没...

可以利用51单片机的计数器T0、T1,例如用计数器0的外部计数脉冲输入端T0计数,当计满100个脉冲数量后,触发中断。进入计数服务中断程序。计数原理:例如:可以用...

51 系列 单片机 的定时器/ 计数器 有哪几种工作方式?

定时器0有四种工作方式:方式0:13位定时/计数器模式方式1:16位定时/计数器模式方式2:8位可重装载定时/计数器模式方式3:两个单独8位定时/计数器模式定时器1...

mcs- 51单片机计数器 最大计数值怎么算?

MCS-51单片机的计数器最大计数值取决于其位宽。对于8位计数器,最大计数值为2^8-1=255;对于16位计数器,最大计数值为2^16-1=65535。计数器从0开始计数,逐次增...

单片机 计数器 是干什么的 - 懂得

以51单片机16位定时计数器1(T1)来讲,通俗解释:计数是T1是一个能盛65536(十六位时)滴水的水盆,在水龙头下水一滴滴地滴入盆中。如果盆是空的那水在滴...

51单片机 脉冲计数原理?

1.是通过计数器来实现对脉冲信号的计数。2.在51单片机中,可以通过外部中断或定时器/计数器来实现脉冲计数。当脉冲信号触发外部中断或定时器/计数器时,计数...

猜你喜欢