历史上的今天
返回首页

历史上的今天

今天是:2024年12月29日(星期日)

2021年12月29日 | 带分频整形的单片机频率计(1Hz—20MHz)

2021-12-29 来源:eefocus

单片机频率计 系统采用单片机+分频模块+整形模块+lcd1602液晶显示+按键设计而成。

频率的测量范围为1Hz—20MHz能测量各种周期信号,能测出正弦波、三角波或方波等波形的频率。通过LCD1602液晶显示屏显示检测到的即时频率数值(最多8位数,单位为Hz)。


废话不多说,先上图

正面,组装之前

在这里插入图片描述

正面,组装之后

在这里插入图片描述

背面,焊线面

在这里插入图片描述

频率计电路原理图如下:

在这里插入图片描述

PCB设计图如下:

在这里插入图片描述

74HC14电路设计

由于三极管放大电路输出的信号不是标准的方波信号,存在着上升沿不够陡峭,波形类似于正弦波等问题,为了使单片机对信号更好的采集,这里使用了施密特触发器74HC14对三极管放大电路输出的信号进行整形。电路图如图所示。

在这里插入图片描述

其中输入信号从芯片的1号脚输入,74HC14本身是一个芯片内部带有6个施密特触发器,我这里为了充分利用芯片使用了其中三个,实际上可以只使用一个。整形后的信号从芯片的6号脚输出。

3.5分频模块设计

3.5.1 74HC390芯片介绍

分频电路一般采用十进制计数器如74HC290、74HC390等来实现时间计数单元的计数功能。本次设计中选择74HC390。由其内部逻辑框图(如下图)可知,其为双2-5-10异步计数器,并每一计数器均有一个异步清零端(高电平有效)。由于我们要设计的是100分频电路,因此74HC390内部两个计数器都用上,分别都设置成10计数器。

在这里插入图片描述

3.5.2 74HC390分频电路设计

由于单片机运行速度有限,单片机运行一条基础指令需要1个机器周期即12个是时钟周期,换算成时间为1us。因此当频率过高的时候单片机就不能很精确的换算出频率。为了解决这个问题,这设计加入了一个100分频的计数器。当频率高于200KHZ的时候单片机计算分频后的信号,当频率低于200KHZ的时候计算分频前的信号。这样高低搭配可以扩大单片机的测量频率。最终换算出其真实对应的频率并在液晶上显示。其中电路图如图所示。

在这里插入图片描述

软件设计流程图

在这里插入图片描述

元器件清单

在这里插入图片描述

单片机仿真原理图如下

在这里插入图片描述

频率计仿真操作说明:

在这里插入图片描述
在这里插入图片描述

选择最后一项就可以了

在这里插入图片描述

单片机频率计参考源代码如下:

//******************************************************************************************

//连接框图: ___________________

// | P1.0 |->RS

// | P1.1 |->RW

// | P1.2 |->E

// | P0 |->DB

// | P3.4 |->1~9999hz的输入

// | P3.5 |->1~9999KHZ输入 (分频后)

//******************************************************************************************

#include

unsigned long int fre;

unsigned char time;

unsigned int count;

unsigned int count1;


//端口及函数说明----------------------------------------------------------------------------


sbit LCD_RS=P1^0; //片选信号

sbit LCD_RW=P1^1; //读写信号

sbit LCD_E=P1^2; //使能信号


#define LCD_DB P0 //数据信号

unsigned char character[10]={0};//在屏幕上显示的字符串

unsigned char character_1[]={“fre= Hz”};

unsigned char FLAG = 0;


void LCD_init(void);//初始化函数

void LCD_write_command(unsigned char command);//写指令函数

void LCD_write_data(unsigned char dat);//写数据函数

void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat);//在某个屏幕位置上显示一个字符,X(0-15),y(1-2)

void delay_n40us(unsigned int n);//延时函数


void timer_init(); //中断初始化函数


//-------------------------------------------------------------------------------


void delay_n40us(unsigned int n) //延时函数

{

unsigned int i;

unsigned char j;

for(i=n;i>0;i–)

for(j=0;j<2;j++);

}


void delay_1s()

{

unsigned int i,j;

for(i = 0;i<100;i++)

for(j = 0;j<1000;j++);

}


void LCD_init(void) //液晶初始化函数

{

LCD_write_command(0x38);//设置8位格式,2行,5x7

LCD_write_command(0x38);//设置8位格式,2行,5x7

LCD_write_command(0x38);//设置8位格式,2行,5x7 切记要写三遍!!!!

LCD_write_command(0x0c);//整体显示,关光标,不闪烁

LCD_write_command(0x06);//设定输入方式,增量不移位

LCD_write_command(0x01);//清除屏幕显示

delay_n40us(100);//清屏延时

}


void LCD_write_command(unsigned char dat) //写命令函数

{

LCD_DB=dat;

LCD_RS=0;//指令

LCD_RW=0;//写入

LCD_E=1; //使能

LCD_E=0;

delay_n40us(1);//写命令延时

}


void LCD_write_data(unsigned char dat) //写数据函数

{

LCD_DB=dat;

LCD_RS=1;//数据

LCD_RW=0;//写入

LCD_E=1;//使能

LCD_E=0;

delay_n40us(1); //写数据延时

}


void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)//显示一个字符

{

unsigned char address;

if(y1)

address=0x80+x; //显示在第一排的时候的x的地址

else

address=0xc0+x; //显示在第二排的时候的x的地址

LCD_write_command(address); //输入地址

LCD_write_data(dat); //输入数据

}

void LCD_disp_num(unsigned char x,unsigned char y,unsigned char dat)//显示一个数字

{

unsigned char address;

if(y1)

address=0x80+x; //显示在第一排的时候的x的地址

else

address=0xc0+x; //显示在第二排的时候的x的地址

LCD_write_command(address); //输入地址

LCD_write_data(dat+48); //输入数据

}


void dis_num(void)

{

unsigned char i=0,j=0,k=0;

LCD_write_command(0x01);//清除屏幕显示


character[0] = fre/1000000;

character[1] = fre/100000%10;

character[2] = fre/10000%10;

character[3] = fre/1000%10;

character[4] = fre/100%10;

character[5] = fre/10%10;

character[6] = fre%10;

character[7] = ‘H’;

character[8] = ‘z’;


for(i = 0;i<4;i++) //显示fre

{

LCD_disp_char(i+0,1,character_1[i]);

}

for(i = 0;i<10;i++) //判断第一个不为0的数

{

if(character[i]!=0)

break;

}

k = 10-i-2;

for(j = 0;j{

LCD_disp_num(4+j,1,character[i++]);

}


for(i = 5;i<7;i++) //显示Hz

{

LCD_disp_char(j+4,1,character_1[i]);

j++;

}

}


void main()

{

unsigned char i;

LCD_init();

timer_init(); //定时/计数器初始化


for(i = 0;i<4;i++)

{

LCD_disp_char(i+0,1,character_1[i]);

}

while(1)

{

dis_num(); //显示

delay_1s();


}

}


void timer_init(void) //定时/计数器初始化

{

TMOD=0x66; //计数器0工作工作方式2,自动重装初值

TH0=0; //计数器初值为0

TL0=0;

TR0=1; //计数器开始计数

ET0=1; //打开计数器0中断


TH1=0; //计数器初值为0

TL1=0;

TR1=1; //计数器开始计数

ET1=1; //打开计数器0中断


RCAP2H=(65536-62500)/256; //在程序初始化的时候给RCAP2L和RCAP2H赋值,

RCAP2L=(65536-62500)%256; //TH2和TL2将会在中断产生时自动使TH2=RCAP2H,TL2=RCAP2L。

TH2=RCAP2H; //12M晶振下每次中断62.5ms

TL2=RCAP2L;

ET2=1; //打开定时器2中断

TR2=1; //定时器2开始计时

EA=1; //开总中断

}

//----------------------------------------------------------------

void timer2(void) interrupt 5 //定时器2中断(62.5ms)

{

double temp;

time++;

TF2=0; //定时器2的中断标志位TF2不能够由硬件清零,所以要在中断服务程序中将其清零

if (time==16) //定时1s时间到

{

time=0; //计时清0

fre=(long)count256+TL1; //count256强制转换成long型,否则将不产生进位 先判断分频后的

FLAG = 0;


if(fre<2000)//200K之后读取分频后的频率

{

fre = (long)count1*256+TL0;

FLAG = 1;

}


count=0; //清零计数器0计数

count1=0;

EA=1; //开中断

}

}

//----------------------------------------------------------------

void timer0(void) interrupt 1 //计数器0中断

{

count++;

}

//----------------------------------------------------------------

void timer1(void) interrupt 3 //计数器1中断

{

count1++;

}


……………………

推荐阅读

史海拾趣

Condor公司的发展小趣事

关于Condor公司在电子行业的发展,以下是五个相关故事:

  1. Condor的创始与早期发展

Condor公司成立于1893年,起初主要涉及离心机、挤奶机以及泵的生产。随着技术的不断进步和市场需求的变化,公司逐渐转型,开始专注于压力和液位控制组件及系统解决方案的研发与生产。这一转变使得Condor在电子行业中崭露头角,为其后续的发展奠定了坚实的基础。

  1. 专利技术的突破

1935年,Condor取得了世界上的泵压力开关上的第一个专利,这一创新性的技术突破为公司的快速发展注入了新的动力。随着这项专利技术的应用,Condor的产品开始在各种工业领域中得到广泛应用,特别是在需要精确控制压力和液位的场景中,如汽车、冶金、水火核风电等行业。

  1. 国际市场的拓展与合作

随着全球化进程的加速,Condor开始积极拓展国际市场。公司与多个国家的合作伙伴建立了长期稳定的合作关系,共同开发新产品,拓展新的应用领域。这一战略举措不仅提升了Condor在全球电子行业中的影响力,也为其带来了更多的商业机会。

  1. 产品质量的持续提升

Condor一直坚持以最高的质量要求来生产每一款产品。为了确保产品质量,公司在生产过程中严格把控每一个环节,从原材料采购到最终的产品测试,都遵循严格的标准和流程。这种对质量的执着追求,使得Condor的产品在市场上赢得了良好的口碑和客户的信赖。

  1. 技术创新的持续推进

作为家族企业,Condor始终保持着对技术创新的热情和投入。公司不断引进新的技术和设备,优化生产流程,提高产品的性能和可靠性。同时,Condor还积极与科研机构和高校合作,共同研发新的技术和产品,以满足市场不断变化的需求。这种持续的技术创新为Condor在电子行业中保持领先地位提供了有力支持。

以上五个故事展示了Condor公司在电子行业中的发展历程和关键转折点,体现了其对技术、质量和市场的敏锐洞察力和持续创新精神。如需更多信息,建议查阅Condor公司官网或相关新闻报道。

CyOptics Inc公司的发展小趣事

在被Avago收购后,CyOptics并未停止其技术创新的步伐。公司继续投入研发,推出了一系列新的光学产品和解决方案,以满足不断增长的市场需求。例如,CyOptics的物理介质相关(PMD)IC产品系列,不仅提供了完整的GaAs芯片组件,还提供了跨阻放大器(TIA)、激光驱动器(LD)等一站式芯片套件解决方案,为客户提供了更加便捷和高效的服务。

Cardinal Components公司的发展小趣事

2016年,Taitien收购了Cardinal Components,这一收购为公司带来了新的发展机遇和资源支持。随后,在2021年,Cardinal加入了Pletronics,进一步扩大了其在电子行业的影响力。这些收购与合作不仅为公司带来了更多的业务机会,也促进了其在技术研发和市场拓展方面的进步。

这五个故事只是Cardinal Components在电子行业发展中的一部分缩影。作为一家具有深厚历史底蕴和强大技术实力的公司,Cardinal将继续在电子行业中发挥重要作用,为行业的进步和发展做出更多贡献。

Holt Integrated Circuits公司的发展小趣事

Holt在CAN控制器领域也取得了重要突破。作为世界上第一家将CAN控制器和收发器集成在同一紧凑塑料封装中的公司,Holt的ARINC 825(CAN)数据总线产品为用户提供了极大的便利。这种集成设计不仅减小了产品的体积和重量,还提高了系统的可靠性和稳定性。Holt的这一创新成果,不仅推动了CAN总线技术在航空航天领域的广泛应用,也为其他行业的自动化控制提供了有力支持。

以上五个故事,从不同角度展现了Holt Integrated Circuits公司在电子行业中的发展历程和卓越成就。这些事实不仅证明了Holt在技术创新和市场拓展方面的实力,也为其在未来的发展中奠定了坚实的基础。

FILTRONIC公司的发展小趣事

FILTRONIC深知技术创新是企业持续发展的动力源泉。因此,公司不断加大研发投入,建立了先进的研发中心和实验室,吸引了一批高素质的研发人才。通过持续的技术研发,FILTRONIC在滤波器技术、射频技术、天线技术等领域取得了多项重要突破,推出了多款具有自主知识产权的新产品。这些新产品的推出不仅进一步巩固了FILTRONIC在市场中的领先地位,也为公司的未来发展注入了新的活力。

功得(CONQUER)公司的发展小趣事

随着公司实力的不断增强,功得公司开始将目光投向国际市场。他们积极参加国际电子展会,与全球各地的客户建立联系,拓展销售渠道。同时,功得公司还根据不同国家和地区的市场需求,推出定制化的产品和服务。通过不懈努力,功得公司逐渐在国际市场上打开了局面,产品出口量稳步增长。

问答坊 | AI 解惑

风力发电机结构

机舱:机舱包容着风力发电机的关键设备,包括齿轮箱、发电机。维护人员可以通过风力发电机塔进入机舱。机舱左端是风力发电机转子,即转子叶片及轴。   转子叶片:捉获风,并将风力传送到转子轴心。现代600千瓦风力发电机上,每个转子叶片的测量 ...…

查看全部问答>

vhdl怎么越学越难。超级超级超级郁闷。一个74 161, 74 194 高手帮我指出错误,立即结贴。

由表可知,74161具有以下功能:     ① 异步清零。当RD=0时,不管其他输入端的状态如何,不论有无时钟脉冲CP,计数器输出将被直接置零(Q3Q2QlQ0=0000),称为异步清零。     ② 同步并行预置数。当RD=1、LD=0时,在输入 ...…

查看全部问答>

dm9008AE dm9000A的驱动问题,谢谢了

读写寄存器都没问题,写进去,读出来都是正确的,但是初始化后LED灯就是不亮,也没初始化成功,不知道为什么,谁知道啊,谢谢了…

查看全部问答>

wince5.0 修改NORFlash分区大小

平台为wince5.0 + ep9315 我的实现注册表保存之后,想把分区空间分配大一点,如何实现呢?请高手指教!…

查看全部问答>

键盘源代码

老板不想买pc键盘,想自己做。别的都有办法做,就是键盘里的一块膏药似的芯片里的代码怎么写啊?想请教各位高手大侠们帮帮我。谢谢!…

查看全部问答>

十分钟学会Xilinx FPGA 设计

十分钟学会Xilinx FPGA 设计…

查看全部问答>

初学vxWorks应该从何入手呢

大家好,我刚刚接触VxWorks,现在要从头学习应哪个部分开始学起呢,我现在手上没有vxWorks系统,从网上下了一个要求注册才能用.非常感谢朋友们的参与!…

查看全部问答>

iar430在定时器中断里对一个全局变量不断++变量值总为零

iar 430 在定时器中断里对一个全局变量不断++ 仿真时在中断中怎么这个变量值总为零 有没有遇到同样的问题的呢 谢谢…

查看全部问答>

TI原装全新没用过的触摸板36卖了有人要不

RT TI原装全新没用过的触摸板 需要的留个联系方式吧…

查看全部问答>

请问LM3S811的下载和仿真方式有哪些

请问一下LM3S811的可以用什么下载程序呢?   可以用什么仿真呢?   现在只有一个最小系统 [ 本帖最后由 ming1006 于 2013-1-18 13:18 编辑 ]…

查看全部问答>