频率计的设计报告.docx
- 文档编号:8502068
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:14
- 大小:161.20KB
频率计的设计报告.docx
《频率计的设计报告.docx》由会员分享,可在线阅读,更多相关《频率计的设计报告.docx(14页珍藏版)》请在冰豆网上搜索。
频率计的设计报告
综合设计报告
设计题目:
频率表
1.频率计概述
数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。
它是一种用十进制数字显示被测信号频率的数字测量仪器。
它的基本功能是测量正弦信号、方波信号及其他各种单位时间内变化的物理量。
在进行模拟、数字电路的设计、安装、调试过程中,由于其使用十进制数显示,测量迅速,精确度高,显示直观,经常要用到频率计。
传统的频率计采用测频法测量频率,通常由组合电路和时序电路等大量的硬件电路组成,产品不但体积大,运行速度慢而且测量低频信号不准确。
本次采用单片机技术设计一种数字显示的频率计,测量准确度高,响应速度快,体积小等优点[1]。
2.系统总体方案设计
2.1测频的原理
测频的原理归结成一句话,就是“在单位时间内对被测信号进行计数”。
被测信号,通过输入通道的放大器放大后,进入整形器加以整形变为矩形波,并送入主门的输入端[3]。
由晶体振荡器产生的基频,按十进制分频得出的分频脉冲,经过基选通门去触发主控电路,再通过主控电路以适当的编码逻辑便得到相应的控制指令,用以控制主门电路选通被测信号所产生的矩形波,至十进制计数电路进行直接计数和显示。
若在一定的时间间隔T内累计周期性的重复变化次数N,则频率的表达式为式:
2.2具体模块
根据上述系统分析,频率计系统设计共包括四大模块:
单片机控制模块、外围电路模块、显示模块。
各模块作用如下:
2.2.1单片机控制模块:
以STC12C5A32AD单片机为控制核心,来完成它待测信号的计数,译码,和显示以及对分频比的控制。
利用其内部的定时/计数器完成待测信号周期/频率的测量。
单片机STC12C5A32AD内部具有2个16位定时/计数器,定时/计数器的工作可以由编程来实现定时、计数和产生计数溢出时中断要求的功能。
单片机最小系统如图1:
图1:
单片机最小系统
2.2.2外围电路模块:
整形电路是对一些不是方波的待测信号转化成方波信号,便于测量。
如图2:
图2:
外围电路
2.2.3显示模块:
数据经74LS595送出,显示电路采用四位共阴极数码管动态显示。
如图3(四位数码管)、图4(74LS595):
图3:
四位数码管图4:
74LS595
3.系统硬件电路设计
3.1系统原理框图
本方案主要以单片机为核心,利用单片机的计数定时功能来实现频率的计数并且利用单片机的动态扫描把测出的数据送到数字显示电路显示。
如图5:
四位位数码管
3.2AT89S52的介绍
8位单片机是MSC-51系列产品升级版[5],有世界著名半导体公司ATMEL在购买MSC-51设计结构后,利用自身优势技术——(掉电不丢数据)闪存生产技术对旧技术进行改进和扩展,同时使用新的半导体生产工艺,最终得到成型产品。
与此同时,世界上其他的著名公司也通过基本的51内核,结合公司自身技术进行改进生产,推广一批如51F020等高性能单片机。
AT89S52片内集成256字节程序运行空间、8K字节Flash存储空间,支持最大64K外部存储扩展。
根据不同的运行速度和功耗的要求,时钟频率可以设置在0-33M之间。
片内资源有4组I/O控制端口、3个定时器、8个中断、软件设置低能耗模式、看门狗和断电保护。
可以在4V到5.5V宽电压范围内正常工作。
不断发展的半导体工艺也让该单片机的功耗不断降低。
同时,该单片机支持计算机并口下载,简单的数字芯片就可以制成下载线,仅仅几块钱的价格让该型号单片机畅销10年不衰。
根据不同场合的要求,这款单片机提供了多种封装,本次设计根据最小系统有时需要更换单片机的具体情况,使用双列直插DIP-40的封装。
3.1.1AT89S52引脚
AT89S52引脚如下图6所示:
图6:
AT89S52引脚图
3.2.2复位电路及时钟电路
复位电路和时钟电路是维持单片机最小系统运行的基本模块。
复位电路通常分为两种:
上电复位(图7)和手动复位(图8)。
图7:
上电复位图8:
手动复位
有时系统在运行过程中出现程序跑飞的情况,在程序开发过程中,经常需要手动复位。
所以本次设计选用手动复位。
高频率的时钟有利于程序更快的运行,也有可以实现更高的信号采样率,从而实现更多的功能[6]。
但是告诉对系统要求较高,而且功耗大,运行环境苛刻。
考虑到单片机本身用在控制,并非高速信号采样处理,所以选取合适的频率即可。
合适频率的晶振对于选频信号强度准确度都有好处,本次设计选取12.000M无源晶振接入XTAL1和XTAL2引脚。
并联2个30pF陶瓷电容帮助起振。
单片机最小系统如图1所示。
3.2.3引脚功能
VCC:
电源电压;GND:
地;
P0口:
P0口是一个8位漏极开路的双向I/O口。
作为输出口,每位能驱动8个TTL逻辑电平。
对P0端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。
在这种模式下,P0具有内部上拉电阻。
在flash编程时,P0口用来接收指令字节;在程序校验时,输出指令字节。
程序校验时,需要外部上拉电阻[7]。
P1口:
P1口是一个具有内部上拉电阻的8位双向I/O口,P1输出缓冲器能驱动4个TTL逻辑电平。
对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。
此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入和定时器/计数器2的触发输入,P1口功能具体如表1所示。
在flash编程和校验时,P1口接收低8位地址字节。
表1P1口的第二种功能说明表
引脚号
第二功能
P1.0
T2(定时器/计数器T2的外部计数输入),时钟输出
P1.1
T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)
P1.5
MOSI(在系统编程用)
P1.6
MISO(在系统编程用)
P1.7
SCK(在系统编程用)
P2口:
P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。
对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。
在访问外部程序存储器或用16位地址读取外部数据存储器时,P2口送出高八位地址。
在这种应用中,P2口使用很强的内部上拉发送1。
在使用8位地址访问外部数据存储器时,P2口输出P2锁存器的内容。
在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。
P3口:
P3口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。
对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。
P3口亦作为AT89C51特殊功能(第二功能)使用,P3口功能如表2所示。
在flash编程和校验时,P3口也接收一些控制信号。
表2P3口的第二种功能说明表
引脚号
第二功能
P3.0
RXD(串行输入)
P3.1
TXD(串行输出)
P3.2
(外部中断0)
P3.3
(外部中断1)
P3.4
T0(定时器0外部输入)
P3.5
T1(定时器1外部输入)
P3.6
(外部数据存储器写选通)
P3.7
(外部数据存储器写选通)
RST:
复位输入。
晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。
看门狗计时完成后,RST脚输出96个晶振周期的高电平。
特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。
DISRTO默认状态下,复位高电平有效。
XTAL1:
振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2:
振荡器反相放大器的输出端。
3.2.4单片机引脚分配
根据系统设计及各模块的分析得出,单片机的引脚分配如表3所示。
表3单片机端口分配表
模块
端口
功能
显示模块
P0.0-P0.4、P2.0-P2.7
数码管频率值显示
P1.4-P1.6
LED单位显示
分频模块
P1.0-P1.2
通道选择
P1.3
清零
4.程序流程图与源程序
4.1程序流程图
程序流程图如图9所示:
图9:
程序流程图
4.2主程序
#include
#include
#include
#include
/*************************************************
定义位变量
*************************************************/
sbitSCL=P0^3;//移位;
sbitRCL1=P0^1;//RCL1,RCL2位码锁存时钟;
sbitRCL2=P0^2;
sbitSDATA=P0^0;//数据位;
sbitkey=P1^0;
/************************************************
定义数组
*************************************************/
Unsignedcharcodeled1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xf1,0x38,0x39};//0~9,r,l,c不带小数点;
/************************************************
段位代码宏定义
*************************************************/
#definek000x8000
#definek010x4000
#definek020x2000
#definek030x1000
#definek100x0800
#definek110x0400
#definek120x0200
#definek130x0100
#definek200x0080
#definek210x0040
#definek220x0020
#definek230x0010
unsignedchara[4]={0};
bitint_flag;//定时器01S到标志位
unsignedcharvolatileint_count=0;//定时器0中断次数
unsignedcharvolatileT1count=0;//定时器1中断次数
unsignedlongsum;//1S内脉冲总个数
/************************************************
函数名:
voiddelay()
出口参数:
无
入口参数:
无
功能:
延时函数(100ms)
*************************************************/
voiddelay(void)
{
unsignedintl;
for(l=0;l<500;l++);
}
/************************************************
函数名:
Data_Out(unsignedintn_LED,unsignedcharData_595)
出口参数:
无
入口参数:
n_led,data_595;段码及显示的数据
功能:
发送数据并显示
*************************************************/
voidData_Out(unsignedintn_LED,unsignedcharData_595)
{
unsignedchary;
RCL2=1;//输出锁存时钟,上升有效
RCL1=1;
RCL2=0;//段码清零;
for(y=0;y<8;y++)
{
SCL=0;//数据输入时钟,上升沿有效
SDATA=0;
SCL=1;
}
RCL2=1;
RCL1=0;//发送位选信号;
for(y=0;y<16;y++)
{
SCL=0;
if((n_LED&0x0001)==0x0001){SDATA=1;}
if((n_LED&0x0001)!
=0x0001){SDATA=0;}
n_LED>>=1;
SCL=1;
}
RCL1=1;
RCL2=0;//发送段信号;
for(y=0;y<8;y++)
{
SCL=0;
if((Data_595&0x80)==0x80){SDATA=1;}
if((Data_595&0x80)!
=0x80){SDATA=0;}
Data_595<<=1;
SCL=1;
}
RCL2=1;
delay();//延迟一会;
delay();
delay();
}
/*************数据分离************
函数名:
Data_con()
功能:
将所需结果按单个字符输出
************************************/
voidData_con(floatx)
{
unsignedintresult;
result=x;
a[3]=result%10;//低
a[2]=(result/10)%10;
a[1]=((result/10)/10)%10;
a[0]=(((result/10)/10)/10)%10;
}
/************************************************
函数名:
xianshi1()
出口参数:
无
入口参数:
无
功能:
给出显示的数据位码及段码(频率显示)
*************************************************/
voidxianshi1()//数据显示
{
Data_Out(k10,led1[a[3]]);
Data_Out(k11,led1[a[2]]);
Data_Out(k12,led1[a[1]]);
Data_Out(k13,led1[a[0]]);
}
/************************************************
/********定时器0初始化************
功能:
设定初值
*************************************/
voidinit_t0(void)
{
TMOD=(TMOD&0xF0)||0x01;//定时器0工作于方式1保存高4位,低4位清零,再给低0001
TH0=(65536-50000)/256;//定时50ms
TL0=(65535-50000)%256;
}
/********定时器1初始化********/
voidinit_t1(void)
{
TMOD=(TMOD&0x0F)|0x50;//timer1forcount高四位清零,在给0101计数方式,方式1
TH1=0x00;
TL1=0x00;
}
/************************************************
函数名:
主函数
出口参数:
无
入口参数:
无
功能:
实现主要功能
*************************************************/
voidmain(void)
{EA=1;//开总中断
init_t0();//初始化定时器
init_t1();
TR0=1;//定时器开始工作
TR1=1;
ET0=1;//定时器TO溢出中断允许
ET1=1;//计数器T1溢出中断允许
while
(1)
{
if(int_flag==1)//完成1秒计时,死循环,一只扫描是否完成1秒计时
{
int_flag=0;
sum=TL1+TH1*256;//+T1count*65536;//计算1秒内的脉冲个数
//以下将数据格式化,转成LED可显示的BCD码
Data_con(sum);
int_count=0x00;
T1count=0;
TH1=0x00;//将计数器TO的值清0
TL1=0x00;//将计数器T0的值清0
TR1=1;
}
xianshi1();
}
}
/********定时器0中断服务程序*****
功能:
T0定时开启后,做+1,溢出后中断,
进入该程序,循环20次,即1S定时完成
**************************************/
voidint_t0(void)interrupt1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
int_count++;
if(int_count==20)
{
TR1=0;
int_flag=1;//定时器TO定时结束标志位
int_count=0x00;
}
}
5.设计心得
本次课程设计有较强的综合性,不仅要求设计者能灵活使用单片机,熟练使用单片计计数器和定时器,熟练编写顺序结构程序,循环结构程序以及分支结构程序,还要求对单片机的电路连接结构,对数码管管理芯片有明确清晰的了解与认识,否则在设计的第一步就会遇到障碍。
掌握了C语言的编写程序,学会了使用PROTUTES和KEIL的仿真来实现,同时掌握了如何收集、查阅、应用文献资料,如何根据实际需要有选择的阅读书籍和正确确定系统所要使用的元器件的类型。
而且在精神方面锻炼了思想、磨练了意志。
面对存在的困难首先分析问题根据目的要求确定可实现的部分,定出那不准的方面找同学和老师讨论研究,再完善、再修改、再发现问题、再解决培养了自己的耐心、恒心及遇事不乱的精神。
看着自己亲自通过自己的知识和努力设计的频率计,心里是很欣慰的,因为我从这次课程设计不仅仅只是得到了一个自己的产品,还学到了很多,例如面对问题要保持冷静,特别是在程序的编写这一块,要找出程序的错误一定要有一个冷静的头脑,否则很难发现错误甚至是越改越错。
另外我还认识到与他人合作的重要性,虚心向别人学习,吸取别人编写程序的一些好的风格与特点再融入到自己的程序中,都是一些不错的方法。
在本次综合设计试验中我的很多方面的能力都得到了提高,尤其在单片机软件编程方面让我感触颇深。
最后,感谢在这次课程设计中王党树老师和孙广清老师及彭倩老师提供的指导和帮助!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 频率计 设计 报告