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

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

目录

  • 多加热炉炉温检测系统设计
  • 任务及要求
  • 硬件设计
  • 软件设计
  • 数据段
  • 代码段初始化与变量定义
  • 主函数
  • 主循环
  • 定时器中断
  • ADC中断
  • 外部中断0
  • 外部中断1
  • 外部中断2
  • 外部中断3
  • 子函数1 – 显示通道0显示数据准备
  • 子函数2 – 显示通道1显示数据准备
  • 子函数3 – 动态扫描
  • 子函数4 – 亮灯警告

  • 任务及要求

  • 加热炉的炉温可以在 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
    ; 通道0变1
    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
    
    	; 循环CX次
    	LOOP 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
    
    	; 循环CX次
    	LOOP 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 => 右移7位
    	SHR  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 => 右移7位
    	SHR  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 => 右移7位
    	SHR  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 => 右移7位
    	SHR  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 => 右移7位
    	SHR  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 => 右移7位
    	SHR  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
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » 多加热炉炉温检测系统设计

    发表评论