微机原理实验课程设计
数据采集系统三(中断法)
班级:
姓名:
学号:
年月日 实验室
课程设计三 数据采集系统三(中断法)
一、课设目的:进一步掌握微机原理知识,了解微机在实时采集过程中的应用,学
习、掌握编程和程序调试方法。
二、仪器设备:微机,微机接口实验箱,示波器,三用表等。
三、课设内容和要求:
用中断法,将 ADC 0809 通道 0 外接 0 ~ 5V 电压,转换成数字量后,在七段 LED 数
码 管 上 , 以 小 数 点 后 两 位 ( 几 十 毫 伏 ) 的 精 度 , 显 示 其 模 拟 电 压 的 十 进 值 ;
0809 通道 0 的数字量以线性控制方式送 DAC0832 输出,当通道 0 的电压为 5V 时,0832 的 OUT
为 0V, 当通道 0 的电压为 0 时,0832 的 OUT 为 2.5V;此模拟电压再送到 ADC 0809 通道 1,
转换后的数字量在 CRT 上以十六进制显示。
ADC 0809 的 CLK 脉冲,由定时器 8254 的 OUT0 提供;ADC 0809 的 EOC 信号,用作
8259 中断请求信号。
要有较好的人机对话界面;控制程序的运行,
四、总体设计
1 、ADC 0809 的 IN0 采集电位器 0 — 5V 电压,IN1 采集 0832 输出的模拟量。
2 、DAC 0832 将 ADC 0809 的 IN0 数字量后重新转换成模拟量输出。
3、8259 用于检测 ADC 0809 转换是否结束和向 CPU 发送 INTR 信号
4, 8255 为七段 LED 数码管显示提供显示驱动信息。
5、七段 LED 数码管显示 ADC 0809 的 IN0 的值。
6、8254 提供 ADC 0809 的采样时钟脉冲。
7、有良好的人—机对话界面。系统运行时,显示主菜单,开始数据采集, 在数据采集时, 主
键盘有键按下, 退出返回 DOD 系统。
五、硬件设计
因采用了 PC 机和微机实验箱, 硬件电路设计相对比较简单, 主要利用微机实验箱上的
8255 并行口、ADC 0809、DAC 0832、七段 LED 数码管单元、8254 定时/计数器、74LS574 输
出接口、电位器等单元电路, 就构成了数据采集系统, 硬件电原理框图 4-3-1 所示。
1
2
3
4
XD0-XD7
D0-D7
/Y2
XIOW
XD0-XD7
XIOW
XIOR
XA2
XA3
/Y3
XD0-XD7
XIOW
XIOR
/Y0
XD0-XD7
XIOW
XIOR
INTR
/Y7
XD0-XD7
XIOW
XIOR
XA2
XA3
/Y1
XA5
XA6
XA7
0832
0832
8254
0809
8259
8255
74138
CS
WR
D0-D7
WR
RD
A0
A1
CS
D0-D7
WR
RD
CS
D0-D7
WR
RD
INTR
CS
D0-D7
WR
RD
A0
A1
CS
A
B
C
/G
D
C
B
A
Rfe
Iout1
2
Iout2
3
4
A
1
LM324
GATE0
1
1
+5V
6
5
1.8432MHZ
4
B
7
LM324
1
1
OUT
CLK0
OUT0
CLK
A
B
C
IN0
IN1
EOC
IR0
A0
XA2
XA3
XA4
10K
+5V
A2
PA0-PA5
L1-L6
数码管
键盘单元
PB0-PB7
A,B-G,Dp
/Y0
/Y1
/Y2
/Y3
/Y4
/Y5
/Y6
/Y7
图 4-3-1 数据采集系统三电原理框图
Title
1
2
Size
B
Date:
File:
Number
Revision
8-Jan-2011
Sheet of
D:\protel 99se\Library\Sch\sy.ddbDrawn By:
3
4
D
C
B
A
六、软件设计
本设计通过软件编程,实现模/数转换器 0809 分别对 IN0 0-5V 直流电压的采样,和经
0832 线性控制后输出电压的 IN1 采样,IN0 的值转换成十进制后,在七段数码管上显示; IN1
的值在显示器上显示。CPU 根据 IN0 的值,使八位发光二极管根据题目的要求,指示相应的
范围。
1、设计思想
数据采集系统分成六个功能模块,分别是主程序模块、量纲转换模块、数码管显示模块、
中断服务子程序模块。
(1)主程序模块
根据题目要求,采用中断方式实现数据采集,因此可把读取 IN0 的值并保存,和此数字
量经线性控制后送给 0832 输出, 作为 0809 IN1 的模拟电压和 IN1 的启动、读取以及 IN0
的 BCD 码转换, 放在中断服务子程序模块中完成。所以,在主程序模块上主要实现启动 0809
IN0、显示模块的调用、和中断结束部分程序。
(2) 量纲转换模块
量纲转换模块在中断服务程序内完成,只要将 IN0 的数字量分别除以 51, 商存入显示
IN0 的个位存储单元; 余数乘以十,再除以 51, 商存入十分位存储单元; 余数再乘以十,除
以 51, 若余数大于 25,则商加 1, 小于 25 则舍去, 这样就达到四舍五入的精度, 再把商存
入百分位存储单元; 以供七段数码管显示时调用,BCD 码转换模块可参考图 10 所示的流程
图。
(3) 数码管显示模块
数码管显示模块比较简单,自编程序可参考图 1-6 所示的流程图,也可参考实验 8255
并行口中的显示模块,应注意的是在显示个位时, 要加上小数点的显示,这可以在查表获取
个位段码后,再加上 80H 来实现,注意每一位显示后要适当延迟时间。
(4) 中断服务子程序模块
考虑到 0832 的输出是 0809 IN1 的输入,因此,为防止在执行中断服务子程序时,二次
进入中断服务子程序, 故在进入中断服务子程序后,应关闭中断,而在退出中断前开中断,以
便下次中断进入。中断服务子程序模块主要完成对 IN0 数据的读取和保存,对 IN1 的启动
和读取,对 IN0 数据的 BCD 转换等任务。
2. 参考流程图:
数据采集三主程序流程图如图 4-3-2 所示; 中断服务子程序如图 4-3-3 所示。数码管显示
子程序流程图如图 3-4-7 所示,
初 始 化
显示提示信息
关中断
保存原中断向量表内容
设置新的中断向量表
保存原中断屏蔽寄存器值
允许 IRQ2 中断
8254 初始化
开中断
启动 0809 IN0
FLAG=0FFH
IN0 值量纲转换后送显存
调用数码管显示子程序
将 IN1 的值进行 ASCII 码转换
显示器显示 IN1 的值
有键按下吗?
Y
恢复原中断屏蔽寄存器值
恢复原中断向量表内容
结
束
N
图 4-3-2 数据采集三主程序流程图
保护现场 ; 关中断
FLAG=0FFH ?
Y
读 IN0 值, 保存
N
读 IN1 值, 保存
七、运行结果
数码管显示:0.01~5.01;
对应 CRT 显示:IN0=00~FF;
IN1=83~00;
结果符合设计要求。
八、心得体会
在本次微机原理课程设计中,实践了多种外围芯片协同工作的综合系统,使自己对
80X86 系统硬件原理的认识,特别是接口地址及控制字的认识有了进一步提高。软件部分利
用中断法编程的方法,在掌握的基础上加深了对中断法的理解。
一直来,都感觉微机是实验课程非常有趣,它把课程上“纸上谈兵”式的理论讲解与分
析,变为真切的机器执行过程,可以看到各个寄存器的值随着一条条语句的执行而变化,内
存单元里的数据也在程序的指挥下被 CPU 调用和改变。最欢乐的是看见自己编的代码运行
后,实现了自己设定的功能,跑马灯,霓虹灯,虽然简单,却也是在好多次的失败与修改之
后才成功的。
本次课设开始时计划我主要是负责硬件连接。这种按照书本线路图连线的事是难不住我
的,虽然有很多线需要连接,但是经过我的合理安排,不到四十分钟线路连接就完成了,乍
一看乱乱的,但其中有我自己安排的条里,逐一检查了一遍也很快。之后,按老师写在黑板
上的方法进行硬件的自检,结果正确,硬件连接顺利完成。之后,便参与到软件编程的工作
中。这次的软件语言是要求完全由我们自己编写的,书本给出了程序的流程图,我与同伴尹
佳事先也写了程序,但第一次编译后得到的是 27 个错误的结果。逐一修改,发现有好些是
单纯语法上的错误,于是果断决定把微机原理课本上第三、四章的指令系统重新复习了一次。
修改完之后,编译是没有错误了,但执行之后,LED 数码管毫无反应,CRT 也不显示任何值,
分析原因是程序没有进入中断。纠结了半天,最后在多方讨教后发现是中断入口地址写错了,
修改了之后,顺利进入了中断程序。之后的调试便都是一些小问题的修改了。
通过这次微机原理课程设计,复习了整个微机课程及平时实验所学的大部分内容,加深
了对微机 80X86 系统软硬件的认识,使自己的动手编程能力得到了很大的提高。
感谢老师的指导!
九、代码
;ADC0809 端口设置
ADCIN0
ADCIN1
EQU
EQU
;8255 端口设置
EQU
EQU
EQU
EQU
PA55
PB55
PC55
CTR55
3000H ;ADC0809 端口地址,通道 IN0
3004H ;ADC0809 端口地址,通道 IN1
3020H ;8255 的 A 口地址
3024H ;8255 的 B 口地址
3028H ;8255 的 C 口地址
302CH ;8255 的控制寄存器地址
;DAC0832 端口设置
EQU
DAC
3040H ;DAC0832 端口地址
TIMER0
TIMER1
TIMER2
CTR54
;8254 端口设置
EQU
EQU
EQU
EQU
;8259 端口地址
3060H ;计数器 0 端口地址
3064H ;计数器 1 端口地址
3068H ;计数器 2 端口地址
306CH ;控制寄存器端口地址
;INTR 对应 PC 机内部 8259 的 OCW1 地址
;INTR 对应 PC 机内部 8259 的 OCW2 地址
;INTR 对应的中断屏蔽字
INTR_IVADD EQU 01C8H ;INTR 对应的中断矢量地址
EQU 0A1H
INTR_OCW1
EQU 0A0H
INTR_OCW2
EQU 0FBH
INTR_IM
EQU 30E0H ;片选 8259 端口地址
Y7
EQU Y7+00H ;系统中 8259ICW1 端口地址
MY59_ICW1
EQU Y7+04H ;系统中 8259ICW2 端口地址
MY59_ICW2
EQU Y7+04H ;系统中 8259ICW3 端口地址
MY59_ICW3
EQU Y7+04H ;系统中 8259ICW4 端口地址
MY59_ICW4
EQU Y7+04H ;系统中 8259OCW1 端口地址
MY59_OCW1
MY59_OCW2 EQU Y7+00H ;系统中 8259OCW2 端口地址
MY59_OCW3 EQU Y7+00H ;系统中 8259OCW3 端口地址
;-------------------------------------------------
STACK1 SEGMENT
DW 256 DUP(?)
STACK
;标志位
;保存 IN0 值
;保存 IN1 值
STACK1 ENDS
DATA SEGMENT
FLAG DB ?
IN0M DB ?
IN1M DB ?
TS
TP
WUI
TEN
RESULT DB 3 DUP (0)
DB 'PRESS
MES0
DB 'IN0=
MES2
$'
MES3
DB '
DB 02H
DB ?
DB 33H
DB 0AH
;存十进制结果
ANY
KEY
TO
EXIT!','$'
IN1=
$'
DCTBL DB 3Fh,06h,5Bh,4Fh,66h,6Dh,7Dh,07H,7Fh,6Fh;数码管的段码表
CS_BAK DW ?
IP_BAK DW ?
IM_BAK DB ?
DATA ENDS
CODE
;保存原中断处理程序入口段地址
;保存原中断处理程序入口偏移地址
;保存原中断屏蔽字的变量
SEGMENT
ASSUME
START: MOV
MOV
CLI
MOV
MOV
MOV
MOV
MOV
MOV
MOV
ADD
MOV
MOV
MOV
MOV
MOV
IN
MOV
AND
CS:CODE,DS:DATA,SS:STACK1
AX,DATA
DS,AX
AX,0000H
ES,AX
DI,INTR_IVADD
AX,ES:[DI]
IP_BAK,AX ;保存原中断入口偏移地址+
AX,OFFSET MYINT ;设置当前中断入口偏移地址
ES:[DI],AX
DI,2
AX,ES:[DI]
CS_BAK,AX ;保存原中断入口段地址
AX,SEG MYINT ;设置当前中断入口段地址
ES:[DI],AX
DX,INTR_OCW1
AL,DX
IM_BAK,AL ;保存原中断屏蔽字
AL,INTR_IM ;允许 PC 机内部 8259 的 IR2 中断