历史上的今天
今天是:2025年02月05日(星期三)
2020年02月05日 | 基于51单片机的频率测量仪设计
2020-02-05 来源:51hei
频率计是一种使用计数法、测宽法来等方法来测量信号频率的一种测量仪器。他主要是由四个部分构成:时基产生电路、信号处理电路、结果显示电路以及控制电路组成
制作出来的实物图如下:
Altium Designer画的原理图和PCB图如下:

单片机源程序如下:
#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; //关中断
史海拾趣
|
本帖最后由 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 ...… 查看全部问答> |
|
我在公司里做毕业设计,采用lpc931单片机,想把一个十六位的数字量用单片机的Pwm功能给转换成模拟量,pwm输出采用rc滤波,但具体的c程序该怎么写呢?请指教!!… 查看全部问答> |
|
Andrew Armutat 产品市场部 吉时利仪器公司 减少机架所占空间。新的吉时利SMU采用了2U[1]高的半机架设计,大大提高了机架密度。在实际情况下,基于该设计的自动化系统容量很容易集成几个到16个通道,甚至于128通道[2]也是有可能的 ...… 查看全部问答> |
|
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并行通信的芯片中断管脚是怎么 ...… 查看全部问答> |




