多加热炉炉温检测系统设计


任务及要求

  • 加热炉的炉温可以在 50℃~420℃之间任意调节

  • 系统每隔 5 秒钟检测一遍炉温(共2路)

  • 利用6位七段码显示器实时显示给定炉温实际炉温,显示值为10进制数值。左三位显示给定值右三位显示实际值。系统开始运行时以循环显示 2 路炉温。每路显示时间为 3 秒钟

  • 分别记录各加热炉的实际炉温数据,每一加热炉的数据保存 256 字节。 每检测一次即保存一次,循环刷新

  • 对应各加热炉扩展功能按键,功能键按下后不影响检测功能,仅影响显示功能。具体要求如下:

    • 循环显示模式下,按下某一功能键之后,七段码显示器即显示对应加热炉的给定温度实际温度。如果此时按下另一个功能键,则会改变当前显示,即应显示与后一次按下的功能键对应的加热炉的给定温度和实际温度。只有连续按下同一个功能键两次才能回到循环显示方式状态
  • 扩展发光二极管担任报警功能,当温度低于给定值 20℃报警或超过给定值 20℃即点亮发光二极管报警。2 路分别设置高低报警指示灯


硬件设计


软件设计

程序说明:

  • 一共两个炉温通道,用通道0通道1标记
  • 用的是ADC的通道4和通道5进行采样,故ADC通道4对应炉温通道0ADC通道5对应炉温通道1


数据段

DATA segment
	; 中断向量
	VECTOR		equ		20H
	OPORT		equ		3A0H
	JPORT		equ		3A8H
	
	; 8253 定时器端口
	CTRL_8253	equ		30CH
	TIMER_0		equ		300H
	TIMER_1		equ		304H
	TIMER_2		equ		308H

	; 0809 ADC端口
	ADC_0		equ		3C0H
	ADC_1		equ		3C4H
	ADC_2		equ		3C8H
	ADC_3		equ		3CCH
	ADC_4		equ		3D0H
	ADC_5		equ		3D4H
	ADC_6		equ		3D8H
	ADC_7		equ		3DCH

	; 8255 并行端口
	CTRL_8255	equ		20FH
	PORTA		equ		203H
	PORTB		equ		207H
	PORTC		equ		20BH

	; 273 数码管端口
	SEG_SEL		equ     360H

	; 显示缓存区
	org 6000H
	disp_buff	db	6	dup(0)

	; ADC通道4数据保存
	org 6100H
	adc_val_0	db	256	dup(0)
	
	; ADC通道5数据保存
	org 6400H
	adc_val_1	db	256	dup(0)
DATA ends


代码段初始化与变量定义

CODE segment USE16
	assume CS:CODE,DS:DATA,ES:DATA
	org  2000H

; 程序入口
Begin:
	CLI						; 关中断
	JMP  Main

; 变量定义
timer_count	db	0			; 定时器计数值
given_val_0	dw	12CH		; 炉温通道0给定值
given_val_1	dw	10FH		; 炉温通道1给定值
							; 通道0的段码
SEG_CODE_0 	db	3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,67H
							; 通道1的段码 所有数字加上小数点
SEG_CODE_1 	db	0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0E7H
adc_save_0	db	0			; 通道0保存数据个数
adc_save_1	db	0			; 通道1保存数据个数
adc_current_ch  db  0		; ADC当前是哪个通道
display_ch	db	0			; 显示哪一路数据
disp_mod	db	2			; 0 通道0显示模式   1 通道1显示模式  2 循环显示模式 		 


主函数

初始化程序

; 主函数
Main:
	; 段初始化
	MOV  AX,DATA
	MOV  DS,AX				; 数据段
	MOV  ES,AX
	MOV  AX,0
	MOV  SS,AX				; 堆栈段
	MOV  SP,1000H			; 堆栈段指针

; 并行接口初始化
GPIO_Init_8255:
	; 控制字
	MOV  DX,CTRL_8255
	MOV  AL,10001001B		; AB输出 C输入
	OUT  DX,AL
	; 关灯
	MOV  DX,PORTA
	MOV  AL,0FH
	OUT  DX,AL
	
; 定时器初始化
TIM2_Init_8253:
	; 控制字
	MOV  DX,CTRL_8253
	MOV  AL,01110110B
	OUT  DX,AL	
	; 预装载值 				; 3M / 60000 -> 50Hz 
	MOV  DX,TIMER_1
	MOV  AL,60H				; 低字节
	OUT  DX,AL
	MOV  AL,0EAH			; 高字节
	OUT  DX,AL

; 定时器中断初始化
TIM2_Int_Init_8253:
	MOV  DI,0				; 中断向量20H
	MOV  DX,offset Timer2_IRQHandler
	MOV  VECTOR[DI],DX		; 低位偏移地址IP
	MOV  DX,CS
	MOV  VECTOR[DI+2],DX	; 高位段基址CS

; ADC中断初始化
ADC_Int_Init_0809:
	MOV  DI,04H				; 中断向量24H
	MOV  DX,offset EOC_IRQHandler
	MOV  VECTOR[DI],DX		; 低位偏移地址IP
	MOV  DX,CS
	MOV  VECTOR[DI+2],DX	; 高位段基址CS

; EXTI中断初始化
EXTI0_INT_Init:
	MOV  DI,08H				; 中断向量28H
	MOV  DX,offset EXTI0_IRQHandler
	MOV  VECTOR[DI],DX		; 低位偏移地址IP
	MOV  DX,CS
	MOV  VECTOR[DI+2],DX	; 高位段基址CS

EXTI1_INT_Init:
	MOV  DI,0CH				; 中断向量2CH
	MOV  DX,offset EXTI1_IRQHandler
	MOV  VECTOR[DI],DX		; 低位偏移地址IP
	MOV  DX,CS
	MOV  VECTOR[DI+2],DX	; 高位段基址CS

EXTI2_INT_Init:
	MOV  DI,10H				; 中断向量30H
	MOV  DX,offset EXTI2_IRQHandler
	MOV  VECTOR[DI],DX		; 低位偏移地址IP
	MOV  DX,CS
	MOV  VECTOR[DI+2],DX	; 高位段基址CS

EXTI3_INT_Init:
	MOV  DI,14H				; 中断向量34H
	MOV  DX,offset EXTI3_IRQHandler
	MOV  VECTOR[DI],DX		; 低位偏移地址IP
	MOV  DX,CS
	MOV  VECTOR[DI+2],DX	; 高位段基址CS

; 中断控制器初始化
NVIC_Init_8259:
	MOV  AL,00010011B		; ICW1
	MOV  DX,OPORT
	OUT  DX,AL

	MOV  AL,00001000B		; ICW2
	MOV  DX,JPORT
	OUT  DX,AL

	MOV  AL,00001101B		; 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
 

    主循环

    包含模式判断

    ; ---- while(1) ----
    
    Cycle_Main:
    	; 开中断
    	STI
    	
    	; 显示模式
    	LEA  DI,disp_mod
    	MOV  AL,[DI]
    	
    	; 通道0单独显示
    	CMP  AL,0
    	JZ   Ch_0_Disp
    	
    	; 通道1单独显示
    	CMP  AL,1
    	JZ   Ch_1_Disp
    
    	; 循环显示模式
    	CMP  AL,2
    	JZ   Cycle_Disp
    
    ; 模式0 - 循环显示
    Cycle_Disp:
    	LEA  SI,display_ch
    	MOV  AL,[SI]
    	TEST AL,AL
    	JZ   display_0   
    	JNZ  display_1   
    	
        ; 通道1  
    display_1:    
    	CALL DataPrepare_1
    	JMP  Next  
    	
        ; 通道0
    display_0:
    	CALL DataPrepare_0
    	JMP  Next
    	
    ; 模式1 - 通道0单独显示
    Ch_0_Disp:
    	LEA  SI,display_ch
    	MOV  AL,0
    	MOV  [SI],AL
    	CALL  DataPrepare_0
    	JMP  Next
    
    ; 模式2 - 通道1单独显示
    Ch_1_Disp:
    	LEA  SI,display_ch
    	MOV  AL,1
    	MOV  [SI],AL
    	CALL DataPrepare_1
    	JMP  Next
    
    Next:	
    	CALL Dynamic_Scan
    	CALL Alert_LED
    	JMP  Cycle_Main
    
     

      定时器中断

      开启ADC通道4

      ; 定时器中断
      Timer2_IRQHandler proc
      	; 关中断
      	CLI
      
      	; 构造局部变量
      	PUSH SI
      	PUSH DI
      	PUSH AX
      	PUSH DX
      
      	; 计数值++
      	LEA  SI,timer_count
      	MOV  AL,[SI]
      	INC  AL
      	; 如果加到150  3s
      	; CMP  AL,96H
      	
      	; 调试阶段切换时间改为1s = > 50 1s
      	CMP  AL,32H
      
      	; 3s到了  开启ADC4  
      	JAE ADC4_StartConvert
      	
      	; 更新计数变量
      	MOV  [SI],AL
      	JMP  Exit
      
      ADC4_StartConvert:
      	; 启动ADC
      	MOV  DX,ADC_4
       	OUT  DX,AL
       	
      	; 更新计数值	
      	MOV  AL,0
      	MOV  [SI],AL
      
      ; 循环显示下切换显示通道
      	; 显示模式
      	LEA  DI,disp_mod
      	MOV  AL,[DI]
      	
      	; 不是循环显示模式
      	CMP  AL,2
      	JNZ   Exit
      
      	; 否则换通道
      	LEA  DI,display_ch
      	MOV  AL,[DI]
      	TEST AL,AL
      	; 0 -> 1
      	JZ   Zero
      	; 1 -> 0
      	MOV  AH,00H
      	MOV  [DI],AH
      	JMP  Exit
      ; 通道01
      Zero:
      	MOV  AH,01H
      	MOV  [DI],AH
      
      Exit:
      	; 中断复位
      	MOV  AL,20H
      	MOV  DX,OPORT
      	OUT  DX,AL
      
      	; 局部变量析构
      	POP  DX
      	POP  AX
      	POP  DI
      	POP  SI
      	
      	; 退出中断
      	iret
      	
      Timer2_IRQHandler endp
      


      ADC中断

      包括一个通道判断,ADC通道4是在定时器内开启的,判断本次是否是ADC4,如果是则读完数据之后开启ADC通道5

      ; ADC中断服务
      EOC_IRQHandler proc
      	; 关中断
      	CLI
      	; 构造局部变量
      	PUSH AX
      	PUSH BX
      	PUSH CX
      	PUSH DX
      	PUSH SI
      	PUSH DI
      
      	; 判断当前通道
      	LEA  SI,adc_current_ch
      	MOV  AL,[SI]
      	TEST AL,AL
      	; 跳转通道0
      	JZ   CH_0
      	; 否则通道1
      	
      CH_1:
      	; 基地址
      	LEA  DI,adc_val_1
      
      	; 偏移地址  保存第几个数据
      	LEA  SI,adc_save_1
      	
      	; 数据后移
      	; 保存几个数据循环几次
      	MOV  CH,00H
      	MOV  CL,[SI]
      	INC  CL
      	
      Save_1:	  
      	; 移动的数据的地址
      	ADD  DI,CX
      	MOV  AL,[DI]
      	; 下一地址
      	INC  DI
      	; 数据后移一位
      	MOV  [DI],AL
      
      	; 循环CXLOOP Save_1
      
      	; 保存新数据  在第一位
      	LEA  DI,adc_val_1
      	; 读取AD5转换数据
      	MOV  DX,ADC_5
      	IN   AL,DX
      	MOV  [DI],AL
      
      	; 通道变成0
      	LEA  SI,adc_current_ch
      	MOV  AL,00H
      	MOV  [SI],AL
      
      	; 跳转退出
      	JMP ADC_End
      
      CH_0:
      	; 基地址
      	LEA  DI,adc_val_0
      
      	; 偏移地址  保存第几个数据
      	LEA  SI,adc_save_0
      	
      	; 数据后移
      	; 保存几个数据循环几次
      	MOV  CH,00H
      	MOV  CL,[SI]
      	INC  CL
      
      Save_0:	  
      	; 移动的数据的地址
      	ADD  DI,CX
      	MOV  AL,[DI]
      	; 下一地址
      	INC  DI
      	; 数据后移一位
      	MOV  [DI],AL
      
      	; 循环CXLOOP Save_0
      
      	; 保存新数据  在第一位
      	LEA  DI,adc_val_0
      	; 读取AD4转换数据
      	MOV  DX,ADC_4
      	IN   AL,DX
      	MOV  [DI],AL
      
      	; 通道变成1
      	LEA  SI,adc_current_ch
      	MOV  AL,01H
      	MOV  [SI],AL
      
      ; 启动通道5
      ADC5_StartConvert:
      	; 启动ADC
      	MOV  DX,ADC_5
       	OUT  DX,AL
      
      ADC_End:
      	; 中断复位
      	MOV  AL,20H
      	MOV  DX,OPORT
      	OUT  DX,AL
      
      	; 局部变量析构
      	POP  DI
      	POP  SI
      	POP  DX
      	POP  CX
      	POP  BX
      	POP  AX
      	
      	; 退出中断
      	iret
      
      EOC_IRQHandler endp
      


        外部中断0

        通道0独立显示,连续按两次进入循环显示

        EXTI0_IRQHandler proc
        	; 关中断
        	CLI
        
        	; 临时变量
        	PUSH AX
        	PUSH DX
        	PUSH DI
        	
        	; 当前显示模式
        	LEA  DI,disp_mod
        	MOV  AL,[DI]  
        	
        	; 当前是循环显示 2
        	CMP  AL,02H
        	; 进入通道0独立
        	JZ   Disp_0
        	
        	; 当前是通道1独立显示 1
        	CMP  AL,01H
        	; 进入通道0独立
        	JZ   Disp_0
        	
        	; 当前是通道0独立显示 0
        	; 退出到循环显示
        	MOV  AL,02H
        	MOV  [DI],AL
        	JMP  Exch_Done_0
        
        Disp_0:
        	MOV  AL,00H
        	MOV  [DI],AL	
        
        Exch_Done_0:
        	; 中断复位
        	MOV  AL,20H
        	MOV  DX,OPORT
        	OUT  DX,AL
        
        	; 临时变量析构
        	POP  DI
        	POP  DX
        	POP  AX
        
        	iret
        EXTI0_IRQHandler endp
        
         

          外部中断1

          设置通道0给定值

          ; 通道0给定值
          ; 通道0给定值
          EXTI1_IRQHandler proc
          	; 关中断
          	CLI
          
          	; 临时变量
          	PUSH AX
          	PUSH BX
          	PUSH DX
          	PUSH SI
          	
          	; 读取键值
          	MOV  DX,PORTC
          	IN   AL,DX
          	
          	; 数据处理  00H - FFH  => 50 - 420
          	;185
          	MOV  BL,0B9H
          	MUL  BL
          	; 128 => 右移7SHR  AX,07H
          	;50
          	ADD  AX,32H
          
          	; [50,420] 存到 given_val_0
          	LEA  SI,given_val_0
          	MOV  [SI],AX
          	; 中断复位
          	MOV  AL,20H
          	MOV  DX,OPORT
          	OUT  DX,AL
          
          	; 临时变量析构
          	POP  SI
          	POP  DX
          	POP  BX
          	POP  AX
          
          	iret
          EXTI1_IRQHandler endp
          


          外部中断2

          通道1独立显示,连续按两次进入循环显示

          EXTI2_IRQHandler proc
          	; 关中断
          	CLI
          	; 临时变量
          	PUSH AX
          	PUSH DX
          	PUSH DI
          
          	; 当前显示模式
          	LEA  DI,disp_mod
          	MOV  AL,[DI]  
          	
          	; 当前是循环显示 2
          	CMP  AL,02H
          	; 进入通道1独立
          	JZ   Disp_1
          	
          	; 当前是通道0独立显示 0
          	CMP  AL,00H
          	; 进入通道1独立
          	JZ   Disp_1
          
          	; 当前是通道1独立显示 1
          	CMP  AL,01H
          	; 退出到循环显示
          	MOV  AL,02H
          	MOV  [DI],AL
          	JMP  Exch_Done_1
          
          Disp_1:
          	MOV  AL,01H
          	MOV  [DI],AL	
          
          Exch_Done_1:
          	; 中断复位
          	MOV  AL,20H
          	MOV  DX,OPORT
          	OUT  DX,AL
          
          	; 临时变量析构
          	POP  DI
          	POP  DX
          	POP  AX
          	
          	iret
          EXTI2_IRQHandler endp
          


          外部中断3

          设置通道1给定值

          EXTI3_IRQHandler proc
          	; 关中断
          	CLI
          	; 临时变量
          	PUSH AX
          	PUSH BX
          	PUSH DX
          	PUSH SI
          
          	; 读取键值
          	MOV  DX,PORTC
          	IN   AL,DX
          
          	; 数据处理  00H - FFH  => 50 - 420
          	;185
          	MOV  BL,0B9H
          	MUL  BL
          	; 128 => 右移7SHR  AX,07H
          	;50
          	ADD  AX,32H
          
          	; [50,420] 存到 given_val_1
          	LEA  SI,given_val_1
          	MOV  [SI],AX
          
          	; 中断复位
          	MOV  AL,20H
          	MOV  DX,OPORT
          	OUT  DX,AL
          
          	; 临时变量析构
          	POP  SI
          	POP  DX
          	POP  BX
          	POP  AX
          
          	iret
          EXTI3_IRQHandler endp
          


          子函数1 - 显示通道0显示数据准备

          ; 通道0显示数据准备 
          DataPrepare_0 proc
          	LEA  SI,given_val_0
          	LEA  DI,disp_buff
          
          	; 给定值百位
          	; 被除数
          	MOV  AX,[SI]
          	; 除数  
          	MOV  DL,64H
          	;100
          	DIV  DL
          	; 商在AL  保存百位
          	MOV  [DI],AL
          
          	; 余数在AH 几十几
          	MOV  AL,AH
          	MOV  AH,00H
          	MOV  DL,0AH
          	; 除以10
          	DIV  DL
          	; 商在AL  保存十位
          	MOV  [DI+1],AL
          	; 余数在AH  保存个位
          	MOV  [DI+2],AH
          
          	; 采样值
          	LEA  SI,adc_val_0
          	; 数据处理  00H - FFH  => 50 - 420
          	MOV  AL,[SI]
          	;185
          	MOV  BL,0B9H
          	MUL  BL
          	; 128 => 右移7SHR  AX,07H
          	;50
          	ADD  AX,32H
          	; [50,420] 暂存到BX
          	MOV  BX,AX
          
          	; 采样值百位
          	; 被除数
          	MOV  AX,BX
          	; 除数
          	MOV  DL,64H
          	;100
          	DIV  DL
          	; 商在AL  保存百位
          	MOV  [DI+3],AL
          
          	; 余数在AH 几十几
          	MOV  AL,AH
          	MOV  AH,00H
          	MOV  DL,0AH
          	; 除以10
          	DIV  DL
          	; 商在AL  保存十位
          	MOV  [DI+4],AL
          	; 余数在AH  保存个位
          	MOV  [DI+5],AH
          	
          	ret
          DataPrepare_0 endp
          


          子函数2 - 显示通道1显示数据准备

          ; 通道1显示数据准备 
          DataPrepare_1 proc
          	LEA  SI,given_val_1
          	LEA  DI,disp_buff
          
          	; 给定值百位
          	; 被除数
          	MOV  AX,[SI]
          	; 除数  
          	MOV  DL,64H
          	;100
          	DIV  DL
          	; 商在AL  保存百位
          	MOV  [DI],AL
          
          	; 余数在AH 几十几
          	MOV  AL,AH
          	MOV  AH,00H
          	MOV  DL,0AH
          	; 除以10
          	DIV  DL
          	; 商在AL  保存十位
          	MOV  [DI+1],AL
          	; 余数在AH  保存个位
          	MOV  [DI+2],AH
          
          	; 采样值
          	LEA  SI,adc_val_0
          	; 数据处理  00H - FFH  => 50 - 420
          	MOV  AL,[SI]
          	;185
          	MOV  BL,0B9H
          	MUL  BL
          	; 128 => 右移7SHR  AX,07H
          	;50
          	ADD  AX,32H
          	; [50,420] 暂存到BX
          	MOV  BX,AX
          
          	; 采样值百位
          	; 被除数
          	MOV  AX,BX
          	; 除数
          	MOV  DL,64H
          	;100
          	DIV  DL
          	; 商在AL  保存百位
          	MOV  [DI+3],AL
          
          	; 余数在AH 几十几
          	MOV  AL,AH
          	MOV  AH,00H
          	MOV  DL,0AH
          	; 除以10
          	DIV  DL
          	; 商在AL  保存十位
          	MOV  [DI+4],AL
          	; 余数在AH  保存个位
          	MOV  [DI+5],AH
          	
          	ret
          DataPrepare_1 endp 
          


          子函数3 - 动态扫描

          ; 动态扫描
          Dynamic_Scan proc
          
          	; 构造局部变量	
          	PUSH CX
          	PUSH DX
          
          	LEA  SI,disp_buff
          	MOV  AH,01H
          
          Scan:
          	; 位选 PORTB
          	MOV  DX,PORTB
          	MOV  AL,AH
          	OUT  DX,AL
          
          
          	; 显示通道
          	LEA  DI,display_ch
          	MOV  AL,[DI]
          	TEST AL,AL
          
          	; 通道0 段码
          	JZ   Seg_0
          
          	; 通道1 段码
          	LEA  BX,SEG_CODE_1
          	MOV  AL,[SI]
          	XLAT
          	
          	JMP  Seg_Done
          
          Seg_0:
          	
          	; 通道0段选
          	LEA  BX,SEG_CODE_0
          	MOV  AL,[SI]
          	XLAT
          
          Seg_Done:
          	; 输出段码
          	MOV  DX,SEG_SEL
          	OUT  DX,AL
          
          	; 延时
          	MOV  CX,0200H
          	LOOP $
          
          	; 下一数据
          	INC  SI
          	; 左移一位
          	SAL  AH,1
          	; 6位显示
          	CMP  AH,40H
          	JNZ  Scan
          
          	; 局部变量析构
          	POP  DX
          	POP  CX
          
          	ret
          Dynamic_Scan endp
          


          子函数4 - 亮灯警告

          LED采用并口输出高低电平,并口输出的时候是用寄存器8位同时输出的,判断完前几个位置的输出数据之后,需要暂存状态数据,最后将4位数据拼接起来输出

          ; 亮灯警告
          Alert_LED proc
          
          ; 通道0
          LED_Channel_0:
          
          	PUSH CX
          	MOV  CX,0000H
          
          	LEA  SI,adc_val_0
          	LEA  DI,given_val_0
          
          	; 采样值数据处理  00H - FFH  => 50 - 420(32H - 01A4H)
          	MOV  AL,[SI]
          	;185
          	MOV  BL,0B9H
          	MUL  BL
          	; 128 => 右移7SHR  AX,07H
          	;50
          	ADD  AX,32H
          	; [50,420] (32H,01A4H)
          	MOV  BX,AX
          	; 采样值暂存到BX
          
          	; 采样0 > 给定0 + 20
          	MOV  DX,[DI]
          	ADD  DX,14H	
          	CMP  BX,DX		
          	JNB  LED_1
          
          	; 采样0 < 给定0 - 20
          	MOV  DX,[DI]
          	SUB  DX,14H
          	CMP  BX,DX
          	JB   LED_0
          
          	; 通道0安全
          	MOV  DX,PORTA
          	MOV  AL,1111B
          	OUT  DX,AL
          	; 通道0 LED暂存到CL
          	AND  AL,0011B
          	MOV  CL,AL
          
          	JMP  LED_Channel_1
          
          LED_0:
          	MOV  DX,PORTA
          	MOV  AL,1110B
          	OUT  DX,AL
          
          	; 通道0 LED暂存到CL
          	AND  AL,0011B
          	MOV  CL,AL
          
          	JMP  LED_Channel_1
          
          LED_1:
          	MOV  DX,PORTA
          	MOV  AL,1101B
          	OUT  DX,AL	
          
          	; 通道0 LED暂存到CL
          	AND  AL,0011B
          	MOV  CL,AL
          
          	JMP  LED_Channel_1
          
          ; 通道1
          LED_Channel_1:
          	LEA  SI,adc_val_1
          	LEA  DI,given_val_1
          
          	; 采样值数据处理  00H - FFH  => 50 - 420(32H - 01A4H)
          	MOV  AL,[SI]
          	;185
          	MOV  BL,0B9H
          	MUL  BL
          	; 128 => 右移7SHR  AX,07H
          	;50
          	ADD  AX,32H
          	; [50,420] (32H,01A4H)
          	MOV  BX,AX
          	; 采样值暂存到BX
          
          	; 采样1 > 给定1 + 20
          	MOV  DX,[DI]
          	ADD  DX,14H	
          	CMP  BX,DX		
          	JNB  LED_3
          
          	; 采样1 < 给定1 - 20
          	MOV  DX,[DI]
          	SUB  DX,14H
          	CMP  BX,DX
          	JB   LED_2
          
          	; 通道1安全
          	MOV  DX,PORTA
          	MOV  AL,1100B
          	ADD  AL,CL
          	OUT  DX,AL
          	JMP  Exti
          
          LED_2:
          	MOV  DX,PORTA
          	MOV  AL,1000B
          	ADD  AL,CL
          	OUT  DX,AL
          	JMP  Exti
          
          LED_3:
          	MOV  DX,PORTA
          	MOV  AL,0100B
          	ADD  AL,CL
          	OUT  DX,AL	
          	JMP  Exti
          
          ; 全部安全
          Secure:
          	MOV  DX,PORTA
          	MOV  AL,1111B
          	OUT  DX,AL
          
          Exti:
          	POP  CX
          	ret
          Alert_LED endp
          
          
          CODE ends
          END  Begin