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

📄 chouyouyanji.asm

📁 一个能够控制抽油烟机定时开关及风速调节的程序
💻 ASM
字号:
	SSTOP EQU  30H    ;启动/停止键次数  
	ROUNT EQU  31H    ;风量按键次数
	TIMEK EQU  32H    ;定时按键次数
	LEDCOUNT EQU 33H  ;LED按键次数
	INCTA EQU 34H     ;定时计数器A
	INCTB EQU 35H     ;定时计数器B

	ORG 00H
	LJMP MAIN
	ORG 000BH
	LJMP TO
	ORG 030H
MAIN:	MOV TMOD,#01H                 ;定时器0方式1
	MOV TH0,#(65536-60000)/256    ;载入初值60ms
	MOV TL0,#(65536-60000)MOD 256
	MOV INCTA,#00H                
	MOV INCTB,#00H                
	SETB ET0
	SETB EA
	MOV P3,#0FFH
	MOV ROUNT,#00H
	MOV TIMEK,#00H
;=======================================================================================
;按键扫描
;=======================================================================================
START:	ACALL DISP
	MOV A,P3
	ANL A,#0FH
	XRL A,#0FH
	JZ START            ;有无按键按下判断
	ACALL DELAY5MS
	MOV A,P3
	ANL A,#0FH
	XRL A,#0FH
	JZ START
	ACALL BUZZER        ;调用蜂鸣器子程序
	MOV A,P3
	ANL A,#0FH
	CJNE A,#0EH,STARK   ;OEH:为LED控制按键,如果不为1就跳到启动按钮判断
	clr p1.2
	INC LEDCOUNT        ;LEDCOUNT为1:亮,LEDCOUNT为2:灭
	MOV A,LEDCOUNT
	CJNE A,#01H,LEDSTOP
	ACALL KEYFK
	SJMP START
LEDSTOP:SETB P1.2            ;LECOUNT为2时LED灯灭
	ACALL KEYFK
	MOV LEDCOUNT,#00H
	SJMP START
;=======================================================================================
;启动/停止判断子程序
;=======================================================================================
STARK:	CJNE A,#07H,WIND     ;跳到风量键判断
	ACALL KEYFK
	INC SSTOP
	MOV A,SSTOP
	CJNE A,#01H,KEYSTOP   ;SSTPO为1:启动并显示为1:停止
	CLR P2.2              ;启动时风速和延时指示灯亮          
	CLR P2.3 
	LJMP START
WIND:	JMP WIND1
;=======================================================================================
;停止子程序
;=======================================================================================
KEYSTOP:MOV SSTOP,#00H
	MOV A,P1
	ORL A,#03H             ;关闭P1.0和P1.1,P1.7和P1.2始终有效,因为LED灯不受停止开关控制
	MOV P1,A
	MOV ROUNT,#00H
	MOV TIMEK,#00H
	SETB P2.2             ;延时指示灯灭
	SETB P2.3             ;风速指示灯灭
	LJMP START
;=======================================================================================
;风量设置子程序
;=======================================================================================
WIND1:	CJNE A,#0DH,TIMEKEY          ;跳到时间设置子程序
	MOV A,SSTOP
	CJNE A,#01H,RSTART           ;判断是在启动状态下,只有在启动状态下才能改变及显示风速
	ACALL KEYFK
	MOV A,TIMEK                  
	CJNE A,#00H,WIND2            ;判断时间是否有设置,如果有设置那么时间设置应清除,时间复位,
	SJMP WIND3
WIND2:	MOV TH0,#(65536-60000)/256   ;时间设置清除、复位子程序
	MOV TL0,#(65536-60000)MOD 256
	MOV R1,TIMEK
	MOV TIMEK,#00H
	MOV INCTA,#00H
	MOV INCTB,#00H
	CLR TR0
	ACALL DISP
WIND3:	INC ROUNT                     ;风速设置子程序
	MOV A,ROUNT
	CJNE A,#03H,WIND4            ;跳到风量1设置子程序
	MOV A,P1
	ORL A,#03H
	MOV P1,A
	MOV ROUNT,#00H
	LJMP START
RSTART:	ACALL KEYFK                   ;SSTOP为1时表示已经启动,为其它时为停止,风量按键不起作用
	LJMP START
WIND4:	CJNE A,#01H,WIND5             ;跳到风量2设置子程序
	SETB P1.1
	CLR P1.0
	LJMP START
WIND5:	SETB P1.0
	CLR P1.1
	LJMP START
;=======================================================================================
;时间设置子程序
;=======================================================================================
TIMEKEY:CJNE A,#0BH,OUTKEY            ;如果都不一样就跳到不在按键范围内子程序
	ACALL KEYFK
	MOV A,ROUNT
	CJNE A,#0,ADDTIME
	LJMP START
;=======================================================================================
;按键值不在范围内
;=======================================================================================
OUTKEY:	MOV A,P3
	ANL A,#0FH
	XRL A,#0FH
	JNZ TIMEKEY1
	LJMP START
;=======================================================================================
;时间设置初始化子程序
;=======================================================================================
TIMEKEY1:ACALL KEYFK
ADDTIME:INC TIMEK      ;定时键次数
	MOV A,TIMEK
	CJNE A,#0AH,TIME1
	MOV TIMEK,#00 
	LJMP START
TIME1:	CJNE A,#01H,TIME2     
	MOV R0,#1      ;1分钟 
	SETB TR0
	LJMP START
TIME2:	CJNE A,#02H,TIME3
       	CLR TR0	
	MOV TH0,#(65536-60000)/256   ;时间设置清除、复位子程序
	MOV TL0,#(65536-60000)MOD 256
	MOV INCTA,#00H
	MOV INCTB,#00H
	MOV R0,#2      ;2分钟
	SETB TR0
	LJMP START
TIME3:	CJNE A,#03H,TIME4
	CLR TR0
	MOV TH0,#(65536-60000)/256   ;时间设置清除、复位子程序
	MOV TL0,#(65536-60000)MOD 256
	MOV INCTA,#00H
	MOV INCTB,#00H
	MOV R0,#3      ;3分钟
	SETB TR0
	LJMP START
TIME4:	CJNE A,#01H,TIME5
	CLR TR0
	MOV TH0,#(65536-60000)/256   ;时间设置清除、复位子程序
	MOV TL0,#(65536-60000)MOD 256
	MOV INCTA,#00H
	MOV INCTB,#00H
	MOV R0,#4      ;4分钟
	SETB TR0
	LJMP START
TIME5:	CJNE A,#05H,TIME6
	CLR TR0
	MOV TH0,#(65536-60000)/256   ;时间设置清除、复位子程序
	MOV TL0,#(65536-60000)MOD 256
	MOV INCTA,#00H
	MOV INCTB,#00H
	MOV R0,#5      ;5分钟
	SETB TR0
	LJMP START
TIME6:	CJNE A,#06H,TIME7
	CLR TR0
	MOV TH0,#(65536-60000)/256   ;时间设置清除、复位子程序
	MOV TL0,#(65536-60000)MOD 256
	MOV INCTA,#00H
	MOV INCTB,#00H
	MOV R0,#6      ;6分钟
	SETB TR0
	LJMP START
TIME7:	CJNE A,#07H,TIME8
	CLR TR0
	MOV TH0,#(65536-60000)/256   ;时间设置清除、复位子程序
	MOV TL0,#(65536-60000)MOD 256
	MOV INCTA,#00H
	MOV INCTB,#00H
	MOV R0,#7      ;7分钟
	SETB TR0
	LJMP START
TIME8:	CJNE A,#08H,TIME9
	CLR TR0
	MOV TH0,#(65536-60000)/256   ;时间设置清除、复位子程序
	MOV TL0,#(65536-60000)MOD 256
	MOV INCTA,#00H
	MOV INCTB,#00H
	MOV R0,#8      ;8分钟
	SETB TR0
	LJMP START
TIME9:	CLR TR0
	MOV TH0,#(65536-60000)/256   ;时间设置清除、复位子程序
	MOV TL0,#(65536-60000)MOD 256
	MOV INCTA,#00H
	MOV INCTB,#00H
	MOV R4,#9      ;9分钟
	SETB TR0
	LJMP START
;=======================================================================================
;按键放开判断子程序
;=======================================================================================
KEYFK:	ACALL DISP
	MOV A,P3
	ANL A,#0FH
	XRL A,#0FH
	JNZ KEYFK
	RET
;=======================================================================================
;显示子程序
;=======================================================================================
DISP:	CLR P2.0
	CLR P2.1
	MOV A,SSTOP
	CJNE A,#01H,DISP1
	MOV DPTR,#TABLE
	SETB P2.0
	MOV A,TIMEK
	MOVC A,@A+DPTR
	MOV P0,A
	ACALL DELAY5MS
	CLR P2.0
	SETB P2.1
	MOV A,ROUNT
	MOVC A,@A+DPTR
	MOV P0,A
	ACALL DELAY5MS
	RET
DISP1:	RET
TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;0~9
;=======================================================================================
;中断入口,用来定时
;定时时间到后,时间显示复位、电机停止
;=======================================================================================
TO:	PUSH PSW
	PUSH ACC
	MOV TH0,#(65536-60000)/256
	MOV TL0,#(65536-60000)MOD 256
	INC INCTA
	MOV A,INCTA
	CJNE A,#64H,TO1                 ;600ms是否到了
	MOV INCTA,#00H
	INC INCTB
	MOV A,INCTB
	CJNE A,#0AH,TO1                ;1分钟是否到了
	MOV INCTB,#00H
	MOV A,TIMEK
	DEC A
	MOV TIMEK,A                    ;延时显示倒计
	DJNZ R0,TO1                    ;设定的时间是否到了
	SETB P1.0                      ;停止风速1电机                     
	SETB P1.1                      ;停止风速电机2
	MOV ROUNT,#00H                 ;风速显示清零
	MOV TIMEK,#00H                 ;时间显示复位
	CLR TR0                        ;停止定时器
	POP ACC
	POP PSW
	RETI
	TO1:POP ACC
	POP PSW
	RETI
;=======================================================================================
;蜂鸣器子程序,响2声
;=======================================================================================
BUZZER:	CLR P1.7
	NOP
	NOP
	NOP
	SETB P1.7
	NOP
	NOP
	NOP
	CPL P1.7
	NOP
	NOP
	NOP
	SETB P1.7
	RET
;=======================================================================================
;延时子程序
;=======================================================================================
DELAY5MS:MOV R6,#20
DD1:	MOV R7,#200
	DJNZ R7,$
	DJNZ R6,DD1
	RET
	END

⌨️ 快捷键说明

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