基于单片机简易的频率计.docx
《基于单片机简易的频率计.docx》由会员分享,可在线阅读,更多相关《基于单片机简易的频率计.docx(24页珍藏版)》请在冰豆网上搜索。
基于单片机简易的频率计
摘要1
1.芯片介绍1
1.1LM324[1]1
1.2AT89S52[2]1
1.2.1AT89S52的主要性能1
1.2.2AT89S52的功能特性描述2
1.2.3AT89S52的引脚功能描述3
1.2.4特殊功能寄存器4
1.2.5存储器结构7
1.2.6定时器0和定时器17
1.2.7定时器27
1.2.8中断8
1.2.9晶振特性9
1.2.10Flash编程―并行模式10
2总体方案设计11
2.1设计要点11
2.2系统方案11
3模块设计与实现12
3.1显示模块12
3.2单片机总控制单元:
12
3.3放大整形电路[4]13
4软件设计[3]14
5测试结果18
6总结与体会19
参考文献20
附录1:
总体电路原理图21
附录2:
元件清单22
摘要
本次设计的简易频率计,是以AT89S52单片机为控制核心,辅以放大整形电路,显示电路构成的。
简易频率计能够根据题目要求能够用4位7段数码管显示待测频率,格式为0000Hz。
测量频率0~9999Hz信号类型:
正弦波、方波和三角波。
测量信号幅值:
0.1~9V。
另外,采用在线编程校准大大提高了频率计的测量精度,在9999Hz的频率范围内,可以把误差控制在0.022%以下。
而且具有灵活的现场可更改性。
在不更改硬件电路的基础上,对系统进行各种改进还可以进一步提高系统的性能。
该数字频率计具有高速、精确、可靠、抗干扰性强和现场可编程等优点。
对所设计的频率计的各项指标进行了测量和记录,满足要求,且在局部某些地方有自己的创新之处,相比用中规模集成器件构成的频率计优点有成本低、原理简单、功能齐全,实现价值高,各项性能较好。
关键字:
数字频率计AT89S52可编程高精度
1.芯片介绍
本次课程设计主要用到的芯片有用于整形电路的集成运放LM324和主控芯片AT89S52,下面对这两块芯片作一下详细的介绍。
1.1LM324[1]
LM324是四运放集成电路,它采用14脚双列直插塑料封装,外形如图1所示。
它的内部包含四组形式完全相同的运算放大器,除电源共用外,四组运放相互独立。
每一组运算放大器可用图2所示的符号来表示,它有5个引出脚,其中“+”、“-”为两个信号输入端,“V+”、“V-”为正、负电源端,“Vo”为输出端。
两个信号输入端中,Vi-(-)为反相输入端,表示运放输出端Vo的信号与该输入端的相位相反;Vi+(+)为同相输入端,表示运放输出端Vo的信号与该输入端的相位相同。
LM324的引脚排列见图3。
图2运算放大器的符号图3LM324的引脚排图
由于LM324四运放电路具有电源电压范围宽,静态功耗小,可单电源使用,价格低廉等优点,因此被广泛应用在各种电路中。
1.2AT89S52[2]
1.2.1AT89S52的主要性能
●与MCS-51单片机产品兼容
●8K字节在系统可编程Flash存储器
●1000次擦写周期
●全静态操作:
0Hz~33Hz
●三级加密程序存储器
●32个可编程I/O口线
●三个16位定时器/计数器
●八个中断源
●全双工UART串行通道
●低功耗空闲和掉电模式
●掉电后中断可唤醒
●看门狗定时器
●双数据指针
●掉电标识符
1.2.2AT89S52的功能特性描述
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
其引脚结构图如图4所示。
图4AT89S52的引脚结构
1.2.3AT89S52的引脚功能描述
VCC:
电源
GND:
地
P0:
P0口是一个8位漏极开路的双向I/O口。
作为输出口,每位能驱动8个TTL逻辑电平。
对P0端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。
在这种模式下,P0具有内部上拉电阻。
在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。
程序校验时,需要外部上拉电阻。
P1:
P1口是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。
对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
此外,P1.0和P1.2分别作定时器/计数器2的外部计数输(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表1所示。
在flash编程和校验时,P1口接收低8位地址字节。
表1P1口部分引脚的第二功能
P2:
P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。
对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX@DPTR)时,P2口送出高八位地址。
在这种应用中,P2口使用很强的内部上拉发送1。
在使用8位地址(如MOVX@RI)访问外部数据存储器时,P2口输出P2锁存器的内容。
在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。
P3:
P3口是一个具有内部上拉电阻的8位双向I/O口,p2输出缓冲器能驱动4个TTL逻辑电平。
对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
P3口亦作为AT89S52特殊功能(第二功能)使用,如表2所示。
在flash编程和校验时,P3口也接收一些控制信号。
表2P3口引脚的第二功能
RST:
复位输入。
晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。
看门狗计时完成后,RST脚输出96个晶振周期的高电平。
特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。
DISRTO默认状态下,复位高电平有效。
ALE/PROG:
地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。
在flash编程时,此引脚(PROG)也用作编程输入脉冲。
在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。
然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。
如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。
这一位置“1”,ALE仅在执行MOVX或MOVC指令时有效。
否则,ALE将被微弱拉高。
这个ALE使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。
PSEN:
外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。
当AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。
EA/VPP:
访问外部程序存储器控制信号。
为使能从0000H到FFFFH的外部程序存储器读取指令,EA必须接GND。
为了执行内部程序指令,EA应该接VCC。
在flash编程期间,EA也接收12伏VPP电压。
XTAL1:
振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2:
振荡器反相放大器的输出端。
1.2.4特殊功能寄存器
特殊功能寄存器(SFR)的地址空间映象如表3所示。
并不是所有的地址都被定义了。
片上没有定义的地址是不能用的。
读这些地址,一般将得到一个随机数写入的数据将会无效。
用户不应该给这些未定义的地址写入数据“1”。
由于这些寄存器在将来可能被赋予新的功能,复位后,这些位都为“0”。
表3AT89S52特殊寄存器映象及复位值
定时器2寄存器:
寄存器T2CON和T2MOD包含定时器2的控制位和状态位(如表4和表5所示),寄存器对RCAP2H和RCAP2L是定时器2的捕捉/自动重载寄存器。
中断寄存器:
各中断允许位在IE寄存器中,六个中断源的两个优先级也可在IE中设置。
双数据指针寄存器:
为了更有利于访问内部和外部数据存储器,系统提供了两路16位数据指针寄存器:
位于SFR中82H~83H的DP0和位于84H~85。
特殊寄存器AUXR1中DPS=0选择DP0;DPS=1选择DP1。
用户应该在访问数据指针寄存器前先初始化DPS至合理的值。
表4T2CON:
定时器/计数器2控制寄存器
表5AUXR:
辅助寄存器
1.2.5存储器结构
MCS-51器件有单独的程序存储器和数据存储器。
外部程序存储器和数据存储器都可以64K寻址。
程序存储器:
如果EA引脚接地,程序读取只从外部存储器开始。
对于89S52,如果EA接VCC,程序读写先从内部存储器(地址为0000H~1FFFH)开始,接着从外部寻址,寻址地址为:
2000H~FFFFH。
数据存储器:
AT89S52有256字节片内数据存储器。
高128字节与特殊功能寄存器重叠。
也就是说高128字节与特殊功能寄存器有相同的地址,而物理上是分开的。
当一条指令访问高于7FH的地址时,寻址方式决定CPU访问高128字节RAM还是特殊功能寄存器空间。
直接寻址方式访问特殊功能寄存器(SFR)。
例如,下面的直接寻址指令访问0A0H(P2口)存储单元MOV0A0H,#data使用间接寻址方式访问高128字节RAM。
例如,下面的间接寻址方式中,R0内容为0A0H,访问的是地址0A0H的寄存器,而不是P2口(它的地址也是0A0H)。
MOV@R0,#data堆栈操作也是简介寻址方式。
因此,高128字节数据RAM也可用于堆栈空间。
1.2.6定时器0和定时器1
在AT89S52中,定时器0和定时器1的操作与AT89C51和AT89C52一样。
为了获得更深入的关于UART的信息,可参考ATMEL网()。
从这个主页,选择“Products”,然后选择“8051-ArchitechFlashMicrocontroller”,再选择“ProductOverview”即可。
1.2.7定时器2
定时器2是一个16位定时/计数器,它既可以做定时器,又可以做事件计数器。
其工作方式由特殊寄存器T2CON中的C/T2位选择(如表2所示)。
定时器2有三种工作模式:
捕捉方式、自动重载(向下或向上计数)和波特率发生器。
如表4所示,工作模式由T2CON中的相关位选择。
定时器2有2个8位寄存器:
TH2和TL2。
在定时工作方式中,每个机器周期,TL2寄存器都会加1。
由于一个机器周期由12个晶振周期构成,因此,计数频率就是晶振频率的1/12。
在计数工作方式下,寄存器在相关外部输入角T2发生1至0的下降沿时增加1。
表6定时器2工作模式
在这11种方式下,每个机器周期的S5P2期间采样外部输入。
一个机器周期采样到高电平,而下一个周期采样到低电平,计数器将加1。
在检测到跳变的这个周期的S3P1期间,新的计数值出现在寄存器中。
因为识别1-0的跳变需要2个机器周期(24个晶振周期),所以,最大的计数频率不高于晶振频率的1/24。
为了确保给定的电平在改变前采样到一次,电平应该至少在一个完整的机器周期内保持不变。
1.2.8中断
AT89S52有6个中断源:
两个外部中断(INT0和INT1),三个定时中断(定时器0、1、2)和一个串行中断。
这些中断如图5所示每个中断源都可以通过置位或清除特殊寄存器IE中的相关中断允许控制位分别使得中断源有效或无效。
IE还包括一个中断允许总控制位EA,它能一次禁止所有中断。
如表7所示,IE.6位是不可用的。
对于AT89S52,IE.5位也是不能用的。
用户软件不应给这些位写1。
它们为AT89系列新产品预留。
定时器2可以被寄存器T2CON中的TF2和EXF2的或逻辑触发。
程序进入中断服务后,这些标志位都可以由硬件清0。
实际上,中断服务程序必须判定是否是TF2或EXF2激活中断,标志位也必须由软件清0。
定时器0和定时器1标志位TF0和TF1在计数溢出的那个周期的S5P2被置位。
它们的
值一直到下一个周期被电路捕捉下来。
然而,定时器2的标志位TF2在计数溢出的那个周期的S2P2被置位,在同一个周期被电路捕捉下来。
图5中断源
表7中断允许控制寄存器(IE)
1.2.9晶振特性
如图10所示,AT89S52单片机有一个用于构成内部振荡器的反相放大器,XTAL1和XTAL2分别是放大器的输入、输出端。
石英晶体和陶瓷谐振器都可以用来一起构成自激振荡器。
从外部时钟源驱动器件的话,XTAL2可以不接,而从XTAL1接入,如图7所示。
由于外部时钟信号经过二分频触发后作为外部时钟电路输入的,所以对外部时钟信号的占空比没有其它要求,最长低电平持续时间和最少高电平持续时间等还是要符合要求的。
图6内部振荡电路连接图石英晶振图7外部振荡电路连接图
C1,C2=30PF±10PF陶瓷谐振器C1,C2=40PF±10PF
1.2.10Flash编程―并行模式
AT89S52带有用作编程的片上Flash存储器阵列。
编程接口需要一个高电压(12V)编程使能信号,并且兼容常规的第三方*(原文:
third-party,不知道对不对)Flash或EPROM编程器。
AT89S52程序存储阵列采用字节式编程。
编程方法:
对AT89S52编程之前,需根据Flash编程模式表和图13、图14对地址、数据和控制信号设置。
可采用下列步骤对AT89S52编程:
1)在地址线上输入编程单元地址信号
2)在数据线上输入正确的数据
3)激活相应的控制信号
4)把EA/Vpp升至12V
5)每给Flash写入一个字节或程序加密位时,都要给ALE/PROG一次脉冲。
字节写周期时自身定制的,典型值仅仅50us。
改变地址、数据重复第1步到第5步,知道全部文件结束。
2总体方案设计
2.1设计要点
本次课程设计有以下要点:
设计一个频率计。
要求用4位7段数码管显示待测频率,格式为0000Hz。
测量频率范围:
10~9999Hz。
③测量信号类型:
正弦波、方波和三角波。
④测量信号幅值:
0.5~5V。
⑤设计的脉冲信号发生器,以此产生闸门信号,闸门信号宽度为1S。
⑥确定设计方案,按功能模块的划分选择元、器件和中小规模集成电路,设计分电路,画出总体电路原理图,阐述基本原理。
2.2系统方案
简易数字频率计可以用中规模集成芯片构建而成,但与用51单片机实现相比,其电路复杂程度要大得多,而且远远不及用单片机实现灵活,其精度也不及用单片机实现的高。
所以我采用用AT89S52单片机去实现。
我采用单片机89S52作为控制核心,用数码管显示所输入信号的频率,具体的系统框图如图8所示:
图8简易频率计的系统总体框图
其中,信号通过整形放大后,输入单片机中的计数器,运用单片机中的定时器设置每隔一秒钟将计数器中死亡数据输出,通过数码管显示。
单片机作为控制中心,随时检测和计录输入信号的频率,并控制输出显示和输入是否超载。
而显示电路用一个四位一体的数码管实现。
为简化硬件电路,用动态显示的方式,依次点亮个数码管,这样不仅仅是简化了电路,而且每一时刻四位数码管只相当于一位数码管的功耗,大大减少了功耗。
3模块设计与实现
3.1显示模块
本次课程设计采用一个四位一体数码管,替显输入信号的平率。
因为频率是一个实时变化量,我用一个的数码管来显示,每隔一秒更换一次数据。
电路原理图如图9所示。
各数码管的显示采用动态扫描的方式,这样,两个数码管共八位的功耗只相当于一位数码管显示的功耗。
与液晶显示相比,既可以实现所要求的功能节省了硬件成本,又大大减小了功耗。
图9显示模块
3.2单片机总控制单元
:
图10单片机系统原理图
我们用AT89S52作为整个电路的控制中心和数据计算处理中心,其中P0口对应两个数码管的数据位,P1口为LED动态点亮位。
P3.4脚用于信号输入。
具体系统原理图如图10所示
3.3放大整形电路[4]
考虑到所输入的信号有正弦波和三角波,而单片机所能读入的信号只能是数字信号的方波,所以正弦波和三角波在输入单片机之前必须通过整形电路整成方波。
我设计的整形电路是用集成运放搭建而成,运用集成运放的增益非常大,而又受限于运放的电源电压的特点,可以实现将一定幅值的电压信号整成标准的数字信号。
有因为所设计的频率计测量的频率信号的幅值能够达到越小越好,信号在进入整形电路之前设计了一个放大电路将信号放大。
放大电路也用集成运放构建而成,因集成运放的稳定性较好。
所设计的放大整形电路如图11所示:
图11放大整形电路
4软件设计[3]
本系统以AT89S52单片机为核心,用C语言编程[6],可实现题目要求的各种功能,其程序流程图如图12所示。
图12程序流程图
简易频率计的C语言程序:
#pragmadbcode
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitLED_0=P1^0;
sbitLED_1=P1^1;
sbitLED_2=P1^2;
sbitLED_3=P1^3;
/*=====0-9=====A-G=====*/
uchara[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0x86,0x8e,0x82};
ucharb[4]={0x8e,0xc1,0xc7,0xc7};
ucharone,two,three,four;
uintt=8000,j;//时间t
uintm=0,n=0,k=0;//次数
uints3=0,s4;//dt前后次数
time1()interrupt3
{//delay(20);
t=t+0.05*100;//每到0.05s,定时器1产生中断
TH1=0x3e;
TL1=0xff;
if(t%100==0){m=TH0*256+TL0;TH0=0x00;TL0=0x00;/*s3=n;m=(s3-s4);s4=s3;*/}
}
voiddelay(uintx);
voiddisplay(void);
voidled_analyze(uintl);
voidled_add();
voidmain()
{uinta;
IT1=1;//外部中断0下跳沿
EX1=1;
TMOD=0x15;//T1定时方式1,T0计数1
TH1=0x3e;
TL1=0xff;//定时50ms
TR1=1;//T1
ET1=1;
TH0=0x00;
TL0=0x00;//定时50ms
TR0=1;//T0
ET1=1;
EA=1;
while
(1)
{if(m<=9999){led_analyze(m);
for(a=0;a<100;a++)display();}
else{P0=b[0];
LED_0=0;
delay(300);
LED_0=1;
P0=b[1];
LED_1=0;
delay(300);
LED_1=1;
P0=b[2];
LED_2=0;
delay(3);
LED_2=1;
P0=b[3];
LED_3=0;
delay(300);
LED_3=1;
}
}
}
voiddelay(uintx)
{uinti;for(i=0;ivoiddisplay(void)
{P0=a[one];
LED_0=0;
delay(3);
LED_0=1;
P0=a[two];
LED_1=0;
delay(3);
LED_1=1;
P0=a[three];
LED_2=0;
delay(3);
LED_2=1;
P0=a[four];
LED_3=0;
delay(3);
LED_3=1;
}
voidled_analyze(uintl)
{l=l%10000;
one=l/1000;
two=(l/100)%10;
three=(l%100)/10;
four=(l%100)%10;}
本程序是结合理论联系实际设计而成,因为晶振的频率不是百分百的准确,根据单片机的机器周期设计一秒钟的时间也有差异,所以在线编程,一标准的频率对频率计进行校准,这样大大提高了频率计的精确度。
5测试结果
在硬件和软件都做好好,为检测频率计的可行性,用各种波形的标准频率信号对频率计进行了测试,测试结果如表8所示。
表8频率计的测试结果
正
弦
波
幅值(V)
实际值(Hz)
显示值(Hz)
误差(%)
5.0
1000
1000
0
5.0
5000
5001
0.02
5.0
9000
9002
0.022
方
波
0.2
1000
1000
0
0.2
5000
5001
0.02
0.2
9000
9002
0.022
0.1
9000
9002
0.022
三
角
波
0.1
1000
1000
0
0.1
5000
5001
0.02
0.1
9000
9002
0.022
9.0
9000
9002
0.022
从所测试的结果可以看出,此次课程设计所涉及出来的简易频率计的进度是相当高的。
如果对所输入的信号进行分频或增加数码管的位数,可以进一步提高所测频率值的范围。
但误差无法消除,有一部分原因是单片机工作时间的长短,直接影响机器周期的长短。
6总结与体会
本文对所设计的简易频率计做了整体和各模块的介绍,及硬件软件设计原理和实现方法的说明。
频率计AT89S52单片机为控制核心,辅以整形电路,显示电路等外围器件,构成了一个单片机系统。
频率计能够根据题目要求能够用4位7段数码管显示待测频率,格式为0000Hz。
测量频率0~9999Hz信号类型:
正弦波、方波和三角波。
测量信号幅值:
0.1~9V。
在9999Hz的频率范围内,可以把误差控制在0.022%以下。