链接:https://pan.baidu.com/s/1mrGH9CQ-Z5P2BadpBnWroQ
提取码:laje
系统的硬件设计
本频率计的硬件电路主要由时钟信号发生器、频率计控制电路和LCD显示电路组成。频率计的主要核心部件是采用AT89S52的内部定时/计数器来产生定时和记录脉冲变化次数。主要用到的元器件有晶振器件、电阻、74LS04、74LS74、74LS00、AT89S52单片机、LCD1602等。其硬件系统框图如3-2所示:
时钟信号发生器是频率计的频率信号产生电路,它是由一个晶振、两个电阻、一个电容及两个非门74LS04构成的工作于串联谐振状态的TTL门电路振荡器。当电路频率为串联谐振频率时,晶体的等效电抗接近零(发生串联谐振),串联谐振频率信号最容易通过闭环回路,这个频率信号通过两级反相后形成反馈振荡,晶体同时也担任着选频作用,在工作于串联谐振状态的振荡电路,它的频率取决于晶体本身具有的频率参数。也就是说,石英晶体多谐多谐振荡器的振荡频率取决于石英晶体的固有谐振频率,与外接电阻、电容无关。
4.3 LCD1602显示电路
在频率计设计中,显示部分对整个系统来说是非常重要的。整个系统的设计最终结果都要通过显示器来反应出来。本次频率计系统的设计采用的显示器为LCD1602。图4-2为LCD1602的显示电路:
4.3.3 频率计硬件电路整体设计
整个频率计的硬件电路设计主要由包括时钟信号发产生器、LCD1602显示电路、频率计的控制电路这三大部分电路组成。图4-3为频率计的电路原理图:
#include <Reg52.h>
#include <intrins.h>
#include <string.h>
#include <stdio.h>
#include "1602.h"
sbit Key = P3^4;
sbit Beep = P3^7;
unsigned char Flag_1S=0,SelecMode=0;
unsigned int CounterFlag=0,CounterShow=0;
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--);
}
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; //开总中断
}
void HandInit(void)
{
LCD_init();
SystemInit();
}
void main(void)
{
unsigned char ShowBuf[6]={0};
float CycleVal=0,PulseWitVal=0;
HandInit();
while(1)
{
if(!Key)
{
Beep=0;
delay500ms();
Beep=1;
while(!Key);
SelecMode++;
if(SelecMode>2)
SelecMode=0;
}
switch(SelecMode)
{
case 0x00:
LCD_disp_str(0,1," Current frequ: ");
LCD_disp_char(4,2,CounterShow/1000+0x30);
LCD_disp_char(5,2,CounterShow%1000/100+0x30);
LCD_disp_char(6,2,CounterShow%100/10+0x30);
LCD_disp_char(7,2,CounterShow%10+0x30);
LCD_disp_char(8,2,' ');
LCD_disp_char(9,2,'H');
LCD_disp_char(10,2,'z');
LCD_disp_char(11,2,' ');
break;
case 0x01:
LCD_disp_str(0,1," Current Cycle: ");
CycleVal=1000.0/CounterShow;
sprintf (ShowBuf, "%0.2f", CycleVal);
ShowBuf[5]='\0';
LCD_disp_str(4,2,ShowBuf);
LCD_disp_char(9,2,' ');
LCD_disp_char(10,2,'m');
LCD_disp_char(11,2,'s');
break;
case 0x02:
LCD_disp_str(0,1," Current Pusle: ");
CycleVal=500.0/CounterShow;
sprintf (ShowBuf, "%0.2f", CycleVal);
ShowBuf[5]='\0';
LCD_disp_str(4,2,ShowBuf);
LCD_disp_char(9,2,' ');
LCD_disp_char(10,2,'m');
LCD_disp_char(11,2,'s');
break;
default:break;
}
}
}
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>=50) //1s
{
Flag_1S=0;
CounterShow=CounterFlag;
CounterFlag=0;
}
}