简易数字频率计Word格式文档下载.docx
- 文档编号:7479314
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:26
- 大小:168.93KB
简易数字频率计Word格式文档下载.docx
《简易数字频率计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《简易数字频率计Word格式文档下载.docx(26页珍藏版)》请在冰点文库上搜索。
1.3单片机的发展趋势
现在可以说单片机是百花齐放,百家争鸣的时期,世界上各大芯片制造公司都推出了自己的单片机,从8位、16位到32位,数不胜数,应有尽有,有与主流C51系列兼容的,也有不兼容的,但它们各具特色,互成互补,为单片机的应用提供广阔的天地。
纵观单片机的发展过程,可以预示单片机的发展趋势,大致有:
(1).低功耗CMOS化
(2).微型单片化
(3).主流与多品种共存
第2章系统硬件电路框图设计
2.1简易数字频率计的功能描述
本次毕业设计主要完成功能有:
(1)长按设置键可选择测量频率或者周期。
(2)短按则是选择设置闸门时间(0.05s—10s)。
(3)输入信号幅度:
0-5v,测量频率范围:
0.1Hz—4MHz。
2.2硬件电路设计框架
根据设计要求,数字频率计硬件电路框图设计如图2-1所示:
图2-1整机硬件设计框图
2.3主要芯片介绍
2.3.174HC161的介绍
74HC161与74ls161功能兼容,是常用的四位二进制可预置的同步加法计数器,他可以灵活的运用在各种数字电路,以及单片机系统中实现分频器等很多重要的功能.其管脚图如图2-2所示:
图中P0~P3为时钟CP和四个数据输入端,/MR为清零,CEP、CET为使能端,PE为置数端,Q0~Q3为数据输出端,以及TC为进位输出端。
当清零端CR=“0”,计数器输出Q3、Q2、Q1、Q0立即为全“0”,这个时候为异步复位功能。
当CR=“1”且LD=“0”时,在CP信号上升沿作用后,74LS161输出端Q3、Q2、Q1、Q0的状态分别与并行数据输入端D3,D2,D1,D0的状态一样,为同步置数功能。
而只有当CR=LD=EP=ET=“1”、CP脉冲上升沿作用后,计数器加1。
74LS161还有一个进位输出端CO,其逻辑关系是CO=Q0·
Q1·
Q2·
Q3·
CET。
合理应用计数器的清零功能和置数功能,一片74LS161可以组成16进制以下的任意进制分频器。
2.3.274HC153的介绍
74HC153是一个双4选1数据选择器,其管脚图如图2-3所示:
图2-374HC153管脚图
下面的表是各个端口的工作条件:
极限值
推荐工作条件
电源电压
Vcc…………….-0.5~+7.0V
Vcc……………….2V~6V
输入电压
V1….…..-1.5V~+Vcc+1.5V
V1…………………………..0~VCC
输出电压
VO……….-0.5V~Vcc+0.5V
VO……..…………..0~VCC
输入电流
I1(每端)…….…..±
20mA
工作环境温度TA
54HC153……..-55℃~+125℃
输出电流
IO(每端)…………...±
25mA
74HC153………-40℃~+85℃
电源电流
Icc(Vcc或GND
端)±
50mA
输入脉冲上升,下降时间Tr
Tf
Vcc=2.0V….…...≤1000ns
功率耗散
PD*………………...500mW
Vcc
=4.5V………..≤500ns
储存温度范围
TS…………...-65℃~+150℃
=6.0V….……..≤400ns
焊接温度(10秒)TL
TL…………………..300℃
2.4系统硬件单元电路设计及论证
2.4.1晶振电路
单片机工作所需要的时钟信号有两种产生方式,即内部时钟方式和外部时钟方式。
图1是内部时钟方式,改图中电容C1和C2取33PF,晶体的振荡频率取12MHz,晶体振荡频率高,则系统的时钟频率也高,单片机运行速度也就快。
其实际连接如图2-4所示:
图2-4晶振电路
2.4.2复位电路
复位电路如图2-5所示。
当单片机一上电,立即复位。
电容C和电阻实现上电自动复位。
复位也是使单片机推出低功耗工作方式而进入正常状态的一种操作。
图2-5复位电路
2.4.2放大整形电路
该放大电路主要是为了对输入信号进行放大,波形整形等功能,其原理图设计如图2-6所示:
图2-6放大整形电路
第3章系统软件设计
3.1软件整体设计框图
本次程序设计采用的是C语言程序设计,其设计框图3-1所示:
图3-1系统软件设计框图
3.2子程序设计框图
3.2.1显示程序
该子程序的总体架构图如3-2所示:
图3-2显示子程序总体架构图
其程序的运行流程为:
Y
N
3.2.2频率测量程序
频率测量程序的整体架构如图3-3所示:
图3-3频率测试程序总体框架图
第4章系统调试
单片机硬件和软件调试的工具分别为:
protues和KeilC51调试软件。
4.1软件调试
单片机软件调试主要是调试本次课程设计的主程序。
其调试过程如下:
(1)新建一个工程。
单击Project菜单,在弹出的下拉菜单中选NewProject。
(2)然后选择你要保存的路径,输入工程文件的名字,保存。
(3)新建一个工程后弹出一个对话框,根据你的需要选择你使用的单片机型号。
然后点击确定。
(4)单击“File”,选择“New”,新建文件并在其中输入程序代码,然后保存为c语言文件。
(5)回到编辑界面后,单击“Target1”前面的“+”号,然后在“SourceGroup1”单击右键选择“AddFileToGroup‘SourceGroup1’”,选中Test.c文件。
(6)单击“Project”菜单,选中“BuiltTarget”,完成程序的编译,在工程文件夹中找到*.hex文件即可。
4.2硬件调试
单片机硬件调试是检测在设计电路时,电路中存在的一些缺陷,故硬件调试是必不可少的,其步骤大致如下:
(1)打开软件Protues,将设计好的单片机硬件电路打开。
(2)在确定电路已经连接完成后,双击AT89C51单片机加入*.hex文件。
(3)单击软件最左下方的Play按钮。
若无异常,当按下某一按键时,能完成以下功能时,则表示设计调试通过。
(a)长按设置键可选择测量频率或者周期。
(b)短按则是选择设置闸门时间(0.05s—10s)。
第5章毕业设计总结
大学三年就会在这最后的毕业设计总结划上一个圆满的句号。
我曾经以为时间是一个不快不慢的东西,但现在我感到时间过的是多么的飞快,三年了,感觉就在一眨眼之间结束了我的大学生涯。
最能把理论知识运用到实践当中的过程就数毕业设计了。
在整个毕业设计的过程中每一步都是自己亲自做过的,遇到的问题也非常多,在经过遇到问题,思索问题到解决问题的过程中,收获是最多的。
以往没有注意到的问题,都在这一次的毕业设计中得以体现,这培养了我的细心,耐心和专心。
我觉得能够在这次的毕业设计中学到很多的东西,以往不注意的细节,在这一次中是必须让自己去注意的。
也是我这三年来所学到知识的一个体现。
我深深知道,每一次的学习实践环节都是那么的来之不易,都是通过老师的深思熟虑后,才给我们定下目标。
然后让我们在知识的海洋里翱翔,让我们随着年龄的增长不断的扩充自己的知识领域,也逐渐成熟,逐渐长大,老师同时也教导我们逐渐成为一个能够为身边的人,为家庭,为国家做出点点贡献的人,教导我们学会感恩。
所以,我在这次的毕业设计中,认真对待每一个过程,希望自己的认真,自己最后的毕业设计的成果能够回报老师这么多年来的教导,这么多年的奉献。
最后,由于理论方面所学有限,理解又不好,再加之动手能力的匮乏,在这次毕业设计中难免会有错误,还望老师批评指正。
参考文献
[1]林志琦.单片机原理接口及应用.北京:
中国水利水电出版社,2007
[2]胡辉.单片机原理与应用.北京:
[3]赵文博.单片机语言C51程序设计.北京:
人民邮电出版社,2005
[4]谭浩强.c程序设计.北京:
清华大学出版社,1991
附录1电路原理图
附录2整体总程序
#include<
AT89x52.h>
stdio.h>
math.h>
intrins.h>
floatf;
//频率
floatp;
//周期
floatsj;
//闸门时间
charidatabuff[20];
charflag=0;
//频率\周期选择标志位
charxs=0;
//设置闸门时间结束后是否显示结果的标志位
unsignedcharm=0,n=0,yichu=0,fenpin;
//m定时中断次数n计数中断次数yichu判断是定时器还是计数器溢出
#defineKey_SetP1
#defineK10xbf
#defineK20x7f
#defineNO_Set0xff
#defineFreq0
#definePeri1
sbitB153=P2^4;
sbitA153=P2^3;
sbitP17=P1^7;
sbitP16=P1^6;
sbitP35=P3^5;
sbitSet=P3^2;
unsignedcharLCD_Wait(void);
voidLCD_Write(bitstyle,unsignedcharinput);
voidLCD_SetDisplay(unsignedcharDisplayMode);
voidLCD_SetInput(unsignedcharInputMode);
voidLCD_Initial();
voidGotoXY(unsignedcharx,unsignedchary);
voidPrint(unsignedchar*str);
voidC52_Initial();
voidDelay(unsignedintt);
voiddisplay(floatf);
voidcepin();
voidpanduan();
voidtimedisplay(floatsj);
voidTime_Set1();
voidTime_Set2();
voidt0();
voidt1();
sbitLcdRs=P2^0;
sbitLcdRw=P2^1;
sbitLcdEn=P2^2;
sfrDBPort=0x80;
//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
unsignedcharLCD_Wait(void)
{
LcdRs=0;
//寄存器选择输入端1:
数据0:
指令
LcdRw=1;
_nop_();
//RW:
为0:
写状态;
为1:
读状态;
LcdEn=1;
//使能输入端,读状态,高电平有效;
写状态,下降沿有效
LcdEn=0;
returnDBPort;
}
#defineLCD_COMMAND0//Command
#defineLCD_DATA1//Data
#defineLCD_CLEAR_SCREEN0x01//清屏
#defineLCD_HOMING0x02//光标返回原点
voidLCD_Write(bitstyle,unsignedcharinput)
LcdRs=style;
LcdRw=0;
_nop_();
DBPort=input;
//注意顺序
LCD_Wait();
#defineLCD_SHOW0x04//显示开
#defineLCD_HIDE0x00//显示关
#defineLCD_CURSOR0x02//显示光标
#defineLCD_NO_CURSOR0x00//无光标
#defineLCD_FLASH0x01//光标闪动
#defineLCD_NO_FLASH0x00//光标不闪动
voidLCD_SetDisplay(unsignedcharDisplayMode)
LCD_Write(LCD_COMMAND,0x08|DisplayMode);
#defineLCD_AC_UP0x02
#defineLCD_AC_DOWN0x00//default
#defineLCD_MOVE0x01//画面可平移
#defineLCD_NO_MOVE0x00//default
voidLCD_SetInput(unsignedcharInputMode)
LCD_Write(LCD_COMMAND,0x04|InputMode);
voidLCD_Initial()
LCD_Write(LCD_COMMAND,0x38);
//8位数据端口,2行显示,5*7点阵
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);
//开启显示,无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);
//清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);
//AC递增,画面不动
voidGotoXY(unsignedcharx,unsignedchary)
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
voidPrint(unsignedchar*str)
while(*str!
='
\0'
)
{
LCD_Write(LCD_DATA,*str);
str++;
}
voidC52_Initial()
sj=1000000.00;
Key_Set=0xff;
TMOD=0x51;
//01010001T1为计数器,T0为定时器
EA=1;
ET0=1;
ET1=1;
EX0=1;
PX0=1;
//外部中断0设置为高优先级
IT0=0;
//电平触发方式
voidDelay(unsignedintt)//t随着数值越大,误差趋于平衡.
unsignedchari;
while(t--)
{
for(i=0;
i<
123;
i++)
{;
}
voidt1(void)interrupt3//计数器1溢出,yichu=1
n++;
yichu=1;
TH1=0;
TL1=0;
voidt0(void)interrupt1
m++;
yichu=2;
//定时器0溢出,yichu=2
TH0=0x3c;
//定时50ms
TL0=0xb0;
voidFdisplay(floatf)
{
if(f>
999400.00)
if(f<
4000400.00)
{sprintf(buff,"
Freq:
%2.4fmHz"
(f/1000000.00));
else
if(f>
1040.00)
{sprintf(buff,"
%4.2fkHz"
(f/1000.00));
{
0.06)
%3.2fHz"
f);
}
GotoXY(0,1);
Print(buff);
voidPdisplay(floatp)
if(p>
if(p<
10004000.00)
Cycle:
%2.4fs"
(p/1000000.00));
else
error(TimeorF)"
p);
9950.00)
{sprintf(buff,"
%4.2fms"
(p/1000.00));
else
if(p>
0.248)
{sprintf(buff,"
%3.3fus"
else
}
voidcepin()
unsignedchara;
unsignedlongjs;
m=0;
n=0;
TMOD=0x51;
a=sj/50000.00;
TCON=0x50;
//启动定时器和计数器
while(m!
=a);
TCON=0;
js=TH1*256+n*65536+TL1;
f=(js/(sj/1000000.00))*fenpin;
p=sj/(js*fenpin);
if(xs==0)//设置结束后第一次不显示结果
if(flag==Freq)Fdisplay(f);
elsePdisplay(p);
}
voidpanduan()
xs=0;
//设置结束后第二次循环显示结果
B153=1;
//选择16分频
A153=0;
yichu=0;
TH0=0xff;
//定时器0200us
TL0=0x38;
TH1=0xff;
//计数器1100脉冲
TL1=0x9c;
TR0=1;
//启动定时器0和计数器1
TR1=1;
while(yichu==0);
//如果没有溢出一直循环
TR0=0;
//已经溢出关闭定时器0和计数器1
TR1=0;
if(yichu==1)//计数器先溢出:
在200ms内测得的脉冲过多,说明频率较高
fenpin=16;
//转为测16分频后的频率16
cepin();
else//定时器先溢出:
100个脉冲的时间比较短,即频率较低,可以减少分频数
yichu=0;
B153=0;
A153=1;
TH0=0xfc;
//定时器01ms
TL0=0x18;
TH1=0xff;
//计数器1100个脉冲
TL1=0x9c;
TR0=1;
TR1=1;
while(yichu==0);
//如果没溢出一直循环
TR0=0;
TR1=0;
if(yichu==1)//计数器先溢出:
在1ms内测得的脉冲过多,说明频率较高
fenpin=4;
//转为测4分频后的频率4
cepin();
else//定时器先溢出:
100个脉冲的时间比较短,即频率较低
{
fenpin=1;
B153=0;
A153=0;
cepin();
voidtimedisplay(floatGTime)
sprintf(buff,"
GTime=%7.0fus"
GTime);
GotoXY(0,1);
Print(buff);
Delay(50);
voidTime_Set2()
Delay(1000);
if(P17==1)
sj=sj-50000.00;
if(sj>
50000.00)
timedisplay(sj);
else
sj=50000.00;
else
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 数字频率计