基于51单片机的频率测量仪设计

发布者:红尘清梦最新更新时间:2020-02-05 来源: 51hei关键字:LCD1602  51单片机  频率测量仪 手机看文章 扫描二维码
随时随地手机看文章

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

制作出来的实物图如下:
QQ图片20190429150652.jpg

Altium Designer画的原理图和PCB图如下:
0.png0.png

单片机源程序如下:

#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;                  //关中断                 

[1] [2]
关键字:LCD1602  51单片机  频率测量仪 引用地址:基于51单片机的频率测量仪设计

上一篇:基于51单片机的vs1003 MP3模块原理图
下一篇:基于51单片机的DHT11温湿度检测控制系统设计

推荐阅读最新更新时间:2024-11-16 21:30

51单片机实现多级液晶显示中文菜单
  一、引言   目前小型的显示器主要有LCD和LED,LED显示器只能显示数字和有限个英文字符,不能显示汉字,显示内容不直观,操作人员只能根据约定格式了解显示内容。而LCD则可显示各种汉字和图形,尤其能实现中文菜单显示,为操作者提供方便友好的操作界面,并且功耗低,因此LCD得到广泛应用。而现在市面上带中文字库的LCD比比皆是,价格适中,且大部分具有与MCU统一的标准接口,为使用LCD实现中文菜单操作提供了很大的方便。相信更多的 电子 产品在提升性能的同时,设计更加人性化的中文菜单交互界面,将会使产品具有更广阔的前景。   二、YM12864液晶显示模块简介   YM12864汉字图形点阵液晶显示模块,可显示汉字及图形
[单片机]
<font color='red'>51单片机</font>实现多级液晶显示中文菜单
MCS-51单片机指令系统(1)
指令系统概述 指令是计算机用于控制各种功能部件完成的某一特定动作的指示和命令。一台计算机能识别和执行的指令集合即为其指令系统。指令系统是一套控制计算机执行操作的编码,通常称为机器语言。机器语言是计算机唯一能识别和执行的指令。指令系统由硬件决定,且不具有通用性。汇编语言可以准确地计算出控制操作时间并灵活地实施控制,及高效开发必须掌握指令系统和汇编语言。 在实际开发应用中,由于指令系统与汇编语言开发的繁琐和开发效率低则应用C语言开发或者直接应用固件集成库开发提高开发效率和时间。但是对于单片机及其他硬件开发过程,开发过程的调试和资源应用都应对于汇编和指令系统的熟悉才能真正的高效开发完成调试达到目的。 常用单位和术语 位(
[单片机]
蜂鸣器唱《祝你平安》51单片机
蜂鸣器唱《祝你平安》 * * ********************************************************************************/ SPK bit P1.4 ORG 0000H LJMP START ORG 000BH INC 20H ;中断服务,中断计数器加1 MOV TH0,#0D8H MOV TL0,#0EFH ;12M 晶振 ,形成10毫秒中断 RETI START: MOV SP,#50H MOV TH0,#0D8H MOV TL0,#0EFH MOV TMOD,#01H MOV IE,#82H MUS IC 0: NOP MOV DPTR,#DAT ;表头地
[单片机]
51单片机-STC89C52系列学习第一篇之IO口学习
STC89C52系列单片机IO口有三种工作模式: 1、准双向口/弱上拉(标准8051输出模式) 2、开漏输出模式 3、输入模式 其中P1/P2/P3/P4上电复位后为传统的8051的IO口模式,而P0口上电后是开漏输出。 P0口作为IO口使用时需要加4.7K-10K的上拉电阻。 新增特殊功能寄存器的声明示例: sfr P4 = 0xe8; sbit P40 = 0xe8; sbit P41 = 0xe9; sbit P42 = 0xea; sbit P43 = 0xeb; sbit P44 = 0xec; sbit P45 = 0xed; sbit P46 = 0xee; 将寄存器P4的位全部置为1: P4 = 0xff; 单
[单片机]
基于K9F5608A的MCS-51单片机驱动程序
K9F5608A的MCS-51单片机驱动程序主要包括函数声明管脚定义部分、命令操作函数以及数据输出函数。 (1)函数声明管脚定义部分主要完成程序所涉及的库函数的声明及有关引脚的定义,一般置于程序的开头部分,代码如下: (2)命令操作函数NFCommand()。 NfCommand()函数实现向K9F5608发送操作命令,程序代码如下: (3)地址发送函数NfAddre()。 NfAddre()函数完成向K9F5608发送3字节地址数据,程序代码如下: (4)页读函数。 页读函数实现对K9F5608数据的页读功能,主要包括ReadPageF()、ReadPage()和ReadPageS()等3种函数,相关程序
[单片机]
基于K9F5608A的MCS-<font color='red'>51单片机</font>驱动程序
51单片机的自动校准装置Proteus仿真程序 MAX5438数字电位器
Altium Designer画的原理图和PCB图如下: 仿真原理图如下 单片机源程序如下: #include reg52.h #define uchar unsigned char #define uint unsigned int sbit CLK=P1^0; sbit DIN=P1^2; sbit CS=P1^1; uint o,p,q,r; long int i; /**********【MAX5438】***********/ void MAX5438 (long int h) { for(o=0;o 10;o++) {r=h/2; CLK=0; DIN=r; CLK=~CL
[单片机]
<font color='red'>51单片机</font>的自动校准装置Proteus仿真程序 MAX5438数字电位器
学习笔记之-51单片机中断
1.中断的概念 通俗的讲,中断就是cup正在工作的时候,突然外部来了某一请求,要求cpu转去处理请求的事件,当事情做完之后cup再回来继续它的工作。这一过程称为中断 。 单片机中断响应可以分为以下几个步骤: 1、停止主程序运行。当前指令执行完后立即终止现行程序的运行; 2、保护断点。把程序计数器PC 的当前值压入堆栈,保存终止的地址(即断点地址),以便从中断服务程序返回时能继续执行该程序; 3、寻找中断入口; 4、执行中断处理程序; 5、中断返回。执行完中断处理程序后,就从中断处返回到主程序,继续往下执行。 流程图如下:     中断技术不仅解决了快速主机与慢速I/O设备的数据传送问题,而且还具有如下优点: 分时操作:CP
[单片机]
学习笔记之-<font color='red'>51单片机</font>中断
基于P89V51单片机的电力线载波温湿控制系统设计
  以单片机为核心的控制系统可准确实现交互信息的输入输出,信息量大,被广泛应用于工控系统、移动电子设备中。利用电力线网络作为高速数据的传输媒介,能够创造出很高的经济效益和社会效益。电力线载波通讯是利用电网的电力线作为传输媒介的有线传输模式,作为载波通讯在同一电力变压器范围内无需另外架设线路,成本低,使用方便。双音多频DTMF(Dual Tone Multi Frequency)信号由于具有较强的抗干扰能力和可靠的信号传输等优点,已逐渐被广泛使用。本系统设计采用以单片机为核心结合PID算法的智能载波温湿控制系统,实验证明系统运行稳定可靠。   1 P89V51单片机简介   P89V51是PHILIPS生产的高性能、低功耗的8位
[单片机]
基于P89V<font color='red'>51单片机</font>的电力线载波温湿控制系统设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved