数字频率计
学生:****学号:071300022指导老师:张俊
1、设计内容的相关理论
(1)数字频率计是直接用十进制数字来显示被测信号频率的一种测量装置。它不仅可
以测量正弦波、方波、三角波、和尖脉冲信号的频率,而且还可以测量它们的周期。数字频
率计在测量其他物理量如转速、振动频率等方面获得广泛应用。
(2)所谓“频率”,就是周期性信号在单位时间(1s)内变化的次数,若在一定时间间
隔T内测得这个周期性信号的重复变化次数N,则其频率可表示为f=N/T。
(3)原理图中的个元件介绍
1)、7414TTL六反相施密特触发器
2)、LM318运算放大器
3)AT89C51单片机
4)、六位数码管
2、具体设计
2.1设计思路
我们设计的数字频率计要可以测三角波,正弦波,方波和尖脉冲信号,那我们就不能直
接从单片机的I/O口输入一个脉冲信号,因为从单片机输入的是方波信号,那我们必须把除
方波以外的其他波形转化成方波的形式,然后从单片机的一个I/O口输入,所以我在信号输
入单片机之前使用运算放大器将信号先放大以便单片机可以检测到输入的外部信号,在经
过一个施密特触发器将放大后的信号转换成为方波信号,再输入给单片机进行脉冲计数,对
数据进行处理,最后在数码管上面显示。
2.2电路设计和分析过程
下图1是数字频率计的原理图
分析:输入的信号经过第一个Lm318组成的交流反向比例运算放大器放大26倍之后再
经过第二个LM318组成的交流反向比例运算放大器进行二次放大
10倍,放大后的信号在经
过7414TTL六反相施密特触发器将输入放大后的信号整形成为方波,经过整形后的信号,伏
值增大,频率不变。此整形电路将输入的正弦波、三角波和尖脉冲信号经过放大整形成为方
波。形成的方波通过AT89C51的P3.4T0口输入计数,将记得的脉冲个数经过处理用两个三位
数码管显示。
图2是在Protus上的仿真电路图
2.3、程序流程图
开始
设置定时器T1定时1S
、计数器T0计数
T1定时到
1S?
定时器清零
关闭T0、T1
将T0所计脉冲
数进行处理
显示
2.4、仿真结果分析
输入一个56HZ的正弦波是的仿真结果如下:
等待
T1定时结束
分析:如果我直接从单片机的T0口输入频率范围为1Hz~10KHz的方波信号,显示的结
果准确而且稳定,但是不能输入其他的脉冲信号,否则将无法显示;如果我将信号进行处理
之后再输入到单片机进行数据处理,则输入信号的频率到达200HZ之后显示电路开始闪烁。
在仿真的过程当中还出现一个问题就是从信号的输入到输出结果,输入的频率越大,计
数器T0就在不断的计数,显示输出结果等待的时间就越长。
3、设计小结
在这次数字频率计电路原理图与程序的设计过程当中,一开始出现了很多的问题,比如,
一开始不知道从何入手,自己是用软件实现还是用纯电路实现,如果自己用纯电路实现的话,
有些知识不是很完善,所以最后还是选择用单片机实现频率的显示。但定好方案,在完成的
过称当中,又出现了一些不同的问题,比如数据处理的时候该用何种方法对数据进行处理,
显示的时候让它怎样在规定的频率范围内不闪烁等等。
4、程序代码
#include
#include
头文件
#defineucharunsignedchar//宏定义
#defineuintunsignedint//
宏定义
sfr16DPTR=0x82;//定义DPTR
bitflag=1;//状态标志位
uintaa,qian,bai,shi,ge,bb,wan,shiwan;//
定义变量
ucharcout;//计数
unsignedlongtemp;//
定义长整型变量
/*
数码管显示0-9*/
ucharcode
table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
0x79,0x71};
/*延时子函数。延时1MS*/
voiddelay(uintz)
{
uinti,j;
for(i=0;i
for(j=0;j<110;j++);
}
/*定时器,计数器初始化*/
voidchu()
{
temp=0;//变量赋初值
aa=0;
cout=0;
IE=0X8A;//
开中断,T0,T1中断
TMOD=0x15;//T0为定时器工作于方式1,T1为计数器工作于方式1
TH1=0x3c;//
定时器赋高
8初值,12M
晶振
TL1=0xb0;//
定时器赋低
8初值,12M
晶振
TR1=1;//开定时器1
TH0=0;//计数器赋高8初值初值
TL0=0;//计数器赋低8初值
TR0=1;//开计数器0
}
/*显示子函数*/
voiddisplay(uintshiwan,uintwan,uintqian,uintbai,uintshi,uintge)
{
P0=0xdf;//P0
口是位选11011111改成11111101==0XDF
P2=table[shiwan];//
显示shiwan位
delay(5);
P0=0xef;//P0
口是位选
11101111
改成11111110==0XFE
P2=table[wan];//
显示wan位
delay(3);
P0=0xf7;//P0
口是位选
111101111
改成01111111==0X7F
P2=table[qian];//
显示千位
delay(3);
P0=0xfb;//P0
口是位选
11111011
改成10111111==0XBF
P2=table[bai];//
显示百位
delay(3);
P0=0xfd;//P0
口是位选11111101改成11011111==0XDF
P2=table[shi];//
显示十位
delay(3);
P0=0xfe;//P0
口是位选
11111110
改成11101111==0XEF
P2=table[ge];//
显示个位
delay(3);
}
/*定时中断子函数*/
voidxtimer1()interrupt3
{
TH1=0x3c;//定时器赋高8初值
TL1=0xb0;//定时器赋低8初值
aa++;
}
/*计数器中断子函数*/
voidxtimer0()interrupt1
{
cout++;
}
/*主函数*/
voidmain()
{
P0=0XFF;//初始化P0口
chu();//调用定时器,计数器初始化
while(1)
{
if(aa==19)//定时20*50MS=1S
{
aa=0;//定时完成一次后清0
flag=1;//完成计数
TR1=0;//关闭
T1定时器,定时1S完成
delay(50);//
延时较正误差
TR0=0;//关闭T0
DPL=TL0;//计数量的低8位
DPH=TH0;//计数量的高8位
temp=DPTR+cout*65535;//计数值放入变量
shiwan=temp%1000000/100000;
wan=temp%100000/10000;
qian=temp%10000/1000;//显示千位
bai=temp%1000/100;//显示百位
shi=temp%100/10;//显示十位
ge=temp%10;//显示个位
}
display(shiwan,wan,qian,bai,shi,ge);//调用显示函数
}
}
本文发布于:2022-12-31 11:32:07,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/65192.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |