Ⅰ 51单片机电子频率计
建议你去"幸福校园"看看 里面有些样子 你可以参考
前言
传统的数字频率计都是采用纯硬件方式组成(纯数字电路)。它的集成电路(IC)用量较大,因而产品的体积、功耗都较大,生产成本较高。产品定型后不能升级(加入新功能)。而采用单片机和相关可编程智能集成器件制成的现代数字频率计方式情况就不同了,单片机的内核CPU可完成多项工作如计数、读入、译码、驱动和时基的产生等。和纯硬件方式比,它减少了很大一部分的集成电路的用量,还可加入许多的智能操作,这更是纯硬件方式所望尘莫及的。
目前市场上的频率计产品很多,但基本上都是采用专用计数芯片(如ICM7240 , ICM7216) 和数字逻辑电路组成,由于这些芯片本身的工作频率不高(如ICM7240 仅有15MHz 左右) ,从而限制了产品的工作频率的提高, 远不能达到在一些特殊的场合需要测量很高的频率的要求,而且测量精度也受到芯片本身极大的限制。
自从80年代单片机引入我国之后,单片机已广泛地应用于各行各业的电子设计中,使频率计智能化水平在广度和深度上产生了质的飞跃,数字化也成为了电子设计的必由之路. 运用单片机和高速计数器的组合设计频率计,并采用适当的算法取代传统电路,次方法不仅能解决传统频率计结构复杂、稳定性差、精度不高的弊端,而且性能也将大有提高,可实现精度较高、等精度和宽范围频率计的要求;随着单片机技术的不断发展,可以用单片机通过软件设计直接用十进制数字显示被测信号频率。本设计正是基于此技术进行的传统频率计技术改进。
Ⅱ CPLD和单片机的等精度频率计仿真怎么做只用软件可以仿真吗CPLD芯片需要画吗
完全可以自己去做,遇到问题再问、再讨论。现在根本就一点都不去想,直接要就完了。这不能怪罪于学生,而是我国教育的失败!(当然不排除花父母钱去学校玩的,这种人也大有人在)
Ⅲ 做用51单片机做一个频率计,测量范围为0.1Hz~10kHz
在不改变定时时间的前提下,也就是0.5秒定时,是不能实现0.1~2Hz频率的测量的。
你所谓2Hz~10KHz易实现也是基于这个道理。但这个也是理论情况。
当你0.5s内刚好检测到一个脉冲,你认为这个时候是2Hz而不是2.5hz或者3.9hz?
这中间存在一个测量精度的问题。实际上你所测到的信号是在2hz到4hz之间。
实际上我们在测量信号的时候,低频一般会采用测周期,高频用测频才能提高测量的准确性。
至于高低频的临界点,跟你的计数频率有关,感兴趣的话可以去看《电子测量原理》。
下面我来讲下测周实现的方法,可以使用边沿触发的D触发器输出作为单片机的外部定时控制,测量信号作为触发时钟,计数值作为该信号的周期。
Ⅳ 单片机频率计
1.实验任务
利用51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。
2.电路原理图
见插图
3.程序设计内容
(1).定时/计数器T0和T1的工作方式设置,由图可知,T0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T0,最大计数值为fOSC/24,由于fOSC=12MHz,因此:T0的最大计数频率为250KHz。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以T1工作在定时状态下,每定时1秒中到,就停止T0的计数,而从T0的计数单元中读取计数的数值,然后进行数据处理。送到数码管显示出来。
(2).T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,共定时20次,即可完成1秒的定时功能。
4.C语言源程序
/******************************************************************************
*定时器+计数器测频
*
*file:frequency.c
*name:zhzhchang
*time:2010.3.17
*V1.0
*blog:http://blog.csdn.net/zhzht19861011
*Nots:本程序定义6个数码管,经过实测,在200HZ~50KHZ时结果较准确,误差小于0.4%,
*50KHZ以上频率未进行测量.据资料表明,可以测量到120KHZ,本程序未证明.
*********************************************************************************/
#include<reg52.h>
bitint_flag;//定时器01S到标志位
unsignedcharvolatileint_count;//定时器0中断次数
unsignedcharvolatileT1count;//定时器1中断次数
unsignedcharcodedofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值0123456789
unsignedlongsum;//1S内脉冲总个数
unsignedcharled[6];//LED显示缓存
///////////////软件延时/////////////
voiddelay(unsignedintcnt)
{
while(--cnt);
}
///定时器0初始化
voidinit_t0(void)
{
TMOD=(TMOD&0xF0)||0x01;//定时器0工作于方式1
TH0=(65536-50000)/256;//定时50ms
TL0=(65535-50000)%256;
}
//定时器1初始化
voidinit_t1(void)
{
TMOD=(TMOD&0x0F)|0x50;//timer1forcount
TH1=0x00;
TL1=0x00;
}
//显示
voiddisp(void)
{
unsignedchari;
for(i=0;i<6;i++)
{
P0=dofly[(led[i])];//取显示数据
P2=5-i;//取段码
delay(100);//扫描间隙延时,根据单片机调整,延时1ms即可
}
}
///////////////////////////////////////////////////////
voidmain(void)
{
EA=1;//开总中断
init_t0();//初始化定时器
init_t1();
TR0=1;//定时器开始工作
TR1=1;
ET0=1;//开T0中断
while(1)
{
if(int_flag==1)
{
int_flag=0;
sum=TL1+TH1*256+T1count*65536;//计算1秒内的脉冲个数
//以下将数据格式化,转成LED可显示的BCD码
led[0]=sum%10;//最低位
sum=sum/10;
led[1]=sum%10;//第二位
sum=sum/10;
led[2]=sum%10;
sum=sum/10;
led[3]=sum%10;
sum=sum/10;
led[4]=sum%10;
led[5]=sum/10;
int_count=0x00;
T1count=0;
TH1=0x00;
TL1=0x00;
TR1=1;
}
disp();
}
}
//定时器0中断服务程序
voidint_t0(void)interrupt1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
int_count++;
if(int_count==20)
{
TR1=0;
int_flag=1;
int_count=0x00;
}
}
//定时器1中断服务程序
voidint_t1(void)interrupt3
{
T1count++;
}
别说你的设计要求用汇编啊!!!
不过既然是课程设计,我这个只是给你参考,你自己一定要弄懂,变成自己的。我实测过,程序没问题,但用到你的硬件上可能需要改一下,因为你的硬件数码管不一定和我的硬件接法一样,但整体思路我都给你了。