等精度频率计设计C程序
单片机频率计C程序
单片机频率计C程序单片机频率计C程序//---------函数声明,变量定义--------------------------#include <reg51.h>sbit GATE=P3^0; //预制门限sbit CLR =P3^1; //请零sbit RGATE=P3^2; //实际门限sbit SEL0=P3^4; //数据选择位0sbit SEL1=P3^5; //数据选择位1sbit SEL2=P3^6; //数据选择位2#define data_in P1unsigned char Nx[4]; //待测频率计数值unsigned char Ns[4]; //标准频率计数值unsigned char GATE_time=1; //门限时间,预定义为1S unsigned char time_count;bit PRE_judge=1;//-----------------------变量声明---------------------------------------------------------------------void system_init(void ); //初始化,设置定时器0的工作方式,供主程序调用void TIMER0_SCANkey(); //定时器0中断处理函数//--------------------------------------------------------------------------------------------------// 函数名称:system_init()// 函数功能:初始化设置// 设定INT0的工作方式//--------------------------------------------------------------------------------------------------void system_init(void ){TMOD=0x01; //定时器0工作在方式1ET0=1; //定时器0中断允许TH0=-5000/256; //12M时钟时,定时0.01秒TL0=-5000%256;TR0=1; //定时器0开始计数EA=1; //系统中断允许}//--------------------------------------------------------------------------------------------------// 函数名称:read_result// 函数功能:将计数值读出到Nx、Ns//--------------------------------------------------------------------------------------------------void read_result(){GATE=0;while(RGATE); //等待实际门限的结束SEL0=0;SEL1=0;SEL2=0;Nx[0]=data_in; //SEL=000SEL0=1;Nx[1]=data_in; //001SEL1=1;Nx[3]=data_in; //011SEL0=0;Nx[2]=data_in; //010SEL0=0;SEL1=0;SEL2=1;Ns[0]=data_in; //100SEL0=1;Ns[1]=data_in; //101SEL1=1;Ns[3]=data_in; //111SEL0=0;Ns[2]=data_in; //110}//--------------------------------------------------------------------------------------------------// 函数名称:judge_Prage// 函数功能:判断频率范围,// 大于1M 即Nx>0x00 0F 42 40, GATE=1// 小于1M大于1k即0x00 00 03E8<Nx<0x00 0F 42 40,GATE=5// 小于1k 即Nx<0x00 00 03 E8, GATE=10//--------------------------------------------------------------------------------------------------void judge_Prage(){if((Nx[3]==0)&&(Nx[2]==0))if((Nx[1]<3)||((Nx[1]==3)&&(Nx[0]<0xE8)))GATE_time=10;else GATE_time=5;else if((Nx[3]==0)&&(Nx[2]<0x0f))GATE_time=5;else if((Nx[3]==0)&&(Nx[2]==0x0f))if(Nx[1]<0x42)GATE_time=5;elseif((Nx[1]==0x42)&&(Nx[0]<0x40))GATE_time=5;elseGATE_time=1;else GATE_time=1;}//--------------------------------------------------------------------------------------------------// 函数名称:calcu_Fx// 函数功能:计算频率,根据Fx=(Nx/Ns)Fs 计算结果//--------------------------------------------------------------------------------------------------void calcu_Fx(){}//--------------------------------------------------------------------------------------------------// 函数名称:TIMER0_intrupt// 函数功能:定时器0中断处理程序//--------------------------------------------------------------------------------------------------void TIMER0_intrupt() interrupt 1 using 1{EA=0; //系统中断禁止GATE=1;TH0=-5000/256; //12M时钟时,定时0.01秒TL0=-5000%256;time_count++;if(++time_count==100) GATE_time--;while(GATE_time==0){GATE=0;read_result();if(PRE_judge) //预测,判断频率范围{judge_Prage();PRE_judge=0;if(GATE_time) //如果频率大于1M,直接计算,无须再测calcu_Fx();}elsecalcu_Fx(); //不是预测,直接计算结果}EA=1;}//--------------------------------------------------------------------------------------------------// 函数名称:main// 函数功能:主函数//--------------------------------------------------------------------------------------------------void main(){CLR=0;GATE=1;system_init();}。
PIC单片机C语言编程实例六 利用CCP模块设计频率计
第10章利用CCP模块设计频率计10.5 程序设计10.5.4 程序清单#include <pic.h>#include <stdio.h>#include <math.h>//本程序利用CCP1模块实现一个“简易数字频率计”的功能const char table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0xFF};//不带小数点的显示段码表const char table0[11]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0xFF};//带小数点的显示段码表bank3 int cp1z[11];//定义一个数组,用于存放各次的捕捉值union cp1{int y1;unsigned char cp1e[2];}cp1u;//定义一个共用体unsigned char COUNTW,COUNT;//测量脉冲个数寄存器unsigned char COUNTER,data,k;unsigned char FLAG @ 0XEF;#define FLAGIT(adr,bit) ((unsigned)(&adr)*8+(bit)) //绝对寻址位操作指令static b it FLAG1 @ FLAGIT(FLAG,0);static b it FLAG2 @ FLAGIT(FLAG,1);static b it FLAG3 @ FLAGIT(FLAG,2);unsigned char s[4];//定义一个显示缓冲数组int T5 ,uo;double RE5;double puad5;//spi方式显示初始化子程序void SPIINIT(){PIR1=0;SSPCON=0x30;SSPSTA T=0xC0;174//设置SPI的控制方式,允许SSP方式,并且时钟下降沿发送,与"74HC595,当其//SCLk从低到高跳变时,串行输入寄存器"的特点相对应TRISC=0xD7;//SDO引脚为输出,SCK引脚为输出TRISA5=0;//RA5引脚设置为输出,以输出显示锁存信号FLAG1=0;FLAG2=0;FLAG3=0;COUNTER=0X01;}//CCP模块工作于捕捉方式初始化子程序void ccpint( ){CCP1CON=0X05;//首先设置CCP1捕捉每个脉冲的上升沿T1CON=0X00;//关闭TMR1震荡器??PEIE=1;//外围中断允许(此时总中断关闭)CCP1IE=1;//允许CCP1中断TRISC2=1;//设置RC2为输入}//系统其它部分初始化子程序void initial( ){COUNT=0X0B;//为保证测试精度,测试5个脉冲的参数后//求平均值,每个脉冲都要捕捉其上升、下降沿,//故需要有11次中断TRISB1=0;PORTB=0XFB;B=1011TRISB2=0;PORTB=0XFD ;D=1101TRISB4=1;TRISB5=1;//设置与键盘有关的各口的输入、输出方式RB1=0;RB2=0;//建立键盘扫描的初始条件}//SPI传送数据子程序void SPILED(data){SSPBUF=data;//启动发送do {;175}while(SSPIF==0);SSPIF=0;}//显示子程序,显示4位数void display( ){RA5=0;//准备锁存for(COUNTW=0;COUNTW<4;COUNTW++){data=s[COUNTW];data=data&0x0F;if(COUNTW==k) data=table0[data];//第二位需要显示小数点else data=table[data];SPILED(data);//发送显示段码}for(COUNTW=0;COUNTW<4;COUNTW++){data=0xFF;SPILED(data);//连续发送4个DARK,使显示好看一些}RA5=1;//最后给一个锁存信号,代表显示任务完成}//键盘扫描子程序void keyscan( ){if((RB4==0)||(RB5==0)) FLAG1=1;//若有键按下,则建立标志FLAG1(FLAG1有无按键标志位)else FLAG1=0;//若无键按下,则清除标志FLAG1}//键服务子程序void keyserve( ){PORTB=0XFD ;RB2=1if(RB5==0) data=0X01;if(RB4==0) data=0X03;PORTB=0XFB;RB1=1if(RB5==0) data=0X02;if(RB4==0) data=0X04;//以上确定是哪个键按下PORTB=0X00;//恢复PORTB的值if(data==0x01) {176COUNTER=COUNTER+1;//若按下S9键,则COUNTER加1if(COUNTER>4) COUNTER=0x01;//若COUNTER超过4,则又从1计起}if(data==0x02) {COUNTER=COUNTER-1;//若按下S11键,则COUNTER减1 if(COUNTER<1) COUNTER=0x04;//若COUNTER小于1,则又循环从4计起}if(data==0x03) FLAG2=1 ;//若按下S10键,则建立标志FLAG2if(data==0x04) FLAG2=0 ;//若按下S12键,则清除标志FLAG2}//中断服务程序void interrupt cp1int(void){CCP1IF=0;//清除中断标志cp1u.cp1e[0]=CCPR1L;cp1u.cp1e[1]=CCPR1H;cp1z[data]=cp1u.y1;//存储1次捕捉值CCP1CON=CCP1CON^0X01;//把CCP1模块改变成捕捉相反的脉冲沿data++;COUNT--;}//周期处理子程序void PERIOD( ){T5=cp1z[10]-cp1z[0];//求得5个周期的值???????????/RE5=(double)T5;//强制转换成双精度数RE5=RE5/5;//求得平均周期,单位为μs}//频率处理子程序void FREQUENCY( ){PERIOD( );//先求周期RE5=1000000/RE5;//周期值求倒数,再乘以1 000 000 (μs转换),得频率,//单位为HZ}//脉宽处理子程序void PULSE( )177{int pu;for(data=0;puad5=0;data<=9;data++){pu=cp1z[data+1]-cp1z[data];puad5=(double)pu+puad5;data=data+2;} //求得5个脉宽的和值RE5=puad5/5;//求得平均脉宽}//占空比处理子程序void OCCUPA TIONAL( ){PULSE( );//先求脉宽puad5=RE5;//暂存脉宽值PERIOD();//再求周期RE5=puad5/RE5;//求得占空比}//主程序main( ){SPIINIT( );//SPI方式显示初始化while(1) {ccpint();//CCP模块工作于捕捉方式初始化initial();//系统其它部分初始化if(FLAG2==0) {s[0]=COUNTER;//第一个存储COUNTER的值s[1]=0X0A;s[2]=0X0A;s[3]=0X0A;//后面的LED将显示"DARK"}display( );//调用显示子程序keyscan();//键盘扫描data=0x00;//存储数组指针赋初值TMR1H=0;TMR1L=0;//定时器1清0CCP1IF=0;//清除CCP1的中断标志,以免中断一打开就进入//中断178ei( );//中断允许TMR1ON=1;//定时器1开while(1){if(COUNT==0)break;} //等待中断次数结束di();//禁止中断TMR1ON=0;//关闭定时器keyscan();//键盘扫描if(FLAG1==1) keyserve() ;//若确实有键按下,则调用键服务程序if(FLAG2==0) continue;//如果没有按下确定键,则终止此次循环,//继续进行测量//如果按下了确定键,则进行下面的数值转换和显示工作if(COUNTER==0x01) FREQUENCY();//COUNTER=1,则需要进行频率处理if(COUNTER==0x02) PERIOD();//COUNTER=2,则需要进行周期处理if(COUNTER==0x03) OCCUPA TIONAL();//COUNTER=3,则需要进行占空比处理if(COUNTER==0x04) PULSE();//COUNTER=4,则需要进行脉宽处理k=5;if(RE5<1){RE5=RE5*1000;//若RE5<1,则乘以1 000,保证小数点的精度k=0x00;}else if(RE5<10){RE5=RE5*1000;//若RE5<10,则乘以1 000,保证小数点的精度k=0x00;}else if(RE5<100){RE5=RE5*100;//若RE5<100,则乘以100,保证小数点的精度k=0x01;}else if(RE5<1000){RE5=RE5*10;//若RE5<1000,则乘以10,保证小数点的精度k=0x02;}else RE5=RE5 ;uo=(int)RE5;sprintf(s,"%4d",uo);//把需要显示的数据转换成4位ASII码,且放入数//组S中display();179}}180。
等精度数字频率计的设计
等精度数字频率计的设计(Design of equal precision digital frequency meter)作者:李欢(电子工程学院光信息科学与技术 1103班)指导教师:惠战强摘要:伴随着集成电路(IC)技术的发展,电子设计自动化(EDA)逐渐成为重要的设计手段,已经广泛应用于模拟与数字电路系统等许多领域。
电子设计自动化是一种实现电系统或电子产品自动化设计的技术,它与电子技术、微电子技术的发展密切相关,它吸收了计算机科学领域的大多数最新研究成果,以高性能的计算机作为工作平台,促进了工程发展。
数字频率计是一种基本的测量仪器。
它被广泛应用于航天、电子、测控等领域。
采用等精度频率测量方法具有测量精度保持恒定,不随所测信号的变化而变化的特点。
本文首先综述了EDA技术的发展概况,FPGA/CPLD开发的涵义、优缺点,VHDL语言的历史及其优点,然后介绍了频率测量的一般原理。
关键字:电子设计自动化;VHDL语言;频率测量;数字频率计AbstractThe Electronic Design Automation (EDA) technology has become an important design method of analog and digital circuit system as the integrated circuit's growing. The EDA technology, which is closely connected with the electronic technology, microelectronics technology and computer science, can be used in designing electronic product automatically.Digital frequency meter is a basic measuring instruments. It is widely used in aerospace, electronics, monitoring and other fields. With equal precision frequency measurement accuracy to maintain a constant, and not with the measured signal varies.We firstly present some background information of EDA, FPGA/CPLD and VHDL;then introduced the general principle of frequency measurement. Keywords: Electronic Design Automation,VHDL, Frequency measurement,digital frequency meter.目录摘要................................................... 错误!未定义书签。
计算机毕业论文_基于FPGA的等精度频率计的设计与实现
目录前言...............................................................1 第一章 FPGA及Verilog HDL..........................................2 1.1 FPGA简介.....................................................2 1.2 Verilog HDL 概述.............................................2 第二章数字频率计的设计原理........................................3 2.1 设计要求.....................................................3 2.2 频率测量.....................................................3 2.3.系统的硬件框架设计..............................................4 2.4系统设计与方案论证............................................5 第三章数字频率计的设计............................................8 3.1系统设计顶层电路原理图........................................8 3.2频率计的VHDL设计.............................................9 第四章软件的测试...............................................15 4.1测试的环境——MAX+plusII.....................................15 4.2调试和器件编程...............................................15 4.3频率测试.....................................................16基于FPGA的等精度频率计的设计与实现摘要:本文详细介绍了一种基于FPGA的高精度频率计。
CPLD数字频率计中C语言编程
1 引言为了实现智能化的电子计数测频,实现一个宽领域、高精度的频率计,一种有效的方法是运用单片机测量频率。
采用单片机、接口芯片以及分频电路实现频率的自动分频。
根据计数值、分频系数,求出周期T,得到待测频率。
2 C51语言使用中几个关键问题在数字频率计中,没有采用常用的汇编语言,全部软件用C语言编程。
8051单片机的C 语言编译器简称C51。
C51程序有且仅有一个名为main的主程序。
(l)用#include在C语言源程序中包含库文件。
例如:#include〈reg51.h〉(2)为了能直接访问特殊功能寄存器SFR,C51提供了一种自主形式的定义方法,这是标准C语言中所没有的,仅适于单片机编程。
例如:sfr TMOD=OX89;(3)对于片外的I/O扩展,用“#define‘,语句进行定义。
如:#define PORT A XBYTE[0xffc 0];(4)实时中断程序的编程方法。
中断函数的声明方法如下:void<函数名>(void)interrupt【中断向量代号][using[内部寄存器组代号]3 数字频率计主程序设计在主程序中声明库文件,定义8155的口地址和所有全局变量。
显示函数说明以及定时器和8155的初始化。
点亮启动标志灯。
设置外部中断为边沿触发。
设置分频系数初值并测周期。
进行分频系数的判断,读周期值并将其转换成频率。
调用显示程序,完成显示频率的功能。
在使用C51语言中,absacc.h和reg51.h是不可缺少的。
这两个文件定义了单片机的所有寄存器和端口。
上述程序中还定义8155的各个口地址,便于C51编译器按8155的实际硬件结构,建立I/O变量名与其实际地址的对应关系。
下面程序是函数说明和初始化:4 数字频率计显示程序设计在显示程序中,要设定字型数码数组,判断频率值的单位,并将其分为Hz,KHz,MHz。
判断频率值的整数部分和小数部分的位数,显示频率值和单位数量级标志灯。
等精度测频法的频率计设计
摘要摘要频率测量是电子学测量中最为基本的测量之一。
频率计主要是由信号输入和放大电路、单片机模块、分频模块及显示电路模块组成。
AT89C52单片机是频率计的控制核心,来完成它待测信号的计数,译码,显示以及对分频比的控制。
利用它内部的定时/计数器完成待测信号频率的测量。
在整个设计过程中,所制作的频率计采用外部分频,实现1Hz-1kHz的频率测量及1ms-100ms的脉宽测量,而且可以实现量程自动切换流程。
以AT89C52单片机为核心,通过单片机内部定时/计数器的门控时间,方便对频率计的测量。
其待测频率值使用LCD液晶显示器显示,并可以自动切换量程。
本次采用单片机技术设计一种数字显示的频率计,具有测量准确度高,响应速度快,体积小等优点。
关键词:频率计,单片机,LCD液晶显示器。
I西安交通大学城市学院本科生毕业设计(论文)I IABSTRACTABSTRACTFrequency measurement is one of the most basic measurement electronics measurement. Frequency counter is dominated by the signal input and the amplifier circuit, microcontroller module, frequency module and the display circuit module. AT89C52 microcontroller is to control the core frequency meter to complete its measured signal counting, decoding, display and control divider ratio. Use its internal timer / counter to complete the test signal frequency measurements.Throughout the design process, by making use of external parts of the frequency meter frequency to achieve frequency measurement and pulse width measurement 1ms-100ms of 1Hz-1kHz, and can realize automatic range switching processes. To AT89C52 microcontroller as the core, through the internal microcontroller timer / counter gate time, easy measurement of the frequency meter. Its measured frequency value using the LCD display, and can automatically switch range. The use of microcomputer technology to design a digital display of frequency meter, have a measurement of high accuracy, fast response, small size and so on.KEYWORDS: Frequency meter, Single chip, LCD display.III西安交通大学城市学院本科生毕业设计(论文)I V目录目录1 绪论 (1)1.1 数字频率计简介 (1)1.2 单片机系统的研究现状 (2)1.3 频率计的研究现状 (2)1.4设计的技术要求和主要内容 (3)2 等精度频率计的原理与应用 (5)2.1 等精度频率计测量的原理 (5)2.2 脉冲宽度的测量方法 (6)2.3 等精度频率计的误差分析 (6)2.4 本章小结 (8)3 硬件电路设计 (9)3.1单片机周边电路 (9)3.2 51单片机及AT89C52介绍 (9)3.2.1 单片机简介 (9)3.2.2 AT89C52简介 (10)3.2.3 管脚说明 (11)3.2.4 AT89C52主要性能 (13)3.3 各部分电路图及电路工作原理分析 (13)3.3.1 时钟脉冲电路 (13)3.3.2 同步门逻辑控制电路 (14)3.3.3 LCD显示电路 (15)3.3.4 复位电路 (17)4 软件设计 (19)4.1 KEIL51软件简介 (19)4.2 软件的模块化设计及各部说明 (19)4.2.1 定时中断模块 (19)4.2.2 测量模块 (20)4.2.3 显示模块 (20)V西安交通大学城市学院本科生毕业设计(论文)V I 4.2.4 软件流程图 (20)5 系统仿真与调试 (21)5.1 Proteus软件简介 (21)5.2 Proteus的电路仿真 (22)5.3误差分析 (24)总结 (27)致谢 (29)参考文献 (31)附录 (33)1 程序 (33)2 附图 (41)3 外文翻译 (44)绪论1 绪论1.1 数字频率计简介数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。
基于SOPC的等精度数字频率计设计
De i n o qu lp e ii n di ia r q e y m e e a e n S PC s g f e a r c so g t lf e u nc t r b s d o O
己 口 l 口I年 己月
第己 卷 第 【 g 己期
基 于 S C 的 等 精 度 数 字 频 率 OP
林建英 高苗苗 杨 素英
( 连 理 工 大 学 电 子 信 息 与 电 气工 程 学部 大 连 1 62 ) 大 1 0 4 摘 要 : 出了 一 种 等 精 度 数 字频 率计 的 S P 提 O C实 现 方 法 。该 方 法 的 关 键 是 从 性 能 和 成 本 的要 求 出 发 配 置 嵌 入 式 NisI软 o I
Li in ig Ga io io Ya g Su ig nJa yn oM am a n yn
( a l fE e to i a d E e t ia En i e rn Dain Un v r i fTe h o o y Dain 1 2 Ch n ) F u t o l cr n c n l crc l g n e ig, l ie st o c n l g , l 6 4, ia y a y a 10 Ab t a t s r c :A t o o d s g q a r cso r q e c t ri r p s d i hi p p r Th y o h sm e h d i t o me h d t e i n e u l e ii n f e u n y me e sp o o e n t s a e . p eke ft i t o o c n— s f u e t e e e d d Ni s I o t c r c 0 r c s o y t m a e n t e r q ie n s o h e f r a c n o t a d i r h mb d e o I s f o e mi r p o e s r s s e b s d o h e u r me t ft e p r o m n ea d c s , n g t c iv h e ml s n e r to fFPGA n c o r c s o . e m e s r me to a h p r m e e s r a ie y FP— o a he et es a e sit g a in o a d mir p 。 e s r Th a u e n fe c a a t r i e l d b z GA o i , n h a c l to c n r la d d s l y a e i p e e t d b c o r c s o . l g c a d t e c l u a i n, o to n i p a r m l m n e y mi r p o e s r Th o e c mb n t n o GA n i i a i fFP o a dm — co r e so o r p o e s r c mp e e h e s r me t o h r q e c p r d, u y c c e a d t e p le wi t . l t s t e m a u e n ft e f e u n y, e i o d t y l n h u s d h Th e u t h w h t er s ls s o t a , t e f e u n y me e s o i h p e ii n, o d s a i t l w O t a d s l sz . ti e i e h t t eSOPC r a ia i n o h r q e c t r i fh g r cso g o t b l y,o c S , n ma l ie I sv rf d t a , h i i e l to f z e u 1 r cso r q e c t r i a fe tv e m e h d q a e ii n f e u n y me e S n e f c i e n w t o . p
Msp430频率计c语言代码实现
Msp430频率计c语言代码实现#include <msp430x14x.h>#define uint unsigned intuint i,f;unsigned char table[] = " Hz";//******************延时函数*******************************void delay(uint z){uint t,y;for(t=z;t>0;t--)for(y=110;y>0;y--);}//*******************写命令********************************** void write_com(unsigned char com){P3OUT&=~BIT0; //作为RS选择端低电平有效P3OUT&=~BIT1; //rw位置低P4OUT = com;delay(5);P3OUT|=BIT2; //E选择端置高电平;P3OUT&=~BIT2; //E置低电平}//*******************写数据********************************** void write_data(unsigned char date){P3OUT|=BIT0; //作为RS选择端高电平有效P3OUT&=~BIT1 ; //rw位置低P4OUT=date;delay(5);P3OUT|=BIT2; //E选择端置高电平;P3OUT&=~BIT2; //E置低电平}//********************初始化***********************************void init(){P3DIR=0xff; //P3输出作控制口P3SEL=0;P3OUT=0x00;P3OUT&=~BIT2; //EP3OUT&=~BIT0; //RSP4DIR=0XFF; //P4输出作数据口P4SEL=0;P4OUT=0X00;write_com(0x38); //显示模式设置write_com(0x0c); //开显示,不显光标write_com(0x06); //数据地址指针write_com(0x01); //清屏_BIS_SR(GIE); //开总中断}//********************液晶显示函数************************void display(unsigned char x,unsigned char *p){unsigned int NUM;write_com(x);for(NUM=0;NUM<10;NUM++){write_data(table[NUM]);}}//***********************主函数**************************************************void main(void){WDTCTL = WDT_ADLY_250; // WDT 250ms, ACLK, interval timer IE1 |= WDTIE; // Enable WDT interruptTACTL = TASSEL_0 + TACLR + TAIE + MC1; //定时器A选择外部时钟源,开中断,连续计数模式P1DIR &= ~BIT0; //P1.0输入P1SEL |= BIT0; //P1.0做定时器A的外部信号源输入端口_EINT(); //开总中断while(1){if(f != 0){IE1 &= ~WDTIE; //关看门狗中断table[0] = f/100000 + '0'; //设置液晶输出数组table[1] = f/10000 - 10*(f/100000) + '0';table[2] = f/1000 - 10*(f/10000) + '0';table[3] = f/100 - 10*(f/1000) + '0';table[4] = f/10 - 10*(f/100) + '0';table[5] = f - 10*(f/10) + '0';init();while(1){display(0x80,table); //液晶显示}}}}// Watchdog Timer interrupt service routine#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){i = TAR;f = 4*i;}。
等精度频率计设计
等精度頑率廿o测Si模挟的片外输入果作者:林军招弟任战淸指导老iJih杰(黄冈师学院物理科学于技术学院林军招弟BffiS黄冈438000 )蘭机和FPGA沟成的最小系貌为核心,以89C52单片机作为控制中心,汇编诸言编程oFPGA主芯片是Altera公司的Cyclone系列的EP1C6Q240C8, VHDL语言编程,设双向口,等精度测颐模块,耀盘编码甘描模块等。
測颐模块的片外输人采作者:林军招弟I俯指导老加:杰(黄冈师学院物理科学于技术学院林军招弟任战涛黄冈438000 )K5:本设廿以单片机和FPGA构成的最小系鋭为核心,以89C52单片机作为控制中呛,汇编讯言编程。
FPGA主芯片是Altera公司的Cyclone系列的EP1C6Q240C8, VHDL S言编程,设双向口,等精度測頫模块,健盘编码甘描模块等。
测频模块的片外输入呆作者:林军招弟任拔涛指导老加:杰(黄冈师学院胸理科学于技术学院林军招弟任故涛黄冈438000 )摘要:本设廿以单片机和FPGA构成的E小系筑为核4以89C52单片机作为控制中呛,汇编讯言编程。
FPGA主芯片是Altera公司的Cyclone系列的EP1C6Q240C8, VHDL 言编程,设双向口,等精度d頑模快,建盘编码扫描模块等。
测频模块的片外输入呆作者:林军招弟任战淸指导老帅:杰(黄冈师学院物理科学于技术学院林军招弟任檢涛黄冈438000 )摘要:本设廿以单片机和FPGA构成的最小系境为核心,以89C52单片机作为控制中心,汇编培言编程。
FPGA主芯片是Altera公司的Cyclone系列的EP1C6Q240C8, VHDL培言编程,设双向口,等ft H « i模块,建盘编码扫描模块等。
测频模块的片外输人采用带宽运赦OPA637加大,并使用TL3116和LM311构建迟滞比较器整形为方波信号送人FPGA由可编程逻辑组建的K频单元运算;显示呆用TC6963C腔制液晶显示模快;等精度测量法。
等精度频率计设计C程序
等精度频率计设计C程序下面是一个用C语言编写的精度频率计程序。
该程序使用了时钟计时器来测量输入信号的频率,并计算出其精确频率。
```c#include <stdio.h>#define MEASUREMENT_TIME 1 // 测量时间(单位:秒)unsigned long long getTickCounint maiunsigned long long startTick, endTick;double elapsedTime, frequency;printf("精度频率计\n");printf("请将输入信号连接到计算机的输入端口。
\n");printf("按下Enter开始测量,测量时间为%d秒...\n", MEASUREMENT_TIME);getchar(;//开始计时startTick = getTickCount(;//测量信号频率unsigned int pulseCount = 0;unsigned int prevState = 0;unsigned int currState;while (1)currState = /* 读取输入端口的状态值 */;if (prevState == 0 && currState == 1)pulseCount++;}prevState = currState;endTick = getTickCount(;elapsedTime = (endTick - startTick) * 1e-9; // 转换为秒if (elapsedTime >= MEASUREMENT_TIME)break;}}frequency = pulseCount / elapsedTime;printf("测量时间: %.2lf秒\n", elapsedTime);printf("测量得到的频率: %.2lf Hz\n", frequency);return 0;```以上程序基于以下假设:-输入信号的频率范围适合用计算机进行测量和计算。
基于FPGA的等精度数字频率计设计
摘要频率是常用的物理量,工程中很多物理量的测量,如时间测量、速度控制等,都可转化为频率测量。
此外,还经常遇到以频率为参数的测量信号,例如流量、转速等。
所以频率测量方法的研究越来越受到重视。
基于传统测频原理的频率计的测量精度将随被测信号频率的下降而降低,在实用中有较大的局限性, 而等精度频率计不但具有较高的测量精度, 而且在整个频率区域能保持恒定的测试精度。
本课题设计的等精度数字频率计是采用当今电子设计领域流行的EDA技术,以FPGA为核心,配合STC89C51单片机。
同时,采用等精度测频原理,实现了0.01Hz--50MHz信号频率的等精度频率测量。
此外,该系统还实现测量周期、脉宽、占空比等功能。
设计中用一块FPGA芯片EP2C5Q208C8完成各种时序逻辑控制、计数功能。
在Ouartus II平台上,用VHDL语言编程完成FPGA的软件设计、编译、调试、仿真和下载。
用STC89C51单片机作为系统的主控部件,实现整个电路的测试信号控制、数据运算处理、键盘扫描和控制数码管的显示输出。
系统将单片机STC89C51的控制灵活性及FPGA芯片的现场可编程性相结合,不但大大缩短了开发研制周期,而且使本系统具有结构紧凑、体积小,可靠性高,测频范围宽、精度高等优点。
关键词:频率计;EDA技术;FPGA;单片机AbstractFrequency is commonly used physical quantity, lots of measurement of physical quantity in the project, such as the measurement of time, the control of velocity, can be changed into the measurement of frequency. Besides, the measured signal with a frequency parameter, such as the rate of flow, the rotational speed, is often encountered. So the research of the method of measuring frequency has become more and more significant in the real application.According to the principles of traditional frequency measurement , the measurement accuracy of frequency meter will decrease with the signal frequency decrease .but it has more limitations in the real application, equal precision frequency meter not only has high accuracy, but also maintains constant test accuracy in the whole frequency region .With the help of FPGA and cooperating with the single chip computer STC89C51,The digital frequency design in our program has realized the precision measurement of 0.01Hz-50MHz signal frequency by adopting the current EDA technique prevailing in the electronic designs and using the principle of multi-period synchrony frequency measurement. Besides, the system can complete the cycle, pulse width, duty cycle measurement function .In this design, using an FPGA chip EP2C5Q208C8 completes a variety of temporal logic control and counting function. In the platform of Ouartus II, using VHDL language completes FPGA software design, compiler, debugging, simulation, and download. By use of the STC89C51 single chip computer as the main controlling parts, the control of the tested signal, the scan of keyboard and the output display of LED can be realized. The system combines the control flexibility of STC89C51 with programmable performance of FPGA, consequently,not only can it shorten the period of the development and research, but also it has the advantages of compact structure, little volume, high reliability, wide scope and high precision. Keywords:Frequency meter,EDA technique,FPGA, Single chip computer目录摘要 (I)Abstract (II)目录 (III)1 绪论 (1)1.1 本课题的研究背景及意义 (1)1.2 本课题的主要内容 (2)2 系统设计的相关理论 (3)2.1 频率测量方法的研究 (3)2.1.1 常用测频方案 (3)2.1.2 等精度测频原理 (3)2.1.3 等精度测频误差分析 (5)2.2 单片机模块理论及知识 (5)2.2.1 MCS-51单片机结构简介 (5)2.2.2 Keil μvision 3软件概述 (7)2.2.3 Proteus软件概述 (7)2.3 FPGA模块理论及知识 (8)2.3.1 FPGA原理概述 (8)2.3.2 Quartus II 软件概述 (9)2.3.3 VHDL语言简介及开发优点 (11)3 系统硬件电路设计 (13)3.1 系统顶层电路组成 (13)3.2 被测信号放大整形电路设计 (13)3.3 单片机模块设计 (14)3.3.1 单片机最小系统 (14)3.3.2 键盘接口电路 (15)3.3.3 LED数码管显示电路 (17)3.4 FPGA模块电路设计 (18)3.4.1 基本单元电路 (19)3.4.2 测量与自检选择电路 (23)3.4.3 脉宽控制电路 (24)3.4.4 测频与测周期电路 (25)3.5 单片机与FPGA的相互控制电路 (26)4 系统软件设计 (28)4.1 单片机主程序设计 (28)4.2 复位自检程序设计 (28)4.3 键盘程序设计 (29)4.4 测频子程序设计 (30)4.5 测周期子程序设计 (31)4.6 测脉宽子程序设计 (32)4.7 测占空比子程序设计 (32)4.8 LED数码管显示子程序设计 (33)5 系统性能分析 (34)5.1 测量范围分析 (34)5.2 测量精度分析 (34)5.3 被测信号幅值分析 (34)结论 (35)致谢 (36)参考文献 (37)附录一FPGA程序 (38)附录二单片机程序 (41)1绪论1.1本课题的研究背景及意义EDA(Electronic Design Automation——电子设计自动化)代表了当今电子设计技术的最新发展方向,通过VHDL(V ery High Speed Integrated Circuit Hardware Description Language)硬件描述语言的设计,用FPGA(Field-Programmable Gate Array——现场可编程门阵列)来实现小型电子设备的设计,是开发仪器仪表的主流。
EDA课程设计---等精度频率计的设计
SOPC/EDA综合课程设计报告设计题目:等精度频率计的设计设计者:学号:班级:电气工程及其自动化092班指导老师:完成时间:目录1 绪论 (4)第一章设计项目的分析 (5)1.1 设计原理 (5)1.2 设计要求 (5)1.3 设计思路 (6)第二章项目工作原理及模块工作原理 (6)2.1系统设计方案的选择 (6)2.2 项目工作原理 (6)2.3 频率测量模块 (8)2.4 周期测量模块 (10)2.5 脉宽测量模块 (11)2.6 占空比测量模块 (11)第三章系统设计方案 (11)3.1 等精度数字频率计项目设计方案 (11)3.1.1等精度数字频率计的原理 (12)3.1.2等精度数字频率计主要由以下几个部分组成 (13)3.1.3系统的基本工作方式如下 (13)3.1.4 CPLD/FPGA测频专用模块的VHDL程序设计 (13)3.2 测频/测周期的实现 (14)3.3 控制部件设 (14)3.4 计数部件设计 (15)3.5 脉冲宽度测量和占空比测量模块设计如下图所示: (15)3.5.1测量脉冲宽度的工作步骤 (15)第四章主要VHDL源程序 (16)4.1 -等精度频率计测试模块(VHDL顶层文件DJDPLJ.VHD) . 164.2-测频、周期控制模块CONTRL.VHD (19)4.3--计数模块CNT.VHD (20)4.4-自校/测试频率选择模块FIN.VHD (21)4.5-测脉宽、占空比控制模块CONTRL2.VHD (22)4.6-计数器二频率切换模块GATE.VHD (25)第五章项目硬件测试 (26)5.1 硬件试验情况 (26)第六章设计总结 (27)附录一参考文献 (28)1 绪论测量频率是电子测量技术中最常见的测量之一。
不少物理量的测量, 如时间、速度等都涉及到或本身可转化为频率的测量。
目前, 市场上有各种多功能、高精度、高频率的数字频率计, 但价格不菲。
等精度频率计课程设计
等精度频率计课程设计一、课程目标知识目标:1. 学生能理解等精度频率计的基本原理,掌握频率、周期及其相互关系。
2. 学生能够运用已学过的电子元件知识,识别并说明等精度频率计中的关键电子元件及其作用。
3. 学生能够掌握等精度频率计的测量步骤和方法,并进行简单的数据处理。
技能目标:1. 学生能够通过小组合作,动手搭建简单的等精度频率计电路。
2. 学生能够运用等精度频率计进行实验测量,准确读取并记录数据。
3. 学生能够通过实验数据分析,解决实际问题,提升解决问题的能力。
情感态度价值观目标:1. 学生通过等精度频率计的学习,培养对物理科学的兴趣,提高探究精神和创新意识。
2. 学生在小组合作中,学会相互尊重、沟通协作,培养团队合作精神。
3. 学生通过实验认识到精确测量在实际应用中的重要性,培养严谨的科学态度和良好的实验习惯。
课程性质:本课程为电子技术及应用学科的教学内容,结合学生年级特点,注重理论知识与实践操作的相结合。
学生特点:学生处于高中阶段,具有一定的物理知识和电子元件基础,对实验操作感兴趣,但需进一步引导和培养实验技能。
教学要求:教师应注重理论与实践相结合,引导学生通过小组合作、实验探究等形式,提高学生的实践能力和创新能力。
在教学过程中,关注学生的个体差异,鼓励学生积极参与,使每位学生都能在课程中取得实际的学习成果。
通过课程目标的实现,为后续相关课程的学习打下坚实基础。
二、教学内容本课程教学内容主要围绕等精度频率计的原理、电路搭建、测量方法及数据处理等方面展开。
1. 理论知识:- 频率、周期概念及其关系- 等精度频率计的工作原理- 关键电子元件(如晶体振荡器、计数器、时钟等)的作用2. 实践操作:- 搭建等精度频率计电路- 实验操作步骤及注意事项- 数据的采集、处理与分析3. 教学大纲:- 第一章:等精度频率计基本原理1.1 频率与周期的关系1.2 等精度频率计的工作原理- 第二章:关键电子元件2.1 晶体振荡器的特性与应用2.2 计数器与时钟的作用- 第三章:实验操作与数据处理3.1 电路搭建与调试3.2 实验步骤与注意事项3.3 数据采集、处理与分析4. 教学进度安排:- 理论知识学习:2课时- 实践操作与实验:4课时- 数据处理与分析:2课时教学内容根据课程目标进行科学组织和系统安排,确保学生能够循序渐进地掌握等精度频率计的相关知识。
等精度频率测量(c51)
等精度频率测量
2012.4.6
KX
康芯科技
等精度频率计设计
在此完成的设计项目可达到的指标为:
(1)频率测试功能:测频范围0.1Hz~100MHz。测频精度:测 频全域相对误差恒为百万分之一。 (2)脉宽测试功能:测试范围0.1μs~1s,测试精度0.01μs 。 (3)占空比测试功能:测试精度1%~99%。
KX
康芯
KX
康芯科技
等精度频率法测量误差 Nx计数无误差, Ns最多相差 一个脉冲 结论:等精度频率法的相对误 差与被测信号频率无关,仅 与fs有关。闸门时间越长, 标准频率越高,测量相对误 差越小。
fx
Nx Nx 1 N x fs T NsTs Ns
f x N x Ts fx Nx Ts
KX
康芯科技
测周期(低频测量)
KX
康芯科技
测量公式 测量误差
Nx Nx 1 fx N x fs T NsTs Ns
f x N x Ts N x 1 fx Nx Ts Nx Nx
第一项为计数误差,第二项为晶振误差 f=1MHz,闸门T=1s,δ=10-6 f=500kHz, δ=10-6,则T=N/f=2s F=10Hz, δ=10-6,则T=N/f=10-6/10=100000s
测频率 测周期 测相位 测脉冲宽度
被测信号 放大整形 晶振 分频器
KX
康芯科技
门
控
计数
显示
0.01s, 0.1s, 1s, 10s
KX
康芯科技
测频法(高频测量>1MHz)
输入fx 门控信号T & 计数N fx=N/T
等精度频率计的设计
等精度频率计的设计一、实验原理基于传统测频原理的频率计的测量精度将随被测信号频率的下降而降低,即测量精度随被测信号的频率的变化而变化,在实用中有较大局限性,而等精度频率计不但具有较高的测量精度,且在整个频率区域能保持恒定的测试精度。
设计项目可达到的指标如下:频率测试功能:测频范围0.1Hz~100Hz。
测频精度:测频全域相对误差恒为百万分之一。
脉宽测试功能:测试范围:0.1us~1s,测试精度1%~99%。
占空比测试功能:测试(显示)精度1%~99%。
相位测试功能:测试范围0~360度,测试精度0.2度。
主系统组成等精度频率计的主系统由六个部分组成:信号整形电路。
用于对待测信号进行放大和整形,以便作为PLD器件的输入信号。
测频电路。
是测频的核心模块,可以由FPGA器件担任。
100MHz的标准频率信号源(可通过PLL倍频所得)进入FPGA.。
单片机电路模块。
用于控制FPGA的测频操作和读取测频数据,并作出相应数据处理。
安排单片机的P0口读取测试数据,P2口向FPGA发控制命令。
键盘模块。
可以用5个键执行测试控制,一个是复位键,其余是命令键。
数码显示模块。
可以用7个数码管显示测试结果,最高可表示百万分之一的精度。
考虑到提高单片机IO口的利用率,降低编程复杂性,提高单片机的计算速度以及降低数码显示器对主系统的干扰,可以采用串行静态显示或液晶显示方式。
主系统组成测频原理等精度测频原理为:“预置门控信号”CL由单片机发出,可以证明,在1秒至0.1秒间的选择范围内,CL的时间宽度对测频精度几乎没有影响,在此设其T。
BZH和TF模块是两个可控的32位高速计数器,BENA和ENA分别是宽度为p它们的计算允许信号端,高电平有效。
标准频率信号从BZH 的时钟输入端BCLK 输入,设其频率为s F ;经整形后的被测信号从与BZH 相似的32位计数器TF 的时钟输入端TCLK 输入,设其真实频率值为xe F ,被测频率为x F 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 #include <reg51.h>
2 #include <string.h>
3 #include <math.h>
4 #include <stdlib.h>
5 #include <stdio.h>
6 #define uchar unsigned char
7 #define uint unsigned int
8 #define ulong unsigned long
9
10 code uchar m[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0x00};
11 // 0 1 2 3 4 5 6 7 8 9 灭
12 data uchar NS[]={0x0,0x0,0x0,0x0};//标准频率计数
13 data uchar NX[]={0x0,0x0,0x0,0x0};//待测频率计数
14 data ulong NSS,NXX,MM,F;
15 data ulong temp1,temp2;
16 data uchar shuju[]={0,0,0,0,0,0,0,0};//数码管数据
17 sbit CLR = P2^3;
18 sbit SEL2 = P2^2;
19 sbit SEL1 = P2^1;
20 sbit SEL0 = P2^0;
21 sbit CL = P2^4;
22 sbit START = P2^7;
23 //int i,j,k,l;
24 char *pNS;
//清零
25 char *pNSS;
26 char *pNX;
27 char *pNXX;
28
29 void delay(uint x);
30 void display();
31 void operation();
32 void outdata();
33
34 long powcyc(long c1,long c2)
35 {
36 long c3=1;
37 uchar ii;
38 for(ii=0;ii<c2;ii++)
39 {
40
41
c3*=c1; }
42 return c3;
43 }
44
45 void delay(uint x)
46 {
47 uchar j;
48 while((x--)!=0)
49 {
50 for(j=0;j<125;j++)
51
52
{;} }
53 }
54
55 void display()
56 {
57 uchar i;
58 for(i=0;i<8;i++)
59 {
60 TI=0;
61
62
63
SBUF=m[shuju[i]];
while(TI==0);
}
64 }
65
66
67 void outdata()
68 {
69
70
71
72
73
74
75
76
77
78 uchar i;
for(i=0;i<8;i++)
{
if(i==0)
{
shuju[0]=F/powcyc(10,7);
temp1=F%powcyc(10,7);
}
{
else
79 shuju[i]=temp1/powcyc(10,7-i);temp1=F%powcyc(10,7-i);
80 }
81 }
82 }
83 main()
84 {
85
86 uchar j,i,k,l; P0=0xff;
87 P2=0xff;
88
89 //Added by john 20060623 for(j=0;j<8;j++)
90 {
91 shuju[j] = 10; //all off
92 }
93 display();
94 delay(500); //delay 500ms
95
96 for(j=0;j<8;j++)
97 {
98
99
shuju[j] = j;
}
//0-7
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
display();
delay(500); //delay 500ms
for(j=0;j<8;j++)
{
shuju[j] = j + 2;
}
display();
delay(500);
//2-9
//delay 500ms for(i=0;i<3;i++)
{
for(j=0;j<8;j++)
{
shuju[j] = 11;
}
display();
delay(500);
//all on
//delay 500ms
for(j=0;j<8;j++)
{
shuju[j] = 10;
}
display();
delay(500);
}
//Added by john 20070623
while(1)
{
P0=0xff;
P2=0xff;
START=1;
display();
pNS=NS;
pNSS=&NSS;
pNX=NX;
pNXX=&NXX;
CLR=0;
CLR=1;
CLR=0;
CL=0;
CL=1;
delay(100);
CL=0;
//all off
//delay 500ms
if(START==0);
{
SEL2=SEL1=SEL0=0;
for(i=0;i<4;i++)
{NS[3-i]=P0;P2+=1;}
SEL2=1;SEL1=0;SEL0=0;
for(j=0;j<4;j++)
{NX[3-j]=P0;P2+=1;}
for(k=0;k<4;k++)
{*(pNSS+k)=*(pNS+k);}
for(l=0;l<4;l++)
157 {*(pNXX+l)=*(pNX+l);} 158 MM=NSS/NXX;
159 F=50000000/MM; 160 outdata();
161 162 } }
163 164 } 165。