实验二 单片机定时器和计数器编程

2024-05-08

实验二 单片机定时器和计数器编程(精选2篇)

实验二 单片机定时器和计数器编程 篇1

实验三

定时/计数实验

一、实验目的

1、理解单片机的定时/计数原理,掌握定时/计数程序的编写方法。

2、掌握定时/计数器在定时、计数、频率测量等方面的应用。

3、学会使用PROTEUS中VSM虚拟示波器观察波形。

二、实验设备

计算机一台;单片机实验仪一台;Keil C51和Proteus软件。

三、实验内容

利用定时计数器1,编程实现从P1.0、P1.1、P1.2三个I/O引脚分别输出频率为0.25Hz、50 Hz、1k Hz的方波信号。利用P1.0、P1.1、P1.2三个I/O引脚所接的三个LED灯或利用示波器进行观察。已知fosc=12MHz。

四、实验电路图

图1 8路LED灯控制原理图

五、实验接线

P1.0、P1.1、P1.2三个I/O引脚接J12的三个引脚(即三个LED灯)。

六、思考题

1、简要写出实现该实验的方案(要有必要的计算)。

2、单片机定时/计数器的“加一”操作和单片机运行主程序是同时工作(并行工作)的,还是有先后顺序的?单片机运行中断程序和运行主程序是同时工作(并行工作)的,还是有先后顺序的?

3、单片机定时/计数器的定时与计数的区别是什么,软件上分别应如何设置?

4、在该实验的基础上,输出的三路信号的占空比可以分别为1/2,1/3,1/4吗?

七、实验报告要求 实验目的

1、实验目的

2、实验设备

3、实验内容

4、实验流程图

5、实验源程序

7、思考题解答

8、实验总结及心得体会

实验二 单片机定时器和计数器编程 篇2

一、原理简介

首先让我们举闹钟为例, 将它定时在一分钟后闹铃, 这就需要秒针走一圈 (60次) 。即一分钟时间转化为秒针走的次数, 也就是计数的次数, 计数到了60次然后闹铃, 而每一次计数的时间是1秒。单片机内部的定时/计数器跟闹钟类似, 可以通过编程来设定要定时的时间、定时时间到了进行相应的操作。那么在单片机内部计数一次的时间是多少呢, 51单片机输入的时钟脉冲是由晶体振荡器的输出经12分频后得到的, 所以定时器也可看作是对计算机机器周期的计数器。因为每个机器周期包含12个振荡周期, 故每一个机器周期定时器加1, 可以把输入的时钟脉冲看成机器周期信号。故其频率为晶振频率的1/12。如果晶振频率为12MHz, 则定时器每接收一个输入脉冲的时间刚好为1μs。在本实验套件中采用的是11.0592M的晶振, 故每接收一个输入脉冲的时间约为1.085μs。实现精确定时在实际项目应用中非常重要, 因为往往需要用到精确定时一段时间, 然后定时时间到的时刻做相应的任务。

那如何编程实现定时时间呢?首先先简单介绍下本实验板上单片机 (STC89C52) 内的定时器资源。STC89C52内有三个定时/计数器, 分别为T0、T1和T2。其中T0、T1工作方式一样, 一并介绍。T2的工作方式稍有区别, 这里不做介绍, 实验套件光盘中有实际应用程序。同时, 单片机中的定时器和计数器是复用的, 计数器是记录外部脉冲的个数, 而定时器则是由单片机内部时钟提供的一个非常稳定的计数源。本讲中, 以T0、T1作为定时器来进行实例介绍使用。

了解了单片机内的定时器资源后, 接下来我们来对定时器寄存器进行详细介绍。TMOD (见表1) 、TCON (见表3) 与定时器T0、定时器T1间通过内部总线及逻辑电路连接, TMOD用于设置定时器的工作方式, TCON用于控制定时器的启动、停止, 标志定时器的溢出和中断情况。当设置了定时器的工作方式并启动定时器工作后, 定时器就按被设定的工作方式独立工作, 不再占用CPU的操作时间, 只有在计数器计满溢出时才可能中断CPU当前的操作。

表中各位 (从左至右为从高位到低位) 含义如下。

TMOD的低4位为定时器0的方式字段, 高4位为定时器1的方式字段, 它们的含义完全相同。

M1和M0:工作方式控制位, 其定义如表2所示 (其中i=0, 1) 。

GATE:门控位。当GATE=0时, 软件控制位TR0或TR1置1即可启动定时器。

值得注意的是TMOD寄存器不能位寻址, 只能用字节指令设置高4位定义定时器1上的工作方式或低4位定义定时器0的工作方式。而且在复位时, TMOD所有位均置0。

表中各位 (从左至右为从高位到低位) 含义如下。

(1) TFl:定时器1溢出标志位。当定时器1计满数产生溢出时, 由硬件自动置TF1=1, 向CPU发出定时器1的中断请求, 在中断允许时响应。进入中断服务程序后, 由硬件自动清0。在中断屏蔽时, TF1可作查询测试用, 此时只能由软件清0。

(2) TR1:定时器1运行控制位。由软件置1或清0来启动或关闭定时器1。

当GATE=l, 且 为高电平时, TRI置1启动定时器l;当GATE=0时, TR1置1即可启动定时器1。

(3) TF0:定时器0溢出标志位。其功能及操作情况同TF1。

(4) TR0:定时器0运行控制位。其功能及操作情况同TR1。

(5) IE1:外部中断1 请求标志位。

(6) IT1:外部中断1触发方式选择位。

(7) IE0:外部中断0 请求标志位。

(8) IT0:外部中断0触发方式选择位。

值得注意的是TCON中的低4位用于控制外部中断, 与定时器/计数器无关, 在以后的讲座中会提及。当系统复位时, TCON的所有位也均清0。

在上文中提到定时器溢出和中断, 什么是定时器溢出呢?我们可以这样理解:往一个盆中滴水, 水滴持续落下, 盆中的水持续变满, 最终会有一滴水使得盆中的水满了 (这相当于计数到最大值) 。这个时候如果再有一滴水落下, 这时水就会漫出来, 这就是“溢出”。当然, 水溢出是流到地上, 而定时器溢出后将使得TF0变为“1”。一旦TF0由0变成1, 就会产生中断。中断就是由于某个事件的发生, CPU暂停当前正在执行的程序, 转而执行处理该事件的一个程序。该程序执行完成后, CPU接着执行被暂停的程序的这样一个过程。这正如我们本来在做某事, 有人过来请求帮忙, 我们停下手中的活去帮忙, 完事之后回来接着做原来的事情。根据中断引发的不同, 或者CPU响应中断的不同条件, 也可以把中断划分为可屏蔽中断 (也就是说我们可以拒绝帮别人忙, 继续做自己的事情) 和不可屏蔽中断 (事情做累了, 必须休息) 两种。

了解了中断原理之后, 我们来看中断允许控制寄存器IE (见表4) 和中断优先寄存器IP (见表5) 。

EA:中断允许总控制位。EA=0, 禁止所有中断;EA=1, 开放所有中断, 但是否允许各中断源的中断请求, 还要取决于各中断源的中断允许控制位的状态。这点要注意, 初学者往往容易忘了开放所有中断, 从而导致没法进入中断源。

ET2:时器/计数器T2的中断允许位。

ES:串行口的中断允许位。

ET1:定时器/计数器T1的中断允许位。

EX1:外部中断1 (INT1) 的中断允许位。

ET0:定时器/计数器T0的中断允许位。

EX0:外部中断0 (INT0) 的中断允许位。

以上7个中断允许控制位为0时, 禁止中断, 为1时允许中断。

PT2:定时器/计数器T1中断优先级控制位。

PS:串行口中断优先级控制位。

PT1:定时器/计数器T1中断优先级控制位。

PX1:外部中断1优先级控制位。

PT0:定时器/计数器T0中断控制位。

PX0:外部中断0中断优先级控制位。

以上6个中断优先级控制位分别为“0”时为低级中断, 为“1”时为高级中断。如果几个同一优先级的中断源同时向CPU申请中断, CPU通过内部顺序查询逻辑电路, 按自然优先级顺序确定该响应哪个中断请求。自然优先级由硬件形成, 其优先级别从高到底为外部中断0、定时器/计数器T0、外部中断1、定时器/计数器T1、串行口中断、定时器/计数器T2。

至此, 对定时器控制相关的重要寄存器都介绍完毕了, 接下来通过编写程序来进行验证实践。

二、电路详解

此讲采用和上讲一样的电路, 在此不做赘述 (见图1) 。

三、程序设计

定时器0应用测试程序 (控制D1闪烁) 。

1. 程序详细说明

(1) 头文件包含。程序接下来调用的P0_0就是该头文件中定义好的一个寄存器地址。在对单片机内部的寄存器操作之前, 应申明其来处, 有兴趣的读者可以看看AT89X52.h文件中的内容。

(2) 宏定义led, 便于直观理解也便于程序修改, 将P0_0口命名为led, 这样在程序中就可以用led代替P0_0口进行操作。

(3) 定义一个8位的全局变量。

(4) 主函数入口。主函数不传递参数也不返回值。

(5) 设定定时器0工作在模式1, 为16位的计数器。

(6) 定时器高8位赋初值。对256取整。

(7) 定时器低8位赋初值。对256取余。

(8) 开总中断。

(9) 开定时器0中断。

(10) 定时器0启动, 开始计数。

(11) 设置开定时器0中断为优先中断。

(12) 死循环, 等待中断。

(13) 定时器0中断服务函数入口。

(14) 定时器高8位赋初值。对256取整。

(15) 定时器低8位赋初值。对256取余。

(16) 对变量count进行加1操作。

(17) 如果count增长到10。

(18) count变量清0。

(19) led输出取反。

2. 程序流程图与实验现象

程序流程如图2所示。经编译下载程序到单片机内运行后, 可以看到实验板上P0_0口外接的LED灯有规律的一亮一灭的闪烁见图3。亮灭的时间可以计算为10×50000×1.085μs=542.5ms。实际的时间要比这稍多几个ms, 这是因为没有把条件判断和程序调用的指令时间算在内。在要求非常精确的场合, 应当实际微调。

四、总结

本讲主要介绍了51单片机内部定时器和中断系统以及编写第一个简单的定时器实验程序。通过该讲, 大家可以发现单片机内的定时器和中断系统并不难学, 只要记住应用的相关操作步骤多进行几次实践就可以很熟练的掌握这些资源的用法。鉴于本讲的理论内容较多, 希望读者多花时间记下或者熟悉。下一讲, 将要介绍如果单片机串口通信并给出实例, 敬请期待。

上一篇:我爱你妈妈作文100字下一篇:邮政独立运营发展成就