单片机课设——频率计的设计——C语言编程

合集下载

单片机C51数字频率计程序

单片机C51数字频率计程序

单片机C51数字频率计程序**//头文件部分,文件名:plj.h/**************************************************#include<reg52.h>#include<absacc.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charextern const uchar NoDisp=0; //无显示extern const uchar NoCur=1; //有显示无光标extern const uchar CurNoFlash=2; //有光标但不闪烁extern const uchar CurFlash=3; //有光标且闪烁extern void LcdPos(uchar,uchar); //确定光标位置extern void LcdWd(uchar); //写字符extern void LcdWc(uchar); //送控制字(检测忙信号)extern void LcdWcn(uchar ); //送控制字子程序(不检测忙信号)extern void mDelay(uchar ); //延时,毫秒数由j决定extern void WaitIdle(void); //正常读写操作之前检测LCD控制器状态extern void RstLcd(void); //复位LCD控制器extern void WriteChar(uchar c,uchar xPos,uchar yPos);//在指定的行与列显示指定的字符,xpos:行,ypos:列,c:待显示字符extern void WriteString(uchar *s,uchar xPos,uchar yPos);extern void SetCur(uchar Para); //设置光标extern void ClrLcd(void); //清屏命令extern void WaitIdle(void); // 正常读写操作之前检测LCD控制器状态extern void mDelay(uchar j);/**************************************************/**************************************************//液晶1602子程序,文件名:1602.c/**************************************************;连线图:; DB0---DPROT.0 DB4---DPROT.4 RS-------------P3.5 ; DB1---DPROT.1 DB5---DPROT.5 RW-------------P3.6 ; DB2---DPROT.2 DB6---DPROT.6 E--------------P3.7 ; DB3---DPROT.3 DB7---DPROT.7 VLCD接10K可调电阻到GND*; 需要11根单片机口线;80C51的晶振频率为12MHz;液晶显示程序;**************************************************/#include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit RS = P3^5;sbit RW = P3^6;sbit EN = P3^7;#define DPORT P1void LcdPos(uchar,uchar); //确定光标位置void LcdWd(uchar); //写字符void LcdWc(uchar); //送控制字(检测忙信号)void LcdWcn(uchar ); //送控制字子程序(不检测忙信号)void mDelay(uchar ); //延时,毫秒数由j决定void WaitIdle(); //正常读写操作之前检测LCD控制器状态//在指定的行与列显示指定的字符,xpos:行,ypos:列,c:待显示字符void WriteChar(uchar c,uchar xPos,uchar yPos){LcdPos(xPos,yPos);LcdWd(c);}void WriteString(uchar *s,uchar xPos,uchar yPos){ uchar i;if(*s==0) //遇到字符串结束return;for(i=0;;i++){if(*(s+i)==0)break;WriteChar(*(s+i),xPos,yPos);xPos++;if(xPos>=15) //如果XPOS中的值未到15(可显示的最多位)break;}}void SetCur(uchar Para) //设置光标{ mDelay(2);switch(Para){ case 0:{ LcdWc(0x08); //关显示break;}{ LcdWc(0x0c); //开显示但无光标break;}case 2:{ LcdWc(0x0e); //开显示有光标但不闪烁break;}case 3:{ LcdWc(0x0f); //开显示有光标且闪烁break;}default:break;}}void ClrLcd() //清屏命令{ LcdWc(0x01);}// 正常读写操作之前检测LCD控制器状态void WaitIdle(){ uchar tmp;RS=0;RW=1;EN=1;_nop_();for(;;){ tmp=DPORT;tmp&=0x80;if( tmp==0)}EN=0;}void LcdWd(uchar c) //写字符子程序{ WaitIdle();RS=1;RW=0;DPORT=c; //将待写数据送到数据端口EN=1;_nop_();_nop_();EN=0;}void LcdWc(uchar c) //送控制字子程序(检测忙信号){ WaitIdle();LcdWcn(c);}void LcdWcn(uchar c) //送控制字子程序(不检测忙信号){ RS=0;RW=0;DPORT=c;EN=1;_nop_();EN=0;}void LcdPos(uchar xPos,uchar yPos) //设置第(xPos,yPos)个字符的DDRAM地址{ unsigned char tmp;xPos&=0x0f; //x位置范围是0~15yPos&=0x01; //y位置范围是0~1if(yPos==0) //显示第一行tmp=xPos;elsetmp=xPos+0x40;tmp|=0x80;LcdWc(tmp);}void RstLcd() //复位LCD控制器{ mDelay(15); //如果使用12M或以下晶振,此数值不必改,如用24M晶振,须用30LcdWc(0x38); //显示模式设置LcdWc(0x08); //显示关闭LcdWc(0x01); //显示清屏LcdWc(0x06); //显示光标移动位置LcdWc(0x0c); //显示开及光标设置}void mDelay(uchar j) //延时,毫秒数由j决定{ uint i=0;for(;j>0;j--){ for(i=0;i<124;i++){;}}}//主函数:/*===================================== ========================================= ====公司名称:河海大学电气工程学院 *模块名:AT89C52单片机系统,全国电子设计大赛 *创建人:南东亮日期:2007。

单片机频率计C程序

单片机频率计C程序

单片机频率计C程序单片机频率计C程序//---------函数声明,变量定义--------------------------#include &lt;reg51.h&gt;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&gt;0x00 0F 42 40, GATE=1// 小于1M大于1k即0x00 00 03E8&lt;Nx&lt;0x00 0F 42 40,GATE=5// 小于1k 即Nx&lt;0x00 00 03 E8, GATE=10//--------------------------------------------------------------------------------------------------void judge_Prage(){if((Nx[3]==0)&amp;&amp;(Nx[2]==0))if((Nx[1]&lt;3)||((Nx[1]==3)&amp;&amp;(Nx[0]&lt;0xE8)))GATE_time=10;else GATE_time=5;else if((Nx[3]==0)&amp;&amp;(Nx[2]&lt;0x0f))GATE_time=5;else if((Nx[3]==0)&amp;&amp;(Nx[2]==0x0f))if(Nx[1]&lt;0x42)GATE_time=5;elseif((Nx[1]==0x42)&amp;&amp;(Nx[0]&lt;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模块设计频率计

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。

单片机简易频率计课程设计

单片机简易频率计课程设计

前言 (2)一、总体设计 (3)二、硬件设计 (5)AT89C51单片机及其引脚说明: (5)显示原理 (7)技术参数 (8)电参数表 (8)时序特性表 (8)模块引脚功能表 (9)三、软件设计 (9)四、调试说明 (11)五、使用说明 (13)结论 (13)参考文献 (13)附录 (14)Ⅰ、系统电路图 (14)Ⅱ、程序清单 (14)前言单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。

导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。

更不用说自动控制领域的机器人、智能仪表、医疗器械以及各种智能机械了。

因此,单片机的学习、开发与应用在生活中至关重要。

随着电子信息产业的不断发展,信号频率的测量在科技研究和实际应用中的作用日益重要。

传统的频率计通常是用很多的逻辑电路和时序电路来实现的,这种电路一般运行缓慢,而且测量频率的范围比较小。

考虑到上述问题,本论文设计一个基于单片机技术的数字频率计。

首先,我们把待测信号经过放大整形;然后把信号送入单片机的定时计数器里进行计数,获得频率值;最后把测得的频率数值送入显示电路里进行显示。

本文从频率计的原理出发,介绍了基于单片机的数字频率计的设计方案,选择了实现系统得各种电路元器件,并对硬件电路进行了仿真。

一、总体设计用十进制数字显示被测信号频率的一种测量装置。

它以测量周期的方法对正弦波、方波、三角波的频率进行自动的测量。

所谓“频率”,就是周期性信号在单位时间(1s)内变化的次数。

若在一定时间间隔T内测得这个周期性信号的重复变化次数N,则其频率可表示为f=N/T。

其中脉冲形成电路的作用是将被测信号变成脉冲信号,其重复频率等于被测频率f。

时间基准信号发生器提供标准的时间脉冲信号,若其周期为1s,则门控电路x的输出信号持续时间亦准确地等于1s。

单片机数字频率计课程设计

单片机数字频率计课程设计

单片机数字频率计课程设计一、课程目标知识目标:1. 让学生掌握单片机的基本原理,理解数字频率计的工作机制。

2. 使学生能够运用单片机编程实现数字频率计的功能,包括计时、计数和显示。

3. 让学生了解数字频率计在实际应用中的重要性,如信号处理、电子测量等领域。

技能目标:1. 培养学生运用单片机进行数字频率计设计和编程的能力。

2. 培养学生运用相关软件(如Keil、Proteus等)进行电路仿真和调试的能力。

3. 提高学生的动手实践能力,学会在实际操作中发现问题、解决问题。

情感态度价值观目标:1. 激发学生对电子技术和单片机编程的兴趣,培养其创新精神和实践能力。

2. 培养学生严谨的科学态度,注重实验数据的准确性和可靠性。

3. 增强学生的团队协作意识,学会在项目合作中相互支持、共同进步。

课程性质:本课程为实践性较强的课程,要求学生在掌握理论知识的基础上,进行实际操作和项目实践。

学生特点:学生具备一定的单片机基础知识,对编程和电路设计有一定了解,但实际操作能力有待提高。

教学要求:结合学生特点和课程性质,注重理论与实践相结合,以项目为导向,培养学生的动手实践能力和创新能力。

通过课程学习,使学生能够独立完成单片机数字频率计的设计和编程任务,达到课程目标所要求的具体学习成果。

二、教学内容1. 理论知识:- 单片机原理和结构:介绍单片机的内部组成、工作原理及性能特点。

- 数字频率计原理:讲解频率的概念、测量原理及其在电子测量中的应用。

- 编程语言:回顾C语言基础知识,重点掌握单片机编程相关语法。

2. 实践操作:- 电路设计:学习使用Proteus软件设计数字频率计电路,包括单片机、计数器、显示模块等。

- 程序编写:运用Keil软件编写数字频率计程序,实现计数、计时和显示功能。

- 仿真调试:在Proteus环境下进行电路仿真,调试程序,确保其正常运行。

3. 教学大纲:- 第一周:回顾单片机原理和结构,学习数字频率计原理。

简易频率计单片机课程设计

简易频率计单片机课程设计

单片机课程设计———简易频率计班级:学号:姓名●摘要随着电子信息产业的不断进展,信号频率的测量在科技研究和实际应用中的作用日趋重要。

传统的频率计一般是用很多的逻辑电路和时序电路来实现的,这种电路一样运行较慢,而且测量频率的范围较小。

考虑到上述问题,本论文设计一基于单片机设计频率计。

第一,咱们把待测信号通过放大整形,然后把信号送入单片机的按时计数器里进行计数,获的频率值,最后把测得的频率数值送入显示电路里进行显示。

本文从频率计的原理动身,介绍了基于单片机的频率计的设计方案,选择了实现系统的各类电路元器件,并对硬件电路进行了仿真。

●关键字:单片机频率计测量一、设计任务设计制作一个简易频率计,该频率计能测量正弦波和方波信号的频率。

◆设计框图如下:图一. 简易频率计框图二、设计指标要求◆大体要求(1)能测量频率正弦波和方波10Hz—100kHz。

(2)数码显示共3位,其中1位小数,自动换挡(00—999Hz)有一个指示灯亮,表示单位是Hz,0.00—99.9kHz,另一个灯亮,表示单位是kHz。

(3)要有输入信号超范围的爱惜电路。

◆发挥要求(1)能测量方波的周期,并显示。

(2)能测量100mV的正弦波。

三、设计仪器PC一台、WAVE6000仿真实验箱一台、LM324芯片一个、三极管一个、10KΩ,2MΩ,5KΩ电阻各一个、稳压二极管一个、面包板一个和导线假设干四、设计原理图二.电路原理图◆方案选择及实现原理(1)单片机频率计数原理本方案要紧以单片机为核心,利用单片机的计数按时功能来实现频率的计数而且利用单片机的动态扫描把测出的数据送到数字显示电路显示。

由于频率计实现的能够说是对脉冲信号个数的技术,依照这一简单原理,咱们能够利用单片机片内的两个按时器/计数器T0T1实现对输入信号的频率计数。

具体设计思路如下:先利用按时器T1按时1s,但由于单片机的最大技术范围为65536。

因此,可先利用T1按时100ms,按时十个周期,那么达到按时1s的目的。

基于AT89C51单片机频率计的设计(含程序)

基于AT89C51单片机频率计的设计(含程序)

AT89C51单片机频率计的设计摘要基于在电子领域内,频率是一种最基本的参数,并与其他许多电参量的测量方案和测量结果都有着十分密切的关系。

由于频率信号抗干扰能力强、易于传输,可以获得较高的测量精度。

因此,频率的测量就显得尤为重要,测频方法的研究越来越受到重视。

频率计作为测量仪器的一种,常称为电子计数器,它的基本功能是测量信号的频率和周期频率计的应用范围很广,它不仅应用于一般的简单仪器测量,而且还广泛应用于教学、科研、高精度仪器测量、工业控制等其它领域。

随着微电子技术和计算机技术的迅速发展,特别是单片机的出现和发展,使传统的电子侧量仪器在原理、功能、精度及自动化水平等方面都发生了巨大的变化,形成一种完全突破传统概念的新一代侧量仪器。

频率计广泛采用了高速集成电路和大规模集成电路,使仪器在小型化、耗电、可靠性等方面都发生了重大的变化。

目前,市场上有各种多功能、高精度、高频率的数字频率计,但价格不菲。

为适应实际工作的需要,本次设计给出了一种较小规模和单片机(AT89C51)相结合的频率计的设计方案,不但切实可行,而且体积小、设计简单、成本低、精度高、可测频带宽,大大降低了设计成本和实现复杂度。

频率计的硬件电路是用Ptotues绘图软件绘制而成,软件部分的单片机控制程序,是以KeilC做为开发工具用汇编语言编写而成,而频率计的实现则是选用Ptotues仿真软件来进行模拟和测试。

关键词:单片机;AT89C51;频率计;汇编语言选题的目的意义数字频率计的主要功能是测量周期信号的频率。

其基本原理就是用闸门计数的方式测量脉冲个数。

频率是单位时间( 1s )内信号发生周期变化的次数。

如果我们能在给定的 1s 时间内对信号波形计数,并将计数结果显示出来,就能读取被测信号的频率。

数字频率计首先必须获得相对稳定与准确的时间,同时将被测信号转换成幅度与波形均能被数字电路识别的脉冲信号,然后通过计数器计算这一段时间间隔内的脉冲个数,将其换算后显示出来。

单片机频率计课程设计

单片机频率计课程设计

单片机频率计课程设计一、课程目标知识目标:1. 学生能理解单片机的基本原理,掌握其内部结构和功能。

2. 学生能掌握频率计的设计原理,理解并运用相关电路知识。

3. 学生能了解并掌握编程语言在单片机应用中的基本使用方法。

技能目标:1. 学生能运用所学知识,设计并搭建一个简单的单片机频率计电路。

2. 学生能编写程序,实现对频率计的功能控制,进行基本的数据测量。

3. 学生能通过实验过程,培养动手操作能力、问题解决能力和团队协作能力。

情感态度价值观目标:1. 学生通过课程学习,培养对单片机及电子技术的兴趣,激发创新思维。

2. 学生能认识到单片机技术在现实生活中的应用价值,增强学以致用的意识。

3. 学生在课程实践过程中,培养严谨、细致的科学态度,提高对科学研究的尊重和热爱。

课程性质分析:本课程为实践性较强的电子技术课程,旨在通过单片机频率计的设计与实现,使学生在实践中掌握单片机技术的基本原理和应用。

学生特点分析:学生处于高年级阶段,已具备一定的电子技术基础知识,具有较强的学习能力和动手能力,对实际操作有较高的兴趣。

教学要求分析:根据课程性质和学生特点,要求课程目标具体、可衡量,注重理论与实践相结合,培养学生的实际操作能力和创新思维能力。

通过分解课程目标为具体学习成果,为后续教学设计和评估提供依据。

二、教学内容本课程教学内容围绕单片机频率计的设计与实现,结合以下章节进行组织:1. 单片机基础理论:介绍单片机的内部结构、工作原理和功能特点,重点讲解单片机的时钟系统、I/O口控制、中断系统等基础知识。

2. 频率计原理:讲解频率计的基本原理,包括信号发生器、计数器、时钟脉冲等组成部分,以及频率测量的基本方法。

3. 电路设计与搭建:指导学生运用所学知识,设计并搭建一个简单的单片机频率计电路,包括单片机选型、外围电路设计、元器件选型等。

4. 编程与调试:教授编程语言基础,如C语言、汇编语言等,指导学生编写单片机程序,实现对频率计的功能控制,并进行程序调试。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

沈阳工程学院┊┊课程设计设计题目:频率计程序设计系别自控系班级测控本091学生姓名学号指导教师职称教授起止日期: 2012 年1月2日起——至2012 年1月13日止沈阳工程学院课程设计任务书课程设计题目:频率计程序设计系别自控系班级学生姓名学号 2009308119指导教师职称教授课程设计进行地点: F422任务下达时间: 2012 年 1 月 2 日起止日期:2012年1月2日起——至2012年1月13日止教研室主任 2012 年1月2日批准频率计的设计1.设计主要内容及要求;编写频率计程序。

要求:1)能够测量频率并显示。

2)能够进行闸门时间选择。

2.对设计论文撰写内容、格式、字数的要求;(1).课程设计论文是体现和总结课程设计成果的载体,一般不应少于3000字。

(2).学生应撰写的内容为:中文摘要和关键词、目录、正文、参考文献等。

课程设计论文的结构及各部分内容要求可参照《沈阳工程学院毕业设计(论文)撰写规范》执行。

应做到文理通顺,内容正确完整,书写工整,装订整齐。

(3).论文要求打印,打印时按《沈阳工程学院毕业设计(论文)撰写规范》的要求进行打印。

(4). 课程设计论文装订顺序为:封面、任务书、成绩评审意见表、中文摘要和关键词、目录、正文、参考文献。

3.时间进度安排;沈阳工程学院C8051F020单片机原理及应用课程设计成绩评定表中文摘要在人们的日常生活中,频率的测量无处不在。

随着科学技术的发展,尤其是单片机技术和半导体技术的高速发展,频率计的研究及应用越来越受到重视,这样对频率测量设备的要求也越来越高。

单片机是一门发展极快应用方式极其灵活的使用技术。

他以灵活的设计、微小的功耗、低廉的成本,在数据采集、过程控制、模糊控制、智能仪表等领域得到广泛的应用,极大的提高了这些领域的技术水平和自动化程度。

在电子技术测量中,频率是最基本的参数之一,设计一种快速准确的频率计显得尤为重要。

该数字频率计的设计主要实现用数字显示被测信号的频率,该设计是以51单片机作为核心,与传统频率计相比该设计具有更高的测量精度和速度,具有各种中断处理能力,并且具有丰富的数字输入输出口和通信口等。

该频率计的设计在软件上编写,并采用计数式测频方法,通过单片机外围电路中由振荡电路产生的闸门信号进行计时,并对整形后的被测信号进行脉冲计数以得到被测信号的频率值。

由于低频信号照成了较大的量化误差,可在测量低频信号的时候延长闸门时间信号,以提高测量精度。

数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。

它是一种用十进制数字显示被测信号频率的数字测量仪器。

它的基本功能是测量正弦信号、方波信号及其他单位时间内变化的物理量。

在设计中应用单片机的数学运算和控制功能,来实现测量量程的自动切换,既满足测量精度的要求,又满足系统反应时间的要求。

在进行模拟、数字电路的设计、安装、调试过程中,由于其使用十进制数显式、测量迅速、精确度高、显示直观、所以经常用到频率计。

51系列单片机是国内目前应用最广泛的一种8位单片机之一,随着嵌入式系统、片上系统等概念的提出和普遍接受及应用。

51系列及其衍生单片机还会在继后很长一段时间占据嵌入式系统产品的低端市场,因此,作为新世纪的大学生,在信息产业高速发展的今天,掌握单片机的基本结构、原理和使用时非常重要的。

总之,频率计的设计是进行更深层次频率测量的基石。

关键词单片机,频率测量,分频器,硬件,软件目录1 设计任务描述 (1)1.1设计题目:频率计程序设计 (1)1.2设计要求: (1)1.2.1设计目的: (1)1.2.2基本要求: (1)2 设计思路 (2)3主程序流程图 (3)4 各部分程序的设计及参数计算 (4)4.1定义程序变量 (4)4.2初始化程序设计 (4)4.3主程序设计 (6)4.4T2数据采集程序设计 (8)4.5液晶显示程序设计 (9)4.6程序的参数计算 (11)5 频率计的工作过程分析 (12)6 设计过程未解决的问题 (13)小结 (14)致谢 (15)参考文献 (16)附录源程序代码 (17)1 设计任务描述1.1设计题目:频率计程序设计1.2设计要求:1.2.1设计目的:编写能实现频率测量的汇编语言程序,即设计频率计。

1.2.2基本要求:编写频率计程序。

要求:1)能够测量频率并显示。

2)能够进行闸门时间选择。

2 设计思路一.频率计计算方法的设计思路我们有多种方法可以进行频率的测量:本次课设我使用了两种方法来测量频率 (1) 直接计数法这种计算方法就是以基准时间nT 0 闸门时间来测量未知频率的f x 的周期T x 的个数,其计算公式如下:00/x x x N T T T f ==由上式可得所测频率为:00xx x N f N f T ==但是测量的时候T 0 和T x6不可避免的会有误差的存在最大的误差也就是被测 号的一个脉冲,其最大误差为00111/x x x w N T T T f =±=±=±从公式上面知道当被测频率越大则误差越小所以此部分用来测量高频信号最为合适, (2) 间接计数法间接计数法是用被测信号的时间间隔nT x 作为闸门时间,通过计算时钟脉冲的个数来计算来测量被测信号的频率,计算公式如下:00//x x x N nT T nf f ==(其中f x 是所测频率)由上式可得所测频率为:0/x x f nf N =和直接测量的一样间接计数法也存在误差其形成原因在于基准频率的脉冲个数实际上不为整数,其最大误差是基准脉冲的一个脉冲,这个误差为: 011/xxx f w N nT T nf =±=±=±由此可知他可以用来测量频率较为低一些的信号这样就会产生更小的误差 二.频率计程序的设计思路首先我使用T2定时器用来采集信号,我选择T2定时器就是因为它可以利用系统时钟定时同时又可以采集外面输入信号的信息,可谓是一举两得,接下来我设计了自动档位选择程序可以根据输入信号的频率来自动决定选择合适的档位,判断使用哪种方法来计算更为精确,频率计算完成之后就是将其输入到液晶显示程序将所测到的频率值显示出来3主程序流程图4 各部分程序的设计及参数计算4.1 定义程序变量在程序执行前,定义是非常有必要的。

定义如下:#include<c8051f020.h>#define SYSCLK 11059200.0 //定义系统时钟SYSCLK为11059200.0HZ double Timer0=0; //定义Timer0为双精度浮点型并赋初值为0 unsigned int PCL,PCH; //定义PCL,PCH为无符号整型数据unsigned int tang=0,tang1=0; //定义tang=tang1=0且为无符号整型数据unsigned int shao,shao1; //定义shao,shao1为无符号整型数据unsigned int T=0,T1=0; //定义T=0,T1=0且为无符号整型数据unsigned int count=0,count1=0;//定义count=0,count1=0为无符号整型数据double fre=0; //定义fre为双精度浮点型并赋初值为0bit st3=0; bit st1=0; //定义st3,st1为位类型的变量unsigned char xdata LCDdata[11]={48,49,50,51,52,53,54,55,56,57,46};//定义一个11列的数组unsigned char xdata liangcheng[5][10]={{97,48,49,60,53,48,72,122,0x20,0x20},{98,53,48,60,49,48,48,72,122,0x20},{99,49,48,48,60,49,75,72,122,0x{100,49,75,60,50,53,75,72,122,0x20},{101,50,53,75,60,53,48,75,72,122}};//定义一个5行10列的数组4.2 初始化程序设计void T2_Init(void);//定时器T2的初始化{T2CON=0x09;//T2工作在定时方式允许定时器T2进行捕捉TL2=0;TH2=0; //定时器赋初值00;RCAP2L=0;RCAP2H=0; // RCAP2H ,RCAP2L寄存器赋初值00;XBR1|=0x40; //T2EX0连接端口引脚IE|=0xA0; //总中断使能,并且允许定时器T2中断CKCON|=0x20;//定时器T2按系统时钟频率计数}void PORT_Init(void)//端口初始化{XBR2|=0x40;//交叉开关使能P0=0;//端口寄存器赋初值为00;}void LCD_Init(void)//液晶初始化{unsigned int x;P6=0x09; //写命令for(x=0;x<5000;x++);//延时程序P7=0x38;//两行显示,5X7点阵P6=0x08;//结束写命令P6=0x09;//写命令for(x=0;x<1000;x++);//延时程序P7=0x38;//两行显示,5X7点阵P6=0x08;//结束写命令P6=0x09;//写命令for(x=0;x<1000;x++);//延时程序P7=0x0e;//开显示,开光标,字符不闪烁P6=0x08;//结束写命令P6=0x09; //写命令for(x=0;x<1000;x++);//延时程序P7=0x06;//I/D=1,AC自动增加1;S=0,整体显示不移动P6=0x08;//结束写命令P6=0x09; //写命令for(x=0;x<5000;x++);//延时程序P7=0x01;//清除DDRAM,置AC=0;P6=0x08; //结束写命令P6=0x09;//写命令for(x=0;x<5000;x++);//延时程序}void SYSCLK_Init(void)//系统时钟初始化{int i; /*延时计数器*/OSCXCN = 0x67; /*启动外部11.0592MHz晶振*/ for (i=0; i < 255; i++) ; /*等待外部晶体起振*/while ((OSCXCN & 0x80)==0x00) ; /*查询标志位*/OSCICN = 0x88; /*选择外部晶体作为系统时钟并使能时钟丢失检测*/ }4.3 主程序设计这部分是我设计的主程序,它涉及频率测量的档位选择以及频率运算等核心部分所以我会详细的做这部分的设计介绍:main(){WDTCN=0xde;WDTCN=0xad;//关看门狗T2_Init();//定时器T2初始化PORT_Init();//端口初始化LCD_Init();//液晶初始化SYSCLK_Init();//系统时钟初始化,11MHzwhile(1)//死循环{switch(tang){case 0:shao=3;//a档,计算3个被测脉冲break;case 1:shao=200;//b档,计算200个被测脉冲break;case 2:shao=800;//c档,计算800个被测脉冲break;case 3:shao1=400;//d档,计算400*65536个基准脉冲break;case 4:shao1=10;//e档,计算10*65536个基准脉冲break;default:break;//跳出switch循环}if(tang1!=tang)//档位选择{ EXEN2=0;//禁止T2捕捉tang1=tang;//换档结束count1=0;// 基准频率计时归零count=0;// 基准频率计时归零T=0; T1=0;// 被测脉冲计数归零TL2=0; TH2=0;//定时器T2清零EXEN2=1;//允许T2捕捉中断}if(st1==1) //低频档{Timer0=(double)((PCH*256+PCL+65536*(count+count1*80000))/SYSCLK); fre=(double)((shao-1)/Timer0); //间接计数法算频率T=0; T1=0; //被测脉冲计数归零count=0; count1=0; //基准频率计时归零TL2=0; TH2=0; //基准频率计时归零RCAP2L=0; // RCAP2H寄存器归零RCAP2H=0; // RCAP2L寄存器归零PCL=0; // PCL归零PCH=0; // PCH归零st1=0;//清除低频标志位EXEN2=1; //允许T2捕捉中断}if(st3==1) //高频档{fre=(double)((T-1+T1*80000)*SYSCLK/(shao1*65535)); //直接计数法算频率TL2=0; TH2=0; //基准频率计时归零T=0; T1=0; 被测脉冲计数归零count=0;count1=0; //基准频率计时归零st3=0; //清除高频标志位EXEN2=1; //允许T2捕捉中断}if(fre<=50)tang=0; //频率小于50Hz换a档if((fre>50)&&(fre<=100))tang=1; //频率50~100Hz换b档if((fre>100)&&(fre<=1000))tang=2; //频率100~1000Hz换c档if((fre>1000)&&(fre<=25000))tang=3; //频率1000~25000Hz换d档if(fre>25000)tang=4; //频率大于25000Hz换e档LCD_show(fre);}}4.4 T2数据采集程序设计T2定时器具有边沿触发的捕捉方式,每来一个下降沿,进一次中断并计一个数,直接计数法和间接计数法都需要这个功能。

相关文档
最新文档