课题六 简易频率计(课件)-《单片机技术与应用》同步教学(电子工业版)
2024-07-11
|
39页
|
22人阅读
|
2人下载
普通
内容正文:
课题六 简易频率计
定时器/计数器介绍
输出1kHz方波
定时1s
简易频率计
软件延时是通过不断执行指令,利用每条指令需要一定的机器周期消耗时间。
如循环:for(i=250;i>0;i--);
软件定时的特点:
1.编程较为简单,时间计算较为麻烦;
2.更重要的问题是,软件定时执行的过程中,CPU在干嘛?——
占用了宝贵的CPU资源。
软件延时
A:外加硬件电路实现,例如555时基电路。
缺点:增加成本、电路板尺寸等。
B:利用51单片机自带的定时计数器功能。
51单片机集成了2个16位的定时/计数器,可做定时用,可做计数用,可各自独立也可串联使用。
硬件定时的特点:
定时或计数由单独的电路完成,时间到或计数满,向CPU申请中断。
申请之前,CPU可以做其他事,节省了宝贵的资源。
硬件定时
51单片机的定时计数器
定时器/计数器的实质是一个能够自动加1的电路。
定时功能:是对机器周期计数,机器周期固定,时间就确定。
每一个机器周期结束时定时器自动加1,所以定时器相当于在对机器周期计数,如果机器周期是1us,那么定时器就是每1us加1。
定时器记满(16位/8位/13位几种方式),向CPU申请中断。
51单片机的定时计数器
计数功能:是对外部脉冲计数,脉冲不确定,如流水线上的零件。
只要单片机外部引脚T0或T1有从1到0的负跳变,相应的计数器就自动加1。即计数器实际上是对对应引脚的负跳变在计数,由于受振荡频率的限制,计数的最高频率只能达到振荡周期的1/24。
计数记满(和定时一样,有16/13/8位几种方式),向CPU申请中断。
定时器/计数器简介
T0和T1的工作方式和功能选择由特殊功能寄存器TMOD 的设置确定;定时时间由定时器的计数寄存器(TH0、TL0或TH1、TL1)的值确定;启动标志和定时中断标志在TCON高四位;定时中断允许由中断允许寄存器IE中的相应位确定。
计数器值置于16位的计数寄存器中。向计数寄存器赋值就是给定时器置初始计数数值,直接在表达式中引用计数寄存器就是读取定时器的值。
模式控制寄存器TMOD,是对定时器0和定时器1的计数方式和计数器控制方式进行设置的寄存器,低4位用于T0,高4位用于T1 。
GATE:门控位。为1由外部中断控制定时器工作。
:定时/计数模式选择位。 =0为定时模式; 当 =1为计数模式。
定时模式是对单片机内部的机器周期计数;计数模块是对外单片机引脚上的脉冲计数。
定时器/计数器的控制寄存器TMOD
定时器/计数器的控制寄存器TMOD
M1M0 工作方式 功能描述
0 0 方式0 13位计数器(213=8192)
0 1 方式1 16位计数器(216=65536)
1 0 方式2 8位自动重装计数初值计数器
1 1 方式3 仅适用于T0,分为2个独立的8位计数器
方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。最大计数值为:M=213=8192。
定时/计数器的工作方式 0
定时/计数器的工作方式 0
在方式0中,T0计数器的初始值设置命令为:
TH0=(8192-t×f/12)/32;
TL0=(8192-t×f/12)%32;
表达式中,如果为定时方式,则t为需要定时的时间,单位为μs,f为单片机的工作频率,单位为MHz;如果为计数方式,则t为需要计数的次数,f=12。
在程序编译时,编译程序自动将表达式进行计算,换算成对应的数值并赋值给TH和TL,与手动计算出对应的数值给TH、TL赋值一样。
定时/计数器的工作方式 1
在方式1中,由THx的高8位和TLx的低8位构成全16位定时器/计数器,其最大计数值为:
M=216=65536
定时/计数器的工作方式 1
在方式1中,T0计数器的初始值设置命令为:
TH0=(65536-t×f/12)/256;
TL0=(65536-t×f/12)%256;
T1与T0的初始化命令类似。
式中t和f的说明与方式0相同。在实际中这种方式应用较多。
方式2为自动重装初值的8位计数方式。
工作方式2特别适合于用作较精确的脉冲信号发生器。
计数个数与计数初值的关系为:
定时/计数器的工作方式 2
定时/计数器的工作方式2
在方式2中,T0计数器的初始值设置命令为:
TH0=TL0=256-t×f/12
T1与T0的初始化命令类似。
式中t和f的说明与方式0相同。在实际中这种方式应用较多。
方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。
工作方式3将T0分成为两个独立的8位计数器TL0和TH0 。
定时/计数器的工作方式3
TMOD=工作模式; //设置定时器的工作模式
THx=初始值; // 按工作方式写定时器计数的初值
TLx =初始值;
ETx=1; //允许定时器x产生中断
EA =1; //开中断
TRx=1; //开始计数
定时器的初始化
方式0:13位定时/计数方式,≤8192机器周期
THx=(8192-t*f/12)/32;
TLx=(8192-t*f/12)%32;
方式1:16位定时/计数方式,≤65536机器周期
THx=(65536-t*f/12)/256;
TLx=(65536-t*f/12)%256;
方式2:自动重装初值的8位定时/计数方式,≤256机
器周期
THx= TLx =256-t*f/12;
方式3:两个8位定时/计数方式, ≤256机器周期
定时器的工作模式及定时器初值
定时中断服务程序格式
void 中断服务函数名( ) interrupt 中断号
{
THx=高八位; //重装初值,方式2由硬件自
TLx=低八位; //动重装,不需要这两条命令
中断服务程序;//每中断一次就执行一次
}
输出1000Hz的方波
从P1.0输出1000Hz的方波,实际上就是要求从P1.0输出周期为1ms的方波。为了简化程序,将输出的方波的占空比设定为50%,则高电平和低电平的时间各为1ms的一半,即各为500μs。
单片机中实现500μs的定时,每次定时时间到了的时候,将P1.0的电平改变就可以了。一个引脚的电平的改变,使用取反指令就可以完成,具体的指令如“P10=~P10;”
输出1000Hz的方波
延时500μs
P1.0电平取反
P1.0电平取反
重装定时器初值
定时时间到了
中断结束
采用指令延迟程序框图
中断服务程序的流程图
输出1000Hz的方波
TMOD=0x01; //定时器0定时模式方式1
TH0=(65536-500*110592/120000)/256; //高8位初值
TL0=(65536-500*110592/120000)%256; //低8位初值
ET0=1; //允许定时器0产生中断
EA=1; //开中断
TR0=1; //开始计数
void 中断服务函数名( ) interrupt 1
{
TH0=(65536-500*110592/120000)/256; //高8位初值
TL0=(65536-500*110592/120000)%256; //低8位初值
CLK=~CLK; // 每次取反,产生方波
}
输出频率为 f 的方波
定时时间:t=1e6/f/2
TMOD=0x01; //定时器0定时模式方式1
TH0=(65536-11059200/f/2/12)/256; //高8位初值
TL0=(65536-11059200/f/2/12)%256; //低8位初值
ET0=1; //允许定时器0产生中断
EA=1; //开中断
TR0=1; //开始计数
void 中断服务函数名( ) interrupt 中断号
{
TH0=(65536-11059200/f/2/12)/256; //高8位初值
TL0=(65536-11059200/f/2/12)%256; //低8位初值
CLK=~CLK; // 每次取反,产生方波
}
拓展示例: 钢琴频率输出
音符 频率(HZ) 简谱码(T值)
低1 DO 262 63628
#1 DO# 277 63731
低2 RE 294 63835
#2 RE# 311 63928
低 3 M 330 64021
低 4 FA 349 64103
# 4 FA# 370 64185
低 5 SO 392 64260
# 5 SO# 415 64331
低 6 LA 440 64400
# 6 466 64463
低 7 SI 494 64524
每秒闪烁一次的LED
分析:
为了实现控制LED每秒闪烁一次地显示,由于定时时间是由单片机内部的机器周期来得到,不需要外部的具体的硬件电路,而只需要有驱动LED的电路即可,所以,对应的硬件电路如右图所示。
AT89S51
P2.0
+Vcc
1、在前面的课题中,是怎么样实现每秒闪烁一次的LED控制?请参照右图,写出具体的控制程序。
2、能否用定时中断的方式实现LED闪烁的时间?如能,该怎么样实现?
思 考
AT89S51
P2.0
+Vcc
回 顾
延时指定时间
P2.0电平取反
采用指令延迟程序框图
P2.0电平取反
重装定时器初值
定时时间到了
中断结束
中断服务程序的流程图
定时中断服务程序格式
void 中断服务函数名( ) interrupt 中断号
{
THx=高八位; //重装初值,模式2由硬件自动重
TLx=低八位; //装,不需要这两条命令
中断服务程序;//每中断一次就执行一次
}
回 顾
程序的设计思路:
#include <AT89X51.h>
sbit CLK=P2^0; //声明引脚
void main(viod)
{
设置定时器的初始化命令;
while( 1)
{ ; } //什么也不做,也可以是其他程序
}
void 中断服务函数名( ) interrupt 中断号
{
重装定时器的初始值;
CLK=~ CLK; // P2.0取反
}
回 顾
例中的要求是从单片机的P2.0脚上输出方波,控制LED每秒闪烁一次。按LED的点亮时间和熄灭时间相同进行处理,需要进行0.5s的定时。具体处理是,每过0.5s,将LED的状态取反就可以实现目标了。或者说,与本课题中的任务一类似,只不过是频率变得很低了。
在单片机中,由于定时器最多只能计数65536次,所以在晶振频率较高时,不能够一次产生1s的中断。如晶振为12MHz时,机器周期为1μs,则大定时时间为65536μs,远小于1s。而本例中所采用的晶振为11.0592MHz,当然也不够定时0.5s。
分析
为了完成0.5s的定时,一般来说,采用方案有两种。
第一种是采用硬件定时的基础上,增加一个存储单元,用软件的方式进行计数,延长了定时的时间长度。
第二种方案是也是采用一个定时器进行硬件定时,然后采用硬件计数的方式进行延长定时时间。
分析
#include<Reg51.h>
声明引脚;
声明变量;
void main(viod)
{
设置定时器的初始化;
while( 1)
{;} //什么也不做,也可以是其他程序
}
void 中断服务函数名( ) interrupt 中断号
{
重装定时器的初始值;
计数变量加一;
if (次数到了)
{
取反,输出方波;
计数变量=0;
}
}
1.采用硬件定时+软件计数的示例程序
#include<Reg51.h>
声明引脚;
声明变量;
void main(viod)
{
设置定时器的初始化;
while( 1)
{;} //什么也不做,也可以是其他程序
}
void 中断服务函数名( ) interrupt 3
{ 重装定时器的初始值;
在P3.4上输出一个方波;
}
void 中断服务函数名( ) interrupt 1
{ 重装定时器的初始值;
将P2.0取反;;
}
2.采用硬件定时+硬件计数的示例程序
思考与练习
1、用定时器定时的改写彩灯控制程序。
2、用定时中断实现数字钟。
任务目标
具体目标是:利用AT89S51单片机的T0、T1的定时/计数功能,完成对输入的信号的频率进行测量,测量的结果通过8位动态数码管显示出来。这里要求实现对0~200KHz的信号频率进行准确测量,测量误差不超过±1Hz。
简易频率计
频率计电路原理图
程序设计分析
因实验电路晶振fOSC=11.0592MHz,所以T1的初值的装入语句如下:
TH1=(65536-5*110592/12)/256;
TL1=(65536-5*110592/12)%256;
每定时1s钟时间到了,就停止T0的计数,而从T0的计数单元中读取计数的数值,然后进行数据处理,送到数码管显示出来。
由本课题中的任务二中可知,T1工作在定时状态下,最大定时时间约为65ms,达不到1s的定时,所以采用定时50ms,共定时20次,即可完成1s的定时功能。
一、 定时1s
二、输入的脉冲计数
作为定时器T0,为了得到1s内的频率值,需要在定时1s之前将其初始值赋为0。同时,由于T0的最大计数值为65536,小于要求计数的频率的最大值,所以,在1s内,完全有可能产生溢出,对此,采用与定时1s的类似的方法,使用软件来记录计数器有几次溢出。
程序设计分析
频率计算
频率为原有数据的1/10
取出个位送显示数组
处理完毕?
没有
处理结束
频率计算及数据转换程序框图
思考与练习
1、设置单片机的定时器,使单片机输出指定的频率,完成一首乐曲的播放。
2、针对本课题进行适当修改,分别实现下列要求:
⑴延长闸门时间,实现较低频率的测量。
⑵在硬件电路上外加分频器,测量更高频率。
⑶使用测量周期的方法,测量较低频率的信号。
⑷综合使用测量周期和频率的方法,实现高精度的频率测量。
文本
TF1
TR1
TF0
TR0
GATE
C/T
M1
M0
GATE
C/T
M1
M0
TH0
TL0
8位
5位
溢出
TCON
TMOD
D0
D7
1
&
≥1
1
0
T0引脚
INT0引脚
0
0
机器周期
D7
D0
申请
中断
1
文本
TF1
TR1
TF0
TR0
GATE
C/T
M1
M0
GATE
C/T
M1
M0
1
&
≥1
1
0
T0引脚
INT0引脚
1
0
机器周期
TH0
TL0
8位
8位
溢出
TCON
TMOD
D0
D7
D7
D0
申请
中断
文本
TF1
TR1
TF0
TR0
GATE
C/T
M1
M0
GATE
C/T
M1
M0
1
&
≥1
1
0
T0引脚
INT0引脚
1
0
机器周期
TH0
TL0
8位
溢出
TCON
TMOD
D0
D7
D7
D0
申请
中断
�
�����
�
�
�
TF1�
TR1�
TF0�
TR0�
�
GATE�
C/T�
M1�
M0�
GATE�
C/T�
M1�
M0�
���������
�
�
�
�
�
�
�
�
1�
&�
��1�
�
1�
0�
T0�����
INT0�����
1�
1�
���������
TH0�
TL0�
�
8���
�����
TCON�
TMOD�
D0�
�
D7�
D0�
����
�����
�
8���
�
�
�
����
�����
�����
$$
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。