目录
一.任务及要求:
1.加热炉的炉温可以在0~430℃之间任意调节;
2.系统每隔5秒检测一遍炉温;(3路)
3.利用六位七段码显示器实时显示加热炉的给定和实际温度,显示值为十进制数值。显示器的左三位显示加热炉的实际值,右三位显示给定值。每路显示时间为 5秒。
4.分别记录各加热炉的实际炉温数据,每一加热炉的数据保存256字节。每检测一次即保存一次,循环刷新;
5.对应各加热炉扩展功能按键。功能键按下后不影响检测功能,仅影响显示功能。具体要求如下:
在循环显示方式下,按下某一功能键之后,七段码显示器即显示对应加热炉的给定温度和实际温度,如果此时按下另一个功能键,则会改变当前显示,即应显示与后一次按下的功能键对应的加热炉的给定温度和实际温度。只有连续按下同一个功能键两次才能回到循环显示方式状态;
6.扩展发光二极管担任报警功能,当实际值温度与给定值温度相差大于50℃即点亮发光二极管报警。
7.给定值由外部拨码输入确定,3路的给定温度不同。
二.基本接线及说明(参考)
1.实验选用芯片及其要求细则
⑴硬件部分为实验系统。包括0809、8253、8259、8255、七段码显示器及其驱动电路、按键和报警部分。图中虚线为需要连接的连线;
⑵实际温度由电位器给出,可由外部电位器调节。电压范围0~5V;
⑶实验系统中利用8253提供定时服务。8253的译码片选接译码地址360H,选用计数器1。
⑷实验系统中利用8259提供中断服务。8259片选接译码地址3A0H;
⑸实验系统中利用8255驱动报警发光二极管。
命令口地址:20FH;A口地址:203H;B口地址:207H; C口地址:20CH
A,B 口作输出,C口作输入。
⑹加热炉的实际温度用模拟电压表示。0809的输入通道选用IN4,IN5,IN6。
0809的译码地址为320H。
(7)七段码显示,位码输出接8255 B口,段码地址接译码地址340h
2.检测系统应用软件主要包括:
⑴主程序;
(2)定时器中断服务子程序;
(3) A/D转换中断服务子程序;
⑷代码转换子程序;
⑸显示子程序;
⑹按键中断服务子程序;
(7)报警子程序
3.多加热炉炉温检测系统硬件接线参考
图中虚线为实际接线部分
三.实验代码
1.数据段内容
.486
DATA SEGMENT AT 0 USE16 ;.486是由于实验室设备要求
ZDXL EQU 20H ;中断向量
OPORT EQU 3A0H ;中断向量偶地址
JPORT EQU 3A8H ;中断向量奇地址
LED EQU 340H ;七段译码管段选地址
;8255
PORTB EQU 207H ;B口作为位选地址
PORTA EQU 203H ;A口输出给led灯
CONTROL EQU 20FH
PORTC EQU 20BH ;c口作为输入,输入给定值
;0809
ADPORT4 EQU 330H ;通道4
ADPORT5 EQU 334H ;通道5
ADPORT6 EQU 338H ;通道6
;8253
DS1 EQU 364H ;计数器1
DSC EQU 36CH
ORG 4000H
DATA1 DB 18 DUP(?) ;显示缓存区
ORG 4040H
DATA2 DB 6 DUP(?) ;拆字
ORG 4060H
DATA3 DB 6 DUP(?) ;缓存
DATA ENDS
2.程序初始化部分
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA,ES:DATA
ORG 2000H
BEG: CLI
JMP START
TAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,67H,77H,7CH,39H,5EH,79H,71H ;段码表
TIMER DB 0 ;计数器
LEDNW DW 4000H ;拆字完后的显示地址
LOCK1 DB 0FFH ;按键
LOCK2 DB 0FFH
LOCK3 DB 0FFH
LEDDATA DB 00H ;锁存报警信号
LUZI DB 01H ;报警灯变量
DENG DB 0FEH ;报警灯变量
DATA2X DW 4040H ;指向data2首地址
ADPORT4X DW 330H ;指向通道4地址
START:
MOV AX,DATA ;初始化
MOV DS,AX
MOV ES,AX
MOV AX,0
MOV SS,AX
INIT8255:
MOV AL,89H ;8255初始化
MOV DX,CONTROL
OUT DX,AL
MOV AL,00H
MOV DX,PORTB
OUT DX,AL
INIT8253:
MOV DX,DSC ;8253初始化
MOV AL,01110110B
OUT DX,AL
MOV DX,DS1
MOV AX,60000 ;计数初值,3M hz变为50 hz(即0.02s)
OUT DX,AL
MOV AL,AH
OUT DX,AL
SETVECT:
MOV DI,0 ;中断向量初始化
MOV DX,OFFSET SERVER
MOV ZDXL[DI],DX
MOV DX,CS
MOV ZDXL[DI+2],DX
;AD中断1
INTADC4:
MOV DI,4
MOV DX,OFFSET ADC4
MOV ZDXL[DI],DX
MOV DX,CS
MOV ZDXL[DI+2],DX
;中断2
INT2:
MOV DI,8
MOV DX,OFFSET KEY1
MOV ZDXL[DI],DX
MOV DX,CS
MOV ZDXL[DI+2],DX
;中断3
INT3:
MOV DI,12
MOV DX,OFFSET KEY2
MOV ZDXL[DI],DX
MOV DX,CS
MOV ZDXL[DI+2],DX
;中断4
INT4:
MOV DI,16
MOV DX,OFFSET KEY3
MOV ZDXL[DI],DX
MOV DX,CS
MOV ZDXL[DI+2],DX
;中断5
INT5:
MOV DI,20
MOV DX,OFFSET KEY4
MOV ZDXL[DI],DX
MOV DX,CS
MOV ZDXL[DI+2],DX
INIT8259:
MOV AL,00010011B ;icw1
MOV DX,OPORT
OUT DX,AL
MOV AL,00001000B ;icw2
MOV DX,JPORT
OUT DX,AL
MOV AL,00000001B ;icw4
MOV DX,JPORT
OUT DX,AL
MOV AL,11000000B ;ocw1
MOV DX,JPORT
OUT DX,AL
MOV AL,20H
MOV DX,OPORT
OUT DX,AL
3.主程序(主循环)
;---主程序-------------------------------------------------
AGAIN:
STI ;开中断
CALL CZ ;调拆字
CALL DISP ;调显示
CALL WARN1 ;调报警
JMP AGAIN ;循环
3.1拆字子程序
;---拆字
CZ PROC
PUSH CX
PUSH BX
PUSH AX
PUSH SI
PUSH DI
LEA SI,DATA2
LEA DI,DATA1
CZ0:
MOV CX,6
CZ1:
MOV AX,0
MOV AL,[SI]
MOV BX,56H
MUL BX
MOV BX,33H
DIV BX ;00H-FFH 转换 0到430
MOV DL,64H
DIV DL
MOV [DI],AL ;存百位
MOV AL,AH ;存余数
MOV AH,0H
MOV DL,0AH
DIV DL
MOV [DI+1],AL ;存十位
MOV [DI+2],AH ;存个位
INC SI
ADD DI,3
LOOP CZ1
POP DI
POP SI
POP AX
POP BX
POP CX
RET
CZ ENDP
3.2显示子程序
;-----显示
DISP PROC
PUSH CX
PUSH BX
PUSH AX
PUSH SI
LEA BX,TAB ;段码表
MOV SI,[LEDNW]
MOV AH,01H
DISP1:
MOV DX,PORTB ;位码启动
MOV AL,AH
OUT DX,AL
MOV DX,LED ;段码输出
MOV AL,[SI]
XLAT ;换码
OUT DX,AL
MOV CX,0200H
LOOP $ ;延时,使显示稳定不闪烁
INC SI
SAL AH,1
CMP AH,40H ; 显示6位
JNZ DISP1
POP SI
POP AX
POP BX
POP CX
RET
DISP ENDP
3.3报警子程序
;;;;;;;;;;;;;;;;;;;;LED报警子程序;
WARN1 PROC
PUSH SI
PUSH DI
PUSH AX
PUSH BX
LEA DI,LEDDATA ;读LED状态
MOV AL,[DI]
MOV CX,3
LEA SI,DATA2
DENGDENG:
MOV BH,[SI] ;读炉子的实际值
MOV BL,[SI+1] ;读炉子的给定值
SUB BL,30
CMP BH,BL ;低于50
JL LEDLOWUP
ADD BL,60
CMP BH,BL ;高于50
JG LEDLOWUP
MOV DX,PORTA ;正常情况,不亮灯
OR AL,LUZI ;当前炉子温度正常,保留另外两炉子的状态,清零当前炉子的状态(灭灯)
OUT DX,AL
JMP HUI
;炉子低温高温亮灯
LEDLOWUP:
MOV DX,PORTA ;报警,亮灯
OR AL,LUZI ;保留另外两个炉子报警灯的状态,清零当前炉子的状态
AND AL,DENG ;更改当前炉子的状态
OUT DX,AL
HUI:
ADD SI,2 ;检测下一个炉子
ROL LUZI,1 ;更改报警灯
ROL DENG,1 ;更改报警灯
LOOP DENGDENG
MOV BYTE PTR [LUZI],01H ;重置
MOV BYTE PTR [DENG],0FEH ;重置
END4:
POP BX
POP AX
POP DI
POP SI
RET
WARN1 ENDP
4.定时中断服务子程序
;-------定时中断
SERVER PROC
CLI
PUSH AX
PUSH DX
PUSH SI
LEA SI,TIMER
MOV AL,[SI]
INC AL
CMP AL,250 ;调试时改为50(即1s),方便调试
JAE ADC4START
MOV [SI],AL
JMP EXIT
ADC4START:
MOV DX,ADPORT4 ;启动ad
OUT DX,AL
MOV BYTE PTR [SI],00H ;清空计数值
LEDDANCE:
CMP LOCK1,0
JZ EXIT
CMP LOCK2,0
JZ EXIT
CMP LOCK3,0
JZ EXIT ;若按键按下,则跳出循环
LEA SI,LEDNW ;循环部分
MOV AX,[SI]
CMP AX,400CH
JAE EXMT
ADD AX,6
MOV [SI],AX
JMP EXIT
EXMT:
MOV AX,4000H
MOV [SI],AX
EXIT:
MOV AL,20H
MOV DX,OPORT
OUT DX,AL
POP SI
POP DX
POP AX
IRET ;中断返回
SERVER ENDP
5.A/D转换中断服务子程序
ADC4 PROC
CLI
PUSH AX
PUSH DX
PUSH SI
MOV DI,[DATA2X]
MOV DX,[ADPORT4X]
IN AL,DX ;读取ad转换结束的值
MOV [DI],AL ;存数据
CMP DX,338H
JAE ADCADC
ADD [ADPORT4X],4
MOV DX,[ADPORT4X]
OUT DX,AL ;启动ad
ADD [DATA2X],2
JMP ENDD
ADCADC:
MOV [ADPORT4X],330H ;重置
MOV [DATA2X],4040H ;重置
ENDD:
MOV AL,20H
MOV DX,OPORT
OUT DX,AL
POP SI
POP DX
POP AX
IRET
ADC4 ENDP
6.各通道对应的按键中断子程序
KEY1 PROC ;按键1对应通道4
CLI
PUSH AX
PUSH DX
PUSH SI
NOT LOCK1 ;屏蔽循环
MOV LOCK2,0FFH
MOV LOCK3,0FFH
MOV [LEDNW],4000H
MOV DX,PORTC
IN AL,DX ;读取拨码的给定值
LEA SI,DATA3+1
MOV [SI],AL ;存入缓存区
ENDKEY1:
MOV AL,20H
MOV DX,OPORT
OUT DX,AL
POP SI
POP DX
POP AX
IRET
KEY1 ENDP
KEY2 PROC ;按键2对应通道5
CLI
PUSH AX
PUSH DX
PUSH SI
NOT LOCK2 ;屏蔽循环
MOV LOCK1,0FFH
MOV LOCK3,0FFH
MOV [LEDNW],4006H
MOV DX,PORTC
IN AL,DX ;读取拨码的给定值
LEA SI,DATA3+3
MOV [SI],AL ;存入缓存区
ENDKEY2:
MOV AL,20H
MOV DX,OPORT
OUT DX,AL
POP SI
POP DX
POP AX
IRET
KEY2 ENDP
KEY3 PROC ;按键3对应通道6
CLI
PUSH AX
PUSH DX
PUSH SI
NOT LOCK3 ;屏蔽循环
MOV LOCK1,0FFH
MOV LOCK2,0FFH
MOV [LEDNW],400CH
MOV DX,PORTC
IN AL,DX ;读取拨码的给定值
LEA SI,DATA3+5
MOV [SI],AL ;存入缓存区
ENDKEY3:
MOV AL,20H
MOV DX,OPORT
OUT DX,AL
POP SI
POP DX
POP AX
IRET
KEY3 ENDP
7.确定按键中断子程序
KEY4 PROC
CLI
PUSH AX
PUSH SI
PUSH DI
PUSH CX
MOV CX,3
LEA SI,DATA3+1 ;缓存区
LEA DI,DATA2+1 ;拆字区
KEY:
MOV AL,[SI]
MOV [DI],AL
ADD SI,2
ADD DI,2
LOOP KEY
MOV AL,20H
MOV DX,OPORT
OUT DX,AL
POP CX
POP DI
POP SI
POP AX
IRET
KEY4 ENDP
CODE ENDS
END BEG
注意:
1.子程序可以不压栈(PUSH,POP),但中断子程序必须压栈,否则可能会出现数据丢失,导致无法达到对应的功能。
2.程序中部分注释的分号是中文,报错就把对应行的分号改成英文或者把注释删除。