⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 001.asm

📁 proteus仿真 ad590 与 8951 制作的温度报警器
💻 ASM
字号:
;==============================
;定义
;==============================
LED_0	EQU 	30H
LED_1 	EQU 	31H
LED_2 	EQU 	32H
ADC	EQU	35H
H_TEMP	EQU	38H
H_ALM	BIT	P3.4
SOUND	BIT	P3.7
CLOCK	BIT	P2.6
ST 	BIT 	P2.7
EOC 	BIT 	P2.5
OE 	BIT 	P2.4
        ORG 	00H		;复位地址 ORG origin缩写
	SJMP	START		;跳转 START 开始的意思
	ORG 	03H             ;外部中断INT0
	AJMP 	INT_0
	ORG	0BH		;T0中断入口
	LJMP	INT_T0
;==============================
;初始化
;==============================
START:	MOV 	SP,#70H     	;堆栈初始化
	CLR	SOUND
	MOV	LED_0,#00H
	MOV	LED_1,#00H
	MOV	LED_2,#00H
	MOV	H_TEMP,#65  	;设置高温温度
	MOV	TMOD,#02H	;定时/计数器方式选择(高4位T1,低4位T0)(T0定时器,方式2)
	MOV	TH0,#245
	MOV	TL0,#0		;定时10ms
	MOV	IE,#8AH		;开放T1,T0中断
	CLR	C
	CLR 	60H		;INT0复位
	MOV 	TCON,#01H	;定时/计数控制
	SETB 	EA		;允许中断总控制
	SETB 	EX0		;外部中断,INT0启动
	SETB	TR0		;定时器T0启动,为ADC0808提供时钟
;==============================
;0809对电压进行AD转换
;==============================
AD:	SETB	H_ALM
	CLR 	ST
	SETB 	ST
	CLR 	ST		;启动转换
 	JNB 	EOC,$
	SETB 	OE		;允许输出数字量
	MOV 	ADC,P1		;读取AD转换结果
	LCALL	TWO		;调用数值转换摄氏度
	CLR 	OE		;停止输出数字量
	MOV	A,H_TEMP
	MOV	R0,ADC
	SUBB	A,R0		;比较判断是否高于上限
	JC	HALM
	CLR	60H		;设置开关复位
       	LJMP    ZH
;==============================
;高温警报
;==============================
HALM:	JB 	60H,ZH		;INT0中断报警
	CLR	H_ALM    	;高温LED报警
	SETB 	SOUND		;高温喇叭报警
	CALL 	DELAYDISP
 	SETB 	H_ALM
	CLR 	SOUND
	CALL 	DISDISP
	LJMP	ZH
;==============================
;0809输出数值转换
;==============================
ZH:	MOV 	A,ADC		;数值转换
	MOV 	B,#100
	DIV 	AB
	MOV 	LED_2,A		;百位
        MOV 	A,B
	MOV 	B,#10
	DIV 	AB
	MOV 	LED_1,A		;十位
        MOV 	LED_0,B		;个位
        LCALL	DISP
	SJMP 	AD
;==============================
;方式2 定时器
;==============================
INT_T0:	CPL	CLOCK	   	;AT89C51提供ADC0808时钟
	RETI
;==============================
; 输出显示程序
;==============================
DISP:	MOV	A,LED_0	       	;个位赋值
	MOV	DPTR,#TABLE0
	MOVC	A,@A+DPTR
	CLR	P2.3		;开启个位位型
	MOV	P0,A		;个位输出
	LCALL	DELAY250US
	SETB	P2.3
	MOV     A,LED_2		;根据百位情况 十位需要灭零与否
        JNZ     NCT		;百位不为零 十位不灭零则跳转NCT
	MOV	A,LED_1		;百位为零 判断十位是否为零
        JZ      CT		;十位也为零 灭零采用字形表TABLE
        SJMP    NCT		;十位不为零 正常赋值
CT:     MOV     DPTR,#TABLE
NCT:    MOV	A,LED_1		;十位(不灭零)正常赋值
        MOVC	A,@A+DPTR
        CLR	P2.2
	MOV	P0,A
	LCALL	DELAY250US
	SETB	P2.2
        MOV	A,LED_2		;百位直接采用灭零字形表
	MOV	DPTR,#TABLE
	MOVC	A,@A+DPTR
	CLR	P2.1
	MOV	P0,A
	LCALL	DELAY250US
	SETB	P2.1
        RET
;==============================
;2字节除1字节程序(R4,R5除R7)
;==============================
TWO:	MOV	R7,#255
	MOV	A,ADC
	MOV	B,#100
	MUL	AB
	MOV	R5,A
	MOV	R4,B
 	MOV A,R4
 	SUBB A,R7
 	JC DV50
 	SETB OV 		;商溢出
 	RET
	DV50: MOV R6,#8 	;求平均值(R4R5/R7-→R3)
	DV51: MOV A,R5
 	RLC A
 	MOV R5,A
 	MOV A,R4
 	RLC A
 	MOV R4,A
 	MOV F0,C
 	CLR C
 	SUBB A,R7
 	ANL C,/F0
 	JC DV52
 	MOV R4,A
DV52: 	CPL C
 	MOV A,R3
 	RLC A
 	MOV R3,A
 	DJNZ R6,DV51
 	MOV A,R4 		;四舍五入
 	ADD A,R4
 	JC DV53
 	SUBB A,R7
 	JC DV54
DV53: 	INC R3
DV54: 	CLR OV
	MOV A,R3
 	MOV ADC,A
 	RET
;==============================
;延时250US程序
;==============================

DELAY250US:MOV   R0,#5
     DL1:  MOV   R1,#24
     DL2:  DJNZ  R1,DL2
           DJNZ  R0,DL1
           RET
;==============================
;延时1MS程序
;==============================

DELAY1MS : MOV  R5,#10
    DL9:   MOV  R6,#25
    DL0:   DJNZ  R6,DL0
           DJNZ  R5,DL9
           RET
;=============================
;延时10MS程序
;=============================
DELAY10MS :MOV    R2,#50
     DL3  :MOV    R3,#50
     DL4  :DJNZ   R3,DL4
           DJNZ   R2,DL3
           RET
;=============================
;延时200MS程序
;=============================
DELAY200MS:	MOV    R3,#250
DL5: 	 	MOV    R4,#200
DL6:  		DJNZ   R4,DL6
           	DJNZ   R3,DL5
           	RET

;=============================
;显示--延迟
;=============================
DELAYDISP:
	MOV 	R7,#200		;显示延时
C1:	CALL 	DISP
	DJNZ 	R7,C1
	RET
;=============================
;灭灯--延迟
;=============================
DISDISP:MOV LED_0,#0AH
	MOV LED_1,#0H
	MOV LED_2,#0H
	MOV R7,#200	;显示延时
C2:	CALL DISP
	DJNZ R7,C2
	RET	
;=============================
;灭灯--延时700MS程序
;=============================
DELAY700MS:	MOV    R2,#3
DL7:		MOV    R3,#100
DL8: 	 	MOV    R4,#250
DL10:  		DJNZ   R4,DL10
           	DJNZ   R3,DL8
		DJNZ   R2,DL7
           	RET
;==============================
;外部中断(开关 改变电平)
;==============================
INT_0:	CPL 	60H		;开关给INT0下降沿--取反
	CALL 	DELAY250US
	RETI
;=============================
;字形表		0,1,2,3,4,5,6,7,8,9,灭
;=============================
TABLE0: DB 	3FH,06H,5BH,4FH,66H
	DB 	6DH,7DH,07H,7FH,6FH,00H
;=============================
;灭零字形表灭	灭,1,2,3,4,5,6,7,8,9
;=============================
TABLE: 	DB 	00H,06H,5BH,4FH,66H
	DB 	6DH,7DH,07H,7FH,6FH
	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -