;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;; 变量定义 ;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
FLAG1 BIT 55H ;温度测量中的标志位
TEMPER_L EQU 31H ;温度测量中存放的高8位数据
TEMPER_H EQU 32H ;温度测量中存放的高8位数据
TEMPER_NUM EQU 34H ;存放温度数值
DQ BIT P0.7 ;外接温度传感器
SL BIT P1.0 ;调时键
JS BIT P1.1 ;调时加一
TM BIT P1.3 ;煮饭定时器开关
FR BIT P1.5 ;火力调节
SS BIT P1.4 ;总开关
JDQ BIT P1.6 ;输出控制继电器
MS BIT P1.7 ;蜂鸣器开关
NZ BIT P1.2 ;音乐/闹铃开关
XZ EQU P0 ;
CD45 EQU P2 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;; 数据初始化 ;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 00H
LJMP START
ORG 0BH
LJMP TIM0 ;T0中断地址
ORG 30H
START:
MOV SP, #70H
MOV P1,#00H ;断开继电器
MOV P2,#00H ;
MOV 33H, #100 ;33存放一次中断时间的乘数: 1s/0.01s
;延迟数据存放单元
MOV 39H, #0H ;
MOV 40H, #0H ;
;调时数据存放单元
MOV 30H, #00H ;
MOV 53H,#200
MOV 54H,#60 ;
MOV 63H,#240 ;
MOV R0,#41H ;R0存放时间数据的地址
MOV R1,#47H ;R1存放定时数据的地址
MOV TMOD, #01H ;选择模式1
MOV TH0,#0D8H ;给计时器高8位赋值
MOV TL0,#0F0H ;给计时器低8位赋值
MOV IE, #8AH ;开启TIMER0 中断
MOV P1,#3BH ;给PORT1 复位
SETB TR0 ;开启定时器
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;; 主程序 ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAIN:
JB SS,MAIN1 ;判断总开关
JB TM,DINGS ;判断定时
SETB JDQ ; ;开启继电器
SJMP MAIN2 ;
DINGS: ;若定时开关开启,判断是否到时间.
CLR JDQ ;
SJMP MAIN2 ;
MAIN1: ;当总开关闭和时,运行以下程序.(设置)
JNB FR, MAIN2 ;判断火力设置. 煮粥还是煮饭.
MOV A, 54H
CJNE A,#01H,MAIN2 ;
DJNZ 63H,MAIN2 ;
MOV 63H,#240 ;
CLR JDQ ;断开继电器
MAIN2:
MOV A,49H ;判断定时时候与目前时间是否吻合.
CJNE A,41H,SENS ;
MOV A,4AH ;
CJNE A,42H,SENS ;
MOV A,4BH ;
CJNE A,43H,SENS ;
MOV A,4CH ;
CJNE A,44H,SENS ;
MOV A,46H ;
CJNE A,#01H,SENS;
JNB TM,BRI2 ;
SETB JDQ ;开启继电器
MOV 63H,#240 ;为煮粥时间定时
BRI2:
JNB NZ,SENS ; ;判断音乐开启与否
LJMP MUSIC0 ;若是,执行音乐程序 否,执行温度测量程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;; 温度测量 ;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;模块程序
SENS:
LCALL GET_TEMPER
LCALL TEMPER_COV;
SJMP MAIN ;
GET_TEMPER:
SETB DQ ;
BCD:
LCALL INIT_1820;
JB FLAG1,S22 ;
LJMP BCD ;
S22:
LCALL DELAY2
MOV A,#0CCH ;
LCALL WRITE_1820;
MOV A,#44
LCALL WRITE_1820
NOP
LCALL DELAY1
LCALL DELAY1
CBA:
LCALL INIT_1820
JB FLAG1,ABC
LJMP CBA
ABC: LCALL DELAY2
MOV A,#0CCH
LCALL WRITE_1820
MOV A,#0BEH
LCALL WRITE_1820
LCALL READ_18200
RET
INIT_1820: SETB DQ ;初始化数字传感器
NOP
CLR DQ
MOV 55H,#80H
TSR1: DJNZ 55H,TSR1
SETB DQ
MOV 55H,#25H
TSR2: DJNZ 55H,TSR2
JNB DQ,TSR3
LJMP TSR4
TSR3: SETB FLAG1
LJMP TSR5
TSR4: CLR FLAG1
LJMP TSR7
TSR5: MOV 55H,#06BH
TSR6: DJNZ 55H,TSR6
TSR7: SETB DQ
RET
READ_1820:
MOV 55H,#8
RE1:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV 56H,#7
DJNZ 56H,$
MOV C,DQ
MOV 56H,#23
DJNZ 56H,$
RRC A
DJNZ 55H,RE1
RET
WRITE_1820:
MOV 55H,#8 ;写入温度传感器
CLR C
WR1: CLR DQ
MOV 56H,#6
DJNZ 56H,$
RRC A
MOV DQ,C
MOV 56H,#23
DJNZ 56H,$
SETB DQ
NOP
DJNZ 55H,WR1
SETB DQ
RET
READ_18200: ;读温度传感器
MOV 58H,#2
MOV 55H,#36H
RE00: MOV 56H,#8
RE01:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV 57H,#7
DJNZ 57H,$
MOV C, DQ
MOV 57H,#23
DJNZ 57H,$
RRC A
DJNZ 56H,RE01
SETB PSW.4
MOV R1,56H
MOV @R1,A
DEC 56H
CLR PSW.4
DJNZ 58H,RE00
RET
TEMPER_COV: ;温度转换
MOV A,#0F0H
ANL A,TEMPER_L
SWAP A
MOV TEMPER_NUM,A
MOV A, TEMPER_L
JNB ACC.3,TEMPER_COV1
INC TEMPER_NUM
TEMPER_COV1:
MOV A,TEMPER_H
ANL A,#07H
SWAP A
ADD A,TEMPER_NUM
MOV TEMPER_NUM,A
LCALL BIN_BCD
RET
BIN_BCD: ;再次初始化
MOV DPTR,#TEMP_TAB
MOV A, TEMPER_NUM
MOVC A,@A+DPTR
MOV TEMPER_NUM,A
MOV A,TEMPER_NUM
MOV B,#10
DIV AB
MOV 47H,A
MOV 48H,B
RET
RE_CONFIG:
JB FLAG1,RE_CONFIG1
RET
RE_CONFIG1:
MOV A,#0CCH
LCALL WRITE_1820
MOV A,#4EH
LCALL WRITE_1820
MOV A,#00H
LCALL WRITE_1820
MOV A,#00H
LCALL WRITE_1820
MOV A,#7FH
LCALL WRITE_1820
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;; 音乐程序 ;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;模块程序
MUSIC0: MOV DPTR,#DAT ;表头地址送DPTR
MOV 30H,#00H ;中断计数器清0
MOV B,#00H ;表序号清0
MUSIC1: JNB SL,MUSICN;
LCALL DELAY ;
JNB SL,MUSICN;
CLR MS
MUSICN: CLR A ;CLEAR A
MOVC A,@A+DPTR ;查表取代码
JZ END0 ;是00H,则结束
CJNE A,#0FFH,MUSIC5
LJMP MUSIC3
MUSIC5:
NOP
MOV R6,A
INC DPTR
MOV A,B
MOVC A,@A+DPTR ;取节拍代码送R7
MOV R7,A
;SETB TR0
MUSIC2:
NOP
CPL MS
MOV A,R6
MOV R3,A
LCALL DEL
MOV A,R7
CJNE A,30H,MUSIC2 ;中断计数器(20H)=R7否?
;不等,则继续循环
MOV 30H,#00H ;等于,则取下一代码
INC DPTR
INC B
LJMP MUSIC1
MUSIC3:
NOP
CLR MS ;CLR TR0 休止100毫秒
MOV R2,#0DH
MUSIC4:
NOP
MOV R3,#0FFH
LCALL DEL
DJNZ R2,MUSIC4
INC DPTR
SETB MS
LJMP MUSIC1
MUSIC6:
MOV R3,#00H
LCALL DEL
DJNZ R2,MUSIC6
LJMP MUSIC0
END0:
CLR MS ;
LJMP MAIN ;音乐程序执行完,返回主程序.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;; 延迟系统 ;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DEL:
NOP
DEL3:
MOV R4,#02H
DEL4:
NOP
DJNZ R4,DEL4
NOP
DJNZ R3,DEL3
RET
DELAY:
MOV 39H,#14H
L1:
MOV 40H,#0F8H ;
DJNZ 40H,$ ;
DJNZ 39H,L1 ;
RET
DELAY1: MOV 59H,#00H
MIN: DJNZ 59H,YS500
RET
YS500:
LCALL YS500US
LJMP MIN
YS500US:
MOV 60H,#00H
DJNZ 60H,$
RET
DELAY2:MOV 60H,#20H
DJNZ 60H,$
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;; 计时中断;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIM0:
PUSH ACC
PUSH PSW
INC 30H ;中断服务,中断计数器加1
DJNZ 33H,SD ;中断10MS
MOV 33H, #100 ;重载100
INC 46H ;
MOV A, 46H ;
CJNE A,#0,SD ;检测是否到60s
MOV 46H, #0H ;置数
INC 45H ;分钟加一
MOV A,45H ;
CJNE A,#6,SD ;检测60M
MOV 45H, #0 ;重载0
INC 44H ;
MOV A,44H ;
CJNE A,#0,SD
MOV 44H,#0 ;小时个位
INC 43H ;
MOV A, 43H ;
CJNE A,#6,SD
MOV 43H, #0H
INC 42H ;检测小时是否到24
MOV A, 42H ; ;检测小时个位
CJNE A,#4,HOU ;
MOV A, 41H ;
CJNE A,#2,HOU ; ;检测小时十位
MOV 41H,#00 ;
MOV 42H,#00 ; ;时间处理完毕
SJMP SD ;
HOU:
MOV A, 42H ; ;41,42 用于显示
CJNE A,#0,SD ;
INC 41H ;显示位移动
SD: MOV A, #0F0H ;精准调时
ADD A, TL0 ;
MOV TL0, A ;重载计时器低8位
MOV TH0, #0D9H ;重载计时器高8位
;;;;;;;;;;;;;;;;;;;;;;
;;;;;; 显示程序 ;;;;;
;;;;;;;;;;;;;;;;;;;;;;
DISPLAY:
JB JS,SWI ; ;判断转换开关是否被按下
JB SL,JUS1 ; ;判断调时开关是否被按下
INC R0 ;显示位移动
INC XZ ;
MOV A,R0 ;数据位变化
CJNE A,#49H,RRS ;
MOV R0,#41H ;寻址寄存器变化
MOV XZ,#00H ;寻址寄存器变化
RRS: MOV CD45,@R0 ;向CD4511传数据
R: DJNZ 53H,RR1 ; ;检查煮粥时间.
MOV 53H,#200 ; ;2个小时
DJNZ 54H,RR1 ;
MOV 54H,#60 ;
RR1:
POP PSW ;从堆栈中弹出数据
POP ACC
RETI ; ;退出中断.
SWI:
JB SL,JUS3 ;防抖动程序
INC R1 ; ;显示位移动
INC XZ ;
MOV A,R1
CJNE A,#4DH,RRS1 ;
MOV R1,#47H ; ;显示位还原
MOV XZ,#00H ; ;显示位还原
RRS1: MOV CD45,@R1 ;
;
LJMP R ;退出
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;; 调时程序 ;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
JUS1:
LCALL DELAY ; ;防抖动程序
DEC 33H ; ;精准定时
JNB SL,DISPLAY; ;检测松按键
JB SL,$ ; ;等待按键被弹起
MOV R0,#41H ; ;重置显示位
MOV R1,#49H ; ;重置显示位
MOV XZ,#00H ; ;重置78HC138
JUS0:
MOV CD45,@R0 ;调时间
JNB JS, JUS2 ;
LCALL DELAY ;
JNB JS,JUS2 ;
INC @R0 ;
JB JS, $ ;
JUS2: JNB SL,JUS0 ; ;防抖动
LCALL DELAY ;
JNB SL,JUS0 ;
JB SL,$ ;
INC R0 ; ;显示下一位
INC XZ ; ;显示下一位
MOV A,R0 ;
CJNE A,#47H,JUS0; ;判断显示位
MOV R0,#41H ;
MOV CD45,#00H ;
LJMP R ; ;退出
JUS3:
LCALL DELAY ; ;调定时时间
DEC 33H ; ;精准定时
JNB SL,SWI ; ;等待按键弹起
JB SL,$ ;
JB JS,$ ;
MOV R0,#41H ; ;改变显示位
MOV R1,#49H ;
MOV XZ,#00H ;
JUS4:
MOV CD45,@R1 ; ;置数CD4511
JNB JS, JUS5 ; ;判断是否有调节键按下
LCALL DELAY ;
JNB JS,JUS5 ; ;调时,时间加一
INC @R1 ;
JB JS, $ ;
JUS5: JNB SL,JUS4 ; ;换待调节显示位
LCALL DELAY ; ;防抖动
JNB SL,JUS4 ;
JNB SL,$ ;
INC R0 ; ;时间加一
INC XZ ; ;下一位显示
MOV A,R0 ; ;
CJNE A,#5DH,JUS0;
MOV R0,#49H ;
MOV XZ,#00H ;
LJMP R ; ;返回
;;;;;;;;;;;;;;;;;;;;;;;
;;;; 音乐程序数据表;;;;
;;;;;;;;;;;;;;;;;;;;;;;
DAT:
db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h
db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h
db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h
db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h
db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
db 20h,10h,2bh,10h,26h,30h,30h,80h,00H
TEMP_TAB:;温度测量程序数据表
DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,10H,11H,12H,13H,14H,15H
DB 16H,17H,18H,19H,20H,21H,22H,23H
DB 24H,25H,26H,27H,28H,29H,30H,31H
DB 32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,50H,51H,52H,53H,54H,55H
DB 56H,57H,58H,59H,60H,61H,62H,63H
DB 64H,65H,66H,67H,68H,69H,70H,71H
DB 72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H
DB 88H,89H,90H,91H,92H,93H,94H,95H
DB 96H,97H,98H,99H
END
文章评论(0条评论)
登录后参与讨论