摘要
在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量显得更为重要。测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。电子计数器测频有两种方式:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法,如周期测频法。本次设计的简易数字频率计以555为核心,采用直接测频法测频。
数字频率计是近代电子技术领域的重要测量工具之一,同时也是其他许多领域广泛应用的测量仪器。数字频率计是在规定的基准时间内把测量的脉冲数记录下来,换算成频率并以数字形式显示出来。数字频率计用于测量信号(方波,正弦波或其他周期信号)的频率,并用十进制数字显示,它具有精度高,测量速度快,读数直观,使用方便等优点。
关键字:数字频率计;频率;时限;放大整形
目录
一、概述 3
二、方案设计与论证 3
1.设计原理 3
2.整体电路设计 4
三、单元电路设计与分析 4
1.放大整形电路设计 4
2.时基电路及控制电路设计 5
四、总原理图及元器件清单 6
1.总原理图 6
2.元器件清单 7
五、结论 7
六、心得体会 8
七、参考文献 8
一、概述
通过放大整形电路使被测信号放大产生一个脉冲信号,并和时基电路一块控制计数器的开或关,时基电路产生的脉冲信号加到控制电路,控制电路再生锁存信号,加到锁存电路上,然后经过一个反相器,产生清零信号,加到计数器的清零端。当计数完毕时,锁存器作用,将数锁住,并加到译码器上,经过译码后显示在LED数码管上,一共有四个数码管,使量程达到了9999。开始时,先清零,然后时基电路和放大整形电路一块作用开始计数,当时基电路产生低电位时,计数器停止工作,锁存器开始工作,将数送到译码电路,通过译码,将数显示在数码管上。然后,在下一个信号到来时,先清零然后继续上述操作。
二、方案设计与论证
频率计 是直接用十进制来显示被测信号频率的一种测量装置。它可以测量正弦波、方波和三角波的频率。利用施密特触发器将输入信号整形为方波,并利用计数器测量1s内脉冲的个数,利用锁存器锁存,稳定显示在数码管上。
1.设计原理
频率,即是周期信号在单位时间(1S)内变化的次数。若在一定时间间隔T内测得这个周期信号的重复变化次数N,则其频率就可以表示:
图2-1即为数字频率计的原理框图。被测信号经过放大整形将其转换成同频率的脉动信号。时基信号发生器提供标准的时间脉冲信号。计数译码显示电路由计数器、锁存器、译码器和LED显示器构成。它对被测信号进行计数显示。闸门电路由标准信号进行控制,当秒信号来到时,闸门开通,被测脉冲信号通过闸门送到计数译码显示电路。秒信号结束时,闸门关闭,计数器停止计数。
图2-1 数字频率计原理框图
2.整体电路设计
数字频率计由时基电路、控制电路、闸门电路、计数锁存电路、脉冲形成电路和译码显示电路组成。图2-2 数字频率计的组成框图。
图2-2 数字频率计整体框图
被测信号经过放大整形电路变成方波信号,其周期与被测信号的周期是一样的。实际电路输出标准时间信号即为闸门信号。闸门时间设置为1S,计数器记得的脉冲即为被测信号的频率。但在每次计数之前需对计数器清零,每次计数完成之后要对数据进行锁存。如图2-3为工作时序波形图。
图2-3 工作时序波形图
三、单元电路设计与分析
1.放大整形电路设计
由三极管及电阻构成的幅度扩展电路和555构成的施密特触发电路构成整形电路,如图3-1所示。
三极管U14及电阻R1、R2、R3构成信号幅度扩展电路,当输入信号较小时,对信号进行幅度扩展。用555构成的施密特触发器作用是将输入的周期信号,如正弦波、三角波或其他成周期性变化的波形变换成脉冲波形,其周期不变。
图3-1 放大整形电路
2.时基电路及控制电路设计
时基电路的作用是控制计数器的输入脉冲。当标准时间信号(1s正脉冲)到来时,闸门关闭,计数器无脉冲输入。时基电路可以由555定时器构成的多谐振荡器实现,如图3-2左侧部分所示。
控制电路可以由555构成的单稳态电路来构成,如图4-2右侧部分所示。
逻辑控制电路利用标准时间信号结束后产生的负跳来产生锁存信号,同时锁存信号经反相又产生清零信号,锁存信号的脉冲宽度由单稳态电路本身的时间常数决定。
图3-2 时基电路及控制电路
四、总原理图及元器件清单
1.总原理图
图4-1 总原理图
2.元器件清单
五、结论
在本次课程设计中,完成了设计任务书中的基本要求,我使用proteus ISIS仿真软件进行电路设计简易数字频率计仿真设计。
简易数字频率计是使用十进制数字显示信号频率的测量装置。它可以对方波以及正旋波进行测量。
在最初设计时,对数字频率计的整体设计概念认识不足,以及对仿真软件的使用方法不太了解,使在设计初期进展不大,随后在各种资料的帮助下使设计得以进行。但因照抄课本,在进行放大整形电路设计时,不能得到想要的结果,后在同学们都的帮助下,终于做出新的电路。其次,在使用555集成电路时,也遇到了众多问题,在同学的帮助下都一一解决,最终完成了任务。
六、心得体会
本次实习让我们体味到设计电路、连接电路、调测电路过程中的乐苦与甜。设计是我们将来必需的技能,这次实习恰恰给我们提供了一个应用自己所学知识的机会,从到图书馆查找资料到对电路的设计对电路的调试再到最后电路的成型,都对我所学的知识进行了检验。在实习的过程中发现了以前学的数字电路的知识掌握的不牢。同时在设计的过程中,遇到了一些以前没有见到过的元件,但是通过查找资料来学习这些元件的功能和使用。制作过程是一个考验人耐心的过程,不能有丝毫的急躁,马虎,对电路的调试要一步一步来,不能急躁,因为是在电脑上调试,比较慢,又要求我们有一个比较正确的调试方法,像把频率调准等等。这又要我们要灵活处理,在不影响试验的前提下可以加快进度。合理的分配时间。在设计控制电路的时候,我们可以连接译码显示和计数电路,这样就加快了完成的进度。最重要的是要熟练地掌握课本上的知识,这样才能对试验中出现的问题进行分析解决
七、参考文献
[1] 阎石 数字电子技术(第五版) 高教出版社 ,2006.5
[2] 康光华 电子技术基础 模拟部分 高教出版社 ,1999.6
[3] 崔瑞雪 张增良 电子技术动手实践 北京航空航天大学出版社,2007.6
[4] 郭照南 电子技术与EDA技术课程设计 中南大学出版社,2010.1
第二篇:单片机课程设计报告 数字频率计
湖南科技大学
《单片机原理及应用》
课程设计报告
题目: 数字频率计
姓名: **
学号: **
班级: 08自动化一班
专业: 自动化
信息与电气工程学院
20**年 7月
内容摘要
设计以ATMEL单片机为核心,利用单片机的计数器和定时器的功能对被测信号进行计数。编写相应的程序可以使单片机自动调节测量的量程,并把测出的频率数据送到显示电路显示。
本设计的目的是通过在对单片机原理及应用的学习,以及查阅资料,培养自学与动手能力,把学到的知识应用到日常生活当中。在设计的过程中,不断的补充不知道的内容、巩固所学,和队友的分工合作、相互讨论,运用科学的分析问题的方法解决遇到的困难,掌握单片机系统一般的开发流程,学会对常见问题的处理方法,积累设计系统的经验,充分发挥教学与实践的结合。
关键词:单片机;数字频率计;设计;
目录
第 1 节 概述……………………………………… 4
1.1 数字频率计概述…………………………… 4
1.2 基本设计原理…………………………………5
1.3 系统主要功能…………………………………5
1.4 设计中遇到的一些问题………………………5
第 2 节 数字频率计(低频)的硬件结构设计………6
2.1 系统硬件的构成…………………………………6
2.2 系统工作原理图…………………………………6
2.3 单片机最小系统设计……………………………7
2.4 频率产生电路设计………………………………8
2.5 数据显示电路设计(8279)……………………8
2.6 电源设计………………………………………10
第 3 节 软件设计……………………………………11
3.1 程序图…………………………………………11
3.2 数据采集程序设计…………………………….11.
3.3 显示子程序设计……………………………… 13
3.4 C语言程序清单………………………………….14
第 4 节 结束语……………………………………….19.
参考文献……………………………………………….19
第1节 概述
1.1 数字频率计概述
数字频率计是采用数字电路制成的实现对周期性变化信号的频率的测量。
数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。它是一种用十进制数字,显示被测信号频率的数字测量仪器。它的基本功能是测量正弦信号,方波信号以及其他各种单位时间内变化的物理量。在进行模拟、数字电路的设计、安装、调试过程中,由于其使用十进制数显示,测量迅速,精度高,显示直观,所以经常要用到数字频率计。
频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。通常情况下计算每秒内待测信号的脉冲个数,此时我们称闸门时间为1秒。闸门时间也可以大于或小于一秒。闸门时间越长,得到的频率值就越准确,但闸门时间越长则没测一次频率的间隔就越长。闸门时间越短,测的频率值刷新就越快,但测得的频率精度就受影响。本文。数字频率计是用数字显示被测信号频率的仪器,被测信号可以是正弦波,方波或其它周期性变化的信号。如配以适当的传感器,可以对多种物理量进行测试,比如机械振动的频率,转速,声音的频率以及产品的计件等等。因此,数字频率计是一种应用很广泛的仪器。
电子系统非常广泛的应用领域内,到处可见到处理离散信息的数字电路。数字电路制造工业的进步,使得系统设计人员能在更小的空间内实现更多的功能,从而提高系统可靠性和速度。
集成电路的类型很多,从大的方面可以分为模拟电路和数字集成电路2大类。数字集成电路广泛用于计算机、控制与测量系统,以及其它电子设备中。一般说来,数字系统中运行的电信号,其大小往往并不改变,但在实践分布上却有着严格的要求,这是数字电路的一个特点。数字集成电路作为电子技术最重要的基础产品之一,已广泛地深入到各个应用领域。
本次设计的数字频率计由四部分组成: 频率源,单片机、8279显示驱动电路、显示电路。
1.2 基本设计原理
运用单片机TO,T1计数功能来完成对输入信号的计数。其T1为
计数器,T1为计时器。
为T1装入初值19466,定时50ms,重复50次即为1s,与此同时将同时计数的T0里的值取出,即为该频率信号1s的频率示数
1.3系统主要功能
利用单片机的T0,T1计数定时器功能,来完成对输入信号进行率计数,计数结果通过8位动态数码管显示出来,能对0到250KHZ的信号频率进行准确计数。
特点1,由开关控制启动。
特点2,无脉冲信号时,数码管显为全0。
特点3,可以多次测量,自动刷新 1s一次。
特点4,使用溢出标志T0count,防止20ms内计数超过65536次的频率信号溢出造成的示数错误
1.4 设计中遇到的一些问题
1. 计数器溢出造成数据错误
解决方法:通过设置溢出中断T0count变量来记下溢出的次数再结合总数就不会有误差。
2. 定时器初值的设置
解决方法:本实验才用11.0592M晶振驱动,理论初值设为19456,仍然会有一些误差,经过反复调校,确认初值设为19466最佳。
3. 超高频率计数问题
实验箱有两种百万级别的频率分别为1.228M和2.4576M,单片机无法响应短时间的超高频率,造成实验结果失常。
解决方法:采用硬件分频电路。
第 2 节 数字频率计(低频)的硬件结构设计
2.1 系统硬件的构成
2.2 系统工作原理图
选择AT89S52单片机芯片,选用两位8段共阴极LED数码管实现频率显示,利用8279作I/O口扩展,连接数码管。通过定时器1计时方式,定时器0计数方式,定时每秒钟对外部频率计数,把计数值通过8279芯片在数码管上显示
2.3 单片机最小系统设计
1.时钟电路
单片机的时钟一般需要多相时钟,所以时钟电路由振荡器和分频器组成。
AT8951内部有一个用于构成振荡器的可控高增益反向放大器。两个引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。在片外跨接一晶振和两个匹配电容C1、C2如图4.3所示,就构成一个自激振荡器。振荡频率根据实际要求的工作速度,从几百千赫至24MHz可适当选取某一频率。匹配电容C1、C2要根据石英晶体振荡器的要求选取。
当晶振频率为12MHz时,C1C2一般选30pF左右。上述电路是靠AT89C51单片机内部电路产生振荡的。也可以由外部振荡器或时钟直接驱动AT89C51。本设计采用内部电路产生振荡。
2.复位电路
RST引脚是复位端,高电平有效。该引脚输入至少连续两个机器周期以上的高电平,单片机复位。RST引脚内部有一个ST触发器以对输入信号整形,保证内部复位电路的可靠,所以外部输入信号不一定要求是数字波形。使用时,一般在此引脚与VSS引脚之间接一个8.2kΩ的下拉电阻,与VCC引脚之间接一个约10μF的电解电容,即可保证上电自动复位。
2.4 频率产生电路设计
频率发生电路是由CD2040芯片产生150HZ,300HZ,600HZ,153.6KHZ,2.4KHZ 的频率,比较稳定。
1.频率产生电路
2.频率产生电路的驱动电路
2.5 数据显示电路设计(8279)
1.8279部分
数码管显示电路由4位八段共阴数码及8279芯片及74HS138芯片组成,共阴数码管在应用时将公共极COM接到地,当某一字段发光二极管的阴极为高电平时,相应字段就点亮。当某一字段的阴极为低电平时,相应字段就不亮。通过数码管显示,可以简单而准确的实现显示频率。
2.数码管
2.6 电源的设计
本电源电路是通过变压器,把外部接入的22V电源转变为5V电源,采用7805使电源稳定。
第 3 节 软件设计
3.1 程序流程图
根据设计项目所需功能,我们先进行初始化,在待机状态下,采集频率。然后检测是否有按钮按下,若按钮按下,则数码管显示所采集的频率,再按下键0时则不显示。
系统实现所有功能,其程序框图如图所示。
3.2 数据采集子程序的设计
1. 设置T1为定时器,T0为计数器 ,并设置变量x,用来装1s时间内的计数数值。
unsigned char i;
init8279(); //8279初始化
while(1)
{
TMOD=0x15;//T1, 设为方式1定时模式,TO设为方式1计数模式
TH0=0;//T0的16位计数器高八位清0
TL0=0;//T0的16位计数器低八位清0
/*经过测试,初值设为19466最佳,65536-46070*/
TH1=(65536-46070)/256; //T1定时50ms处置的高八位送TH1,计算公式(65536-定时器初值)/晶振频率*12=0.05
TL1=(65536-46070)%256;//T1定时50ms处置的底八位送TL1,得出定时器初值为19456,应该减去46080
TR1=1;//启动定时器1
TR0=1;//启动计数器0
ET0=1;//开计数器0中断
ET1=1;//开定时器1中断
EA=1;//开CPU中断
while(1)
{
if(k==1)//开关设置
{
C8279=0xd1;
}
while(k==1);
if(flag==1)// 1s时间到?
{
if(x==0)//如果没有脉冲,数码管显示全0
{
C8279=0x80; //置显示位置
D8279=ledseg[0];//显示
C8279=0x81; //置显示位置
D8279=ledseg[0];//显示
C8279=0x82; //置显示位置
D8279=ledseg[0];//显示
C8279=0x83; //置显示位置
D8279=ledseg[0];//显示
C8279=0x84; //置显示位置
D8279=ledseg[0];//显示
C8279=0x85; //置显示位置
D8279=ledseg[0];//显示
C8279=0x86; //置显示位置
D8279=ledseg[0];//显示
C8279=0x87; //置显示位置
D8279=ledseg[0];//显示
}
flag=0;
x=T0count*65536+TH0*256+TL0; //计算频率值
2. 计数器0中断
设置变量T0count,防止20ms内计数器溢出造成的错误。
void to(void) interrupt 1 using 0 // 定时器0中断处理函数
{
T0count++; // 16位计数器满,频率计最高八位计数变量加1
}
3. 定时器1中断
void t1(void) interrupt 3 using 0
{
/*经过测试,初值设为19466最佳,65536-46070*/
TH1=(65536-46070)/256; //T1定时50ms处置的高八位送TH1,计算的时候公式(65536-定时器初值)/晶振频率*12=0.05
TL1=(65536-46070)%256;//T1定时50ms处置的底八位送TL1,得出定时器初值为19456,应该减去46080
timecount++; // 50ms时间到,1s计数器加1
if(timecount==20)
{
TR0=0;//时间到,停止计数
TR1=0;//T1停止计时
timecount=0; //1s计数器变量清0
flag=1;//1s定时时间到标志状态变量置1
}
}
3.3 显示子程序的设计
1.先初始化8279
void init8279()
{
C8279=10; //置8279工作方式,8个字符显示,右入口
C8279=0xd1; //清除 LED 显示
delay();
}
2.采用8279驱动数码管,先置显示位置,在置显示的段选码
如下举例:
while(x/10)
{
i=x%10;
C8279=0x80; //置显示位置
D8279=ledseg[i];//显示
x=x/10;
// 第二个
i=x%10;
C8279=0x81; //置显示位置
D8279=ledseg[i];//显示
x=x/10;
//第三个
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
3.4 C语言程序清单
/*数字频率计数器设计 designed by 李众*/
/*利用单片机的T0,T1计数定时器功能,来完成对输入信号进行频率计数,计数结果通过8位动态数码管显示
出来,能对0到250KHZ的信号频率进行准确计数*/
/* 特点1,由开关控制启动,关闭
特点2,无脉冲信号时,显示为0
特点3,可以多次测量,自动刷新 1s一次*/
//-----头文件引用------
#include<reg51.h>
#include<absacc.h>
//-----宏声明-----
#define D8279 XBYTE[0xF238] //8279 数据口地址
#define C8279 XBYTE[0xF239] //8279 状态/命令口地址
#define uchar unsigned char
#define uint unsigned int
//-----变量定义-----
uchar code ledseg[] = { 0x3f,
0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5E,0x79,0x71};//LED显示常数表
unsigned char T0count ;//频率计最高八位计数变量
unsigned char timecount;// 1s定时器计数变量
unsigned long x;
bit flag;//标志位
sbit k=P1^0;//启动开关定义1
//-----延时子程序-----
void delay()
{
uint k,j;
for(k=0;k<100;k++)
{
for(j=0;j<500;j++);
}
}
//----8279初始化子程序-----
void init8279()
{
C8279=10; //置8279工作方式,8个字符显示,右入口
C8279=0xd1; //清除 LED 显示
delay();
}
//-----主程序-----
void main()
{
unsigned char i;
init8279(); //8279初始化
while(1)
{
TMOD=0x15;//T1, 设为方式1定时模式,TO设为方式1计数模式
TH0=0;//T0的16位计数器高八位清0
TL0=0;//T0的16位计数器低八位清0
/*经过测试,初值设为19466最佳,65536-46070*/
TH1=(65536-46070)/256; //T1定时50ms处置的高八位送TH1,计算公式(65536-定时器初值)/晶振频率*12=0.05
TL1=(65536-46070)%256;//T1定时50ms处置的底八位送TL1,得出定时器初值为19456,应该减去46080
TR1=1;//启动定时器1
TR0=1;//启动计数器0
ET0=1;//开计数器0中断
ET1=1;//开定时器1中断
EA=1;//开CPU中断
while(1)
{
if(k==1)//开关设置
{
C8279=0xd1;//清屏
}
while(k==1);
if(flag==1)// 1s时间到?
{
if(x==0)//如果没有脉冲,数码管显示全0
{
C8279=0x80; //置显示位置
D8279=ledseg[0];//显示
C8279=0x81; //置显示位置
D8279=ledseg[0];//显示
C8279=0x82; //置显示位置
D8279=ledseg[0];//显示
C8279=0x83; //置显示位置
D8279=ledseg[0];//显示
C8279=0x84; //置显示位置
D8279=ledseg[0];//显示
C8279=0x85; //置显示位置
D8279=ledseg[0];//显示
C8279=0x86; //置显示位置
D8279=ledseg[0];//显示
C8279=0x87; //置显示位置
D8279=ledseg[0];//显示
}
flag=0;
x=T0count*65536+TH0*256+TL0; //计算频率值
while(x/10)
{
i=x%10;
C8279=0x80; //置显示位置
D8279=ledseg[i];//显示
x=x/10;
// 第二个
i=x%10;
C8279=0x81; //置显示位置
D8279=ledseg[i];//显示
x=x/10;
//第三个
i=x%10;
C8279=0x82; //置显示位置
D8279=ledseg[i];//显示
x=x/10;
// 第四个
i=x%10;
C8279=0x83; //置显示位置
D8279=ledseg[i];//显示
x=x/10;
// 第五个
i=x%10;
C8279=0x84; //置显示位置
D8279=ledseg[i];//显示
x=x/10;
// 第六个
i=x%10;
C8279=0x85; //置显示位置
D8279=ledseg[i];//显示
x=x/10;
// 第七个
i=x%10;
C8279=0x86; //置显示位置
D8279=ledseg[i];//显示
x=x/10;
// 第八个
i=x%10;
C8279=0x87; //置显示位置
D8279=ledseg[x];//显示
x=x/10;
}
timecount=0;//1s定时计数器变量清0
T0count=0;//频率计最高八位计数变量清0
TH0=0;// T0的16位计数器高八位清0
TL0=0;// T0的16位计数器低八位清0
/*经过测试,初值设为19466最佳,65536-46070*/
TH1=(65536-46070)/256; //T1定时50ms处置的高八位送TH1,计算的时候公式(65536-定时器初值)/晶振频率*12=0.05
TL1=(65536-46070)%256;//T1定时50ms处置的底八位送TL1,得出定时器初值为19456,应该减去46080
TR0=1;//计数器0
TR1=1;//定时器1
}
}
}
}
void to(void) interrupt 1 using 0 // 定时器0中断处理函数
{
T0count++; // 16位计数器满,频率计最高八位计数变量加1
}
void t1(void) interrupt 3 using 0
{
/*经过测试,初值设为19466最佳,65536-46070*/
TH1=(65536-46070)/256; //T1定时50ms处置的高八位送TH1,计算的时候公式(65536-定时器初值)/晶振频率*12=0.05
TL1=(65536-46070)%256;//T1定时50ms处置的底八位送TL1,得出定时器初值为19456,应该减去46080
timecount++; // 50ms时间到,1s计数器加1
if(timecount==20)
{
TR0=0;//时间到,停止计数
TR1=0;//T1停止计时
timecount=0; //1s计数器变量清0
flag=1;//1s定时时间到标志状态变量置1
}
}
第 4 节 结束语
这次为期两周的课程设计让我受益匪浅。以前只是对单片机更多的只是一些感性的,理论上的认识,自己真正动手的时候,才真正理解到其中的精华所在。
频率计的设计让我更好的了解如何应用单片机的定时器计数器模块,灵活应用IO口和应用8279的部分功能。其中最重要的是分析问题解决问题的能力,在我看来,写程序并不难,重要的是把程序优化,无论是在节省硬件资源,还是提高数据的准确度来看,都需要下一些功夫把它做到最好。
感谢赵老师,谢老师在此酷暑的天气每天指导我们的单片机的设计,是您的经验帮助我解决很多技术上的难题。
参考文献:
【1】 杨恢先 黄辉先 《单片机原理及应用》人民邮电出版社
【2】 大能 南光群 刘金华 《单片机课程设计指导书》 北京理工大学
【3】 谭浩强 《C语言程序设计第二版》 清华大学