历史上的今天
返回首页

历史上的今天

今天是:2025年02月05日(星期三)

正在发生

2020年02月05日 | 基于51单片机的频率测量仪设计

2020-02-05 来源:51hei

频率计是一种使用计数法、测宽法来等方法来测量信号频率的一种测量仪器。他主要是由四个部分构成:时基产生电路、信号处理电路、结果显示电路以及控制电路组成

制作出来的实物图如下:
QQ图片20190429150652.jpg?imageView2/2/w/550

Altium Designer画的原理图和PCB图如下:
0.png?imageView2/2/w/5500.png?imageView2/2/w/550

单片机源程序如下:

#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++);

//---------------------lcd1602液晶显示函数--------------------                                     

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(y==1)

                 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(y==1)

                 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/10000000;

        character[1] = fre/1000000%10;

        character[2] = fre/100000%10;

        character[3] = fre/10000%10;

        character[4] = fre/1000%10;

        character[5] = fre/100%10;

        character[6] = fre/10%10;

        character[7] = fre%10;

    character[8] = 'H';

        character[9] = '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 = 8-i;

        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和计数器1工作工作方式2,自动重装初值 

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

        TL0=0;

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

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

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

        TL1=0;

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

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

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

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

        TH2=RCAP2H;               //12M晶振下每次中断62.5ms(1s=1000ms=62.5ms×16)

        TL2=RCAP2L;

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

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

        EA=1;                     //开总中断   

//------------------中断函数----------------------

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

{

        time++;

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

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

        {

           time=0;                //计时清0

           EA=0;                  //关中断                 

推荐阅读

史海拾趣

Frequency Devices公司的发展小趣事

在追求经济效益的同时,Frequency Devices公司始终不忘履行社会责任。公司积极响应国家环保政策,采用环保材料和生产工艺,减少对环境的影响。同时,公司还致力于可持续发展,通过技术创新和管理优化,不断提高资源利用效率,降低能耗和排放。这些努力不仅体现了公司的社会责任感,也为公司的长期发展奠定了坚实的基础。

DILABS公司的发展小趣事

为了进一步扩大市场份额,DILABS开始寻求与国内外知名企业的战略合作。他们与多家大型电子制造商签订了长期供货协议,同时也积极与高校和研究机构合作,共同研发新技术、新产品。这些战略合作不仅为DILABS带来了更多的订单,也促进了公司在技术和管理方面的不断进步。

GTE Microcircuits公司的发展小趣事
实现高频性能需要关注放大器的带宽和转换速率(Slew Rate)等参数。选择具有宽带宽和高转换速率的放大器是基础。此外,优化电路布局,减少寄生电容和电感的影响,以及采用适当的频率补偿技术也是提高高频性能的关键。
Ferroxcube公司的发展小趣事

在全球经济一体化的背景下,Ferroxcube公司意识到拓展国际市场的重要性。为了进一步扩大业务范围,公司决定在欧洲、亚洲和北美等地设立分支机构,以更好地服务当地客户。

通过在各地设立销售和服务中心,Ferroxcube成功地打入了多个国际市场。公司的产品和服务得到了越来越多国际客户的认可和赞赏。同时,公司也积极与当地的研究机构和高校合作,共同推动磁性元件技术的创新和发展。

这些国际市场的成功拓展不仅为Ferroxcube带来了更多的业务机会和收入来源,还进一步提升了公司在全球电子行业中的地位和影响力。如今,Ferroxcube已经成为了全球知名的磁性元件供应商之一,为电子行业的发展做出了重要贡献。

Dfx公司的发展小趣事

随着智能家居市场的不断发展,某智能家居企业面临着如何将各种智能设备无缝连接、实现高效协同的挑战。通过引入DFX的设计理念,该企业成功实现了智能家居产品的标准化、模块化和可扩展性设计。这种设计方式使得不同设备之间可以方便地进行连接和通信,提高了系统的整体性能和用户体验。同时,该企业还通过优化生产流程和加强质量控制等手段,确保了产品的稳定性和可靠性。

这些故事虽然基于虚构的情境,但融入了电子行业中常见的实际问题和发展趋势。通过引入DFX的设计理念,这些企业成功解决了面临的挑战,提升了产品竞争力并赢得了市场的认可。

台湾凌通(Generalplus)公司的发展小趣事
可能是光线阈值设置不当,导致指示灯在光线变化时无法正确响应。可尝试调整光敏元件的灵敏度或重新设置光线阈值。

问答坊 | AI 解惑

颜色识别传感器

本帖最后由 paulhyde 于 2014-9-15 09:44 编辑  …

查看全部问答>

晶体振荡器的工作原理

本帖最后由 paulhyde 于 2014-9-15 09:11 编辑 关键字: 晶振 振荡器 石英晶体 石英晶体振荡器是高精度和高稳定度的振荡器,被广泛应用于彩电、计算机、遥控器等各类振荡电路中,以及通信系统中用于频率发生器、为数据处理设备产生时钟信号和为特 ...…

查看全部问答>

困扰许久的数码管显示问题!

用两个传统的573 控制 数码管显示,奇怪的是单个显示时,一切正常。待到多位扫描显示时,就出现了奇怪的顺序和段码,小弟不才, 望大虾们,不吝赐教! #include <reg52.h> sbit dula=P2^0;sbit wela=P2^1; void delay(int i){ int j=1 ...…

查看全部问答>

鼠标指针的刷新问题

加了USB鼠标,能够显示鼠标指针。只移动鼠标,显示正常。点击鼠标时,不论左右键,鼠标指针背景就不对了,看起来是上一帧的图案。在右键菜单上下移动鼠标就会留下一行轨迹。 平时移动鼠标,没有异常,那么显示驱动里SetPointerShape应该是对的吧。 ...…

查看全部问答>

各位老师,我是新手,请教Plc931直接ad转换的问题

我在公司里做毕业设计,采用lpc931单片机,想把一个十六位的数字量用单片机的Pwm功能给转换成模拟量,pwm输出采用rc滤波,但具体的c程序该怎么写呢?请指教!!…

查看全部问答>

新型测试仪器如何减少机架所占空间

Andrew Armutat 产品市场部 吉时利仪器公司   减少机架所占空间。新的吉时利SMU采用了2U[1]高的半机架设计,大大提高了机架密度。在实际情况下,基于该设计的自动化系统容量很容易集成几个到16个通道,甚至于128通道[2]也是有可能的 ...…

查看全部问答>

STM32 USART串口中断

 main(void)  {    /*PC4  PC13 PB10 PA0 */  USART_InitTypeDef USART_InitStructure;  USART_InitStructure.USART_BaudRate = 9600;  USART_InitStructure.USART_WordLength = USART_WordLengt ...…

查看全部问答>

使用usb(ch376或者ch375)完成PC和FPGA的通信

只是读写。   写,pc上的信息通过USB写如FPGA在数码管上显示。   读,读FPGA,ram里的信息,传给PC。 现在编verilog代码出现问题了。 谁要是有这个代码更好。 如果没有我想问一下,CH376并行通信的芯片中断管脚是怎么 ...…

查看全部问答>

点亮一个数码管

  之前虽然在开发板上学习了74HC573,但是当时连它的datasheet都没怎么看,就照着程序来写,所以对很多的芯片都不是很了解,对芯片很迷茫。终于决定要把以前做的试验在面包板上搭一遍体验体验。所以就有了今天的实验。经过几个小时的努力 ...…

查看全部问答>