数字频率计(51单片机)

合集下载

单片机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。

51单片机数字频率计的代码

51单片机数字频率计的代码

51单片机数字频率计的代码标题: 用51单片机实现数字频率计功能的创作导言:数字频率计是一种常见的电子测量仪器,用于测量信号的频率。

本文将介绍如何使用51单片机实现数字频率计的功能,通过编写相关代码和接线,实现对信号频率的测量和显示。

一、引言数字频率计是一种电子测量仪器,用于测量信号的频率。

它通过将输入信号与计时器进行比较,并将计数结果转换为频率值。

在本项目中,我们将使用51单片机来实现这一功能。

二、硬件设计我们需要准备的硬件有:51单片机、晶体振荡器、LCD显示屏、按键开关和一些连接线。

首先,将晶体振荡器连接到单片机的相应引脚上,以提供系统时钟。

然后将LCD显示屏连接到单片机的I/O端口上,用于显示测量结果。

最后,连接按键开关到单片机的I/O端口上,用于启动和停止测量。

三、软件设计1. 初始化我们需要初始化单片机的计时器和LCD显示屏。

通过设置计时器的工作模式和计数方式,以及LCD的显示模式和位置,来确保测量和显示的准确性。

2. 信号测量接下来,我们需要编写代码来测量输入信号的频率。

通过将输入信号与计时器进行比较,并在每个计数周期结束时进行计数,来获取信号的周期时间。

然后,通过计算周期时间的倒数,即可得到信号的频率。

3. 结果显示将测量得到的频率值转换为字符形式,并通过LCD显示屏进行显示。

可以使用LCD库函数来实现字符显示的功能,通过将频率值转换为字符数组,并逐个显示在LCD屏幕上。

四、实验结果经过测试,我们成功实现了数字频率计的功能。

当输入信号稳定时,可以准确地测量并显示信号的频率。

通过按下按键开关,可以启动和停止频率测量。

结论:通过51单片机的编程和硬件设计,我们成功实现了数字频率计的功能。

该频率计可以准确地测量输入信号的频率,并通过LCD显示屏进行显示。

这个项目不仅加深了我们对单片机的理解,还提高了我们的编程能力。

希望这个项目能对读者有所帮助,激发对电子技术的兴趣和研究。

基于51单片机的数字频率计设计

基于51单片机的数字频率计设计

基于51单片机的数字频率计一、实验内容1.1数字频率计概述数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。

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

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

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

本数字频率计将采用定时、计数的方法测量频率,采用四位LED数码管动态显示4位数。

测量范围从1Hz—10kHz的正弦波、方波、三角波。

用单片机实现自动测量功能。

1.2频率测量仪的设计思路与频率的计算频率测量仪的设计思路主要是:设置单片机T1为计数器模式,对输入信号进行计数,T0设置为定时器模式,定时时间为1秒,则计数器所计数值即为被测信号频率。

1.3 基本设计原理基本设计原理是直接用十进制数字显示被测信号频率的一种测量装置。

它以在单位时间内对被测信号上升沿计数的方法对正弦波、方波、三角波的频率进行自动的测量。

如果被测信号频率超过量程,则有警报灯闪烁。

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

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

1.4 频率计性能参数设计量程:0-10KHz波形:方波输入信号电压:5V二、数字频率计的硬件结构设计2.1 系统硬件的构成本频率计的数据采集系统主要元器件是单片机AT89C51,由它完成对待测信号频率的计数和结果显示等功能,外部还要有电源电路、复位电路、显示器,报警电路等器件,如下图所示:图一数字频率计功能模块2.2 AT89C51单片机引脚说明在本次设计中,采用89C51作为CPU处理器,充分利用其硬件资源,结合数码管,发光二极管,按键开关构成控制及显示模块。

在试验中选用P1.2,P1.3,P1.4端口分别控制数据和时钟信号的输入实现频率的动态显示。

基于51单片机的频率计设计报告

基于51单片机的频率计设计报告

基于51单片机的频率计设计报告
在该设计报告中,我将介绍基于51单片机的频率计的设计原理、硬件设计和软件设计。

设计原理:
频率计是一种用于测量信号频率的仪器。

基于51单片机的频率计的设计原理是利用单片机的定时计数器来测量输入信号的脉冲个数,然后将脉冲个数转换为频率。

硬件设计:
硬件设计主要包括输入信号的采集电路、计数电路和显示电路。

输入信号的采集电路使用一个比较简单的电路,包括一个电阻和一个电容,用于将输入信号转换为脉冲信号。

计数电路使用单片机的定时计数器来进行计数。

在这个设计中,我们使用TIMER0和TIMER1作为计数器,分别用于测量输入信号的高电平时间和低电平时间,然后将两个时间相加得到一个完整的周期,再根据周期反推频率。

显示电路使用一个LCD模块来显示测量得到的频率。

在这个设计中,我们使用IO口将计算得到的频率发送给LCD模块,通过LCD模块来显示频率。

软件设计:
软件设计主要包括信号采集、脉冲计数和频率计算。

信号采集主要通过定时器的中断来进行。

在采集到一个脉冲之后,中
断程序会使计数器加1
脉冲计数是通过对输入信号高电平时间和低电平时间计数来完成的。

在脉冲计数的过程中,我们需要启动TIMER0和TIMER1,并设置正确的工
作模式和计数值。

频率计算是通过将高电平时间和低电平时间相加得到一个完整的周期,然后再根据周期反推频率来完成的。

最后,将计算得到的频率发送给LCD
模块进行显示。

总结:。

数字频率计(51单片机)

数字频率计(51单片机)

自动化与电子工程学院单片机课程设计报告课程名称:单片机原理与应用学院:自动化与电子工程院专业班级:学生姓名:完成时间:报告成绩:评阅意见:评阅教师日期目录第1章数字频率计概述11.1数字频率计概述01.2数字频率计的基本原理01.3单脉冲测量原理1第2章课程设计方案设计12.1系统方案的总体论述12.2系统硬件的总体设计22.3处理方法2第3章硬件设计33.1单片机最小系统3第4章软件设计44.1系统的软件流程图44.2程序清单6第5章课程设计总结6参考文献7附录Ⅰ仿真截图8附录Ⅱ程序清单14第1章数字频率计概述1.1数字频率计概述数字频率计又称为数字频率计数器,是一种专门对被测信号频率进行测量的电子测量仪器,是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。

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

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

本数字频率计将采用定时、计数的方法测量频率,采用6个数码管显示6位十进制数。

测量范围从10Hz—5.5kHz,精度为1%,用单片机实现自动测量功能。

基本设计原理是直接用十进制数字显示被测信号频率的一种测量装置。

它以测量频率的方法对方波的频率进行自动的测量。

1.2数字频率计的基本原理数字频率计最基本的工作原理为:当被测信号在特定时间段T内的周期个数为N时,则被测信号的频率f=N/T(如图1.1所示)。

图1.1 频率测量原理频率的测量实际上就是在1s时间内对信号进行计数,计数值就是信号频率。

用单片机设计频率计通常采用的办法是使用单片机自带的计数器对输入脉冲进行计数;好处是设计出的频率计系统结构和程序编写简单,成本低廉,不需要外部计数器,直接利用所给的单片机最小系统就可以实现。

缺陷是受限于单片机计数的晶振频率,输入的时钟频率通常是单片机晶振频率的几分之一甚至是几十分之一,在本次设计使用的AT89C51单片机,由于检测一个由“1”到“0”的跳变需要两个机器周期,前一个机器周期测出“1”,后一个周期测出“0”。

基于51单片机的频率计的设计

基于51单片机的频率计的设计

基于51单片机的频率计的设计频率计是一种测量信号频率的仪器或装置,其原理是通过对信号进行计数和定时来测量信号的周期,并进而计算出信号的频率。

在本篇文章中,我们将设计一个基于51单片机的频率计。

设计方案:1.硬件设计:(1)时钟电路:使用11.0592MHz晶振为主频时钟源。

(2)信号输入:选择一个IO口作为信号输入口,通过外部电平转换电路将信号转换为51单片机能够处理的电平。

(3)显示装置:使用一个数码管或液晶显示屏来输出测量结果。

2.软件设计:(1)初始化:设置51单片机的工作模式、引脚功能、定时器等。

初始化时,将IO口配置为输入模式,用于接收外部信号。

(2)定时器设置:利用定时器来进行时间的测量,可以选择适当的定时器和计数器来实现定时功能。

(3)外部中断设置:使用外部中断来触发定时器,当外部信号边沿发生变化时,触发定时器的启动或停止。

(4)中断处理:通过中断处理程序来对定时器进行启动、停止和计数等操作。

(5)频率计算:将计数结果经过一定的处理和运算,计算出信号的频率。

(6)结果显示:将计算得到的频率结果通过数码管或液晶显示屏输出。

3.工作流程:(1)初始化设置:对51单片机进行初始化设置,包括端口、定时器、中断等的配置。

(2)外部信号输入:通过外部电平转换电路将要测量的信号输入至51单片机的IO口。

(3)定时测量:当外部信号发生边沿变化时,触发外部中断,启动定时器进行定时测量。

(4)停止计时:当下一个信号边沿出现时,中断处理程序停止定时器,并将计数结果保存。

(5)频率计算:根据定时器的设置和计数结果,计算出信号的周期和频率。

(6)结果显示:将计算得到的频率结果通过数码管或液晶显示屏进行显示。

4.注意事项:(1)确保信号输入的稳定性:外部信号输入前需要经过滤波处理,保证稳定且无杂波的输入信号。

(2)测量精度的提高:如有必要,可以通过增加定时器的位数或扩大计数范围来提高测量精度。

(3)显示结果的优化:可以根据需要,通过增加缓冲区、优化数码管显示等方式来改善结果的可读性。

基于51单片机的数字频率计

基于51单片机的数字频率计
• 5、ALE/PROG(30脚):地址锁存信号输入端/EPROM 编程脉冲输入端;
• 6、RESET/VPD(9脚):复位信号输入端/备用电源输入 端;
单片机执行程序都是从地址0000H开始的,所以在进入系 统时必须对CPU进行复位,有时候程序运行错误或操作错 误,系统会处于锁死的状态为了摆脱这样的状态也必须对 单片机进行复位。
复位的方法比较简单:只要在RESET脚上加一个持续时 间为24个振荡周期(两个机器周期)的高电平就可以了。
• 7、EA/VPP(31脚):内/外部ROM选择端; • 8、P0口(39-32脚):双向IO口P00-P07(P0口无上拉
电阻,作输出用需要接上拉电阻);
• 9、P1口(1-8脚):准双向通用IO口; • 10、P2口(21-28脚):准双向通用IO口; • 11、P3口(10-17脚):准双向通用IO口;
环境干扰等因素。经实际多次测试频率在 等于1000Hz的时候最大相对误差达到0.1%, 符合误差要求。
• 实物图
2.3 显示模块
• 2.3.1 LCD1602简介
LCD1602是一种专门用来显示字母、数字、 符号等的点阵型液晶模块,它由若干个5X7 或者5X11等点阵字符位组成,每个点阵字 符位都可以显示一个字符,每位之间有一 个点距的间隔,每行之间也有间隔,起到 了字符间距和行间距的作用。LCD1602是= 显示的内容为16X2,即可以显示两行,每 行16个字符液晶模块。
2.3.4 LCD1602地址
比如第二行第一个字符的地址是40H,那么是否直接 写入40H就可以将光标定位在第二行第一个字符的位置呢? 这样不行,因为写入显示地址时要求最高位D7恒定为高 电平1,所以实际写入的数据应该40H+80H=C0H

51单片机——数字频率计

51单片机——数字频率计

频率计是我们经常会用到的实验仪器之一,本实验要使用单片机和计数电路及液晶器件来设计一个宽频的频率计。

期望达到10Hz-1.1G范围的频率精确测量。

实验电路图(初步方案)1) 计数及显示电路:2)前置放大及分频电路:设计思路频率的测量实际上就是在1S时间内对信号进行计数,计数值就是信号频率。

用单片机设计频率计通常采用两种办法,1)使用单片机自带的计数器对输入脉冲进行计数,或者测量信号的周期;2)单片机外部使用计数器对脉冲信号进行计数,计数值再由单片机读取。

由于单片机自带计数器输入时钟的频率通常只能是系统时钟频率的几分之一甚至几十分之一,因此采用单片机的计数器直接测量信号频率就受到了很大的限制。

本实验电路采用方式2,使用一片74LS393四位双二进制计数器和Atmega8的 T1计数器组成了24位计数器,最大计数值为16777215。

如果输入信号经过MB501分频器进行64分频后再进行测量,则固定1S时基下最高测量频率为1073.741760Mhz。

为了方便得到准确的1秒钟测量闸门信号,我们使用了Atmega8的异步实时时钟功能,采用32.768Khz的晶振由TC2产生1秒钟的定时信号。

测量原理:单片机打开测量闸门,即PB1输出高电平,同时TC2定时器启动。

74LS393开始对输入脉冲进行计数,74LS393每计数达256时,Atmega8的T1计数器也向上计数1次。

当1S定时到达时,单片机产生中断,PB1输出低电平关闭测量闸门,然后Atmega8读取74LS393和T1的计数值,然后送LCD显示。

实验进展2004-09-27根据设计思路编写程序初步获得了一些实验结果,如下图所示。

下图是测量8M有源晶振的输出结果。

由于1S的测量闸门时间在业余条件下不好测试,因此,实验程序中在LCD上同时显示实时时钟用于判断1S闸门时间的准确性。

实验中,我使用CDMA手机上显示的GPS卫星精确时间进行比较。

手机时间显示的最小单位是分钟,测量时一旦手机分钟值发生跳变,则立即记录下LCD显示的秒值,这样的话让频率计运行一段时间后,再多次记录下LCD显示的秒,就可以准确判断频率计的异步时钟是否准确。

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

自动化与电子工程学院单片机课程设计报告课程名称:单片机原理与应用学院:自动化与电子工程院专业班级:学生姓名:完成时间:报告成绩:目录第1章数字频率计概述 (2)1.1数字频率计概述 (1)1.2数字频率计的基本原理 (1)1.3单脉冲测量原理 (2)第2章课程设计方案设计 (2)2.1系统方案的总体论述 (2)2.2系统硬件的总体设计 (3)2.3处理方法 (3)第3章硬件设计 (4)3.1单片机最小系统 (4)第4章软件设计 (5)4.1系统的软件流程图 (5)4.2程序清单 (7)第5章课程设计总结 (7)参考文献 (8)附录Ⅰ仿真截图 (9)附录Ⅱ程序清单 (15)第1章数字频率计概述1.1数字频率计概述数字频率计又称为数字频率计数器,是一种专门对被测信号频率进行测量的电子测量仪器,是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。

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

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

本数字频率计将采用定时、计数的方法测量频率,采用6个数码管显示6位十进制数。

测量范围从10Hz—5.5kHz,精度为1%,用单片机实现自动测量功能。

基本设计原理是直接用十进制数字显示被测信号频率的一种测量装置。

它以测量频率的方法对方波的频率进行自动的测量。

1.2数字频率计的基本原理数字频率计最基本的工作原理为:当被测信号在特定时间段T内的周期个数为N时,则被测信号的频率f=N/T(如图1.1所示)。

图1.1 频率测量原理频率的测量实际上就是在1s时间内对信号进行计数,计数值就是信号频率。

用单片机设计频率计通常采用的办法是使用单片机自带的计数器对输入脉冲进行计数;好处是设计出的频率计系统结构和程序编写简单,成本低廉,不需要外部计数器,直接利用所给的单片机最小系统就可以实现。

缺陷是受限于单片机计数的晶振频率,输入的时钟频率通常是单片机晶振频率的几分之一甚至是几十分之一,在本次设计使用的AT89C51单片机,由于检测一个由“1”到“0”的跳变需要两个机器周期,前一个机器周期测出“1”,后一个周期测出“0”。

故输入时钟信号的最高频率不得超过单片机晶振频率的二十四分之一。

根据频率检测的原理,很容易想到利用51单片机的T0、T1两个定时/计数器,一个用来定时,另一个用来计数,两者均应该工作在中断方式,一个中断用于1s时间的中断处理,一个中断用于对频率脉冲的计数溢出处理。

1.3单脉冲测量原理首先设置定时器T0为方式1,在被测脉冲信号INT0的下降沿进入外部中断函数,在中断函数中启动T0计数码,被测脉冲信号下降沿停止T0计数,脉宽测量过程见下图:定时器T0以方式1对内部脉冲计数,16位计数值存放在40H(高字节)和41H单元第2章课程设计方案设计2.1系统方案的总体论述数字频率计是用于测量信号(方波,脉冲信号)的频率,并用十进制数字显示,它具有精度高,测量迅速,读数方便等优点。

脉冲信号的频率就是在单位时间内所产生的脉冲个数,其表达式为f=N/T,其中,f为被测信号的频率,N为计数器所累计的脉冲个数。

T为产生N个脉冲所需的时间。

计数器所记录的结果,就是被测信号的频率。

如在1S内记录1000个脉冲,则被测信号的频率为1000Hz。

本实验课题仅讨论一种简单易制的数字频率计。

2.2系统硬件的总体设计本频率计的数据采集系统主要元器件是单片机AT89C51,由它完成对待测信号频率的计数和结果显示等功能,可分为以下几个两个模块电路:单片机系统、数码管及显示电路。

各模块关系图如图2.1所示:图2.1 数字频率计系统框图2.3处理方法本频率计的设计以AT89C51 单片机为核心,利用它内部的定时/ 计数器完成待测信号周期/ 频率的测量。

单片机AT89C51 内部具有2 个16 位定时/计数器,定时/ 计数器的工作可以由编程来实现定时、计数和产生计数溢出中断要求的功能。

在构成为定时器时,每个机器周期加1(使用12MHz 时钟时,每1us 加1),这样以机器周期为基准可以用来测量时间间隔。

在构成为计数器时,在相应的外部引脚发生从1 到0 的跳变时计数器加1 ,这样在计数闸门的控制下可以用来测量待测信号的频率。

外部输入每个机器周期被采样一次,这样检测一次从1 到0 的跳变至少需要2 个机器周期(24 个振荡周期),所以最大计数速率为时钟频率的1/ 24 (使用12MHz 时钟时,最大计数速率为500 KHz)。

定时/计数器的工作由相应的运行控制位TR 控制,当TR置1,定时/ 计数器开始计数;当TR 清0 ,停止计数。

第3章硬件设计3.1单片机最小系统AT89C51是一种高性能低功耗的采用CMOS工艺制造的8位微控制器,它提供下列标准特征:4KB的程序存储器,128B的RAM,32条I/O线,2个16位定时器/计数器,2个外部中断源和1个串行口。

图3.1 单片机最小系统其引脚功能如下:⒈电源:⑴ VCC -电源引脚,接+5V;⑵ GND -接地端;⒉时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。

⒊控制线:控制线共有4根,⑴PROGALE:地址锁存允许/片内EPROM编程脉冲/① ALE功能:用来锁存P0口送出的低8位地址②PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。

⑵ PSEN:外ROM读选通信号。

⑶ RESET:复位信号。

⑷VppEA:内外ROM选择/片内EPROM编程电源。

/①EA功能:内外ROM选择端。

② Vpp功能:片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。

⒋ I/O线89C51共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。

P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。

5.P3口第二功能P3.0 RXD 串行输入口P3.1 TXD 串行输出口INT外部中断0申请输入端P3.2 0INT外部中断1申请输入端P3.3 1P3.4 T0 定时计数器0计数输入端P3.5 T1 定时计数器1计数输入端P3.6 WR外部数据存储器写选通P3.7 RD外部数据存储器读选通第4章软件设计4.1系统的软件流程图系统软件设计采用模块化设计方法。

整个系统由初始化模块、显示模块和信号频率测量模块和脉冲测量模块组成(见图4.1) 。

上电后,进入系统初始化模块,系统软件开始运行。

在执行过程中,根据外界开关选择是频率测量模式还是脉冲宽度测量模式。

其中当闭合开关,蓝色指示灯亮时,表示是在单脉冲测量模式,打开开关,蓝色指示灯灭,表示是在频率测量模式。

若模式选择错误,将会导致不能得到正确的测量结果。

具体程序流程见下图:图4.1 主函数流程图图4.2频率测量流程图图4.3脉冲宽度测量流程图4.2程序清单程序详见附录Ⅱ。

第5章课程设计总结通过本次对数字频率计的设计使我对书本上的知识有了更进一步的了解,同时也使我感觉到,在实际运用中仅仅凭借书本上的的知识是远远不够的。

在设计中我遇到了一些困难,比如测量方法的选择上曾一度陷入困境,终于攻克了难题。

本次课程设计使我的分析能力和动手能力都有了很大的进步,激起了我对课程的更大兴趣。

在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量就显得更为重要。

频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。

通常情况下计算每秒内待测信号的脉冲个数,此时我们称闸门时间为1秒。

闸门时间也可以大于或小于一秒。

闸门时间越长,得到的频率值就越准确,但闸门时间越长则没测一次频率的间隔就越长。

闸门时间越短,测的频率值刷新就越快,但测得的频率精度就受影响。

本设计还有很多地方需要改进,其中包括对数据的处理,因为取模运算耗时过大,导致数码管在测量高频信号时出现闪烁。

所以应该优化算法,获得更好的显示效果。

参考文献[1]《单片机原理及应用》陈为,中国石油大学出版社附录Ⅰ仿真截图开关打开,指示灯灭,表示此时为测量频率模式,调整方波频率,在数码管上得到测量值为520Hz开关打开,指示灯灭,表示此时为测量频率模式,调整方波频率,在数码管上得到测量值为21Hz经过放着可见,对频率的测量还是比较准确的以下是对脉冲宽度测量的仿真截图双击脉冲发生器,会出现如下对话框设置脉冲格式,单脉冲,正脉冲,起始时间为1s后(即开始仿真一秒后,脉冲自动产生),脉冲宽度设置为520us,点击OK保持开关闭合,模式指示灯亮,表示此时在脉冲测量方式下,点击仿真开始按钮,开始仿真,1s后,单片机接收到脉冲信号,并把结果显示到数码管上其默认单位为us,此时显示结果为576us修改脉冲宽度为0.1s(要求测量范围的上限),仿真结果如下,此时数码管显示为100000us,即0.1s附录Ⅱ程序清单/*****************************************************************课题名称:单片机测输入方波脉冲频率和单脉冲宽度测量范围:外界输入频率在10KHz以内可以稳定显示,六位数码管默认单位为Hz当测量范围过大时,因取模运算耗时大数码管会闪烁,但显示基本正确单正脉冲测量范围可达100us--0.1s,六位数码管默认单位为us*****************************************************************/#include<reg51.h> //包含51单片机寄存器定义的头文件#define uchar unsigned char#define uint unsigned intlong n,num; //全局变量,n用来记录T1的中断次数,4000次后正好是一秒:num用来存放测脉冲宽度时T0的计数值sbit u=P3^2; //将u位定义为P3.2sbit L=P2^7; //将L位定义为P2.7sbit led=P2^6; //led亮时表示测量脉冲宽度状态uchar a,b,c,d,e,f; //六位数码管uchar code t[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段码/**************************************************************函数功能:延时子函数*************************************************************/void delay(uint z){uint i,j;for(i=0;i<z;i++)for(j=0;j<50;j++);}/**************************************************************函数功能:测频率时的定时器初始化*************************************************************/void init() //测频率时的定时器初始化{TMOD=0x25; // 0010 0101 =>T1,定时方式二,8位自动重装;T0,计数,方式1 TH0=0; //计数初值为零TL0=0;TH1=6; //定时250usTL1=6;TR1=1; //开T1定时TR0=1; //开T0计数ET0=1; //允许TO中断ET1=1; //允许T1中断EA=1; //开总中断}/************************************************************** 函数功能:显示子函数*************************************************************/ void display() //显示{P2=0xfe; //最右端一位数码管P0=t[f]; //送段码delay(1); //延时P0=0; //熄灭P2=0xfd; //右端数第二位P0=t[e]; //送段码delay(1); //延时P0=0; //熄灭P2=0xfb; //右端数第三位P0=t[d]; //送段码delay(1); //延时P0=0; //熄灭P2=0xf7; //右端数第三位P0=t[c]; //送段码delay(1); //延时P0=0; //熄灭P2=0xef; //右端数第三位P0=t[b]; //送段码delay(1); //延时P0=0; //熄灭P2=0xdf; //右端数第三位P0=t[a]; //送段码delay(1); //延时P0=0; //熄灭}/************************************************************** 函数功能:定时器T0中断,定时1s*************************************************************/ void t1(void) interrupt 3 //定时器T1中断,{n++; //记录中断次数,4000次正好1sif(n==4000) //一秒时间到,读计数器的T0的值{n=0; //清零EA=0; //关中断TR1=0; //关T1定时TR0=0; //关T0计数num=(long)TH0*256+TL0; //取计数值TL0=0; //计数清零TH0=0; //计数清零a=num/100000; //对计数值取模,显示用b=num/10000%10;c=num/1000%10;d=num/100%10;e=num/10%10;f=num%10;TR1=1; //开T1定时TR0=1; //开T0计数EA=1; //重开}}/************************************************************** 函数功能:测脉冲宽度的子函数*************************************************************/ void maikuan(void){TMOD=0x01; //TMOD=0001H,使用计数器T0的模式1EA=1; //开放总中断EX0=1; //允许使用外中断IT0=0; //选择负跳变来触发外中断TH0=0; //定时器T0赋初值0TL0=0; //定时器T0赋初值0while(L==0)display();//无限循环,不停调用显示子函数}/************************************************************** 函数功能:外中断0的中断服务程序*************************************************************/ void int0(void) interrupt 0 //外中断0的中断编号为0{TR0=1; //外中断一到来,即启动T0计时while(u==0); // P3^2为低电平时T0一直计数TR0=0; //P3^2为高电平时关闭T0num=((long)TH0*256+TL0)+31; //取计数值TL0=0; //计数清零TH0=0; //计数清零if(TF0==1)//如果计数器有溢出,需要加上溢出前的计数值65535 {TF0=0;num=num+65536;} //计数器没有溢出,直接对计数值处理a=num/100000;b=num%100000/10000;c=num%100000%10000/1000;d=num%100000%10000%1000/100;e=num%100000%10000%1000%100/10;f=num%100000%10000%1000%100%10;}/************************************************************** 函数功能:测频率的子函数*************************************************************/ void pinlv(){init(); //初始化while(L==1)display();}/************************************************************** 函数功能:主函数*************************************************************/ void main(void){while(1) //主循环{if(L==1) //判断是计频率还是测脉冲宽度pinlv();elsemaikuan();}}。

相关文档
最新文档