微机原理数字频率计Word格式文档下载.docx
《微机原理数字频率计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《微机原理数字频率计Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
设计报告成绩(占20%)
总评成绩:
指导教师:
目录
一、系统功能要求分析………………………………………………3
二、方案设计及其说明………………………………………………3
三、原理线路设计……………………………………………………3
1.原理线路…………………………………………………………4
2.工作原理说明……………………………………………………4
3.操作时序分析……………………………………………………5
4.特点说明…………………………………………………………5
四、程序设计…………………………………………………………5
1.程序结构及流程…………………………………………………6
2.程序算法分析……………………………………………………7
3.关键程序段说明…………………………………………………8
4.源程序清单………………………………………………………8
五、系统调试及结论………………………………………………14
1.调试方法…………………………………………………………14
2.重点问题及解决方法……………………………………………15
3.运行结果及结论…………………………………………………15
六、设计体会………………………………………………………16
参考文献……………………………………………………………16
一、系统功能要求分析
本次设计的是一个信号频率测试系统,频率测量范围不小于5Hz~50kHz,测量误差不大于1Hz,并在LED数码显示器上显示测得的频率。
利用Dais系列实验箱现有硬件,基于8086CPU,使用8253、8259等芯片,即可完成设计要求。
二、方案设计及其说明
用M法,定时时间T=1秒,则计数值即为待测频率。
设频率计的测量频率范围为1Hz~65535Hz,利用8253定时器0和定时器1级联作一秒定时器,利用8253CT2作待测信号脉冲计数器。
OUT0上升沿产生中断,8259的IR7为中断入口。
在定时开始之时也开启计数器,在一秒定时到之时关闭计数器并读取计数值,初值与此计数值之差即为被测信号的频率。
三、原理线路设计
1.原理线路
图1线路总连接图
注:
上图不包含数码管显示模块,因为其在试验箱上,非设计连线部分。
2.工作原理说明
本系统采用M法测量频率,即测量计数在一定时间Tc内的信号脉冲数M。
譬如,Tc=1秒,计数值M=1200,则信号频率为1200Hz;
Tc=0.1秒,计数值M=1200,则信号频率为12000Hz。
Dais试验箱上芯片8253的CLK1接系统频率1.8432MHz,因此,我们使用8253的T0和T1做1秒定时,即用T1产生10毫秒方波,OUT1接T0的CLK0,由OUT0输出1秒方波,上升沿触发中断(8259IR7),即每秒产生一次中断。
每中断一次读一次T2的计数值,用初值与当前计数值相减得到1秒钟计数脉冲个数,将这个差值直接送往数码管显示。
即为测量频率。
本设计能测量65535Hz以下的频率,误差小于1Hz,达到设计要求。
对于更大频率的测量,下边会做详细说明。
本系统只是简单的方波频率测量,没有进一步考虑测量正弦波、三角波、锯齿波等波形的频率,如果要测量这些波形,还须添加放大整形电路。
3.操作时序分析
系统利用8253分频,每一秒产生一次中断,读取计数值,每次中断重装计数初值。
由于是分频一秒,初值与计数当前值之差就是被测信号频率。
4.特点说明
本系统可以准确测量65535Hz以下的脉冲信号,误差小于1Hz。
而且实现了动态检测,测量输入端有信号输入,即刻就能在数码管上准确显示其频率值。
四、程序设计
1.程序结构及流程
2.程序算法分析
程序开始开辟相应空间用于存放数码管字型码和频率数值。
初始化显示“000000”。
接着初始化8253和8259,利用试验箱1.8432MHz信号作为时基频率,利用8253定时器1、定时器0产生1秒方波,定时器2装入初值65535。
8259的IR7作为中断入口。
中断时先发读回命令,读回定时器2的计数值,即终值。
由于8253计数器是从初值开始作减1计数的,所以当读取计数完成的计数器值后,应将计数初值减去计数终值才是真正的计数值。
并且在读了之后还需重新赋初值,之后返回主程序进行显示,等待下一次中断。
3.关键程序段说明
1)中断程序:
先保护断点,每次中断发读回命令,读回终值用初值减得之差,将其转换成十进制,恢复断点后返回。
2)二进制转十进制程序:
二进制数除以10所得余数即为十进制的低位,并将其存入BUF。
利用循环可一一将二进制数转换成相应几位十进制数。
3)显示程序:
六位数码管,先取字位偏移地址,找到要显示的数,利XLAT命令找到数对应的字型码,输出字型、字位,延时,在显示下一个数码管数值。
如此循环显示完六个数码管。
4.源程序清单
;
=============数字频率计的设计=============
CODESEGMENT
ASSUMECS:
CODE,DS:
CODE,ES:
CODE
ORG3400H
H8:
JMPP8259
ZXKEQU0FFDCH;
数码管字型口
ZWKEQU0FFDDH;
数码管字位口
LEDDB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;
0~9
BUFDB?
?
;
六位数码管
Port0EQU0FFE0H;
8259芯片地址,A0=0
Port1EQU0FFE1H;
A0=1
P8259:
CLI
CALLWP;
初始化显示“000000”
MOVAX,OFFSETINT8259;
中断IR7入口地址
MOVBX,003CH;
IR7偏移地址
MOV[BX],AX
MOVBX,003EH
MOVAX,0000H;
IR7段地址
CALLFOR8259;
对8259初始化设置
CALLFOR8253;
对8253初始化设置
CALLFOR8253X;
对频率范围进行设置
STI
PPP:
CALLDIS;
循环显示等待中断
JMPPPP
==============================================
对8259进行初始化
--------------------------------
FOR8259:
MOVAL,13H;
写入ICW1,边沿触发,间隔8,单片,需要ICW4
MOVDX,Port0;
上升沿产生中断
OUTDX,AL
MOVAL,08H;
ICW2,中断向量码
MOVDX,Port1
MOVAL,09H;
ICW4,一般全嵌套,缓冲,非自动结束
MOVAL,07FH;
IR7为中断入口,屏蔽其他
RET
对8253进行初始化(产生一秒脉冲信号)
---------------------------------------------------------
FOR8253:
MOVDX,0FFFBH
MOVAL,36H;
T0,高->
低,方式3,二进制
MOVDX,0FFF8H;
T0产生1秒脉冲信号
MOVAL,100
MOVAL,AH
MOVDX,0FFFBH
MOVAL,76H;
T1,高->
OUTDX,AL;
写控制字
MOVDX,0FFF9H;
T1产生10毫秒方波
MOVAX,18432
对频率范围设置
-------------------------
FOR8253X:
MOVDX,0FFFBH;
设置T2,高->
底,方式0,二进制
MOVAL,0B0H
MOVDX,0FFFAH;
T2计数的最大值
MOVAX,65535
MOVCX,10;
延时
WAIT1:
LOOPWAIT1
二——十进制转化
---------------------------------------
BTRO:
MOVCL,5
XORCH,CH
XORDX,DX
MOVBX,10
MOVSI,OFFSETBUF
ADDSI,5;
由低位到高位存储
NEXT:
DIVBX
MOV[SI],DL;
除以10的余数存放低位
DECSI
ANDAX,AX
JZSTOP;
判断是否除尽
MOVDL,0
LOOPNEXT
STOP:
8259中断子程序
------------------------------------
INT8259:
PUSHAX;
断点保护
PUSHDX
PUSHBX
CLI;
关中断
MOVAL,80H
读T2锁存器值
INAL,DX
MOVBl,AL
MOVBh,AL
MOVAX,BX;
计数值放在AX
MOVDX,65535;
将计数值转化为频率值
SUBDX,AX;
65535-计数值=通过脉冲个数
MOVAX,DX
压栈保存等待显示
CALLFOR8253X
CALLBTRO
POPBX;
出栈,恢复中断前数据
POPDX
POPAX
LAST:
IRET
显示子程序DIS
-------------------------------
DIS:
MOVCL,20H;
00100000(六位数码管)为显示数码位做准备
MOVBX,OFFSETBUF;
字位的偏移地址
DIS1:
MOVAL,[BX]
MOVBX,OFFSETLED;
字型的偏移地址
XLAT;
DSx16+BX+AL->
AL,换码。
在LED表里面换取数据
POPBX
MOVDX,ZXK;
输出字型位
MOVAL,CL;
输出字位位
MOVDX,ZWK
PUSHCX
MOVCX,0100H
DELAY:
LOOP$;
显示延时
POPCX
CMPCL,01H;
显示到最后一位?
JZEXIT
INCBX
SHRCL,1;
右移,显示下一个数码管
JMPDIS1
EXIT:
MOVAL,00H;
六位依次显示完
WP:
MOVBUF,0;
MOVBUF+1,0
MOVBUF+2,0
MOVBUF+3,0
MOVBUF+4,0
MOVBUF+5,0
CODEENDS
ENDH8
五、系统调试及结论
1.调试方法
利用Intel8086集成开发环境,对程序反复进行编译,结合单步调试方法。
并下载到Dais试验箱运行正确。
2.重点问题及解决方法
1)8253无法产生中断信号,即定时器0、1做的一秒定时没有正常工作。
经查看代码,才发现在赋定时器0初值(100)时,没有读高位(高位为0)。
改正后可以产生一秒定时了。
2)测量时,数码管每秒闪烁一次,经分析,推测是我们在中断程序中调用了显示的原因。
修改后,问题得到解决。
3)中断中调用显示子程序,还无法实现实时监测。
因为若在中断中调用了显示,显示的延时占用过长系统时间,会发生中断时序错乱,从而导致无法及时读取计数值。
4)由于8253计数器为16位的,因此对65535以上的频率会发生溢出,在定时1秒的情况下无法正确测量。
因此考虑溢出的情况,对于更高频率的测量只能缩短闸门时间。
5)本次设计只使用M法测频率,原则上讲,M法适合测量高频信号,而对于低频信号用此种方法误差较大。
测量低频应该使用T法,即用被测信号做闸门,用时基信号计数,也就是测量低频信号的周期,其周期的倒数即为信号频率。
6)另外,本次设计的频率计只是简单地对方波信号的测量。
如果要实现对正弦波、三角波、锯齿波等信号的测量,还需添加整流放大电路。
3.运行结果及结论
程序调试完全正确后,下载到Dais试验箱并运行,利用试验箱现有的393分频频率,进行测量,测得T7、T6频率与试验箱给的T7、T6实际频率完全符合,误差小于1Hz。
设计满足要求。
六、设计体会
从一开始的源代码编写我已经感觉到这次课程设计的重要与必要,所以我很认真的完成了这次的任务,设计过程中感觉到微机原理知识的不足与欠缺,不过通过查资料和思考,最终还是成功完成了本次设计。
代码来说是比较轻松的,因为自己之前学过微机原理这门课,知道8086CPU、接口芯片8253、8259等各方面的知识,结合这次课程设计的要求,根据试验箱使用手册了解硬件,参照实验指导书,在Intel8086集成开发环境下编写出了程序源代码。
发现有问题的地方及时改掉,经过反复修改、调试终于达到目的。
考虑各个可能出现的问题并解决,尽量与实际实用性接轨,最终基本完成设计要求。
这次的课程设计使我更进一步巩固了微机原理知识,更加熟悉了8086系统的设计方法,进一步掌握了各种借口芯片的使用方法。
但在发现问题和设法解决问题的过程中,也深深体会到学习了书本知识须及时实践应用的重要性,理论须联系实际才能更好的掌握一门技能。
还锻炼了个人设计创造、思考及解决问题的能力,对今后的学习和工作都大有裨益。
参考文献
[1]DAIS系列微机接口实验系统使用手册
[2]DAIS系列微机接口实验系统实验指导书
[3]微机原理及应用课程设计指导书
[4]李伯成、侯伯亨、张毅坤《微型计算机原理及应用》(第二版)西安电子科技大学出版社2008年6月第2版