微机原理课设数字频率计的设计.docx
《微机原理课设数字频率计的设计.docx》由会员分享,可在线阅读,更多相关《微机原理课设数字频率计的设计.docx(19页珍藏版)》请在冰豆网上搜索。
微机原理课设数字频率计的设计
微机原理课设-数字频率计的设计
实验题目:
数字频率计的设计
1.设计目的
通过数字频率计的设计,使同学们进一步掌握:
(1)8086/8088汇编语言程序的设计和调试;
(2)信号频率的数字测量方法;
(3)定时计数器8253的基本工作原理和应用;
(4)微机基本应用系统的设计方法;
2•设计内容
利用微机原理实验装置,设计并实现一个信号频率测试系统,要求频率测量范围不小于5HZ~50HZ,测量误差不大于1HZ,并将测得的频率显示在LED数码显
3•设计要求
(1)针对实验装置已有条件,设计频率测量原理线路;
(2)编制相应的测试软件,实现频率测量;
(3)实际上机调试,完成综合实验;
(4)编写设计说明书(含原理图,程序及说明,实验方法,过程及结果)
4.方案设计及其说明
4.1硬件电路设计
在硬件电路部分我们主要采用的芯片有8088,8253,8259,74LS138等。
基本
工作原理如下:
首先由8253芯片的定时/计数器CT1的OUT1端产生10ms的方波再将OUT1与定时/计数器CT0的CLK0端级联使OUT(端产生1s(测高频)或10s(测低频)方波计时,定时/计数器CT2的CLK2端接收待测信号进行计数,OUTO^口将计时信号输出到8259芯片的IR7口使8259芯片产生中断。
中断产生后,CPU将从CT2中读出计数值并转化为频率值并在数码管显示该频率值。
具体测量方法如下:
当CLK2接收到的待测信号为高频率的脉冲信号时,令计时为1s,即每秒产生
一次中断,即OUT生成10ms的方波,OUTC出来的便是1s的方波。
利用M法可以知道,在下一个1s到来的时候可以测出1s经过的CLK2的基本脉冲数为M则被测频率f=M,此时将M转换为十进制显示在数码管上即可。
当CLK2接收到的待测信号为低频率的脉冲信号时,此时设定中断定时时间为10s,即OUT1生成的依旧是10ms的方波,OUT0生成10s方波脉冲。
在下一个中断来临时,记下CLK2经过的脉冲数M个,利用T法可以知道所测的频率f=M/10,转换为十进制显示在数码管上。
4.1.1计时部分
8253的CTO和CT1级联产生出1秒的方波。
基准时钟信号是CT1的CLK1自带的内部晶振1.8432MHZ当CT1写入初值18432时,OUT1即可输出10ms的方波信号再输入给CLKOCT0写初值100(1000)从OUT0俞出1s(10s)的脉冲时钟信号。
控制字如下:
(
CTO:
0
0
1
1
0
1
1
0
(
定时/计数器0先低8位再高8位读写工作方式3二进制
CT1:
0
1
1
1
0
1
1
0
定时/计数器1先低8位再高8位读写工作方式3二进制
4.1.2计数部分
用8253的CT2产生计数。
CLK2是待测信号脉冲的输入端。
OUT2悬空不接线初值定为65535,即从65535开始,每一个脉冲周期自减一。
控制字如下:
CT2:
1
0
1
1
0
0
0
0
定时/计数器2先低8位再高8位读写工作方式0二进制
4.1.3片选寻址部分
实验中用了8253和8259两片芯片。
故需要进行地址的片选。
8259的地址是FFE0H~FFE3H对应的各地址线如下:
A19~A
9
A8
A7
A6
A5
A4
A3
A2
A1
A0
地址
1
••1
1
1
1
1
0
0
0
0
0
FFE0
H
••1
1
1
1
1
0
0
0
0
1
FFE1
H
1
•1
1
1
1
1
0
0
0
1
0
FFE2
H
1-1
1
1
1
1
0
0
0
1
1
FFE3H
对应的片选接74LS138的丫0口
8253的地址是FFF8H~FFFBH对应的各地址线如下:
A19~A
9
A8
A7
A6
A5
A4
A3
A2
A1
A0
地址
1
••1
1
1
1
1
1
1
0
0
0
FFF8
H
••1
1
1
1
1
1
1
0
0
1
FFF9
H
•1
1
1
1
1
1
1
0
1
0
FFFA
H
1
•1
1
1
1
1
1
1
0
1
1
FFFB
H
对应的片选接74LS138的丫6口
4.1.4中断部分
将8253的OUT0的计时信号给8259的IR7口产生中断。
写入控制字令接收到上升沿产生中断。
通过实验箱的内部已接好的输出电路给数码管显示。
4.1.5硬件线路图
(1)电路原理图
825
(2)完整电路图(见附页)
4.1.6操作时序图
CL^0
K1:
T
OUT
1:
T1=18
T2=1
OUT
0:
OUT0
INT
R1:
INT
R2:
CL
K2:
2软件电路设计
软件部分共划分为如下几个模块:
1.8253芯片定时模块
2.8253芯片计数模块
3.8259芯片中断模块
4.显示模块
4.2.1软件流程图
主程序:
8259初始化子程序
开始
关中断
循环显示
断点恢复
开中断
二进制-十进制转化子程序(高频)
(开始]
r
初始化清零
3F
SI7+5
J
AX/10余数存入SI
SI*SI-1
RET
进制一十进制转化子程序(低频)
N
Y
422源程序代码(见附页)
5.试验中出现问题及解决方法
在实验硬件接线成功将完整程序装载后进行测试时候发现测试不出来数据,经
过小组成员讨论认为可能是咼低频计算转换算法有冋题,于是我们决定不论咼低频
都用M法测量定时一秒发现测量结果是正确的,但误差过大,于是将定时时间设为十秒,采用有小数点显示算法测量结果发现测量结果都是乱码,经过小组成员讨
论认为是实验箱有问题于是换了一台试验箱测试,结果发现当送给CT2的待测信
号是由74LS393的T6、T7给出的时,测量结果是正确的,但当由函数发生器给出待测信号时测量结果是乱码,经过老师知道我们知道了函数发生器产生的方波信号是由负值的需要调整才可产生正确的信号,经调整函数发生器产生正确方波信号后测得正确的结果。
6.实验结果及分析
用函数发生器给频率计输入方波信号,可较精确的测得信号频率。
测量范围为
0.1Hz~65534Hz,经与函数发生器比较,测量误差为高频1Hz,低频0.1Hz
部分测量结果如下表:
咼频
待测(Hz)
44505
31165
25922
2036
实测(Hz)
44506
31166
25923
2035
低频
待测(Hz)
7.8
32.8
121.9
1034.9
实测(Hz)
7.7
32.7
121.8
1035.0
7.课程设计心得体会
为期两周的微机原理课程设计结束了,在这两周的时间里使我学到了许多东西,首先通过此次课设,加强了我们的动手、思索和解决问题的能力,也加深了对在课本上所学理论知识的理解,特别是更加熟悉了对常用芯片比如8253,8259,74LS
138等的应用,同时在这次课设中也加深了我对汇编语言的理解更掌握了8086的
调试环境,使我能更好地将在课本上学到的的理论知识与实践相结合,同时在课设过程中查阅了许多资料从而更加拓宽了我的知识面,在这次课设中也使我更加熟练
地掌握了示波器的运用,同时也学会了函数发生器的使用。
在这次课设中也使我更加明白了团队合作的重要性,在课设过程中我们遇到了许多问题但经过与组员们探讨都一一解决了,课设的成功离不开组员们的配合与指导老师的悉心指导,在此感谢各位组员的配合与老师的悉心指导。
附页:
源程序代码
CODESEGMENT
ASSUMECS:
CODE,DS:
CODE,ES:
CODE
ORG3400H
H8:
JMPP8259
ZXKEQU0FFDCH
ZWKEQU0FFDDH
LEDDB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;0~9
DB040H,079H,24H,30H,19H,12H,02H,78H,00H,10H,0FFH;0.~9.
BUF1DB?
;定义缓冲区用于存放高低频的选择值
;8259初始化
J
FOR8259:
MOVAL,13H;
上升沿产生中断(ICW1)
MOVDX,Port0
OUTDX,AL
MOVAL,08H;ICW2
的设置
MOVDX,Port1
OUTDX,AL
MOVAL,09H;ICW4
的设置
OUTDX,AL
MOVAL,07FH;
设置IR7为中断源,并且屏蔽其它的中断源
OUTDX,AL
RET
J
;8253初始化(一秒信号)
FOR8253:
MOVDX,0FFFBH
MOVAL,36H;00110110CT0,方式3
OUTDX,AL
MOVAL,76H;01110110CT1,方式3,
OUTDX,AL
MOVDX,0FFF9H
MOVAX,18432;CT1置初值产生10ms方波
OUTDX,AL
MOVAL,AH
OUTDX,AL
MOVDX,0FFF8H
MOVAX,100;CT0置初值100产生1s定时信号
OUTDX,Al
MOVAL,AH
OUTDX,AL
RET
;8253初始化(十秒信号)
;控制CT2计数,设置频率范围
FOR8253X:
MOVDX,0FFFBH控制口地址
MOVAL,0B0H;CT2,方式0
OUTDX,AL
MOVDX,0FFFAH;CT2地址
MOVAX,65535;T2计数的最大值
OUTDX,AL
MOVAL,AH
OUTDX,AL
MOVCX,10;延时
GOOD:
LOOPGOOD
RET
卜进制转化(高频无小数点,利用了M法测量)
BTRO:
MOVCL,6
XORCH,CH
XORDX,DX
MOVBX,10
MOVSI,OFFSETBUF
ADDSI,5;从低位到高位存储
NEXT:
DIVBX
MOV[SI],DL;除以10的余数存放低位
DECSI
ANDAX,AX
JZSTOP;判断是否除尽
MOVDL,0;将存放余数的清零
LOOPNEXT
STOP:
RET
卜进制转化(低频有小数点,利用了T法测量)
BTROb:
MOVCL,3
XORCH,CH
XORDX,DX
MOVBX,10
MOVSI,OFFSETBUF
ADDSI,5;使其从数码管的低位开始显示
DIVBX
MOV[SI],DL
DECSI
MOVDL,0;将存放余数的清0
DIVBX
ADDDL,10;查表将该位的小数点显示出来
MOV[SI],DL
DECSI
ANDAX,AX;检测商是否为0,若为0程序跳出,否则继续
JZSTOP1
MOVDL,0
NEXT1:
DIVBX
MOV[SI],DL
DECSI
ANDAX,AX
JZSTOP1
MOVDL,0
LOOPNEXT1;由于数码管只能显示5位,贝UCL=3
STOP1:
RET;8259的中断子程序
INT8259:
PUSHAX
PUSHDX
PUSHBX;断点保护
CLI
MOVDX,0FFFBH
MOVAL,80H
OUTDX,AL;锁存CT2的值,方便下面读取CT2接口的值
MOVDX,0FFFAH
INAL,DX
MOVBI,AL
INAL,DX
MOVBH,AL;读取CT2的值,此时值为剩余的计数值
MOVAX,BX
MOVDX,65535
SUBDX,AX;将读取CT2的值转化为频率值
MOVAX,DX
PUSHAX;保护频率值
MOVSI,OFFSETBUF1
MOVBL,[SI]
CMPBL,1;判断新频率进来之前的显示模式
JNZDIPIN;低频跳转,高频继续向下执行
CMPAX,2000
JBOTHER;若小于2000,测的频率为低频,跳转,否则继续向下
GOM:
CALLFOR8253X
CALLWP
POPAX
CALLBTRO;将频率值转化为十进制,无小数
JMPX59
DIPIN:
CMPAX,20000;低频时,判断是否为高频
JNBOTHER2;大于20000贝U为高频,跳转
GOM2:
CALLFOR8253X
CALLWP
POPAX;
CALLBTROb
JMPX59
OTHER:
CALLANTHER;调用高频转低频程序,设定标志位和中断时间(10s)
JMPGOM
OTHER2:
CALLANTHER2调用低频转高频程序,设定标志位和中断时间(1s)JMPGOM2
X59:
MOVAL,20H
MOVDX,Port0
OUTDX,AL;
MOVCX,0050H;
XX59:
PUSHCX
CALLDIS;
POPCX
LOOPXX59;
POPBX
POPDX
POPAX;
LAST:
STI
IRET
出栈
将频率值转化为十进制,此时带有小数
中断响应后,将ISR相应位清0置循环显示的次数
调用显示程序,将频率值显示在数码管上
循环显示,直至下一次中断
断点回复
;DIS是显示子程序
DIS:
MOVCL,20H;
MOVBX,OFFSETBUFDIS1:
MOVAL,[BX]
PUSHBX
MOVBX,OFFSETLEDXLAT;
POPBX
MOVDX,ZXK;
OUTDX,AL
MOVAL,CL;
MOVDX,ZWK
OUTDX,AL
PUSHCX
MOVCX,0100H
DELAY:
LOOP$
准备好数码管位
换码,在LED表里面换取数据
输出字型位
输出字位位
POPex
CMPCL,01H
JZEXIT
INCBX
SHRCL,1;右移,显示下一个数码管
JMPDIS1
EXIT:
MOVAL,00H
MOVDX,ZWK
OUTDX,AL
RET;初始化显示‘000000'
WP:
MOVBUF,0
MOVBUF+1,0
MOVBUF+2,0
MOVBUF+3,0
MOVBUF+4,0
MOVBUF+5,0
RET
;频率转化程序
ANTHER:
MOVSI,OFFSETBUF1
MOVAL,00H
MOV[SI],AL;让高频转为低频
callFOR8253b;将中断时间设定位10秒
RET
ANTHER2:
MOVSI,OFFSETBUF1
MOVAL,01H
MOV[SI],AL;让低频转为高频
callFOR8253;将中断时间设定位1秒
RET
CODEENDS
ENDH8