设计一个8088/8086的微机系统,用于监控报警,具备如下功能: 存储系统要求:32KB的RAM(6264),16KB的EEPROM(9864); 系统使用1片8259、1片8253和1片8255实现主要功能; 1台设备监控8个点,设备启动信号为3个时钟周期的脉冲信号,某个点为异常时,输出电平为高,1个异常报警灯; 系统对监控设备1秒钟检查一次; 如果检查到8点中任意一个异常(一次只有1个点异常),完成以下操作: (1)将异常信号点以ASCII形式存储在RAM和ROM中,如第2个点异常,记为32H; (2)报警灯闪烁,1秒灭,1秒亮; 警报解除按键1个,按下后,解除报警灯闪烁。 给出相应代码
时间: 2024-03-31 12:36:21 浏览: 103
由于您没有指定开发环境和编程语言,我将为您提供一个基于C语言和x86汇编语言的代码示例,以供参考。
C语言代码:
```c
#include <stdio.h>
#include <dos.h>
#define RAM_SIZE 32768
#define EEPROM_SIZE 16384
#define MONITOR_POINTS 8
unsigned char ram[RAM_SIZE];
unsigned char eeprom[EEPROM_SIZE];
void init_system()
{
// 初始化RAM和EEPROM
memset(ram, 0, RAM_SIZE);
memset(eeprom, 0, EEPROM_SIZE);
// 设置中断向量和中断服务程序
setvect(0x08, isr_8259);
setvect(0x1C, isr_8253);
// 初始化定时器,1秒钟检查一次
outp(0x43, 0x36); // 设置8253工作方式
outp(0x40, 0x00); // 设置8253计数初值
outp(0x40, 0x00);
}
void isr_8259()
{
// 中断服务程序处理设备监控
unsigned char status = inp(0x21);
if (status & 0x01) { // 8259 IRQ0
// 检查8个监控点是否异常,如果有异常,则进行报警处理
for (int i = 0; i < MONITOR_POINTS; i++) {
if (inp(0x300 + i) & 0x80) { // 监控点异常
// 将异常信号点以ASCII形式存储在RAM和EEPROM中
ram[0] = i + '0';
eeprom[0] = i + '0';
// 报警灯闪烁,1秒灭,1秒亮
for (int j = 0; j < 2; j++) {
outp(0x301, 0x01); // 报警灯亮
delay(500);
outp(0x301, 0x00); // 报警灯灭
delay(500);
}
}
}
// 清除8259 IRQ0中断标志
outp(0x20, 0x20);
}
}
void isr_8253()
{
// 定时器中断服务程序,1秒钟检查一次
}
void main()
{
// 初始化系统
init_system();
// 设计一个警报解除按键,按下后,解除报警灯闪烁
while (1) {
if (inp(0x302) & 0x01) { // 检测到按键按下
outp(0x301, 0x00); // 报警灯灭
break;
}
}
}
```
x86汇编语言代码:
```asm
.MODEL SMALL
.STACK 64
.DATA
RAM_SIZE EQU 32768
EEPROM_SIZE EQU 16384
MONITOR_POINTS EQU 8
ram DB RAM_SIZE DUP(0)
eeprom DB EEPROM_SIZE DUP(0)
.CODE
init_system PROC NEAR
; 初始化RAM和EEPROM
MOV AX, SEG ram
MOV DS, AX
MOV AX, SEG eeprom
MOV ES, AX
XOR DI, DI
MOV CX, RAM_SIZE
MOV AL, 0
REP STOSB
MOV CX, EEPROM_SIZE
REP STOSB
; 设置中断向量和中断服务程序
MOV AX, OFFSET isr_8259
MOV [0000H], AX
MOV AX, SEG isr_8259
MOV [0002H], AX
MOV AX, OFFSET isr_8253
MOV [001C0H], AX
MOV AX, SEG isr_8253
MOV [001C2H], AX
; 初始化定时器,1秒钟检查一次
MOV DX, 043H
MOV AL, 036H
OUT DX, AL
MOV AX, 0000H
OUT 040H, AL
OUT 040H, AH
RET
init_system ENDP
isr_8259 PROC NEAR
; 中断服务程序处理设备监控
MOV AL, 021H
IN AL, DX
AND AL, 001H ; IRQ0
JE .end_isr_8259
; 检查8个监控点是否异常,如果有异常,则进行报警处理
XOR SI, SI
MOV CX, MONITOR_POINTS
.is_monitor_point:
IN AL, 300H
AND AL, 080H
JZ .not_exception
; 将异常信号点以ASCII形式存储在RAM和EEPROM中
ADD AL, '0'
MOV [ram], AL
MOV [eeprom], AL
; 报警灯闪烁,1秒灭,1秒亮
MOV DX, 301H
XOR BX, BX
MOV DX, 301H
MOV AL, 01H
.flash:
OUT DX, AL
CALL delay
XOR AL, 01H
OUT DX, AL
CALL delay
INC BX
CMP BX, 02H
JL .flash
.not_exception:
INC SI
LOOP .is_monitor_point
; 清除8259 IRQ0中断标志
MOV AL, 020H
OUT 020H, AL
.end_isr_8259:
IRET
isr_8259 ENDP
isr_8253 PROC NEAR
; 定时器中断服务程序,1秒钟检查一次
.end_isr_8253:
MOV AL, 020H
OUT 020H, AL
IRET
isr_8253 ENDP
main PROC NEAR
; 初始化系统
CALL init_system
; 设计一个警报解除按键,按下后,解除报警灯闪烁
.loop:
IN AL, 302H
AND AL, 001H
JZ .loop
MOV DX, 301H
MOV AL, 00H
OUT DX, AL
RET
main ENDP
delay PROC NEAR
; 等待一段时间,用于控制LED灯闪烁的时间
MOV CX, 0FFFFH
.delay_loop:
LOOP .delay_loop
RET
delay ENDP
END
```
需要注意的是,以上代码仅供参考,可能存在错误和不足之处,具体实现还需要根据具体的开发环境和硬件平台进行调整和优化。
阅读全文