AT89C51数字频率计的设计与实现.docx
《AT89C51数字频率计的设计与实现.docx》由会员分享,可在线阅读,更多相关《AT89C51数字频率计的设计与实现.docx(39页珍藏版)》请在冰豆网上搜索。
![AT89C51数字频率计的设计与实现.docx](https://file1.bdocx.com/fileroot1/2022-12/31/c512f9fe-8461-4131-a3d9-3d017b392f92/c512f9fe-8461-4131-a3d9-3d017b392f921.gif)
AT89C51数字频率计的设计与实现
摘要
测量是人类认识和改造世界的重要手段,在各个历史时期,测量水平的高低可以反映一个国家科学技术发展的状况。
特别在当今信息时代,通信技术日新月异,对频率准确的测量已成为通讯的基本条件之一。
在电子领域中,频率是最基本的参数之一,在检测技术,常常将一些非电量或其供电参量转换成频率进行测量测量。
另外,在现代信息传输和处理中,在电磁波频谱资源利用技术中,对频率源的稳定度和准确度提出了越来越高的要求,也大大促进了时间频率测量技术的发展
本论文主要阐述了以AT89C51单片机为核心,利用它内部的定时/计数器完成待测信号频率的测量。
单片机AT89C51内部具有2个16位定时/计数器,定时/计数器的工作可以由编程来实现定时、计数和产生计数溢出时中断要求的功能。
其基本模块包括输入、切换逻辑、计数、单片机控制及显示模块,采用汇编语言。
测量采用了直接与间接相结合的方法,它避免了直接测量法对低频精度的不足,同时消除了间接测量方法对高频精度的不足,以达到设计要求。
引言
在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此,频率的测量就显得更为重要。
测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。
电子计数器测频有两种方式:
一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法,如周期测频法。
直接测频法适用于高频信号的频率测量,间接测频法适用于低频信号的频率测量。
本次设计的数字频率计以AT89C51为核心,在软件编程中采用的是汇编语言,测量采用了直接与间接相结合的方法,它避免了直接测量法对低频精度的不足,同时消除了间接测量方法对高频精度的不足,以达到设计要求。
数字频率计设计的任务与要求
单片机控制的数字频率计
1.测频范围:
10Hz~10KHz。
为保证测量精度分三个频段
10Hz~100Hz,100Hz~1KHz,1KHz~10KHz,有超量程指示。
2.输入波形:
函数信号发生器输出方波,幅度为5V,能产生所需频率的脉冲信号。
3.测量误差:
≤1。
测量方案的论证与分析
测量方法的分析
测量方法通常有三种:
直接测量法、间接测量法、直接与间接测量结合法。
直接测频法
这种方法的测量原理是:
由于频率是单位时间内信号发生周期变化的次数,使得我们可以在给定的单位时间1S内(称为闸门)对被测信号的脉冲数计数,得到的脉冲个数就是被测信号的频率。
经分析,本测量法在低频段的相对测量误差较大,即在低频段不能满足本设计的要求
间接测量法(测周期法)
虽然直接测频法可以测出单位时间内脉冲的个数即频率,但是对于较低频率的信号其检测误差会大大增大,例如1.8Hz的信号,在通过1秒的闸门时间内其0.8会被淹没,这是在设计中所不允许的。
解决这种现象的办法就是改直接测频法为测周期法。
其原理是用被测信号的周期作为闸门,在该闸门时间内允许已知标准的短周期间隔的较高频率的信号通过,通过数字电路或微型计算机的运算,通过闸门的已知信号频率的个数越多,其被测频率就越低。
测周期法时序图
经误差分析,可得结论:
用该测量法测量时,被测信号的频率越高,测量误差越大。
直接与间接相结合的方法
该方法的出发点是避开±1量化误差的影响较大的频段,寻找有利因素而产生的。
对信号不采用直接测频法,而是改为测周期,并通过切换求得频率。
该方法可以满足测量误差的要求。
由此可见,为了获得较高的测量精度,在高频段,宜采用直接测频法;在低频段,宜采用测周期法。
把测量工作分为两种方法:
(1)当待测信号的频率>100Hz时,定时/计数器构成为计数器,以机器周期为基准,由软件产生计数闸门,计数闸门宽度>1s时,即可满足频率测量结果为4位有效数字;
(2)当待测信号的频率<100Hz时,定时/计数器构成为定时器,由频率计的予处理电路把待测信号变成方波,方波宽度等于待测信号的周期。
硬件电路设计方案分析
中小规模数字集成电路
系统测频部分采用中小规模数字集成电路,用机械式功能转换开关换档,完成测频率、测周期及测脉宽等功能。
该方案的特点是中小规模集成电路应用技术成熟,能可靠的完成频率计的基本功能,但由于系统功能要求较高,所以电路过于复杂,而且多量程换档开关使用不便。
原理框图如2.1所示。
2.1原理框图
单片机AT89C51
系统采用51系列单片机AT89C51作为控制核心,实现整个电路的测试信号控制、数据运算处理、键盘扫描和控制数码管的显示输出完成各种时序逻辑控制、计数功能。
系统组成框图如图2.2所示,所有信号包括基准频率信号、被测信号AT89C51单片机的控制下进行计数或定时,单片机将每次测试结果经运算处理后,以十进制的形式送到4位数码管显示电路显示。
按键接口电路,因为按键数量较少,所以采用独立式按键结构,实现测频、测周功能。
图2.2原理框图
显然,单片机AT89C51的电路简洁、新颖,数字集成电路从系统要实现的指标上看,要实现频率的测量范围10Hz~10KHz,实现比较困难,还要进行周期换算频率,因此采用单片机AT89C51系统。
基于单片机的数字频率计的硬件设计
系统硬件的构成
本频率计的数据采集系统主要元器件是单片机AT89C51,由它完成对待测信号频率的计数和结果显示等功能,外部还要有以下几个模块:
放大整形模块、时钟脉冲产生模块、按键模块、单片机系统、LED显示模块。
各模块关系图如图2所示:
显示电路
(静态串行显示方式)
按键电路
(中断扫描方式)
时钟电路
复位电路
总电路图
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时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。
作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(IIL)。
P3口同时具有AT89C51的多种特殊功能,具体如下表1所示:
端口引脚
第二功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
(外部中断0)
P3.3
(外部中断1)
P3.4
T0(定时器0)
P3.5
T1(定时器1)
P3.6
(外部数据存储器写选通)
P3.7
(外部数据存储器都选通)
表1P3口的第二功能
·RST:
复位输入。
当振荡器工作时,RST引脚出现两个机器周期的高电平将使单片机复位。
·ALE/
:
当访问外部存储器时,地址锁存允许是一输出脉冲,用以锁存地址的低8位字节。
当在Flash编程时还可以作为编程脉冲输出(
)。
一般情况下,ALE是以晶振频率的1/6输出,可以用作外部时钟或定时目的。
但也要注意,每当访问外部数据存储器时将跳过一个ALE脉冲。
·
:
程序存储允许时外部程序存储器的读选通信号。
当AT89C52执行外部程序存储器的指令时,每个机器周期
两次有效,除了当访问外部数据存储器时,
将跳过两个信号。
·
/VPP:
外部访问允许。
为了使单片机能够有效的传送外部数据存储器从0000H到FFFH单元的指令,
必须同GND相连接。
需要主要的是,如果加密位1被编程,复位时EA端会自动内部锁存。
当执行内部编程指令时,
应该接到VCC端。
·XTAL1:
振荡器反相放大器以及内部时钟电路的输入端。
·XTAL2:
振荡器反相放大器的输出端。
信号输入放大和整形电路
放大整形系统包括衰减器、放大器、施密特触发器。
它将正弦输入信号Vx整形成同频率方波Vo,幅值过大的被测信号经过分压器分压送入后级放大器,以避免波形失真。
由运算放大器构成的射级跟随器起阻抗变换作用,使输入阻抗提高。
同相输入的运算放大器的放大倍数为(R1+R2)/R1,改变R1的大小可以改变放大倍数。
系统的整形电路由施密特触发器组成,整形后的方波送到闸门以便计数。
由于输入的信号幅度是不确定、可能很大也有可能很小,这样对于输入信号的测量就不方便了,过大可能会把器件烧毁,过小可能器件检测不到,所以在设计中采用了这个信号调理电路对输入的波形进行阻抗变换、放大限幅和整形,信
号调理部分电路具体实现电路原理图和参数如下图4所示:
图4
时基信号产生电路
时钟是一切微处理器、微控制器内部电路工作的基础。
单片机内部有一个自激振荡电路,它是定时控制部件中的一部分,可以通过内部自激振荡或外部提供振荡源这两种方式,驱动内部时钟电路产生系统时钟信号。
内部方式:
在XTAL1、XTAL2跨接定时元件和两个电容就构成了自激振荡器。
C1、C2取5-30PF,起微调和稳定作用。
晶振频率:
f=1.2~12MHZ,常用频率为6、12、11.0592MHz。
外部方式:
外部振荡脉冲信号直接由XTAL2端输入,此时,XTAL1应接地,而片内振荡电路不起作用,。
常用于单片机同时工作,以便同步,要求信号低于12MHz。
时钟周期:
振荡器输出的时钟脉冲频率的倒数。
为单片机中最小、最基本的时间单位。
状态周期:
振荡信号经2分频后获得的信号周期,称S,显然,S为时钟周期的2倍。
机器周期:
12个时周钟期为一个机器周期,对应计算机执行一个基本操作所需的时间。
指令周期:
执行一条指令所需的时间,至少包含一个机器周期。
指令字节:
指令占用存储空间的字节数,有单字节、双字节、三字节三类。
当时钟频率为12MHz和6MHz时,时钟周期分别为1/12μs和1/6μs,机器周期分别为1μs和2μs。
这里使用12MHz晶振和两个电容就构成的自激振荡器。
复位电路
复位方式有上电自动复位、按键手动复位两种。
如图所示。
在按键手动电平复位电路中,具有上电和按键双重功能
按键电路
键盘电路使用中断扫描方式,使用中断方式可大大提高单片机效率。
显示电路
在单片机应用系统中通常使用由八个LED器件组成的七段LED显示器,其中七个LED构成七笔字形,另一个LED构成小数点(故有时称为八段显示器)。
如图所示,其接法共有两种:
共阴极与共阳极,前者是输入高电平有效(LED发光),后者是输入低电平有效。
其工作原理是:
控制其中各段LED的亮与暗即可显示出相应的数字、字母或符号。
七段LED显示器进行显示的信息称为七段代码,不同接法的七段代码显然是不相同的,共阴极和共阳极的七段代码的相同字符相加为FFH。
两种代码分别如图所示:
字符
字形码
字符
字形码
字符
字形码
共阴
共阳
共阴
共阳
共阴
共阳
0
3FH
C0H
8
7FH
80H
u
3EH
C1H
1
06H
F9H
9
6FH
90H
y
6EH
91H
2
5BH
A4H
A
77H
88H
灭
00H
FFH
3
4FH
B0H
B
7CH
83H
4
66H
99H
C
39H
C6H
5
6DH
92H
D
5EH
A1H
6
7DH
82H
E
79H
86H
7
07H
F8H
F
71H
8EH
这里使用静态显示中的串行显示,节省单片机资源,稳定。
图如下所示:
数字频率计软件设计
主程序设计
程序要求:
要能实现量程切换,超量程指示,准确定时。
主程序流程图
子程序设计
子程序主要包括:
按键中断子程序、定时中断子程序、计数中断子程序、周期中断子程序、超量程判断子程序、除法子程序、二进制转BCD子程序、显示程子序。
按键中断子程序
按键中断子程序流程图
定时中断和计数中断子程序
定时中断和计数子程序流程图
周期中断子程序
周期中断子程序流程图
HAOPAN:
MOVA,32H
CLRC
CJNEA,38H,D1
AJMPN1
N1:
MOVA,31H
CJNEA,37H,D1
AJMPN2
N2:
MOVA,30H
CJNEA,36H,D1
AJMPOUT
D1:
JCMIN
JNCCHAOL
MIN:
MOVA,32H
CLRC
CJNEA,35H,D2
AJMPMN1
MNI:
MOVA,31H
CJNEA,34H,D2
AJMPMN2
MN2:
MOVA,30H
CJNEA,33H,D2
AJMPXIAOL
D2:
JCXIAOL
JNCOUT
XIAOL:
MOVA,#0BFH;"0."编码
AJMPDISPCH;显示输出
CHAOL:
MOVA,#86H;"1."编码
DISPCH:
JBALLOW,OUT;显示更新是否允许
MOVCHAO,#01H;超量程状态存放
CLRP2.0;清除显示
SETBP2.0
MOVSBUF,A;发送
JNBTI,$
CLRTI
OUT:
RET
超量程判断子程序
判断大小,小于量程输出“0.”,大于量程输出“1.”。
除法子程序
该子程序用于周期转换频率,因为周期为两到三字节,所以使用移位除法。
移位除法模拟手算方法:
1)从被除数高位开始对齐除数,比较。
2)若前者大于或等于后者,商位为1,并把被除数减除数,形成部分余数。
若前者小于后者,商位为0。
3)部分余数左移一位,商也左移一位。
4)整个余数若小于除数,则退出。
5)部分余数从高位开始与除数比较。
6)到第2)步。
若被除数大于或等于除数,则溢出。
二进制转BCD子程序
二进制转BCD分为小数部分和整数部分。
二进制转BCD子程序流程图
显示程子序
先进行查码,然后由串行口发送到移位寄存器中。
程序:
DISP:
JBALLOW,OUT;显示更新是否允许
MOVR2,#04H;位数
MOVR1,#40H;显示数据首地址
DL0:
MOVA,@R1
MOVDPTR,#TAB2
MOVCA,@A+DPTR
MOVSBUF,A;发送
JNBTI,$
CLRTI
INCR1
DJNZR2,DL0
RET
TAB2:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
系统调试
硬件调试
硬件调试,由大到小,从整体到局部,进行调试。
本设计电路简单,所以不一一调试,就最复杂的显示电路进行调试。
先由仿真器连接显示电路,循环发送四位(1-9)显示编码,
如果四位都不能显示,检查信号传输电路,时钟电路,电源。
如果四位都能显示,但有的位显示不正确,检查LED与移位寄存器的连线顺序是否正确。
如果还显示不正确,与正常的位调换LED数码管。
调换后,正常的位显示不正常,则数码管坏了,换数码管。
调换后,不正常的位显示不正常,则移位寄存器坏了,换移位寄存器。
软件调试
软件调试的步骤
(1)源文件的建立:
使用菜单“File-New”或者点击工具栏的新建文件按钮,即可在项目窗口的右侧打开一个新的文本编辑窗口,在该窗口中输入汇编语言源程序(4.2小节所示)。
保存该文件,加上扩展名(.asm或a51),这里将文件保存为examl.asm。
(2)建立工程文件:
点击“Project-NewProject”菜单,出现以个对话框,要求给工程起一个名字,我们输入examl,不需要扩展名,点击保存按钮,出现第二个对话框。
这个对话框要求选择目标CPU(即我们所使用的芯片型号80C51)点击ATMEL前面的“+”号,展开该层,点击其中的80C51,然后点击确定按钮。
回到主界面,此时,在工程窗口的文件页中,出现了“Target1”,前面有“+”号,点击“+”展开,可以看到下一层的“SourceGroup1”,这时的工程还是一个空工程,里面什么文件也没有,需要手动把刚才编写好的源程序加入,点击“SouceGroup”使其反白显示,然后,点击鼠标右键,出现一个下拉菜单。
选中其中的“AddfiletoGroup”SouceGroup1”,对话框,要求寻找源文件,注意该对话框下面的“文件类型“默认为CSoucefile(*.c),也就是以C为扩展名的文件,而我们的文件是以asm为扩展名的,所以在列表框中找不到examl1.asm,要将文件类型该掉,点击对话框中”文件类型‘后的下拉列表,找到并选中“AsmSouceFile(*.asm,*.a51)”,这样,在列表框中就可以找到examl1.asm文文件了。
双examl1.asm文件,将文件加入项目,注意,在文件加入项目后,该对话框并不消失,等待继续加入其他文件,但初学时常会认为操作没有成功而再次双击同一文件,这时会出现对话框,提示你所选的文件以在列表中,此时点击确定,返回前一对话框,然后,点击”Close”即可返回主界面,返回后,点击“SouceGoup1”前的加号,会发现examl1.asm文件以在其中。
双击文件名,即打开源程序。
(3)工程的详细设置:
首先点击左边Project窗口的Target1,然后使用菜单“Proget-Optionfortarget‘target1’”即出现对工程设置的对话框,对这个对话框可谓非常复杂,共有8个页面,要全部高清可不容易,好在绝大部分设置项取默认值就行了。
设置完成以后安确认返回主界面,工程建立、设置完毕。
(4)编译、连接:
在设置好工程后,既可以进行编译、连接。
选择菜单Project-Buildtarget,对当前工程进行连接,如果当前文件已修改软件会先对该文件进行比阿尼,然后在连接以产生目标代码。
编译过程中的信息将出现在输出窗口中的Build页中,如果源程序有语法错误,会有错误报告出现,双击该行,可以定到出错的位置,对源程序反复修改后,最终会得到如图5-1所示的结果,提示获得了名为examl.hex的文件,该文件即可被编程器读入并写到芯片中,同时还产生了一些其他相关文件可被用于KEIL的仿真与调试。
正确编译之后的结果
调试过程中遇到的问题及解决方法
在进入环境以后,遇到了很多问题,总结如下:
(1)提示无asm文件
编译时候提示:
F:
\...\XX.asm
Filehasbeenchangedoutsidetheeditor,reload?
解决方法:
重新生成项目,产生examl.asm即可。
(2)在进入Keil的调试环境以后,发现程序有错
解决方法:
将光标定位于需要修改的程序上,用菜单,Debug》InlineAssambly…即可出现对话框,EnterNew后面的编辑框内直接输入需要修改的程序语句,输入完之后键入回车将自动指向下一条语句,可以继续修改,如果不在需要修改,可以点击右上角的关闭按钮关闭窗口。
(3)程序调试时,一些程序必须满足一定的条件才能被执行到
解决方法:
这些条件往往是异步发生或难以预先设定的,这类问题使用的单步实行方法是很难调试的,这时就要使用发哦程序调试中的另一种非常重要是方法---断点设置。
断点设置的方法有多种,常用的是在某一程序行设置断点,设置好断点后可以全速运行程序,一旦执行到该程序行即停止,可在此观察有关变量值,以确定问题所在。
在程序行设置/移除断点的方法是将光标定位于需要设置断点的程序行,使用菜单Debug/Insert/RemoveBreakPoint设置或移除断点(也可以用鼠标在该行双击实现同样的功能);Debug/Enable/DisableBreakPoint是开启或暂停光标所在懂行的断点功能;Dubug/DisaleAllBreakPoint暂停所有断点;Debug/KillAllBreakPoint清除所有的断点设置。
这些功能也可以用工具条上的快捷键进行设置。
(4)输入程序时,有中文标点,用keil编译时出现错误
解决方法:
程序里有带中文标点,用英文重输入一遍
(5)汇编出现数字、字母混淆
解决方法:
字母“O”和数字“0”。
主要错在这里。
注意细节!
参考文献
[1]李全利,单片机原理及应用技术。
北京:
高等教育出版社,2004
[2]王曙霞,单片机实验与实训指导。
西安:
西安电子科技大学出版社,2007
[3]及力,Protel2004原理图与PCB设计教程。
北京:
电子工业出版社,2007
[4]何利民,单片机高级教程。
北京:
航空航天大学出版社,2000
[5]李朝青,单片机原理与接口技术。
北京:
航空航天大学出版社,1999
[6]张毅刚,MCS-51单片机应用设计。
哈尔滨:
哈尔滨工业大学出版社,1997
[7]李华,MCS-51系列单片机实用接口技术。
北京:
航空航天出版社,2000
[8]陈光东,单片微型计算机原理接口技术。
武汉:
华中理工大学出版社,1999
[9]王福瑞,单片机测控系统大全,北京:
航空航天大学出版社,1998
附录A程序
ORG0000H
AJMPMAIN;主程序
ORG0003H
LJMPKAYBOARD;键盘中断入口
ORG000BH
LJMPTIME;定时中断入口
ORG0013H
LJMPZHOU;周期测量入口
ORG002BH
LJMPJSH;计数中断入口
LCEQU50H;量程存放
TOEQU51H;定时溢出次数存放
NEWEQU52H;量程切换状态存放
CHAOEQU53H;超量程状态存