电子频率计报告详解

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

数字频率计
一丶设计基本要求:
(1)能够测试外部输入频率10~2000HZ范围的方波信号
(2)将测试的数据在显示终端上进行显示
(3)可以设定检测频率值,当输入的频率符合设定值可以出现声光提示
(4)要求精度在0.2HZ
二、方案设计与论证
方案一:本方案主要以单片机为核心,利用单片机的计数定时功能来实现频率的技术并且利用单片机的动态扫描法把测出的数据送到数字显示电路显示。

其原理框图如图1.1所示:
图1.1 原理框图
根据所要实现的功能,先在Proteus软件上仿真。

根据所选用的硬件可以将整个软件设计分为若干子程序,有初始化、查询时间、发送指令、读取数据、显示温度等构成,可将以上子程序分别设计,实现各自的功能,再在子程序中调用,就可以实现预期的目标。

在Proteus软件里画出相应的电路图,将编写好的程序的编译后的文件下载到Proteus电路图的单片机里,进行仿真,对频率计设置不同的参数,看是否达到了我们设计所要求的目标,如果不符合要求,需要检查程序算法和硬件连接是否有误。

若仿真成功,就按照电路图焊接硬件。

方案二:本方案主要以数字器件为核心,主要分为时基电路,逻辑控制电路,
放大整形电路,闸门电路,计数电路,锁存电路,译码显示电路七大部分。

其原理框图如图2.2所示:
图2.2 方案二原理框图
方案的论证:
方案一:本方案主要以单片机为核心,利用单片机的计数器和定时器的功能对被测信号进行计数。

编写相应的程序可以使单片机自动调节测量的量程,并把测出的频率数据送到显示电路显示。

方案二:本方案使用大量的数字器件,被测信号经放大整形电路编程计数器所要求的脉冲信号,其高电平持续时间1s,当1s信号来到时,闸门开通,被测脉冲信号通过闸门,计数器开始计数,直到1s信号结束闸门关闭,停止计数。

若在闸门时间1s内计数器件的脉冲个数为N。

则被测信号频率Fx=NHz。

逻辑控制电路的作用有两个:一是产生脉冲,是显示器上的数字稳定:二十产生轻灵脉冲,是计数器每次测量从零开始技术。

方案的选择:比较以上两种方案可以知道,方案一的核心是单片机,使用的元器件少,原理电路简单,调试简单只要改变程序的设定值则可以实现不同频率范
围的测试能自动选择测试的量程。

与方案一相比较方案二则使用了大量的数字元器件,原理电路复杂,硬件调试麻烦。

如要测量高频的信号还需要加上分频电路,价格相对高了点。

基于上述比较,所以选择了方案一。

三、硬件电路设计
图3.1频率计原理图
1丶具体连接方法如下:
XTAL1与XTAL2管脚接两个33UF电容和12M的晶振构成时钟电路。

RET管脚10UF的电解电容和复位开关丶1K欧的电阻构成人工复位。

INTO用来接输入频率。

P1.4丶P1.5丶P1.6用来接三个开关分别用来选模式和加减频率。

WR和RD用来接喇叭和电灯当输入频率符合设定值时可以出现声光提示。

P0端口用于连接1602显示屏。

2丶元件参数如下:
C1=C2=30UF,R4=1K欧,一个8路排阻,阻值为1K欧。

一个10K的滑动电阻,晶振为12M的晶振。

3丶各模块电路的实现及其功能:
(1)单片机系统模块
单片机,又称微控制器,是在一块硅片上集成了各种部件的微型计算机。

这些部件包括中央处理器CPU,数据存储器RAM,程序存储器ROM,定时器/计数器和多种I/O接口电路。

其结构特点:
A丶8位CPU;
B丶片内振荡器及时钟电路;
C丶32根I\O线;
D丶外部存储器ROM和RAM寻址范围各64KB;
E丶2个16位的定时器/计数器
F丶5个中断源,2个中断优先级;
G丶全双工串行口;
H丶布尔处理器;
STC89C52RC单片机的工作模式:
①掉电模式:典型功耗<0.1uA,可由外部中断唤醒,中断返回后,继续执行原程序。

②空闲模式:典型功耗2MA。

③正常工作模式:典型功耗4mA~7mA。

④掉电模式可由外部中断唤醒,适用于水表丶气表等电池供电系统及便携系统
主电源引脚Vcc和Vss Vcc(40脚):接+5V电压; Vss(20脚):接地。

RST:复位输入。

当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。

WDT 溢出将使该引脚输出高电平,设置SFR AUXR的DISRT0 位(地址8EH)可打开或关闭该功能。

DISRT0位缺省为RESET输出高电平打开状态。

ALE /PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。

即使不访问外部存储器,ALE 仍以时钟振荡频率的1/6 输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。

要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。

对F1ash存储器程期间,该引脚还用于输入编程脉冲(PROG)。

如有必要,可通过对特殊功能寄存器(SFR)区中的8EH 单元的D0 位置位,可禁止ALE 操作。

该位置位后,只有一条M0VX和M0VC指令ALE才会被激活。

此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效。

PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S51 由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。

当访问外部数据存储器,没有两次有效的PSEN信号。

EA/VPP:外部访问允许。

欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。

需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。

如EA 端为高电平(接VCC端),CPU则执行内部程序存储器中的指令。

F1ash存储器编程时,该引脚加上+12V的编程电压vpp。

P0口:P0口是一组8位漏极开路型双向I/0口,也即地址/数据总线复用口。

作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“l”可作为高阻抗输入端用。

在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。

在F1ash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。

P1口:是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。

对端口写“l”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。

作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。

Flash编程和程序校验期间,
可驱动(吸收或输出电流)4 个TTL逻辑门电路。

对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。

P3 口:P3 口是一组带有内部上拉电阻的8 位双向I/0 口。

P3 口输出缓冲级可驱动(吸收或输出电流)4 个TTL逻辑门电路。

对P3口写入“l”时,它们被内部上拉电阻拉高并可作为输入端口。

作输入端时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。

P3口除了作为一般的I/0口线外,更重要的用途是它的第二功能,如下表所示:P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。

单片机的最小系统有:处理器丶复位电路丶时钟电路丶调试接口丶存储器
1602字符显示频:
1602字符型LCD通常有14条引脚或16条引脚的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字丶英文字母的大小写丶常用的符号丶日文等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

图3.31602显示屏
四、软件设计
本次程序设计采用的是C语言程序设计。

系统软件设计采用模块化设计方法。

整个系统由初始化模块,信号频率测量,自动量程转换丶按键模块和显示等模块组成。

4.1.1主程序流程图设计
根据本次设计要求,主程序主要包括单片机和LCD1602初始化,频率计测量,量程自动转换以及显示几个方面,用单片机驱动显示器LCD1602,使其显示两行文字第一行显示Current Squ,第二行显示输入频率。

要让液晶显示字符,首先要对其控制器进行初始化设置,还必须对有丶无光标丶光标的移动方向丶光标是否闪烁及字符移动的方向等进行设置,才能获得所需要的显示效果。

对LCD1602的初始化丶读丶写丶光标设置丶显示数据的指针设置等。

主程序流程图如下:
4.1.2子程序流程图设计
(1)显示程序
LCD显示程序设计流程图如下图所示:
(2)中断服务流程图:频率测量程序框图
(3)中断服务流程图
这是按键部分的流程图,按键有三个,第一个按键可以通过设置键模式选择可以选择Current Frequ和Set Frequ显示方式。

第二个按键加Set Frequ的值最多按2000次。

第三个按键减Set Frequ的值最多按2000次。

当显示的值超过2000HZ时只显示2000HZ或低于10HZ时只显示10HZ,显示部分精确到小数点一位。

当Set Frequ的值与输入的值一致时喇叭和提示灯将显示和叫。

五、仿真过程与仿真结果
本设计是在Proteus环境下进行仿真的,仿真所用到的器件有:单片机AT89C52,蜂鸣器,液晶显示器,一些电阻,电容等。

本设计在仿真的条件下可以正确的显示频率,并在输入频率和显示频率一致时,蜂鸣器将发出滴滴的警告声,显示灯亮。

且本设计频率计显示可以精确到0.1满足设计要求。

仿真时频率计显示如下图所示。

六、安装与调试
频率计的系统调试包括硬件调试丶软件调试以及系统软硬件联合调试。

硬件调试包括显示模块丶按键丶显示灯等模块,软件调试就是通过修改程序,使频率计功能完善,提高频率计的测量精度。

使用软件仿真,调试仿真结果,同时使用数字万用表和示波器测试输出电压值和输出波形,调试出正确的软硬件电路。

Proteus仿真成功后,接着就是制作硬件板,在试验电路安装完毕后,不要急于通电测试,而首先必须做好以下调试前的检查工作。

检查连线情况,经常遇到有接错丶少接或是多接等连线错误。

检查连线可以直接对照电路原理进行,但是如果电路中布线较多,则可以以元件为中心,依次检查其引脚的有关连线,这样不仅可以检查出错接或是少接,而且也较容易发现多余的线。

为了确保连线的可靠,在查线的同时,还可以用万用表电阻档对接线作连通检查,而且最好在器件外引线出测量,这样有可能查出某些“虚焊”的隐患。

在通电前,还需要用万用表检查电源输入端与地之间是否存在短路,若有则需要进一步检查其原理。

在完成了以上各项检查并确认无误后,才可以通电测试,但此时应注意电源的正丶负极不能接反。

(1)LCD显示调试
做好板子后,检查电路,没有短路或者短路,接着对显示部分进行测试。

给板子输入电源,调节电阻器改变LCD背光亮度,直到亮度适合而且显示正常。

把程序下载到单片机中,送数据到LCD显示,能正常显示程序中设定显示的数据,说明显示电路部分正常工作。

(2)键盘调试
在显示正常的情况下调试键盘,按下设置键,看是否正常进入中断,若能,进入中断后,按下频率/周期丶闸门时间设置键,看是否正常设置。

在调试过程中,按上述进行调试,没什么问题,键盘正常工作。

制版不太成功,没有显示。

在开发板上可有效实现
七丶结论与心得
为期一周的单片机课程设计已经结束了,从成果上看似乎是做出来了,其实不然:刚开始的时候一脸茫然,找不到的方向,在老师的提醒与同学的帮助下才能入手。

体现出基础知识差劲的一方面;再后来画原理图,制作PCB的时候又出现了一些问题,元器件的不齐,线路的断路导致制出的板不成功的,体现出动手能力不强的方面。

回顾自己的学习经历,感觉今天的生活与状态是由一系列的偶然与必然串联成结果。

这个过程中自己承受了比别人更多的挫折,但也学到了更多的感悟,获得了比别人更多的成就。

虽然很艰辛,但最后在同学的帮助下还是可以成功的在开发板上实现。

经过这次的实训令我提高了对单片机相关软件的应用,以及对PCB板的制作水平。

八丶参考文献
[1]、张毅刚.《单片机原理及应用》.北京:高等教育出版社
[2]、阎石.《数字电子技术基础》.北京:高等教育出版社
[3]、童诗白,华成英.《模拟电子技术基础》.北京:高等教育出版社
#include <REG52.H>
#include <intrins.H>
/* 液晶引脚定义*/
#define LCD_DB P0
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_E=P2^2;
/* 按键引脚定义*/
sbit Key_Mode = P1^5;
sbit Key_Up = P1^6;
sbit Key_Down = P1^7;
/* 报警引脚定义*/
sbit Beep = P3^7;
sbit LedS = P3^6;
/* 变量的定义*/
unsigned char SelecMode=0;
unsigned int Flag_1S=0,CounterFlag=0,CounterShow=0,
SetCounterparame=300;
/* 系统定时器定义*/
void SystemInit(void)
{
TMOD = 0x16; //设置定时器1 计时模式
TH1=(65536-20000)/256; //加载计数器高位数据TL1=(65536-20000)%256; //加载计数器低位数据ET1=1;//允许定时器1 中断触发
TR1=1;//启动定时器1
IT0=1; //下降沿触发
EX0=1;//开启外部中断0 (INT0)EA =1;//开总中断
}
/* 500毫秒延时定义*/
void delay500ms(void)
{
unsigned char a=0,b=0,c=0;
for(c=205;c>0;c--)
for(b=116;b>0;b--)
for(a=9;a>0;a--);
}
/* n*10微妙延时*/
void delay_n10us(unsigned int n)
{
unsigned int i=0;
for(i=n;i>0;i--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/* 写命令函数*/
void LCD_write_command(unsigned char dat)
{
delay_n10us(10);
LCD_RS=0;
LCD_RW=0;
LCD_E=1;
LCD_DB=dat;
delay_n10us(10);
LCD_E=0;
delay_n10us(10);
}
/* 写数据函数*/
void LCD_write_data(unsigned char dat)
{
delay_n10us(10);
LCD_RS=1;
LCD_RW=0;
LCD_E=1;
LCD_DB=dat;
delay_n10us(10);
LCD_E=0;
delay_n10us(10);
}
/* 写字符函数X:0~15 Y:1,2 */
void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat) {
unsigned char address=0;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
LCD_write_data(dat);
}
/* 写一串字符X:0~15 Y:1,2 */
void LCD_disp_str(unsigned char x,unsigned char y,unsigned char *str) {
unsigned char address=0;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
while(*str!='\0')
{
LCD_write_data(*str);
str++;
}
}
/* 液晶初始化*/
void LCD_init(void)
{
delay_n10us(10);
LCD_write_command(0x38);
delay_n10us(10);
LCD_write_command(0x0c);
delay_n10us(10);
LCD_write_command(0x06);
delay_n10us(10);
LCD_write_command(0x01);
delay_n10us(100);
}
/* 硬件初始化*/
void HandInit(void)
{
SystemInit();
LCD_init();
}
/* 按键检测*/
void KeyProcess(void)
{
if(!Key_Mode)
{
Beep=0;
delay500ms();
Beep=1;
while(!Key_Mode);
SelecMode++;
if(SelecMode>1)
SelecMode=0;
}
if(!Key_Up)
{
Beep=0;
delay500ms();
Beep=1;
while(!Key_Up);
if(SelecMode)
{
if(SetCounterparame<20000)
{
SetCounterparame++;
}
}
}
if(!Key_Down)
{
Beep=0;
delay500ms();
Beep=1;
while(!Key_Down);
if(SelecMode)
{
if(SetCounterparame>200)
{
SetCounterparame--;
}
}
}
}
/* 逻辑处理*/
void LogicProcess(void)
{
if(CounterShow==SetCounterparame)
{
Beep = 0;
LedS = 0;
}
else
{
Beep = 1;
LedS = 1;
}
}
/* 数据显示*/
void ShowProcess(void)
{
unsigned char buf[9]={0};
if(SelecMode)
{
LCD_disp_str(0,1," Set Frequ: ");
buf[0]=SetCounterparame/10000+0x30;
buf[1]=SetCounterparame%10000/1000+0x30;
buf[2]=SetCounterparame%1000/100+0x30;
buf[3]=SetCounterparame%100/10+0x30;
buf[4]='.';
buf[5]=SetCounterparame%10+0x30;
buf[6]=' ';
buf[7]='\0';
buf[8]='\0';
}
else
{
LCD_disp_str(0,1," Current Frequ: ");
buf[0]=CounterShow/10000+0x30;
buf[1]=CounterShow%10000/1000+0x30;
buf[2]=CounterShow%1000/100+0x30;
buf[3]=CounterShow%100/10+0x30;
buf[4]='.';
buf[5]=CounterShow%10+0x30;
buf[6]=' ';
buf[7]='\0';
buf[8]='\0';
}
LCD_disp_str(6,2,buf);
}
/* 主函数*/
void main(void)
{
HandInit();
while(1)
{
KeyProcess();
ShowProcess();
LogicProcess();
}
}
/* 外部中断检测*/
void Trig_INT0(void) interrupt 0
{
EX0=0;
CounterFlag++;
EX0=1;
}
/* 定时器中断检测*/
void Time_T1(void) interrupt 3//20ms {
TH1=(65536-20000)/256;
TL1=(65536-20000)%256;
Flag_1S++;
if(Flag_1S>=500) //10s
{
Flag_1S=0;
CounterShow=CounterFlag;
CounterFlag=0;
}
}。

相关文档
最新文档