单片机简易频率计课程设计Word格式.docx
《单片机简易频率计课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《单片机简易频率计课程设计Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
本次设计由于个人水平有限,因此,本次设计根据需要,采用脉冲定时测频法。
基本设计原理是首先把待测信号通过放大整形,变成一个脉冲信号,然后通过控制电路控制计数器计数,最后送到译码显示电路里进行显示,其基本构成框图如图2所示。
图2
由上图可以看出,待测信号经过放大整形电路后得到一个待测信号的脉冲信号,然后通过计数器计数,可得到需要的频率值,最后送入译码显示电路中显示出来。
但是控制部分才是最重要的,它在整个系统的运行中起至关重要的作用。
为了得到一个高性能的数字频率计,本次设计采用单片机来做为数字频率计的核心控制电路,辅之于少数的外部控制电路。
因此本此设计的系统包括信号放大整形电路、分频电路、单片机AT89C51和显示电路等。
本系统让被测信号经过放大整形后,进入单片机开始计数,利用单片机内部定时计数器定时,在把所记得的数经过相关处理后送到显示电路中显示。
其系统原理框图将在下面介绍。
根据上述的基于单片机的数字频率计的设计原理,我们可设计一个由放大整形电路、分频电路、多路数据选择器、AT89C51以及显示电路来构成的数字式频率计,其系统框图如图3所示。
图3
二、硬件设计
AT89C51单片机及其引脚说明:
89C51是一种高性能低功耗的采用CMOS工艺制造的8位微控制器,它提供下列标准特征:
4K字节的程序存储器,128字节的RAM,32条I/O线,2个16位定时器/计数器,一个5中断源两个优先级的中断结构,一个双工的串行口,片上震荡器和时钟电路。
引脚说明:
·
VCC:
电源电压
GND:
地
P0口:
P0口是一组8位漏极开路型双向I/O口,作为输出口用时,每个引脚能驱动8个TTL逻辑门电路。
当对0端口写入1时,可以作为高阻抗输入端使用。
当P0口访问外部程序存储器或数据存储器时,它还可设定成地址数据总线复用的形式。
在这种模式下,P0口具有内部上拉电阻。
在EPROM编程时,P0口接收指令字节,同时输出指令字节在程序校验时。
程序校验时需要外接上拉电阻。
P1口:
P1口是一带有内部上拉电阻的8位双向I/O口。
P1口的输出缓冲能接受或输出4个TTL逻辑门电路。
当对P1口写1时,它们被内部的上拉电阻拉升为高电平,此时可以作为输入端使用。
当作为输入端使用时,P1口因为内部存在上拉电阻,所以当外部被拉低时会输出一个低电流(IIL)。
P2口:
P2是一带有内部上拉电阻的8位双向的I/O端口。
P2口的输出缓冲能驱动4个TTL逻辑门电路。
当向P2口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。
作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(IIL)。
P2口在访问外部程序存储器或16位地址的外部数据存储器(例如MOVX@DPTR)时,P2口送出高8位地址数据。
在这种情况下,P2口使用强大的内部上拉电阻功能当输出1时。
当利用8位地址线访问外部数据存储器时(例MOVX@R1),P2口输出特殊功能寄存器的内容。
当EPROM编程或校验时,P2口同时接收高8位地址和一些控制信号。
P3口:
P3是一带有内部上拉电阻的8位双向的I/O端口。
P3口的输出缓冲能驱动4个TTL逻辑门电路。
当向P3口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。
P3口同时具有AT89C51的多种特殊功能,具体如下表1所示:
端口引脚
第二功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
INT0(外部中断0)
P3.3
INT1(外部中断1)
P3.4
T0(定时器0)
P3.5
T1(定时器1)
P3.6
WR(外部数据存储器写选通道)
P3.7
RD(外部数据存储器都选通道)
表1
RST:
复位输入。
当振荡器工作时,RST引脚出现两个机器周期的高电平将使单片机复位。
EA/VPP:
外部访问允许。
为了使单片机能够有效的传送外部数据存储器从0000H到FFFH单元的指令,EA必须同GND相连接。
需要主要的是,如果加密位1被编程,复位时EA端会自动内部锁存。
ALE/RPOG:
当访问外部存储器时,地址锁存允许是一输出脉冲,用以锁存地址的低8位字节。
当在Flash编程时还可以作为编程脉冲输出(RPOG)。
一般情况下,ALE是以晶振频率的1/6输出,可以用作外部时钟或定时目的。
但也要注意,每当访问外部数据存储器时将跳过一个ALE脉冲。
PSEN:
程序存储允许时外部程序存储器的读选通信号。
当AT89C52执行外部程序存储器的指令时,每个机器周期PSEN两次有效,除了当访问外部数据存储器时,PSEN将跳过两个信号。
显示原理
我们测量的频率最终要显示出来。
八段LED数码管显示器基本电路如图4所示。
图4
八段LED数码管显示器由8个发光二极管组成。
基中7个长条形的发光管排列成“日”字形,另一个圆点形的发光管在数码管显示器的右下角作为显示小数点用,它能显示各种数字及部份英文字母。
LED数码管显示器有两种形式:
一种是8个发光二极管的阳极都连在一起的,称之为共阳极LED数码管显示器;
另一种是8个发光二极管的阴极都连在一起的,称之为共阴极LED数码管显示器。
如下图所示。
共阴和共阳结构的LED数码管显示器各笔划段名和安排位置是相同的。
当二极管导通时,对应的笔划段发亮,由发亮的笔划段组合而显示的各种字符。
8个笔划段hgfedcba对应于一个字节(8位)的D7、D6、D5、D4、D3、D2、D1、D0,于是用8位二进制码就能表示欲显示字符的字形代码。
技术参数
名称
符号
标准值
单位
MIN
TYPE
MAX
电路电源
VDD-VSS
-0.3
7.0
V
LCD驱动电压
VDD-VEE
VDD-13.5
VDD+0.3
输入电压
VIN
静电电压
-
100
工作温度
-20
+70
°
C
储存温度
-30
+80
表2极限参数表
电参数表
测试条件
单位
输入高电平
VIH
2.2
VDD
输入低电平
VIL
0.6
输出高电平
VOH
IOH=0.2mA
2.4
输出低电平
VOL
IOL=1.2mA
0.4
工作电流
IDD
VDD=5.0V
2.0
mA
液晶驱动电压
VDD-VEE
Ta=0°
4.9
Ta=25°
4.7
Ta=50°
4.5
表3电参数表
时序特性表
项目
测试条件
允许时间周期
TCYCE
5.1a5.1b
1000
ns
允许脉冲宽度,高电平
PWEH
450
--
允许上升和下降时间
tErtEf
25
地址建立时间
tAS
140
数据延迟时间
tDDR
320
数据建立时间
tDSW
195
数据保持时间
tH
10
DATAHOLDTIME
tDHR
20
地址保持时间
tAH
表4时序特性表
模块引脚功能表
引线号
功能
1
Vss
接地
0V
2
5V±
10%
3
VEE
保证VDD-VEE=4.5∽5V电压差
4
RS
寄存器选择信号
H:
数据寄存器L:
指令寄存器
5
R/W
读/写信号
读L:
写
6
E
片选信号
下降沿触发,锁存数据
7
|
14
DB0
DB7
数据线
数据传输
表5模块引脚功能表
三、软件设计
测频软件的实现是基于电路系统来进行设计的。
本次设计采用的是脉冲定时测频法,所以在软件实现上基本遵照系统的设计原理,进行测频。
本次软件设计语言采用C语言,在电脑上编译通过后即可下载到电路上的实际电路中,即可实现频率的测量。
初始化T0,T1
开定时器T1,计数器T0
NO
四、调试说明
当输入频率为1HZ时,测得频率为1HZ.
当输入频率为987HZ时,测得频率为987HZ。
但是当输入频率为5KHZ时,测得频率为5001HZ。
误差为0.02%。
当输入频率大到100kHZ时,测得频率为10015HZ,误差为0.15%。
误差分析:
因为定时和计数都是由单片机本身来完成的,在计数的时候会产生误差。
这个误差的大小是用单片机的内部时钟决定的,采用高频率的晶振来为单片机提供内部时钟,则能减少此误差。
本次设计我们用的是12MHz的晶振,而测频的范围是1Hz~1MHz。
所以定时计数的误差在本系统基本可以忽略不计。
五、使用说明
该设计主要是能够测量外部周期信号的频率值,并且通过数码管进行显示。
把编译好得到的hex程序文件载入到单片机里,就可以对整体电路进行仿真了。
经过对上述电路的仿真,我们可以看出,电路所要完成的功能都能基本实现。
结论
基于单片机的频率计的设计涉及到计算机的硬软件知识,通过对系统的设计和调试,本次设计主要完成了以下工作:
1、提出基于单片机的数字频率计设计的基本方案;
2、完成了电路设计;
3、编译了软件程序;
4、对硬件电路进行了仿真,进行了误差分析。
参考文献
[1]李雷等编.集成电路应用实验.国防工业出版社2003
[2]李雷等编.电子技术应用实验教程.电子科技大学出版社,2006
[3]朱红等编.电子技术综合实验.电子科技大学出版社,2005
[4]冯熙昌编.电子电话机集成电路手册.人民邮电出版社,1996
[5]李华等编.MCS-51系列单片机实用接口技术.北京航空航天大学出版社,1993
[6]徐惠民,安德宁等编.单片微型计算机原理接口及应用.北京邮电大学出版社,2000
[7]张毅坤,陈善久,单片微型计算机原理及应用.西安电子科技大学出版社,2002.
[8]张友德,赵志英,徐时亮.单片微机原理应用与实验.复旦大学出版社,2000.
附录
Ⅰ、系统电路图
Ⅱ、程序清单
#include<
reg51.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sfr16DPTR=0x82;
bitstatus_F=1;
uintaa,qian,bai,shi,ge,bb,wan,shiwan;
ucharcout;
unsignedlongtemp;
ucharcode
table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
voiddelay(uintz);
voidinit();
voiddisplay(uintshiwan,uintwan,uintqian,uintbai,uintshi,uintge);
voidxtimer0();
voidxtimer1();
voidmain()
{
P0=0XFF;
init();
while
(1)
if(aa==19)
aa=0;
status_F=1;
TR1=0;
delay(46);
TR0=0;
DPL=TL0;
DPH=TH0;
temp=DPTR+cout*65535;
shiwan=temp%1000000/100000;
wan=temp%100000/10000;
qian=temp%10000/1000;
bai=temp%1000/100;
shi=temp%100/10;
ge=temp%10;
if(shiwan==0)
shiwan=10;
if(wan==0)
wan=10;
if(qian==0)
qian=10;
if(bai==0)
bai=10;
if(shi==0)
shi=10;
}}}}
}
display(shiwan,wan,qian,bai,shi,ge);
voidinit()
temp=0;
cout=0;
IE=0X8A;
TMOD=0x15;
TH1=0x3c;
TL1=0xb0;
TH0=0;
TL0=0;
TR1=1;
TR0=1;
voiddisplay(uintshiwan,uintwan,uintqian,uintbai,uintshi,uintge)
P0=0x20;
P2=table[shiwan];
delay(5);
P0=0x10;
P2=table[wan];
delay(3);
P0=0x08;
P2=table[qian];
P0=0x04;
P2=table[bai];
P0=0x02;
P2=table[shi];
P0=0x01;
P2=table[ge];
voidxtimer1()interrupt3
aa++;
voidxtimer0()interrupt1
{
cout++;
voiddelay(uintz)
uinti,j;
for(i=0;
i<
z;
i++)
for(j=0;
j<
110;
j++);