单片机C51数字频率计程序

合集下载

单片机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显示屏进行显示。

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

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

基于AT98C51单片机数字频率计

基于AT98C51单片机数字频率计

摘要51系列单片机是国内目前应用最广泛的一种8位单片机之一,随着嵌入式系统、片上系统等概念的提出和接受及应用,51系列单片机还会在继后很长一段时间占据嵌入式低端市场。

重要的。

,因此,作为新世纪的大学生,在信息产业高速发展的今天,掌握单片机的基本结构、原理和使用时非常重要的。

随着电子技术的发展,当前数字系统的设计正朝着速度快、容量大、体积小、重量轻的方向发展。

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

本设计所要介绍的是以单片机AT89C51为核心设计了一种量程自选的数字频率计。

在本文的设计采用单片机内部的定时器/计数器对脉宽的机器周期数进行计数,从而求得被测信号的频率值, 最后通过静态显示电路显示数值由于单片机内部振荡频率很高, 所以一个机器周期的量化误差相当小, 可以有效地提高低频信号的测量准确性。

关键字:单片机,AT98C51,量程自选频率计目录摘要 (1)一、设计目的 (3)二、设计要求及指标 (3)三、单元电路分析 (3)1、上拉电路 (3)2、信号输入电路 (6)3、显示电路 (7)四、系统框图 (9)五、仿真图 (10)六、仿真结果 (10)七、软件介绍 (12)八、心得体会 (13)九、参考文献 (13)附录源程序 (14)一设计目的1.掌握量程自选数字频率计的设计、组装与调试方法。

2.熟悉集成元器件的选择和集成电路芯片的逻辑功能及使用方法。

3.熟悉仿真软件的使用。

二设计要求及指标1.输入信号的频率量程可以自动选择。

2.测试结果用6位数码管显示。

三单元电路分析1、上拉电路AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。

使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。

片上Flash允许程序存储器在系统可编程,亦适于常规编程器。

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

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

毕业论文声明本人郑重声明:1.此毕业论文是本人在指导教师指导下独立进行研究取得的成果。

除了特别加以标注地方外,本文不包含他人或其它机构已经发表或撰写过的研究成果。

对本文研究做出重要贡献的个人与集体均已在文中作了明确标明。

本人完全意识到本声明的法律结果由本人承担。

2.本人完全了解学校、学院有关保留、使用学位论文的规定,同意学校与学院保留并向国家有关部门或机构送交此论文的复印件和电子版,允许此文被查阅和借阅。

本人授权大学学院可以将此文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本文。

3.若在大学学院毕业论文审查小组复审中,发现本文有抄袭,一切后果均由本人承担,与毕业论文指导老师无关。

4.本人所呈交的毕业论文,是在指导老师的指导下独立进行研究所取得的成果。

论文中凡引用他人已经发布或未发表的成果、数据、观点等,均已明确注明出处。

论文中已经注明引用的内容外,不包含任何其他个人或集体已经发表或撰写过的研究成果。

对本文的研究成果做出重要贡献的个人和集体,均已在论文中已明确的方式标明。

学位论文作者(签名):年月关于毕业论文使用授权的声明本人在指导老师的指导下所完成的论文及相关的资料(包括图纸、实验记录、原始数据、实物照片、图片、录音带、设计手稿等),知识产权归属华北电力大学。

本人完全了解大学有关保存,使用毕业论文的规定。

同意学校保存或向国家有关部门或机构送交论文的纸质版或电子版,允许论文被查阅或借阅。

本人授权大学可以将本毕业论文的全部或部分内容编入有关数据库进行检索,可以采用任何复制手段保存或编汇本毕业论文。

如果发表相关成果,一定征得指导教师同意,且第一署名单位为大学。

本人毕业后使用毕业论文或与该论文直接相关的学术论文或成果时,第一署名单位仍然为大学。

本人完全了解大学关于收集、保存、使用学位论文的规定,同意如下各项内容:按照学校要求提交学位论文的印刷本和电子版本;学校有权保存学位论文的印刷本和电子版,并采用影印、缩印、扫描、数字化或其它手段保存或汇编本学位论文;学校有权提供目录检索以及提供本学位论文全文或者部分的阅览服务;学校有权按有关规定向国家有关部门或者机构送交论文的复印件和电子版,允许论文被查阅和借阅。

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

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

1 前言频率测量是电子学测量中最为基本的测量之一。

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

随着数字电子技术的发展,频率测量成为一项越来越普遍的工作,测频原理和测频方法的研究正受到越来越多的关注。

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

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

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

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

传统的频率计采用测频法测量频率,通常由组合电路和时序电路等大量的硬件电路组成,产品不但体积大,运行速度慢而且测量低频信号不准确。

本次采用单片机技术设计一种数字显示的频率计,测量准确度高,响应速度快,体积小等优点。

1.2频率计发展与应用在我国,单片机已不是一个陌生的名词,它的出现是近代计算机技术的里程碑事件。

单片机作为最为典型的嵌入式系统,它的成功应用推动了嵌入式系统的发展。

单片机已成为电子系统的中最普遍的应用。

单片机作为微型计算机的一个重要分支,其应用范围很广,发展也很快,它已成为在现代电子技术、计算机应用、网络、通信、自动控制与计量测试、数据采集与信号处理等技术中日益普及的一项新兴技术,应用范围十分广泛。

其中以AT89S52为内核的单片机系列目前在世界上生产量最大,派生产品最多,基本可以满足大多数用户的需要。

2 系统总体设计2.1测频的原理测频的原理归结成一句话,就是“在单位时间内对被测信号进行计数”。

被测信号,通过输入通道的放大器放大后,进入整形器加以整形变为矩形波,并送入主门的输入端。

由晶体振荡器产生的基频,按十进制分频得出的分频脉冲,经过基选通门去触发主控电路,再通过主控电路以适当的编码逻辑便得到相应的控制指令,用以控制主门电路选通被测信号所产生的矩形波,至十进制计数电路进行直接计数和显示。

数字频率计(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单片机频率计程序

#include <REG52.H>#define uchar unsigned char#define uint unsigned int#define ulong unsigned longuchar led_code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管段选码,0~9uchar led_bit[]={0x01,0x02,0x04,0x08,0x10,0x20};//数码管位选码,分别对应1~6uint over_count=0,cap_count=0;//分别定义T2溢出次数、T2捕捉数ulong sig_t=0;//被测信号周期,单位为usvoid timer2isr(void)interrupt 5 using 2//T2中断子程序,测量输入脉冲宽度{if(EXF2==1){EXF2=0;//清中断标志cap_count++;//捕捉次数加1if(cap_count==1)//第一次捕捉到负脉冲时将下述变量清0,为第2次捕捉作准备{TH2=0;TL2=0;RCAP2H=0;RCAP2L=0;over_count=0;return;}sig_t=RCAP2H*256+RCAP2L+over_count*65536+30;//第2次捕捉到脉冲下降沿时计算出该信号的周期,30为误差TH2=0;//将相关寄存器和变量清0TL2=0;RCAP2H=0;RCAP2L=0;over_count=0;cap_count=0;}else{over_count++;TF2=0;//T2溢处次数加1,溢出标志位清零}}void display(ulong tempdata)//用数码管动态显示一个6位整数{uchar led_data[6];uchar i;uint k;for(i=0;i<6;i++)//将6位整数中的每一位分离出来{led_data[5-i]=tempdata%10;tempdata =tempdata/10;}for(i=0;i<6;i++)//将上述分离出来的每位整数显示出来{P2=0;P0=led_code[led_data[i]];//输出段码P2=led_bit[i];//位选数码管for(k=0;k<1000;k++);///每位数码管之间的延时}}void main(void){TH2=0;TL2=0;RCAP2H=0x00;RCAP2L=0x00;//以置初值T2CON=0x0D;//设置T2工作方式,EXEN2=1,TR2=1,C/T2=0,CP/_RL2=1 EA=1;//全部中断允许ET2=1;//T2中断开while(1){display(sig_t);//显示脉冲周期}}。

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显示的秒,就可以准确判断频率计的异步时钟是否准确。

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

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

基于51单片机数字频率计的设计在电子技术领域中,频率计是一种常见的测试仪器,它可以用来测量信号的频率。

在本文中,我们将通过介绍基于51单片机数字频率计的设计实现来了解它的工作原理和设计流程。

1. 确定设计需求在进行任何项目之前,我们需要明确自己的设计需求。

对于频率计而言,它的主要需求就是准确地测量信号的频率。

因此,我们需要确定我们需要测量的频率范围和精确度。

2. 确定硬件设计在确定了设计需求之后,我们需要确定硬件设计。

对于数字频率计而言,它需要一个计数器来计算信号的脉冲数量。

在本设计中,我们采用74LS90计数器芯片来实现计数功能。

我们还需要一个51单片机来读取计数器的计数值,并将其转换为对应的频率值。

另外,我们还需要硬件板、LCD显示屏、按键等元件来搭建数字频率计的电路结构。

3. 确定软件设计硬件设计完成后,我们需要开发相应的软件来实现我们的需求。

在本设计中,我们使用KEIL C51软件来编写51单片机的程序。

编写软件的主要步骤是读取计数器计数值、计算出对应的频率值、将频率值显示在LCD屏幕上,并实现按键控制。

我们需要将这些步骤按照程序流程依次实现。

4. 进行测试在软件编写完成后,我们需要对数字频率计进行测试,以确保其满足我们的需求。

我们可以使用信号发生器给数字频率计输入不同频率的信号,然后观察LCD屏幕上显示出来的相应频率值是否准确。

如果测试结果不满足我们的需求,则需要对硬件或软件进行优化或调试,直到数字频率计能够正常工作为止。

总之,基于51单片机的数字频率计设计是一个较为简单的电子设计项目。

通过上述步骤的详细介绍,我们了解了数字频率计的设计流程和工作原理,并明确了设计中需要注意的细节和注意事项。

希望能够对大家理解数字频率计的设计过程有所帮助。

51单片机数字频率计设计

51单片机数字频率计设计

摘要摘要数字频率计是一种基本的测量仪器。

它被广泛应用于航天、电子、测控等领域,还被应用在计算机及各种数学仪表中。

一般采用的是十进制数字,显示被测信号频率。

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

由于其使用十进制数显示,测量迅速精确,显示直观,所以经常被用来使用。

本文主要介绍数字频率计的设计和调试,本作品是基于STC89C52单片机作为平台,基本原理是通过STC89C52单片机进行频率的采集和分析工作,在通过程序使其显示在LCD1602的液晶显示屏上,通过液晶显示屏,让使用者能够直观的看到当前的输入频率是多少。

由于STC89C52单片机只能处理数字信号因此系统需要先把信号放大成方波信号,再通过施密特触发器整形方波,又由于单片机能处理的频率有限,所以这次我们先用74HC390芯片对输入的信号进行了分频,使其降低了100倍,才送去给单片机处理,如果频率高于200KHZ的时候就计算分频后的频率,得到数据再换算成真实的频率。

关键字:单片机,LCD显示屏,分频器ABSTRACTABSTRACTDigital frequency meter is a basic measuring instruments. It is widely used in aerospace, electronics, measurement and control, etc., it is also used in computer and mathematical instrument. Generally using a decimal number, it displays the signal frequency. The basic function is to measure sinusoidal signal, square-wave signal, and various other units within the time deterioration of physical quantities. Due to the use of decimal display, rapid measurement precision, intuitive display, it is often used to use.This paper describes a digital frequency meter design and debugging, the present work is based STC89C52 microcontroller as a platform, the basic principle is the collection and analysis of the operating frequency through STC89C52 microcontroller, through the program to display on the LCD1602 LCD screen, the LCD display, allowing users to visually see the current input frequency is.Since only single-chip digital signal processing STC89C52 so the system need to put a square wave signal is amplified signal, and then through the Schmitt trigger shaping a square wave, but also due to the limited frequency microcontroll er can handle, so this time we will start with 74HC390 chip input The signal is a frequency, it reduces by 100 times, was sent to the microcontroller processing frequency if the frequency is higher than the frequency after 200KHZ when it calculated to obtain the data and then converted into real frequency.Keywords:microcontroller, LCD display, divider.目录第1章整体框架 (1)1.1课题任务 (1)1.2课题要求 (1)1.3研究意义 (1)第2章设计方案 (3)2.1硬件部分 (3)2.1.1主控模块 (3)2.1.2 LCD液晶显示器模块 (7)2.1.3主控模块的选型和论证 (9)2.1.4显示模块的选型和论证 (9)2.1.5放大电路的选型和论证 (10)2.2软件部分 (10)2.2.1软件工具介绍 (10)2.2.2模块流程图 (11)第3章实现功能 (13)3.1实现功能描述 (13)3.2电路设计 (13)3.2.1主控模块 (14)3.2.2 LCD液晶显示器 (14)3.2.3三极管放大电路设计 (15)3.2.4整形模块设计 (16)3.2.5分频模块设计 (17)3.3软件设计 (19)3.3.2系统软件总体设计 (20)第4章调试与实现 (22)4.1调试中遇到的重点与难点 (22)4.1.1硬件调试 (22)4.1.2软件调试 (22)4.2解决方案 (22)4.3实现展示(附上仿真图或实物照片) (23)第5章总结 (25)参考文献 (26)致谢 (27)附录 (28)第1章整体框架第1章整体框架1.1课题任务本系统设计制作一个基于单片机的频率计。

基于51单片机的频率计程序

基于51单片机的频率计程序

基于51单片机的频率计程序这个是电路原理图*************************************************************入门级频率计设计*********************************精度低,希望各位初学者在此基础上修改为精度更高的程序*************本程序使用了,动态扫描,中断定时/计数等资源,电路图如上设计者:liujy 日期:2010/03/25*******************************/#include reg52.h#define uchar unsigned charsbit w1=P2;sbit w2=P2;sb it w3=P2 ;sbit w4=P2;//位控sbitw5=P2;sb it w6=P2 ;sbit s=P3;//启动键bit flag;//标签uchar ss,sg,fs,fg,ms,mg, shu=1;//显示位变量,由数字钟变来uchar t0,t1,t2,a;unsigned long num,x,y;unsigned char code table1[]={0xc0,0xf9,0xa4,0xb0, //0-f 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e};void delay(int z)//延时子程序{ int h,t; for(h=z;h0;h--) for(t=110;t0;t--);}void iint()//初始化函数{flag=0;TMOD=0x15;//t1 为定时器,t0 为计数器模式TH1=(65536-4000)/256;//设初值TL1=(65536-4000)%256;TH0=0;TL0=0; EA=1; //开总中断ET0=1;//开中断允许ET1=1;//开中断允许TR1=1;//开中断控制TR0=1;//开中断控制}voidmain(){loop: if(s==0)//按键启动{ while(s!=0);//等按键松手a++;//功能变量}if(a==1){ iint(); //while(1) // {while(1) { if(t1==250) { t1=0; EA=0;//关中断TR0=0;//开中断控制,可省flag=1;//标签标志置位} y=TH0*256+TL0;//赋值部分x=t0*65536; num=x+y;ss=num/100000; num=num%100000;//赋值部分sg=num/10000; num=num%10000; fs=num/1000; num=num%1000; fg=num/100;//赋值部分num=num%100;。

数字频率计(51单片机)

数字频率计(51单片机)

数字频率计(51单片机)数字频率计(51单片机)数字频率计(Digital Frequency Counter)是一种常用的电子测量仪器,可用于测量信号的频率。

在本文中,我们将介绍如何使用51单片机实现一个简单的数字频率计。

一、原理简介数字频率计的基本原理是通过计算信号波形周期内的脉冲数来确定频率。

在实际应用中,我们通常使用51单片机作为微控制器,通过计数器和定时器模块来实现频率计算。

二、硬件设计1.信号输入首先,我们需要将待测信号输入到频率计中。

可以使用一个输入接口电路,将信号连接到51单片机的IO口上。

2.计时模块我们需要使用51单片机的定时器/计数器来进行计时操作。

在这里,我们选择使用定时器0来进行计数,同时可以利用定时器1来进行溢出次数的计数,以扩展计数范围。

3.显示模块为了显示测量结果,我们可以使用数码管、LCD液晶显示屏等显示模块。

通过将结果以可视化的方式呈现,方便用户进行观察和读数。

三、软件设计1.定时器配置首先,我们需要对定时器进行配置,以确定计时器的计数间隔。

通过设置定时器的工作模式、计数范围和时钟频率等参数,可以控制定时器的计数精度和溢出时间。

2.中断服务程序当定时器溢出时,会触发中断,通过编写中断服务程序,实现对计数器的相应操作,例如将计数值累加,记录溢出次数等。

3.数字频率计算根据计数器的值和溢出次数,我们可以计算出信号的频率。

通过简单的公式计算,即可得到测量结果。

四、实验步骤1.搭建硬件电路,将待测信号连接到51单片机的IO口上,并连接显示模块。

2.根据硬件设计要求,配置定时器的工作模式和计数范围。

3.编写中断服务程序,实现对计数器的相应操作。

4.编写主程序,实现数字频率计算和显示。

5.下载程序到51单片机,进行测试。

五、实验结果与分析通过实验,我们可以得到信号的频率测量结果,并将结果以数码管或LCD屏幕的形式进行显示。

通过对比实际频率和测量频率,可以评估数字频率计的准确性和稳定性。

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

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

1前言频率测量是电子学测量中最为基本的测量之一。

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

随着数字电子技术的发展,频率测量成为一项越来越普遍的工作,测频原理和测频方法的研究正受到越来越多的关注。

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

它2测频的原理归结成一句话,就是“在单位时间内对被测信号进行计数”。

被测信号,通过输入通道的放大器放大后,进入整形器加以整形变为矩形波,并送入主门的输入端。

由晶体振荡器产生的基频,按十进制分频得出的分频脉冲,经过基选通门去触发主控电路,再通过主控电路以适当的编码逻辑便得到相应的控制指令,用以控制主门电路选通被测信号所产生的矩形波,至十进制计数电路进行直接计数和显示。

若在一定的时间间隔T内累计周期性的重复变化次数N,则频率的表达式为式:频率计数器严格地按照Nf=T公式进行测频。

由于数字测量的离散性,被测频率在计数器中所记进的脉冲数可有正一个或负一个脉冲的1量化误差,在不计其他误差影响的情况下,测量精度将为:应当指出,测量频率时所产生的误差是由N和T俩个参数所决定的,一方面是单位时间内计数脉冲个数越多时,精度越高,另一方面T越稳定时,精度越高。

为了增加单位时间内计数脉冲的个数,一方面可在输入端将被测信号倍频,另一方面可增加T来满足,为及分频电路提供电源,电压要求稳定、噪声小及性价高的电源。

3、放大整形模块:放大电路是对待测信号的放大,降低对待测信号幅度的要求。

整形电路是对一些不是方波的待测信号转化成方波信号,便于测量。

4、分频模块:考虑单片机外部计数,使用12MHz时钟时,最大计数速率为500kHz,因此需要外部分频。

分频电路用于扩展单片机频率测量范围,并实现单片机频率测量使用统一信号,可使单片机测频更易于实现,而且也降低了系统的测频误差。

5、显示模块:显示电路采用四位共阳极数码管动态显示,为了加大数码管的亮度,使用4个PNP三极管进行驱动,便于观测。

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

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

51单片机设计数字频率计的代码前言本文档将介绍如何使用51单片机设计数字频率计的代码。

数字频率计是一种测量信号频率的仪器,通过测量信号周期的倒数来计算频率。

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

硬件准备*51单片机开发板*串口调试助手*信号源代码实现步骤1.引入头文件首先,在代码开头引入51单片机所需的头文件,包括re g51.h、s t di o.h和se ri al.h。

#i nc lu de<r eg51.h>#i nc lu de<s td io.h>#i nc lu de<s er ia l.h>2.定义全局变量我们需要定义一些全局变量来存储计数器的值和频率值。

u n si gn ed in tc ou nt=0;u n si gn ed lo ng fr equ e nc y=0;3.初始化串口使用串口调试助手来与单片机进行通信,需要在代码中初始化串口模块。

v o id in it_s er ia l(){T M OD&=0x0F;T M OD|=0x20;S C ON=0x50;T H1=0x FD;T L1=TH1;T R1=1;}4.中断服务函数我们需要定义一个中断服务函数来处理定时器溢出中断。

在每次溢出时,计数器将自增,并计算频率值。

v o id in te rr up t_han d le r()i nt er ru pt1{i f(T F0==1){T F0=0;c o un t++;i f(c ou nt>=1000){f r eq ue nc y=(1000/c o un t)*1000;c o un t=0;}}}5.主函数在主函数中,我们需要进行一些初始化操作,包括初始化串口和定时器。

v o id ma in(){i n it_s er ia l();E A=1;T M OD&=0x F0;T M OD|=0x01;T H0=0x FC;T L0=TH0;E T0=1;T R0=1;w h il e(1){p r in tf("当前频率:%lu Hz\n",fr eq ue n cy);}}6.编译和下载代码将代码编译生成h ex文件,并下载到51单片机开发板中。

基于单片机c51频率计设计程序

基于单片机c51频率计设计程序

#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid display10(uchar m, uchar n, uchar *p);//汉字显示函数void lcd_int(void);//液晶初始化函数void lcd_set(void);//LCD功能设置函数void write(uchar command);//LCD写指令函数void read(uchar data0);//LCD写数据函数void lcd_clear(void);//LCD清屏函数void maikuan(void);//脉宽计算函数void ini(void);//定时器中断系统初始化函数void t0(void);//定时器0中断服务函数void delay(uint m);//延时函数uchar keyscan(void);//键扫函数void display(void);//频率显示函数void display1(void);//正脉宽计算显示函数void display2(void);//负脉宽计算显示函数void cemaikuan(void);//测脉宽函数void cepinlv(void);//测频率函数void cezhouqi(void);//测周期函数void zhankongbi(void);//测占空比函数void zhouqi(void);//周期计算显示函数void bi(void);//占空比计算显示函数void pinlv(void);//测频率函数(以f=1/T计算法获得)uchar measure() ;//测频率函数/********************LCD控制信号定义********************/sbit AA=P3^5; // 外部被测信号输入口sbit rs = P2^0;sbit rw = P2^1;sbit en = P2^2;sbit psb = P2^3;sbit ret = P2^5; //可以不用接uchar a; //a计数溢出次数uchar command;unsigned long b,z,j,h,hz,rate,count;uchar code yejingtable[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x39};//0--9void main(void){lcd_int();lcd_set();lcd_clear();ini();while(1){uchar A;A=keyscan();switch(A){case 0x88:TR0=0;TR1=0;ET0=1;lcd_clear();cemaikuan(); //测脉宽break;case 0x84:TR0=0;TR1=0;ET0=1;lcd_clear();zhankongbi(); //测占空比break;case 0x82:TR0=0;TR1=0;ET0=1;lcd_clear();cezhouqi(); //测周期break;case 0x81:TR0=0;TR1=0;lcd_clear();cepinlv(); //利用周期测频,适合测低频break;case 0x11: TR0=1;TR1=1;lcd_clear();delay(60000);display(); //计数器测频,适合测高频}}}/***********************测脉宽函数******************/void cemaikuan(void){display10(1,3,"测脉宽");display10(3,1,"正脉宽");display10(2,1,"负脉宽");while(AA);while(!AA);TR0=1;while(AA);TR0=0;delay(10000);display1();z=b;a=0;b=0;TH0=0;TL0=0;while(!AA);while(AA);TR0=1;while(!AA);TR0=0;delay(10000);display2();h=b;b=0;a=0;TH0=0;TL0=0;}/******************************正脉宽计算显示函数***************************/ void display1(void){uchar m1,m2,n1,n2,z1,z2;maikuan();m1=b/100000;n1=b/10000%10;m2=b/1000%10;n2=b/100%10;z1=b/10%10;z2=b%10;write(0x8c);read(yejingtable[m1]);read(yejingtable[n1]);read(yejingtable[m2]);read(yejingtable[n2]);read(yejingtable[z1]);read(yejingtable[z2]);read(0x75);read(0x73);}/******************************负脉宽计算显示函数***************************/ void display2(void){uchar m1,m2,n1,n2,z1,z2;maikuan();m1=b/100000;n1=b/10000%10;m2=b/1000%10;n2=b/100%10;z1=b/10%10;z2=b%10;write(0x94);read(yejingtable[m1]);read(yejingtable[n1]);read(yejingtable[m2]);read(yejingtable[n2]);read(yejingtable[z1]);read(yejingtable[z2]);read(0x75);read(0x73);}/******************************测占空比函数***************************/ void zhankongbi(void){display10(1,3,"测占空比");display10(3,1,"正占空比:");display10(2,1,"负占空比:");while(AA);while(!AA);TR0=1;while(AA);TR0=0;delay(10000);maikuan();z=b;a=0;b=0;TH0=0;TL0=0;while(!AA);while(AA);TR0=1;while(!AA);TR0=0;delay(10000);maikuan();h=b;b=0;a=0;TH0=0;TL0=0;bi();}/******************************占空比计算显示函数***************************/ void bi(void){float x,y,q;uint m1,m2;uchar n1,n2,n3,z1,z2,z3;j=z+h;q=j/1.0;x=z/q;y=h/q;m1=x*1000;m2=y*1000;n3=m1/100;n2=m1/10%10;n1=m1%10;z3=m2/100;z2=m2/10%10;z1=m2%10;write(0x8c);read(yejingtable[n3]);read(yejingtable[n2]);read(0x2e);read(yejingtable[n1]);read(0x25);write(0x94);read(yejingtable[z3]);read(yejingtable[z2]);read(0x2e);read(yejingtable[z1]);read(0x25);}/***************************测周期函数**********************/void cezhouqi(void){display10(1,3,"测周期");while(AA);while(!AA);TR0=1;while(AA);TR0=0;delay(10000);maikuan();z=b;a=0;b=0;TH0=0;TL0=0;while(!AA);while(AA);TR0=1;while(!AA);TR0=0;delay(10000);maikuan();h=b;b=0;a=0;TH0=0;TL0=0;zhouqi();}/******************************周期计算显示函数***************************/ void zhouqi(void){uchar m1,m2,n1,n2,z1,z2;j=z+h;m1=j/100000;n1=j/10000%10;m2=j/1000%10;n2=j/100%10;z1=j/10%10;z2=j%10;write(0x90);read(yejingtable[m1]);read(yejingtable[n1]);read(yejingtable[m2]);read(yejingtable[n2]);read(yejingtable[z1]);read(yejingtable[z2]);read(0x75);read(0x73);}/********************测频率函数*****************/void cepinlv(void){display10(1,3,"测频率");while(AA);while(!AA);TR0=1;while(AA);TR0=0;delay(10000);maikuan();z=b;a=0;b=0;TH0=0;TL0=0;while(!AA);while(AA);TR0=1;while(!AA);TR0=0;delay(10000);maikuan();h=b;b=0;a=0;TH0=0;TL0=0;pinlv();}/******************************频率计算显示函数***************************/ void pinlv(void){uchar m1,m2,n1,n2,z1,z2;j=z+h;hz=1000000/j;m1=hz/100000;n1=hz/10000%10;m2=hz/1000%10;n2=hz/100%10;z1=hz/10%10;z2=hz%10;write(0x90);read(yejingtable[m1]);read(yejingtable[n1]);read(yejingtable[m2]);read(yejingtable[n2]);read(yejingtable[z1]);read(yejingtable[z2+1]);read(0x48);read(0x7a);}/******************键扫函数*********************/uchar keyscan(void){uchar scan,tmp;P1=0xf0; //发全行0扫描码if((P1&0xf0)!=0xf0) //若有键按下{delay(100); // 延时去抖if((P1&0xf0)!=0xf0) //延时再判键是否还按下{scan=0xfe;while((scan&0x10)!=0) //逐行扫描{P1=scan; //输出行扫描码if((P1&0xf0)!=0xf0) //本行有键按下{tmp=(P1&0xf0)|0x0f;return ((~scan)|(~tmp));} //还回键值else scan=(scan<<1)|0x01; //行扫描码左移一位}}}return (0); //无键按下,还回0}/******************延时函数***********************/void delay(uint m){while(--m);}/******************脉宽计算函数*********************/ void maikuan(void){b=a*50000+TH0*250+TL0;}/******************LCD初始化函数*********************/ void lcd_int(void){ret=0;delay(10);ret=1;_nop_();psb=1;_nop_();}/******************LCD功能设置函数******************/ void lcd_set(void){command=0x34;write(command);command=0x30;write(command);command=0x01;write(command);command=0x06;write(command);command=0x0c;write(command);}/*******************清屏函数*********************/ void lcd_clear(void){command=0x01;write(command);command=0x34;write(command);command=0x30;write(command);}/*****************写指令函数********************/void write(uchar command){delay(100);rs=0;rw=0;P0=command;en=1;_nop_();_nop_();en=0;}/*****************写数据函数********************/void read(uchar data0){delay(100);rs=1;rw=0;P0=data0;en=1;_nop_();_nop_();en=0;}/*****************汉字显示函数******************/void display10(uchar m, uchar n, uchar *p){ //m表示行n表示列都为首地址switch (m){case 1:write(0x7f+n); break; //液晶第一行case 2:write(0x8f+n); break; //0x90+(x-1)case 3:write(0x87+n); break;case 4:write(0x97+n); break;default:break;}while(*p)read(*p++);}/*************************定时器中断系统初始化函数**********************/void ini(void){TMOD=0X51; //设置定时器0定时50ms,定时器1计数;TH0=(65536-50000)/256; //定时时间为50msTL0=(65536-50000)%256;TH1=0X00; // 计数TL1=0X00; //TR1=0; //开定时器1计数TR0=0; //开定时器0定时ET0=1; //开定时器0中断EA=1; //开总中断}/********************定时器0中断服务函数***********************/ void t0(void) interrupt 1 using 2{TH0=(65536-50000)/256; //定时时间为50msTL0=(65536-50000)%256;a++;measure();}/*********************** 频率显示函数*******************/void display(void){uchar m1,m2,n1,n2,z1,z2;m1=rate/100000;n1=rate/10000%10;m2=rate/1000%10;n2=rate/100%10;z1=rate/10%10;z2=rate%10;display10(1,3,"测频率");write(0x88); //显示首地址read(yejingtable[m1]);read(yejingtable[n1]);read(yejingtable[m2]);read(yejingtable[n2]);read(yejingtable[z1]);read(yejingtable[z2]);read(0x48); //Hread(0x5a); //z}/********************测频函数*******************/ uchar measure(){{TR0=0;TR1=0;count=TH1*256+TL1; //读出定时器一的计数rate=count*20;TH1=0X00; // 计数TL1=0X00;}TR0=1;TR1=1;return(rate);}。

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

单片机C51数字频率计程序[日期:2008-07-29 ] [来源:东哥单片机学习网 作者:佚名] [字体:大中小] (投递新闻)单片机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;}case 1:{ 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)break;}EN=0;}void LcdWd(uchar c) //写字符子程序{ WaitIdle();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决定for(;j>0;j--){ for(i=0;i<124;i++){;}}}//主函数:/*==================================================================== ==============公司名称:河海大学电气工程学院*模块名:A T89C52单片机系统,全国电子设计大赛*创建人:南东亮日期:2007。

7。

28 * 修改人:*功能描述:利用A T89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。

要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±hz程序设计内容:1)定时/计数器T0和T1的工作方式设置,由图可知,T0是工作在计数状态下,对输入的频率信号进行计数,当T/C工作在定时器时,计数脉冲来自外部脉冲输入管脚T0(P3。

4)或T1(P3。

5),当T0或T1产生负跳变时计数器加1。

识别管脚的负跳变需要两个机器周期,即24个振荡周期。

所以,以T0或T1脚输入的可计数外部脉冲的最高频率为1/24Fosc。

但对工作在计数状态下的T0,最大计数值为fOSC/24,由于fOSC=12MHz 因此:T0的最大计数频率为500KHz?高于此频率将出错。

对于频率的概念就是在一秒只数脉冲的个数,即为频率值所以T1工作在定时状态下,每定时1秒钟到,就停止T0的计数,而从T0的计数单元中读取计数的数值,然后进行数据处理。

送到数码管显示出来。

2)T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,共定时20次,即可完成1秒的定时功能。

*//;*其他说明:产品为设计阶段**///;==================================================================== ==============//;主程序开始//;==================================================================== ==============#include "plj.h"unsigned char code table1[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//0123456789//unsigned char code table2[]={0x41,0x42,0x43,0x44,0x45,0x46};//abcdefuchar *s=" CYMOMETER ";uchar *s1="FREQ: Hz ";uchar T0count; //从T0的计数单元中读取计数的数值uchar timecount; //bit flag; //标志位unsigned long x;uchar xPos,yPos;uchar i;void main(void){RstLcd(); //初始化LCDClrLcd(); //清屏SetCur(1); //开光标显示、闪烁WriteString(s,0,0);WriteString(s1,0,1);TMOD=0x15; //T0工作为16位计数器(方式1),T1工作方式为16位定时器TH0=0; //计数为65536TL0=0; //TH1=(65536-4000)/256; //定时器采用定时4ms. 初值为4000TL1=(65536-4000)%256;TR1=1; //TR1=1,控制开关闭合,计数脉冲进入T1计数器,启动定时TR0=1; //TR0=1,控制开关闭合,计数脉冲进入T1计数器,启动计数ET0=1; //定时器0开中断ET1=1; //定时器1开中断EA=1; //CPU开中断while(1){if(flag==1) //{flag=0; //清标志位x=T0count*65536+TH0*256+TL0; //取得时间宽度参数//LCD显示部分代码// ;================================================================= =================LcdPos(15,1);WriteChar(table1[x%10],11,1);WriteChar(table1[(x/10)%10],10,1);WriteChar(table1[(x/100)%10],9,1);WriteChar(table1[(x/1000)%10],8,1);WriteChar(table1[(x/10000)%10],7,1);WriteChar(table1[(x/100000)%10],6,1);//;==================================================================== ==============timecount=0;T0count=0;TH0=0;TL0=0;TR0=1; //TR0=1,控制开关闭合,计数脉冲进入T1计数器,启动计数}}}//;==================================================================== ==============void t0() interrupt 1 using 0 //T0中断服务{T0count++; //对P3。

相关文档
最新文档