HEFEI UNIVERSITY
微机原理与接口技术
课程设计
系 别 电子信息与电气工程系 姓 名 梁 超 完成时间 2011-12-28
班 级 09自动化(1)班
蒋业万
目录
一、引言 .......................................................... 1 二、总体设计方案 .................................................. 1 (一)、软硬件流程图 ............................................. 2 (二)、源程序设计与硬件介绍 ..................................... 5 2.1 8086最小系统模块 .......................................... 5 2.2 芯片8255A ................................................. 6 2.3 芯片8253 .................................................. 7 2.4可编程控制芯片8259A ........................................ 8 (三)、遇到的问题 .............................. 错误!未定义书签。 三、总结与体会 .................................................... 9 四、参考文献: ................................................... 10 附录 ............................................................. 10
一、引言
汽车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。它关系着交易双方的利益。具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。因此,汽车计价器的研究也是十分有一个应用价值的。
我国在70年代开始出现出租车,但那时的计费系统大都是国外进口不但不够准确,价格还十分昂贵。随着改革开放日益深入,出租车行业的发展势头已十分突出,国内各机械厂家纷纷推出国产计价器。出租车计价器的功能从刚开始的只显示路程(需要司机自己定价,计算后四舍五入),到能够自主计费,以及现在的能够打一发票和语音提示、按时间自主变动单价等功能。随着城市旅游业的发展,出租车行业已成为城市的窗口,象征着一个城市的文明程度。
随着出租车行业的发展,出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。我们设计采用8086为主控器,以A44E霍尔传感器测距,实现对出租车的多功能的计价设计,输出采用8段数码显示管。
二、总体设计方案
利用8253作为定时/计数器,控制电机转速并测量电机的转数;8255作为输入输出接口,控制数码管显示启动后经过的里程数(小数点后取2位有效值)。 硬件连接说明:
直流电机控制器的基础上,增加了一个电机测速电路构成。
8255的B口作为数码管的笔划码驱动;C口的低4位作为段码控制,显示实际里程,同时,也用于输出键盘的列扫描码;PC6、PC7输入行扫描码,用于识别按键,程序中仅使用了PC6行上的四个按键,其定义如下:
X1:启动/停止键;X2:加速键,与X3、X4键组合使用;X3:“+”键;X4:“-”键。 A口仅使用了PA0,输出PWM脉冲信号,通过驱动芯片驱动电机,其输出电压的高低与PWM脉冲的占空比成正比。
电机的转数,通过霍尔元件变换为脉冲个数,送入8253的通道2,计数后,将转数转换为里程数,最小单位为0.01公里,送CPU记录,结果由数码管显示出来。
(一)、软硬件流程图
IRO中断处理流程图 IR7中断处理程序流程图
(二)、源程序设计与硬件介绍
中断程序
里程计数中断程序
每当霍尔传感器输出一个低电平信号就使中断一次,当里程计数器对里程脉冲计满1000次时,进入里程计数中断服务程序中,里程变量加一。主函数中总金额也相应地变化。 中途等待中断程序
在中途等待中断程序中,每1ms产生一次中断,将当前里程值送入某个缓存变量,每5分钟将缓存变量中的值和当前里程值比较,当汽车停止,霍尔传感器5分钟没有输出信号,当前里程值和缓存变量内的值相同,则进入等待计时,每5分钟记一次价格。 显示程序
显示程序利用定时器每1ms产生一次中断,相应变量置位,点亮一个数码管,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。 键盘程序
键盘采用查询的方式,放在主程序中,当没有按键按下的时候,循环主程序,一旦右按键按下,便转向相应的子程序处理,处理结束再返回。 2.1 8086最小系统模块
1、8086CPU构成的系统框图如图:
2.2 芯片8255A
1、 8255A的作用
本实验利用8255A将模拟量转换后的数字量传送到 CPU。此外,8255采用查询工作方式控制ADC0809工作。8086通过8255向七段LED显示器发送控制信号。
2、 8255A的功能分析
8255A是可编程并行接口,可以根据外界条件(I/O设备需要的信号线和它能提供的状态线)来使其构成多种接口电路。8255A内部有3个数据端口,即A口、B口、C口。A口有三种工作方式:即方式0、方式1和方式2,而B口只能工作在方式0或方式1下,而C口通常作为联络信号使用。本实验将控制字设为80H,初始化8255,使得 B口、C口为输出。
在三种工作方式中,本设计只使用了方式0,即方式0是基本的输入/输出方式,在这种方式下,三个端口都可以由程序规定为输入/出方式,但是不能既作为输入又作为输出,也没有提供固定的联络信号。C口分为两个4位---高4位和低4位,可以分别设置为输入或输出方式。 3、8255A的技术参数 8255A的引脚信号
CS:片选信号,低电平有效; A0、A1:地址信号。 JP52: PC口; JP53: PB口; JP56: PA口。
1)与外设相连的
PA7~PA0:A口数据信号线; PB7~PB0:B口数据信号线; PC7~PC0:C口数据信号线; 2)与CPU相连的
RESET:复位信号。当此信号来时,所有寄存器都被清除。同时三个数据端口被自动置为输入端口。
D7~D0:它们是8255A的数据线和系统总线相连。
CS:片选信号。在系统中,一般根据全部接口芯片来分配若于低位地址(比如
A5、A4、A3)组成各种芯片选择码,当这几位地址组成某一个低电平,于8255A被选中。只有当有效时,读信号写才对8255进行读写。
RD:读信号。当此信号有效时,CPU可从8255A中读取数据。 WR:写信号。当此信号有效时,CPU可向8255A中写入数据。
A1、A0:端口选择信号。8255A内部有3个数据端口和1个控制端口,共4个端口。规定:
A1、A0为00时,选中A端口; A1、A0为01时,选中B端口; A1、A0为10时,选中C端口; A1、A0为11时,选中控制口。 4、 8255A的方式控制字
8255A的控制字有两种:一种是方式选择控制字,另一种是C口按位置位/复位控制字
① 方式选择控制字
图1 8255A的方式控制字表
② C口按位置位/复位控制字
图2 8255A的置位/控制字表 2.3 芯片8253
1、 8253的功能分析
Intel8253是NMOS工艺制成的可编程计数器/定时器,有几种芯片型号,外形引脚及功能都是兼容的,只是工作的最高计数速率有所差异,例如8253(2.6MHz),8253-5(5MHz)
8253内部有三个计数器,分别成为计数器0、计数器1和计数器2,他们的机构完全相同。每个计数器的输入和输出都决定于设置在控制寄存器中的控制字,互相之间工作完全独立。每个计数器通过三个引脚和外部联系,一个为时钟输入端CLK,一个为门控信号输入端GATE,另一个为输出端OUT。每个计数器内部有一个8位的控制寄存器,还有一个16位的计数初值寄存器CR、一个计
数执行部件CE和一个输出锁存器OL。
执行部件实际上是一个16位的减法计数器,它的起始值就是初值寄存器的值,而初始值寄存器的值是通过程序设置的。输出锁存器的值是通过程序设置的。输出锁存器OL用来锁存计数执行部件CE的内容,从而使CPU可以对此进行读操作。顺便提一下,CR、CE和OL都是16位寄存器,但是也可以作8位寄存器来用1、8253的作用
2、8253的引脚信号
CS:片选信号,低电平有效;
A0、A1:地址信号;
2.4可编程控制芯片8259A
8259A的原理
一片8959A有8条中断请求线IR0~IR7,8259A被操作系统初始化后,就可以接收中断信号了。8259A从IR请求线上接受中断信号,每个请求线有一个触发器来保 存请求信号,从而形成中断请求寄存器(IRR)。同时如果中断请求信号线上不是被屏蔽的,8259A向CPU发出 INT信号,请求中断。这时如果CPU是处于允许中断状况,CPU就会发送INTA信号给8259A进入中断响应周期。如果有多个请求信号同时到达,8259A的优先权电路会对各个请求进行优先权选择,将最高先权的请求在中断响应周期送到中断服务寄存器(ISR)中将它置位,同时复位IRR中的相应位。接着CPU再次发送一个INTA脉冲给8259A,启动另外一个中断相应周期。8259A在这个相应周期向数据总线的D0-D7上输入一个中断向量。CPU根据该向量的值*4后就可以从中断入口地址表(IDT )中取出中断服务程序的入口地址而转入中断服务程序。而8259A如果工作在自动结束中断(AEOI)模式时会自动使其ISR中的相应位复位,否则需要发出EOI命令使ISR复位。
在老式的PC-XT/AT中,一般使用一片8259A进行中断信号请求。在现代的多数PC中,一般都会采用两片8259A作为级连。其中一片是Master一片是Slave,由于Master上的一个中断请求线需要连接到Slave的INT脚,所以实际可以使用的外部中断个数是15(8*2 – 1)个。
8259A结构
1、数据总线缓冲器--D7~D0
数据总线缓冲器为三态、双向、8位寄存器,数据线D7~D0与CPU系统总线连接,构成CPU与8259A之间信息传送的通道。
2、读/写控制逻辑--WR/WD
读/写控制逻辑用来接收CPU系统总线的读/写控制信号和端口地址选择信号,用于控制8259A内部寄存器的读/写操作。
3、级联缓冲/比较器
8259A既可以工作于单片方式,也可以工作于多片级联方式,级联方式硬件连接如图6.10所示。级联缓冲/比较器提供多片8259A的管理和选择功能,其中一片为主片,其余为从片。
4、中断控制逻辑
中断控制逻辑按照编程设定的工作方式管理中断,负责向片内各部件发送控制信号,向CPU发送中断请求信号INT和接收CPU回送的中断响应信号INTA,控制8259A进入中断管理状态。
5、中断请求寄存器(interrupt request register,IRR)
IRR是一个8位寄存器,用于记录外部中断请求。其中D7~D0分别与外部中断请求信号IR7~IR0相对应,当IRi(i=0~7)有请求(电平或边沿触发)时,IRR中的相应位Di置1,在中断响应信号INTA有效时,DI被清除。
6、中断服务寄存器(interrupt service register,ISR)
ISR是一个8位寄存器,用于记录CPU当前正在服务的中断标志。当外部中断IRi(i=0~7)的请求得到CPU响应进入服务时,由CPU发来的第一个中断响应脉冲INTA将ISR中的相应位Di(i=0~7)置1,而ISR的复位则由8259A中断结束方式决定。若定义为自动结束方式,则由CPU发来的第二个中断响应脉冲INTA的后沿将Di复位为0;若定义为非自动结束方式,则由CPU发送来的中断结束命令将其复位。
7、中断屏蔽寄存器(interrupt mask register,IMR)
IMR是一个8位寄存器,用来存放IR7~IR0的中断屏蔽标志。它的8个屏蔽位D7~D0与外部中断请求IR7~IR0相对应,用于控制IRi的请求是否允许进入。当IMR中的Di位为1时,对应的IRi请求被禁止;当IMR中的Di位为0时,则允许对应的中断请求进入。它可以由软件设置或清除,通过编程设定屏蔽字,可以改变原来的优先级别。
程序代码见附录
三、总结与体会
作为一名自动化的大三学生,我觉得做微机程设计是十分有意义的,而且是十分必要的。在已度过的大学时间里,我们大多数接触的是专业课。我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?如何把我们所学的专业基础课理论知识运用到实践中去呢?我想做类似的课程设计就为我们提供了良好的实践平台。
在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。其次,在这次课程设计中,我们运用到了以前所学的专业课知识,如:汇编语言、模拟和数字电路知识等。虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。另外,
这次课程设计让我感到了团队合作的重要性。在团队中,我们互帮互助,对整个课程设计来说,这是至关重要的,缺少每一个人都会对我们的设计产生影响。还有要感谢指导老师在我们遇到困难时,给予我们的建议与鼓励。两周的课程设计结束了,但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。
为期两个星期的毕业设计即将接近尾声,在刘老师和王老师的亲切指导和同学的帮助下,此次设计才得以完成,在此向所有给予我此次课程设计指导和帮助的老师和同学表示最诚挚的感谢:
四、参考文献
1.周荷琴,吴秀清 《微机计算机原理与接口技术 第四版》
2.周常森 《电子电路计算机仿真技术》
3.杨素行 《微型计算机系统原理及应用》
附录
;计价器(利用调速控制器控制电机的旋转,读出总里程数)
DATA SEGMENT
T EQU 100 ;定时周期时间(基本周期*T)
T_HI DB 50 ;高电平持续时间(基本周期*T_HI)
NOW_T DB T
NOW_HI DB 50
T8253 EQU 609 ;定时器8253的初值=1.19M*0.512MS(基本周期)=609
RUN DB 0 ;启停标志
SPEED DW 0 ; 里程数
STEP DW 50 ;10米的8253脉冲个数(即每来50个脉冲,则前进10米) TAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;0~9的显示码
DISP DB 4 DUP (0),52H;存储转速
DATA ENDS
STACK SEGMENT STACK
DW 64 DUP(?) ;定义堆栈段
STACK ENDS
CODE SEGMENT ;代码段定义
ASSUME CS:CODE,DS:DATA ;段指定
START: MOV AX,DATA
MOV DS,AX
PUSH DS ;当前用户DS段入栈保存
MOV
MOV
MOV
ADD
MOV
MOV
MOV
MOV
MOV
MOV
ADD
MOV
MOV
MOV
MOV
MOV
POP
MOV
OUT
MOV
OUT
MOV
OUT
MOV
OUT
MOV
OUT
MOV
OUT
MOV
OUT
MOV
OUT
MOV
OUT
MOV
OUT
MOV
OUT
口低4位输出
MOV
OUT
STI
AX,0000H DS,AX ;修改DS=0000H,指向中断矢量表所在段 AX,OFFSET IRQ0 ;取出中断处理子程序的入口偏移地址(以0为基准) AX,2000H ;修正,实际地址=装入地址的偏移量+相对于0起始的偏移量 SI,0020H ;IR0中断矢量号为08H,处于矢量表的20H~23H [SI],AX ;将偏移地址装入矢量表 AX,0000H SI,0022H [SI],AX ;将段地址(0000H)装入矢量表 AX,OFFSET IRQ7 AX,2000H SI,0003CH [SI],AX ;将偏移地址装入IRQ7的中断矢量 AX,0000H SI,003EH [SI],AX ;将段地址(0000H)装入矢量表 DS ;恢复用户数据段DS AL,13H 20H,AL ;写入ICW1 AL,08H 21H,AL ;写入ICW2 AL,01H 21H,AL ;写入ICW4 AL,7EH ;D7,D0位复位为0 21H,AL ;写入OCW1(IMR);开放8259A的IR7和IR0中断 AL,34H ;设定8253通道0的工作方式,00110100B 43H,AL ;CH0采用先写低8位,后写高8位,方式2,二进制计数 AX,T8253 ;计数初值为基本周期 40H,AL ;写入CH0 AL,AH 40H,AL AL,0B6H ;设定8253通道2的工作方式,10110110B 43H,AL ;CH2采用先写低8位,后写高8位=0,方式3,二进制计数 AX,STEP 42H,AL AL,AH 42H,AL ;写入CH2 AL,88H ;写入8255A的方式控制字,设定工作方式为10001000B 63H,AL ;即A口方式0输出,C口高4位输入,B口方式0输出,CAL,00H 60H,AL ;关电机 ;开中断
A1: MOV
MOV
MOV
A11: AND
MOV
AND
MOV
DEC
MOV
MOV
ROR
DEC
JNZ
MOV
CALL
MOV
OUT
IN
AND
JZ
JMP
A2: MOV
MOV
MOV
A21: INC
ROL
MOV
OUT
IN
TEST
JNZ
CALL
CALL
IN
AND
JNZ
CMP
JNZ
OR
JMP
RELEA: CALL
MOV
OUT
IN
SI,OFFSET DISP BL,2 AX,SPEED AL,0FH [SI+3],AL AH,0FH [SI+1],AH SI AX,SPEED CL,4 AX,CL BL A11 ;将速度的压缩BCD码转换为非压缩码,存入缓冲区SI,OFFSET DISP DISPLAY AL,00H ;打开开关扫描 62H,AL AL,62H ;读C口 AL,40H A2 ;有键按下,转读键盘 EXIT AH,00H ;记录按键扫描码 CX,04 ;循环扫描4次 DL,77H ;打开第一行的开关扫描 AH ;扫描码+1 DL,1 AL,DL 62H,AL ;打开一行的开关扫描 AL,62H ;读C口 AL,40H ;取PC6(Y1) A22 ;无键按下,转 DALEY DALEY ;去抖动 AL,62H ;读C口 AL,40H ;取PC6(Y1) A22 ;是抖动,转 AH,2 RELEA ;不是加速键,转(单独按下加速键无效) AH,80H ;是加速键,则D7位=1 A22 DISPLAY AL,DL 62H,AL AL,62H
AND
JZ
JMP AL,40H ;等待键释放 RELEA A23 ;AH存扫描码,=1(X1键按下)启停,=2加速,=3'+',=4'-'键 A22:LOOP
JMP
A23: MOV
AND
CMP
JNZ
MOV
TEST
JNZ
MOV
MOV
MOV
MOV
MOV
JMP
A24: MOV
MOV
OUT
JMP
A3: MOV
AND
CMP
JNZ
MOV
TEST
JZ
MOV
A4: ADD
CMP
JBE
MOV
A5: MOV
JMP
A6: MOV
AND
CMP
JNZ
MOV
TEST
JZ
MOV
A21 EXIT AL,AH AL,0FH AL,01H A3 AL,RUN AL,01H A24 RUN,01 NOW_T,T AL,T_HI NOW_HI,AL SPEED,00 EXIT RUN,00 AL,00H 60H,AL EXIT AL,AH AL,0FH AL,03 A6 BL,1 AH,80H A4 BL,10 BL,T_HI BL,100 A5 BL,100 T_HI,BL EXIT AL,AH AL,0FH AL,04 EXIT BH,01 AH,80H A7 BH,10 ;不是按下启停键,则转 ;原为启动,则转停止 ;置位启动标志 ;重装定时周期 ;重装高电平定时时间 ;重新计价(里程) ;复位启动标志 ;关电机 ;不是'+'键,转 ;没按加速键,转 ;按加速键,加10,正常加1 ;增加的百分比不能>100% ;不是'-'键,转 ;没按加速键,转 ;按加速键,-10,正常-1
A7: MOV BL,T_HI
SUB BL,BH
JNC A8
MOV BL,00
A8: MOV T_HI,BL ;最小的百分比为0%
EXIT: JMP A1
;8259A的IR0中断处理子程序(8253的CH0定时基本周期0.512MS) IRQ0: PUSH AX
STI
MOV AL,RUN
AND AL,AL
JZ IREXIT ;不启动,则转测速度
MOV AL,NOW_T
SUB AL,1
JNZ IRSP1
MOV NOW_T,T ;重装定时周期
MOV AL,T_HI
MOV NOW_HI,AL ;重装高电平定时时间
JMP IREXIT
IRSP1: MOV NOW_T,AL ;保存-1后的定时周期
MOV AL,NOW_HI
TEST AL,AL
JNZ IRSP2
MOV AH,00H ;高电平持续时间到,则PA0输出为0 JMP IRSP3
IRSP2: SUB AL,1 ;高电平持续时间不到
MOV NOW_HI,AL ;保存-1后的值
MOV AH,01H ;PA0输出为1,高电平
IRSP3: MOV AL,AH
OUT 60H,AL
IREXIT: MOV AL,20H ;常规EOI中断结束指令
OUT 20H,AL ;写入8259A的OCW2
CLI
POP AX
IRET ;中断返回
;8259A的IR7中断处理子程序(8253的CH2计数中断,10米到) IRQ7: PUSH AX
STI
MOV AX,SPEED
ADD AL,01
DAA
XCHG AL,AH
ADC AL,00
DAA
XCHG MOV MOV OUT CLI POP IRET ;显示子程序
DISPLAY:PUSH AL,AH SPEED,AX AL,20H 20H,AL AX ;常规EOI中断结束指令 ;写入8259A的OCW2 ;中断返回 AX PUSH PUSH PUSH PUSH MOV MOV MOV MOV DISP1: ROL MOV XLAT TEST JNZ OR DISP2: OUT MOV OUT CALL INC LOOP XOR OUT POP POP POP POP POP RET ;延时子程序 DALEY: PUSH MOV DALEY1:LOOP POP RET CODE ENDS BX CX DX SI CX,4 DL,7FH SI,OFFSET DISP BX,OFFSET TAB DL,1 AL,[SI] ;查表转换为显示码 DL,02H DISP2 ;是第二位显示吗? AL,80H ;是,加小数点 61H,AL AL,DL ;允许X1、X2、X3、X4(PC3~PC0)数码管依次选通62H,AL DALEY SI DISP1 ;四次循环,显示转速 AL,AL 61H,AL ;关显示 SI DX CX BX AX CX CX,0560H ;置内循环次数 DALEY1 ;共循环0560H次,以完成延时 CX
END START
HEFEI UNIVERSITY
微机原理与接口技术
课程设计
系 别 电子信息与电气工程系 姓 名 梁 超 完成时间 2011-12-28
班 级 09自动化(1)班
蒋业万
目录
一、引言 .......................................................... 1 二、总体设计方案 .................................................. 1 (一)、软硬件流程图 ............................................. 2 (二)、源程序设计与硬件介绍 ..................................... 5 2.1 8086最小系统模块 .......................................... 5 2.2 芯片8255A ................................................. 6 2.3 芯片8253 .................................................. 7 2.4可编程控制芯片8259A ........................................ 8 (三)、遇到的问题 .............................. 错误!未定义书签。 三、总结与体会 .................................................... 9 四、参考文献: ................................................... 10 附录 ............................................................. 10
一、引言
汽车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。它关系着交易双方的利益。具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。因此,汽车计价器的研究也是十分有一个应用价值的。
我国在70年代开始出现出租车,但那时的计费系统大都是国外进口不但不够准确,价格还十分昂贵。随着改革开放日益深入,出租车行业的发展势头已十分突出,国内各机械厂家纷纷推出国产计价器。出租车计价器的功能从刚开始的只显示路程(需要司机自己定价,计算后四舍五入),到能够自主计费,以及现在的能够打一发票和语音提示、按时间自主变动单价等功能。随着城市旅游业的发展,出租车行业已成为城市的窗口,象征着一个城市的文明程度。
随着出租车行业的发展,出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。我们设计采用8086为主控器,以A44E霍尔传感器测距,实现对出租车的多功能的计价设计,输出采用8段数码显示管。
二、总体设计方案
利用8253作为定时/计数器,控制电机转速并测量电机的转数;8255作为输入输出接口,控制数码管显示启动后经过的里程数(小数点后取2位有效值)。 硬件连接说明:
直流电机控制器的基础上,增加了一个电机测速电路构成。
8255的B口作为数码管的笔划码驱动;C口的低4位作为段码控制,显示实际里程,同时,也用于输出键盘的列扫描码;PC6、PC7输入行扫描码,用于识别按键,程序中仅使用了PC6行上的四个按键,其定义如下:
X1:启动/停止键;X2:加速键,与X3、X4键组合使用;X3:“+”键;X4:“-”键。 A口仅使用了PA0,输出PWM脉冲信号,通过驱动芯片驱动电机,其输出电压的高低与PWM脉冲的占空比成正比。
电机的转数,通过霍尔元件变换为脉冲个数,送入8253的通道2,计数后,将转数转换为里程数,最小单位为0.01公里,送CPU记录,结果由数码管显示出来。
(一)、软硬件流程图
IRO中断处理流程图 IR7中断处理程序流程图
(二)、源程序设计与硬件介绍
中断程序
里程计数中断程序
每当霍尔传感器输出一个低电平信号就使中断一次,当里程计数器对里程脉冲计满1000次时,进入里程计数中断服务程序中,里程变量加一。主函数中总金额也相应地变化。 中途等待中断程序
在中途等待中断程序中,每1ms产生一次中断,将当前里程值送入某个缓存变量,每5分钟将缓存变量中的值和当前里程值比较,当汽车停止,霍尔传感器5分钟没有输出信号,当前里程值和缓存变量内的值相同,则进入等待计时,每5分钟记一次价格。 显示程序
显示程序利用定时器每1ms产生一次中断,相应变量置位,点亮一个数码管,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。 键盘程序
键盘采用查询的方式,放在主程序中,当没有按键按下的时候,循环主程序,一旦右按键按下,便转向相应的子程序处理,处理结束再返回。 2.1 8086最小系统模块
1、8086CPU构成的系统框图如图:
2.2 芯片8255A
1、 8255A的作用
本实验利用8255A将模拟量转换后的数字量传送到 CPU。此外,8255采用查询工作方式控制ADC0809工作。8086通过8255向七段LED显示器发送控制信号。
2、 8255A的功能分析
8255A是可编程并行接口,可以根据外界条件(I/O设备需要的信号线和它能提供的状态线)来使其构成多种接口电路。8255A内部有3个数据端口,即A口、B口、C口。A口有三种工作方式:即方式0、方式1和方式2,而B口只能工作在方式0或方式1下,而C口通常作为联络信号使用。本实验将控制字设为80H,初始化8255,使得 B口、C口为输出。
在三种工作方式中,本设计只使用了方式0,即方式0是基本的输入/输出方式,在这种方式下,三个端口都可以由程序规定为输入/出方式,但是不能既作为输入又作为输出,也没有提供固定的联络信号。C口分为两个4位---高4位和低4位,可以分别设置为输入或输出方式。 3、8255A的技术参数 8255A的引脚信号
CS:片选信号,低电平有效; A0、A1:地址信号。 JP52: PC口; JP53: PB口; JP56: PA口。
1)与外设相连的
PA7~PA0:A口数据信号线; PB7~PB0:B口数据信号线; PC7~PC0:C口数据信号线; 2)与CPU相连的
RESET:复位信号。当此信号来时,所有寄存器都被清除。同时三个数据端口被自动置为输入端口。
D7~D0:它们是8255A的数据线和系统总线相连。
CS:片选信号。在系统中,一般根据全部接口芯片来分配若于低位地址(比如
A5、A4、A3)组成各种芯片选择码,当这几位地址组成某一个低电平,于8255A被选中。只有当有效时,读信号写才对8255进行读写。
RD:读信号。当此信号有效时,CPU可从8255A中读取数据。 WR:写信号。当此信号有效时,CPU可向8255A中写入数据。
A1、A0:端口选择信号。8255A内部有3个数据端口和1个控制端口,共4个端口。规定:
A1、A0为00时,选中A端口; A1、A0为01时,选中B端口; A1、A0为10时,选中C端口; A1、A0为11时,选中控制口。 4、 8255A的方式控制字
8255A的控制字有两种:一种是方式选择控制字,另一种是C口按位置位/复位控制字
① 方式选择控制字
图1 8255A的方式控制字表
② C口按位置位/复位控制字
图2 8255A的置位/控制字表 2.3 芯片8253
1、 8253的功能分析
Intel8253是NMOS工艺制成的可编程计数器/定时器,有几种芯片型号,外形引脚及功能都是兼容的,只是工作的最高计数速率有所差异,例如8253(2.6MHz),8253-5(5MHz)
8253内部有三个计数器,分别成为计数器0、计数器1和计数器2,他们的机构完全相同。每个计数器的输入和输出都决定于设置在控制寄存器中的控制字,互相之间工作完全独立。每个计数器通过三个引脚和外部联系,一个为时钟输入端CLK,一个为门控信号输入端GATE,另一个为输出端OUT。每个计数器内部有一个8位的控制寄存器,还有一个16位的计数初值寄存器CR、一个计
数执行部件CE和一个输出锁存器OL。
执行部件实际上是一个16位的减法计数器,它的起始值就是初值寄存器的值,而初始值寄存器的值是通过程序设置的。输出锁存器的值是通过程序设置的。输出锁存器OL用来锁存计数执行部件CE的内容,从而使CPU可以对此进行读操作。顺便提一下,CR、CE和OL都是16位寄存器,但是也可以作8位寄存器来用1、8253的作用
2、8253的引脚信号
CS:片选信号,低电平有效;
A0、A1:地址信号;
2.4可编程控制芯片8259A
8259A的原理
一片8959A有8条中断请求线IR0~IR7,8259A被操作系统初始化后,就可以接收中断信号了。8259A从IR请求线上接受中断信号,每个请求线有一个触发器来保 存请求信号,从而形成中断请求寄存器(IRR)。同时如果中断请求信号线上不是被屏蔽的,8259A向CPU发出 INT信号,请求中断。这时如果CPU是处于允许中断状况,CPU就会发送INTA信号给8259A进入中断响应周期。如果有多个请求信号同时到达,8259A的优先权电路会对各个请求进行优先权选择,将最高先权的请求在中断响应周期送到中断服务寄存器(ISR)中将它置位,同时复位IRR中的相应位。接着CPU再次发送一个INTA脉冲给8259A,启动另外一个中断相应周期。8259A在这个相应周期向数据总线的D0-D7上输入一个中断向量。CPU根据该向量的值*4后就可以从中断入口地址表(IDT )中取出中断服务程序的入口地址而转入中断服务程序。而8259A如果工作在自动结束中断(AEOI)模式时会自动使其ISR中的相应位复位,否则需要发出EOI命令使ISR复位。
在老式的PC-XT/AT中,一般使用一片8259A进行中断信号请求。在现代的多数PC中,一般都会采用两片8259A作为级连。其中一片是Master一片是Slave,由于Master上的一个中断请求线需要连接到Slave的INT脚,所以实际可以使用的外部中断个数是15(8*2 – 1)个。
8259A结构
1、数据总线缓冲器--D7~D0
数据总线缓冲器为三态、双向、8位寄存器,数据线D7~D0与CPU系统总线连接,构成CPU与8259A之间信息传送的通道。
2、读/写控制逻辑--WR/WD
读/写控制逻辑用来接收CPU系统总线的读/写控制信号和端口地址选择信号,用于控制8259A内部寄存器的读/写操作。
3、级联缓冲/比较器
8259A既可以工作于单片方式,也可以工作于多片级联方式,级联方式硬件连接如图6.10所示。级联缓冲/比较器提供多片8259A的管理和选择功能,其中一片为主片,其余为从片。
4、中断控制逻辑
中断控制逻辑按照编程设定的工作方式管理中断,负责向片内各部件发送控制信号,向CPU发送中断请求信号INT和接收CPU回送的中断响应信号INTA,控制8259A进入中断管理状态。
5、中断请求寄存器(interrupt request register,IRR)
IRR是一个8位寄存器,用于记录外部中断请求。其中D7~D0分别与外部中断请求信号IR7~IR0相对应,当IRi(i=0~7)有请求(电平或边沿触发)时,IRR中的相应位Di置1,在中断响应信号INTA有效时,DI被清除。
6、中断服务寄存器(interrupt service register,ISR)
ISR是一个8位寄存器,用于记录CPU当前正在服务的中断标志。当外部中断IRi(i=0~7)的请求得到CPU响应进入服务时,由CPU发来的第一个中断响应脉冲INTA将ISR中的相应位Di(i=0~7)置1,而ISR的复位则由8259A中断结束方式决定。若定义为自动结束方式,则由CPU发来的第二个中断响应脉冲INTA的后沿将Di复位为0;若定义为非自动结束方式,则由CPU发送来的中断结束命令将其复位。
7、中断屏蔽寄存器(interrupt mask register,IMR)
IMR是一个8位寄存器,用来存放IR7~IR0的中断屏蔽标志。它的8个屏蔽位D7~D0与外部中断请求IR7~IR0相对应,用于控制IRi的请求是否允许进入。当IMR中的Di位为1时,对应的IRi请求被禁止;当IMR中的Di位为0时,则允许对应的中断请求进入。它可以由软件设置或清除,通过编程设定屏蔽字,可以改变原来的优先级别。
程序代码见附录
三、总结与体会
作为一名自动化的大三学生,我觉得做微机程设计是十分有意义的,而且是十分必要的。在已度过的大学时间里,我们大多数接触的是专业课。我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?如何把我们所学的专业基础课理论知识运用到实践中去呢?我想做类似的课程设计就为我们提供了良好的实践平台。
在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。其次,在这次课程设计中,我们运用到了以前所学的专业课知识,如:汇编语言、模拟和数字电路知识等。虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。另外,
这次课程设计让我感到了团队合作的重要性。在团队中,我们互帮互助,对整个课程设计来说,这是至关重要的,缺少每一个人都会对我们的设计产生影响。还有要感谢指导老师在我们遇到困难时,给予我们的建议与鼓励。两周的课程设计结束了,但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。
为期两个星期的毕业设计即将接近尾声,在刘老师和王老师的亲切指导和同学的帮助下,此次设计才得以完成,在此向所有给予我此次课程设计指导和帮助的老师和同学表示最诚挚的感谢:
四、参考文献
1.周荷琴,吴秀清 《微机计算机原理与接口技术 第四版》
2.周常森 《电子电路计算机仿真技术》
3.杨素行 《微型计算机系统原理及应用》
附录
;计价器(利用调速控制器控制电机的旋转,读出总里程数)
DATA SEGMENT
T EQU 100 ;定时周期时间(基本周期*T)
T_HI DB 50 ;高电平持续时间(基本周期*T_HI)
NOW_T DB T
NOW_HI DB 50
T8253 EQU 609 ;定时器8253的初值=1.19M*0.512MS(基本周期)=609
RUN DB 0 ;启停标志
SPEED DW 0 ; 里程数
STEP DW 50 ;10米的8253脉冲个数(即每来50个脉冲,则前进10米) TAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;0~9的显示码
DISP DB 4 DUP (0),52H;存储转速
DATA ENDS
STACK SEGMENT STACK
DW 64 DUP(?) ;定义堆栈段
STACK ENDS
CODE SEGMENT ;代码段定义
ASSUME CS:CODE,DS:DATA ;段指定
START: MOV AX,DATA
MOV DS,AX
PUSH DS ;当前用户DS段入栈保存
MOV
MOV
MOV
ADD
MOV
MOV
MOV
MOV
MOV
MOV
ADD
MOV
MOV
MOV
MOV
MOV
POP
MOV
OUT
MOV
OUT
MOV
OUT
MOV
OUT
MOV
OUT
MOV
OUT
MOV
OUT
MOV
OUT
MOV
OUT
MOV
OUT
MOV
OUT
口低4位输出
MOV
OUT
STI
AX,0000H DS,AX ;修改DS=0000H,指向中断矢量表所在段 AX,OFFSET IRQ0 ;取出中断处理子程序的入口偏移地址(以0为基准) AX,2000H ;修正,实际地址=装入地址的偏移量+相对于0起始的偏移量 SI,0020H ;IR0中断矢量号为08H,处于矢量表的20H~23H [SI],AX ;将偏移地址装入矢量表 AX,0000H SI,0022H [SI],AX ;将段地址(0000H)装入矢量表 AX,OFFSET IRQ7 AX,2000H SI,0003CH [SI],AX ;将偏移地址装入IRQ7的中断矢量 AX,0000H SI,003EH [SI],AX ;将段地址(0000H)装入矢量表 DS ;恢复用户数据段DS AL,13H 20H,AL ;写入ICW1 AL,08H 21H,AL ;写入ICW2 AL,01H 21H,AL ;写入ICW4 AL,7EH ;D7,D0位复位为0 21H,AL ;写入OCW1(IMR);开放8259A的IR7和IR0中断 AL,34H ;设定8253通道0的工作方式,00110100B 43H,AL ;CH0采用先写低8位,后写高8位,方式2,二进制计数 AX,T8253 ;计数初值为基本周期 40H,AL ;写入CH0 AL,AH 40H,AL AL,0B6H ;设定8253通道2的工作方式,10110110B 43H,AL ;CH2采用先写低8位,后写高8位=0,方式3,二进制计数 AX,STEP 42H,AL AL,AH 42H,AL ;写入CH2 AL,88H ;写入8255A的方式控制字,设定工作方式为10001000B 63H,AL ;即A口方式0输出,C口高4位输入,B口方式0输出,CAL,00H 60H,AL ;关电机 ;开中断
A1: MOV
MOV
MOV
A11: AND
MOV
AND
MOV
DEC
MOV
MOV
ROR
DEC
JNZ
MOV
CALL
MOV
OUT
IN
AND
JZ
JMP
A2: MOV
MOV
MOV
A21: INC
ROL
MOV
OUT
IN
TEST
JNZ
CALL
CALL
IN
AND
JNZ
CMP
JNZ
OR
JMP
RELEA: CALL
MOV
OUT
IN
SI,OFFSET DISP BL,2 AX,SPEED AL,0FH [SI+3],AL AH,0FH [SI+1],AH SI AX,SPEED CL,4 AX,CL BL A11 ;将速度的压缩BCD码转换为非压缩码,存入缓冲区SI,OFFSET DISP DISPLAY AL,00H ;打开开关扫描 62H,AL AL,62H ;读C口 AL,40H A2 ;有键按下,转读键盘 EXIT AH,00H ;记录按键扫描码 CX,04 ;循环扫描4次 DL,77H ;打开第一行的开关扫描 AH ;扫描码+1 DL,1 AL,DL 62H,AL ;打开一行的开关扫描 AL,62H ;读C口 AL,40H ;取PC6(Y1) A22 ;无键按下,转 DALEY DALEY ;去抖动 AL,62H ;读C口 AL,40H ;取PC6(Y1) A22 ;是抖动,转 AH,2 RELEA ;不是加速键,转(单独按下加速键无效) AH,80H ;是加速键,则D7位=1 A22 DISPLAY AL,DL 62H,AL AL,62H
AND
JZ
JMP AL,40H ;等待键释放 RELEA A23 ;AH存扫描码,=1(X1键按下)启停,=2加速,=3'+',=4'-'键 A22:LOOP
JMP
A23: MOV
AND
CMP
JNZ
MOV
TEST
JNZ
MOV
MOV
MOV
MOV
MOV
JMP
A24: MOV
MOV
OUT
JMP
A3: MOV
AND
CMP
JNZ
MOV
TEST
JZ
MOV
A4: ADD
CMP
JBE
MOV
A5: MOV
JMP
A6: MOV
AND
CMP
JNZ
MOV
TEST
JZ
MOV
A21 EXIT AL,AH AL,0FH AL,01H A3 AL,RUN AL,01H A24 RUN,01 NOW_T,T AL,T_HI NOW_HI,AL SPEED,00 EXIT RUN,00 AL,00H 60H,AL EXIT AL,AH AL,0FH AL,03 A6 BL,1 AH,80H A4 BL,10 BL,T_HI BL,100 A5 BL,100 T_HI,BL EXIT AL,AH AL,0FH AL,04 EXIT BH,01 AH,80H A7 BH,10 ;不是按下启停键,则转 ;原为启动,则转停止 ;置位启动标志 ;重装定时周期 ;重装高电平定时时间 ;重新计价(里程) ;复位启动标志 ;关电机 ;不是'+'键,转 ;没按加速键,转 ;按加速键,加10,正常加1 ;增加的百分比不能>100% ;不是'-'键,转 ;没按加速键,转 ;按加速键,-10,正常-1
A7: MOV BL,T_HI
SUB BL,BH
JNC A8
MOV BL,00
A8: MOV T_HI,BL ;最小的百分比为0%
EXIT: JMP A1
;8259A的IR0中断处理子程序(8253的CH0定时基本周期0.512MS) IRQ0: PUSH AX
STI
MOV AL,RUN
AND AL,AL
JZ IREXIT ;不启动,则转测速度
MOV AL,NOW_T
SUB AL,1
JNZ IRSP1
MOV NOW_T,T ;重装定时周期
MOV AL,T_HI
MOV NOW_HI,AL ;重装高电平定时时间
JMP IREXIT
IRSP1: MOV NOW_T,AL ;保存-1后的定时周期
MOV AL,NOW_HI
TEST AL,AL
JNZ IRSP2
MOV AH,00H ;高电平持续时间到,则PA0输出为0 JMP IRSP3
IRSP2: SUB AL,1 ;高电平持续时间不到
MOV NOW_HI,AL ;保存-1后的值
MOV AH,01H ;PA0输出为1,高电平
IRSP3: MOV AL,AH
OUT 60H,AL
IREXIT: MOV AL,20H ;常规EOI中断结束指令
OUT 20H,AL ;写入8259A的OCW2
CLI
POP AX
IRET ;中断返回
;8259A的IR7中断处理子程序(8253的CH2计数中断,10米到) IRQ7: PUSH AX
STI
MOV AX,SPEED
ADD AL,01
DAA
XCHG AL,AH
ADC AL,00
DAA
XCHG MOV MOV OUT CLI POP IRET ;显示子程序
DISPLAY:PUSH AL,AH SPEED,AX AL,20H 20H,AL AX ;常规EOI中断结束指令 ;写入8259A的OCW2 ;中断返回 AX PUSH PUSH PUSH PUSH MOV MOV MOV MOV DISP1: ROL MOV XLAT TEST JNZ OR DISP2: OUT MOV OUT CALL INC LOOP XOR OUT POP POP POP POP POP RET ;延时子程序 DALEY: PUSH MOV DALEY1:LOOP POP RET CODE ENDS BX CX DX SI CX,4 DL,7FH SI,OFFSET DISP BX,OFFSET TAB DL,1 AL,[SI] ;查表转换为显示码 DL,02H DISP2 ;是第二位显示吗? AL,80H ;是,加小数点 61H,AL AL,DL ;允许X1、X2、X3、X4(PC3~PC0)数码管依次选通62H,AL DALEY SI DISP1 ;四次循环,显示转速 AL,AL 61H,AL ;关显示 SI DX CX BX AX CX CX,0560H ;置内循环次数 DALEY1 ;共循环0560H次,以完成延时 CX
END START