智能家居远程控制系统
刘庆宇
;*****************************************************
; Filename:
; MCU: AT89S52 OSC:
; IC: MT8870 ISD4002 LM386 74LS04 ULN2803 24C02
; Display: LED*4
; Build by: Liu Qing Yu
; Vision :
; Date:2008-06-13
;********************************************************
;功能: 利用电话线路,远程控制 4 组继电器的通断,控制电饭煲、电
; 暖风等家用电器。可以设定延时通断。恢复出厂设置时按住设
; 置按键按复位键即可恢复默认密码 123456
; 默认开关状态为:关,延时为:无
;
;如需改变等待振铃次数,请搜索“振铃检测程序”并进行修改。
;
;
;寄存器组使用:
; 00:主程序
; 01:显示子程序
;******************************************
; 输入输出引脚定义
;******************************************
;MT8870: 数据 ~
MT_IN EQU P1
;STD____INT0
;ISD4002:
;ISDINT____INT1
MOSI BIT
SS BIT
SCLK BIT
;HD7279:
DAT BIT
CS BIT
CLK BIT
;24C02:
SCL BIT
SDA BIT
;继电器(摘机电路):
JDQK BIT ;低电平有效
;继电器 1(控制高压)
JDQ0_DFB BIT ;电饭煲
JDQ1_DNF BIT ;电暖风
JDQ2_KT BIT ;空调
JDQ3_RSH BIT ;电热水器
;延时指示灯:(低电平有效)
LED0 BIT
LED1 BIT
LED2 BIT
LED3 BIT
;振铃检测
ZHENLJC BIT
HUIFU BIT ;恢复出厂设置按键,默认密码 123456,默认开关状态为:关,延时为:
无
;0=恢复出厂设置 1=不恢复
;使用时按住此按键按复位键即可
;******************************************
; 变量定义
;******************************************
;工作状态寄存(00-07)
GZZHT EQU 20H
YSH0_KG BIT 00H ;延时状态, 1=开启 0=关闭
YSH1_KG BIT 01H
YSH2_KG BIT 02H
YSH3_KG BIT 03H
MIMA BIT 04H ; 密码状态,是否已经输入错误一次 1=是 0=否
STD BIT 05H ;有新数据输入 1=有 0=无
XINMIMA BIT 06H ;新密码校验位,校验两次输入密码是否一致 1=不一致 0=一致
ZHL6C BIT 07H ;振铃次数已够,可以摘机 1=可以 0=不可以
;工作状态寄存 2(08-0F)
GZZHT2 EQU 21H ;位寻址寄存 21H;
NOINPUT BIT 08H ;10 秒没有新数据输入,自动挂机。 1=可以挂机 0=不可以
IS15S BIT 09H ;
DEC_ON BIT 0AH ;是否显示小数点:1=显示 0=不显示
ISDINT BIT 0BH ;4002 中断置位标志
OUT_PLAY BIT 0CH ;从播放进程中终止标志 1=跳过后面的语音提示
;JDQ0_YSH BIT 0AH ; 继电器延时状态 1=开 0=关
;JDQ1_YSH BIT 0BH
;JDQ2_YSH BIT 0CH
;JDQ3_YSH BIT 0DH
;YANSHI BIT 05H ; 延时 1=开启 0=关闭
;YANSHIKG BIT 06H ; 延时状态 1=延时开 0=延时关
;YSH_OK BIT 0BH ;延时数据已准备好,可以写入 1=可以 0=不可以
M1 EQU 22H ;密码寄存(1---6)
M2 EQU 23H
M3 EQU 24H
M4 EQU 25H
M5 EQU 26H
M6 EQU 27H
DINGSHI EQU 28H ;定时时间临时存储
DATA_IN EQU 29H ;HD7279 输入输出缓存
DATA_OUT EQU 2AH
PLAY_ADD EQU 2BH
BAK_A_T1 EQU 2CH
YSH0_TM EQU 30H ;延时时间寄存
YSH1_TM EQU 31H
YSH2_TM EQU 32H
YSH3_TM EQU 33H
OUT_BW EQU 34H ;延时数据输出临时存储(用于显示)
OUT_SHW EQU 35H
OUT_GW EQU 36H
MIMAJSH EQU 37H ;【密码计数】对输入的密码个数进行计数
;ZHENLING EQU 31H ;【振铃计数】对振铃次数进行计数
;TIMEMOOD EQU 29H;定时器模式:03=关,80=4096Hz,81=64Hz,82=1Hz,83=1/60Hz
MTEMP EQU 38H ;记录密码输入错误次数
TEMP EQU 39H
;第一次输入新密码临时存储(3AH~3FH)
MT1 EQU 3FH
T0_TMP EQU 40H ;T0 临时存储,每隔 秒加 1
T0_TMP_S EQU 41H ;T0 临时存储,每隔 减 1
T0_TMP_M EQU 42H ;T0 临时存储,每隔 减 1
BAK_A EQU 43H ;中断期间 A 的备份
BAK_R1 EQU 44H;
BAK_RS1 EQU 45H
BAK_RS0 EQU 46H
BAK_A_SOUND EQU 47H
BAK_DPH EQU 48H
BAK_DPL EQU 49H
;延时数据临时存储
YSH_BW EQU 4AH
YSH_SHW EQU 4BH
YSH_GW EQU 4CH
ADDRESSL EQU 4DH ;ISD4002 放音地址 低位
PANDAH EQU 4EH ;ISD4002 放音地址 高位
TEMP2 EQU 4FH ;密码临时存储
TEMP3 EQU 50H ;T1 中断检测临时存储
TIME EQU 51H ;倒计时定时时间临时存储,长度 1 字节
DISP_CHT EQU 52H ;更换显示继电器倒计时时间计数
DISP_CH EQU 53H ;显示开关指示(1-4)
YSH0_KG_1 EQU 54H ;延时状态, 1=开启 0=关闭
YSH1_KG_1 EQU 55H
YSH2_KG_1 EQU 56H
YSH3_KG_1 EQU 57H
SOUND_OUT_BW EQU 58H ;延时数据输出临时存储(用于剩余时间提示)
SOUND_OUT_SHW EQU 59H
SOUND_OUT_GW EQU 5AH
ZHL_CSH EQU 5BH ;
;******************************************
; 主程序
;******************************************
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP STD_IN
ORG 00BH
LJMP T0STOP
ORG 0013H
LJMP INT1_STOP
ORG 001BH
LJMP T1STOP
ORG 0030H
;全局初始化
MAIN:
MOV SP,#60H ;堆栈
MOV IE,#00H ;禁止所有中断
LCALL LOAD ;载入状态
MOV MIMAJSH,#00H
MOV DINGSHI,#00H
MOV GZZHT,#00H
MOV GZZHT2,#00H
MOV T0_TMP,#200 ;T0 临时存储,每隔 秒加 1
MOV T0_TMP_S,#5 ;T0 临时存储,每隔 加 1
MOV T0_TMP_M,#120;T0 临时存储,每隔 1S 加 1
MOV DISP_CHT,#4 ;更换显示继电器倒计时时间计数
MOV DISP_CH,#1 ;显示开关指示(1-4)
MOV TMOD,#02H ;定时器 0,方式 2(8 位自装载)
MOV TH0,#06H
MOV TL0,#06H ;
MOV IP,#00000100B;设置外部中断 1 为高优先级中断
SETB IT1 ;脉冲触发方式
SETB ET0 ;允许 T0 中断
SETB EA ;允许中断
SETB TR0 ;启动 T0 定时器
SETB IT0 ;脉冲触发方式
; SETB EX0
CLR OUT_PLAY
;使用寄存器组 00
CLRRS1
CLRRS0
LCALL DELAY_30ms
JNB HUIFU,HUIFU1 ;是否恢复出厂设置
MAINLOOP:
JB HUIFU,LP1
LCALL DELAY_30MS
JNB HUIFU,LP2
LP1: CLR ZHL6C ;清振铃 6 次标志位
LCALL ZHENLING1 ;检测振铃
JNB ZHL6C,MAINLOOP ;振铃到 6 次,可以摘机
LP2: LCALL ZHAIJI ;振铃达到 6 次,摘机
SJMP MAINLOOP
;---------------------------------------------------
;恢复出厂设置
HUIFU1: JNB HUIFU,$
MOV M6,#01H
MOV M5,#02H
MOV M4,#03H
MOV M3,#04H
MOV M2,#05H
MOV M1,#06H
LCALL SAVE
LJMP MAINLOOP
;**********************************************
; 摘机子程序
;**********************************************
ZHAIJI: ; LCALL POWEROFF ;屏蔽 ISD4002,以免影响 DTMF 信号识别
CLRJDQK ;继电器摘机
LCALL DELAY_BS
LCALL DELAY_BS
CLR MIMA
CLR EX0 ;不允许语音提示中途退出
MOV A,#13
LCALL SOUND ;语音提示:欢迎您使用智能家居远程控制系统,请输入密码
SETB EX0
ZHJ_MM:
LCALL STDJC ;检测输入数据,结果由 A 带回
JB NOINPUT,EXIT_1
ZHJ_MM_JC1: MOV MIMAJSH,#00H
INC MIMAJSH
CJNE A,M6,ZHJ_MMC ;校验密码第一位是否正确
; JB JDQK,EXIT
LCALL STDJC
JB NOINPUT,EXIT_1
INC MIMAJSH
CJNE A,M5,ZHJ_MMC ;校验密码第二位是否正确
; JB JDQK,EXIT
LCALL STDJC
JB NOINPUT,EXIT_1
INC MIMAJSH
CJNE A,M4,ZHJ_MMC ;校验密码第三位是否正确
; JB JDQK,EXITT3
LCALL STDJC
JB NOINPUT,EXIT_1
INC MIMAJSH
CJNE A,M3,ZHJ_MMC ;校验密码第四位是否正确
; JB JDQK,EXIT
LCALL STDJC
JB NOINPUT,EXIT_1
INC MIMAJSH
CJNE A,M2,ZHJ_MMC ;校验密码第五位是否正确
; JB JDQK,EXIT
LCALL STDJC
JB NOINPUT,EXIT_1
INC MIMAJSH
CJNE A,M1,ZHJ_MMC ;校验密码第六位是否正确
; JB JDQK,EXIT
LJMP ZHJ_2
;----------------------------------------------------------
;密码错
ZHJ_MMC:
LCALL STDJC ;按键检测
JB NOINPUT,EXIT_1
INC MIMAJSH
MOV A,MIMAJSH;密码输入次数存 A
CLR C
SUBB A,#6 ;是否已输入 6 位
JC ZHJ_MMC;未输入六位,继续检测按键
JB MIMA,ZHJ_MMC1
LCALL DELAY_BS
MOV A,#33 ;语音提示:输入错误,请重新输入
LCALL SOUND
SETB MIMA
LJMP ZHJ_MM
ZHJ_MMC1:
LJMP EXIT
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
EXIT_1: LJMP EXIT
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;密码正确
ZHJ_2: SETB EX0 ;允许语音提示中途退出
LCALL DELAY_BS
MOV A,#14 ;语音提示:开关状态查询与修改请按"1",修改密码请按"2"
LCALL SOUND
JB OUT_PLAY,ZHJ_JC1
MOV A,#15 ;语音提示:挂机请按"*"号键
LCALL SOUND
JB OUT_PLAY,ZHJ_JC1 ;语音播放中有按键输入,直接跳转到按键识别部分
LCALL STDJC ;检测按键
JB NOINPUT,EXIT_1
ZHJ_JC1: CJNE A,#01H,ZHJ_GMM_1 ;若按键为:1
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 状 态 查
询 ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ZHJ_ZHT: LCALL DELAY_30MS
SETB EX0
MOV A,#23 ;请根据语音提示选择设备
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N ;语音播放中有按键输入,直接跳转到按键识别部分
MOV A,#1 ;语音提示:1
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N
MOV A,#16 ;语音提示:电饭煲
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N
LCALL DELAY_BS
MOV A,#2 ;语音提示:2
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N
MOV A,#17 ;语音提示:电暖风
LCALL DELAY_BS
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N
MOV A,#3 ;语音提示:3
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N
MOV A,#18 ;语音提示:空调
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N
LCALL DELAY_BS
MOV A,#4 ;语音提示:4
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N
MOV A,#19 ;语音提示:电热水器
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N
LCALL STDJC ;检测按键
JB NOINPUT,EXIT_1
AJMP ZHJ_DFB_N
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
ZHJ_GMM_1: LJMP ZHJ_GMM
ZHJ_DNF_1: LJMP ZHJ_DNF
ZHJ_DNF_N_1: LJMP ZHJ_DNF_N
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%% 电 饭 煲 状 态 查 询
%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
ZHJ_DFB_N: CJNE A,#01H,ZHJ_DNF_N_1 ;若按键为:1
ZHJ_DFB: CLR EX0 ;禁止语音提示中途退出
MOV A,#16 ;语音提示:电饭煲
LCALL SOUND
MOV A,#36 ;语音提示:的状态为
LCALL SOUND
JNB YSH0_KG,ZHJ_DFB2 ;无延时则跳转
JNB JDQ0_DFB,ZHJ_DFB1 ;延时关则跳转
MOV A,#26 ;语音提示:延时开
LCALL SOUND
MOV A,#0 ;继电器 0 剩余时间提示
LCALL SOUND_YSH ;延时剩余时间提示子程序
AJMP ZHJ_DFBXG
ZHJ_DFB1: MOV A,#27 ;语音提示:延时关
LCALL SOUND
MOV A,#0 ;继电器 0 剩余时间提示
LCALL SOUND_YSH ;延时剩余时间提示子程序
AJMP ZHJ_DFBXG
ZHJ_DFB2: JNB JDQ0_DFB,ZHJ_0_K
MOV A,#20 ;语音提示:关
LCALL SOUND
AJMP ZHJ_DFBXG
ZHJ_0_K:
MOV A,#21 ;语音提示:开
LCALL SOUND
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 电 饭 煲 状 态 修 改
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ZHJ_DFBXG:SETB EX0
LCALL DELAY_30MS
SETB EX0 ;允许语音提示中途退出
MOV A,#24 ;语音提示:开启
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_SHB
MOV A,#16 ;语音提示:电饭煲
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_SHB
MOV A,#28 ;语音提示:请按
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_SHB
MOV A,#1 ;语音提示:1
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_SHB
MOV A,#25 ;语音提示:关闭
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_SHB
MOV A,#16 ;语音提示:电饭煲
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_SHB
MOV A,#28 ;语音提示:请按
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_SHB
MOV A,#2 ;语音提示:2
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_SHB
MOV A,#26 ;语音提示:延时开
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_SHB
MOV A,#28 ;语音提示:请按
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_SHB
MOV A,#3 ;语音提示:3
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_SHB
MOV A,#27 ;语音提示:延时关
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_SHB
MOV A,#28 ;语音提示:请按
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_SHB
MOV A,#4 ;语音提示:4
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_SHB
MOV A,#15 ;语音提示:返回上级请按 9,挂机请按"*"号键
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_SHB
LCALL STDJC ;检测按键
JB NOINPUT,EXIT_2
;--------------------------------------------------------------------------
;开启电饭煲
ZHJ_DFB_SHB: CJNE A,#01H,ZHJ_DFBG ;若按键为:1
CLR JDQ0_DFB
SETB LED0
CLR YSH0_KG
ZHJ_DFBK4: MOV A,#16 ;语音提示:电饭煲
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N_T2
MOV A,#30 ;语音提示:已开启
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N_T2
LJMP ZHJ_ZHT
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
EXIT_2: LJMP EXIT
ZHJ_DFB_N_T2: LJMP ZHJ_DFB_N
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;--------------------------------------------------------------------------
;关闭电饭煲
ZHJ_DFBG: CJNE A,#02H,ZHJ_DFBY ;若按键为:2
SETB JDQ0_DFB
SETB LED0
CLR YSH0_KG
ZHJ_DFBG4: MOV A,#16 ;语音提示:电饭煲
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N_T2
MOV A,#31 ;语音提示:已关闭
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N_T2
LJMP ZHJ_ZHT
;--------------------------------------------------------------------------
;电饭煲延时开
ZHJ_DFBY: CJNE A,#03H,ZHJ_DFBY2
ZHJ_DFBY_2: LCALL YSH_IN ;调用延时输入子程序
JB JDQK,EXIT_2
MOV YSH0_TM,TIME ;存延时数据
SETB JDQ0_DFB
CLR LED0 ;开延时指示灯
SETB YSH0_KG ;置位延时开标志
CLR EX0
MOV A,#26 ;延时开
LCALL SOUND
MOV A,#32 ;已设定
LCALL SOUND
MOV A,#0 ;继电器 0 剩余时间提示
LCALL SOUND_YSH ;延时剩余时间提示子程序
SETB EX0
LJMP ZHJ_ZHT ;延时设定完毕,转状态查询页
;--------------------------------------------------------------------------
;电饭煲延时关
ZHJ_DFBY2: CJNE A,#04H,ZHJ_DFBF
ZHJ_DFBY2_2: LCALL YSH_IN ;调用延时输入子程序
JB JDQK,EXIT_3
MOV YSH0_TM,TIME ;存延时数据
CLR JDQ0_DFB
CLR LED0 ;开延时指示灯
SETB YSH0_KG ;置位延时开标志
CLR EX0
MOV A,#27 ;延时关
LCALL SOUND
MOV A,#32 ;已设定
LCALL SOUND
MOV A,#0 ;继电器 0 剩余时间提示
LCALL SOUND_YSH ;延时剩余时间提示子程序
SETB EX0
LJMP ZHJ_ZHT ;延时设定完毕,转状态查询页
;-----------------------------------------------------------------------------
ZHJ_DFBF: CJNE A,#09H,ZHJ_DFBF1 ;按键为 9
LJMP ZHJ_ZHT
ZHJ_DFBF1: CJNE A,#00001011B,ZHJ_DFBF2 ;按键为"*"
LJMP EXIT_3
ZHJ_DFBF2: MOV A,#33 ;语音提示:输入错误,请重新输入
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_SHB_T1
LJMP ZHJ_DFBXG
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
EXIT_3: LJMP EXIT
ZHJ_KT_1: LJMP ZHJ_KT
ZHJ_KT_N_1: LJMP ZHJ_KT_N
ZHJ_DFB_SHB_T1: LJMP ZHJ_DFB_SHB
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%% 电 暖 风 状 态 查 询
%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
ZHJ_DNF_N: CJNE A,#02H,ZHJ_KT_N_1 ;若按键为:1
ZHJ_DNF: CLR EX0 ;禁止语音提示中途退出
MOV A,#17 ;语音提示:电暖风
LCALL SOUND
MOV A,#36 ;语音提示:的状态为
LCALL SOUND
JNB YSH1_KG,ZHJ_DNF2 ;无延时则跳转
JNB JDQ1_DNF,ZHJ_DNF1 ;延时关则跳转
MOV A,#26 ;语音提示:延时开
LCALL SOUND
MOV A,#1 ;继电器 1 剩余时间提示
LCALL SOUND_YSH ;延时剩余时间提示子程序
AJMP ZHJ_DNFXG
ZHJ_DNF1: MOV A,#27 ;语音提示:延时关
LCALL SOUND
MOV A,#1 ;继电器 1 剩余时间提示
LCALL SOUND_YSH ;延时剩余时间提示子程序
AJMP ZHJ_DNFXG
ZHJ_DNF2: JNB JDQ1_DNF,ZHJ_1_K
MOV A,#20 ;语音提示:关
LCALL SOUND
AJMP ZHJ_DNFXG
ZHJ_1_K:
MOV A,#21 ;语音提示:开
LCALL SOUND
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 电 暖 风 状 态 修 改
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ZHJ_DNFXG:LCALL DELAY_30MS
SETB EX0 ;允许语音提示中途退出
MOV A,#24 ;语音提示:开启
LCALL SOUND
JB OUT_PLAY,ZHJ_DNF_SHB
MOV A,#17 ;语音提示:电暖风
LCALL SOUND
JB OUT_PLAY,ZHJ_DNF_SHB
MOV A,#28 ;语音提示:请按
LCALL SOUND
JB OUT_PLAY,ZHJ_DNF_SHB
MOV A,#1 ;语音提示:1
LCALL SOUND
JB OUT_PLAY,ZHJ_DNF_SHB
MOV A,#25 ;语音提示:关闭
LCALL SOUND
JB OUT_PLAY,ZHJ_DNF_SHB
MOV A,#17 ;语音提示:电暖风
LCALL SOUND
JB OUT_PLAY,ZHJ_DNF_SHB
MOV A,#28 ;语音提示:请按
LCALL SOUND
JB OUT_PLAY,ZHJ_DNF_SHB
MOV A,#2 ;语音提示:2
LCALL SOUND
JB OUT_PLAY,ZHJ_DNF_SHB
MOV A,#26 ;语音提示:延时开
LCALL SOUND
JB OUT_PLAY,ZHJ_DNF_SHB
MOV A,#28 ;语音提示:请按
LCALL SOUND
JB OUT_PLAY,ZHJ_DNF_SHB
MOV A,#3 ;语音提示:3
LCALL SOUND
JB OUT_PLAY,ZHJ_DNF_SHB
MOV A,#27 ;语音提示:延时关
LCALL SOUND
JB OUT_PLAY,ZHJ_DNF_SHB
MOV A,#28 ;语音提示:请按
LCALL SOUND
JB OUT_PLAY,ZHJ_DNF_SHB
MOV A,#4 ;语音提示:4
LCALL SOUND
JB OUT_PLAY,ZHJ_DNF_SHB
MOV A,#15 ;语音提示:返回上级请按 9,挂机请按"*"号键
LCALL SOUND
JB OUT_PLAY,ZHJ_DNF_SHB
LCALL STDJC ;检测按键
JB NOINPUT,EXIT_4
;--------------------------------------------------------------------------
;开启电暖风
ZHJ_DNF_SHB: CJNE A,#01H,ZHJ_DNFG ;若按键为:1
CLR JDQ1_DNF
SETB LED1
CLR YSH1_KG
ZHJ_DNFK4: MOV A,#17 ;语音提示:电暖风
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N_T3
MOV A,#30 ;语音提示:已开启
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N_T3
LJMP ZHJ_ZHT
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
EXIT_4: LJMP EXIT
ZHJ_DFB_N_T3: LJMP ZHJ_DFB_N
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;--------------------------------------------------------------------------
;关闭电暖风
ZHJ_DNFG: CJNE A,#02H,ZHJ_DNFY ;若按键为:2
SETB JDQ1_DNF
SETB LED1
CLR YSH1_KG
ZHJ_DNFG4: MOV A,#17 ;语音提示:电暖风
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N_T3
MOV A,#31 ;语音提示:已关闭
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N_T3
LJMP ZHJ_ZHT
;--------------------------------------------------------------------------
;电暖风延时开
ZHJ_DNFY: CJNE A,#03H,ZHJ_DNFY2
ZHJ_DNFY_2: LCALL YSH_IN ;调用延时输入子程序
JB JDQK,EXIT_4
MOV YSH1_TM,TIME ;存延时数据
SETB JDQ1_DNF
CLR LED1 ;开延时指示灯
SETB YSH1_KG ;置位延时开标志
CLR EX0
MOV A,#26 ;延时开
LCALL SOUND
MOV A,#32 ;已设定
LCALL SOUND
MOV A,#1 ;继电器 1 剩余时间提示
LCALL SOUND_YSH ;延时剩余时间提示子程序
SETB EX0
LJMP ZHJ_ZHT ;延时设定完毕,转状态查询页
;--------------------------------------------------------------------------
;电暖风延时关
ZHJ_DNFY2: CJNE A,#04H,ZHJ_DNFF
ZHJ_DNFY2_2: LCALL YSH_IN ;调用延时输入子程序
JB JDQK,EXIT_5
MOV YSH1_TM,TIME ;存延时数据
CLR JDQ1_DNF
CLR LED1 ;开延时指示灯
SETB YSH1_KG ;置位延时开标志
CLR EX0
MOV A,#27 ;延时关
LCALL SOUND
MOV A,#32 ;已设定
LCALL SOUND
MOV A,#1 ;继电器 1 剩余时间提示
LCALL SOUND_YSH ;延时剩余时间提示子程序
SETB EX0
LJMP ZHJ_ZHT ;延时设定完毕,转状态查询页
;-----------------------------------------------------------------------------
ZHJ_DNFF: CJNE A,#09H,ZHJ_DNFF1 ;按键为 9
LJMP ZHJ_ZHT
ZHJ_DNFF1: CJNE A,#00001011B,ZHJ_DNFF2 ;按键为"*"
LJMP EXIT_3
ZHJ_DNFF2: MOV A,#33 ;语音提示:输入错误,请重新输入
LCALL SOUND
JB OUT_PLAY,ZHJ_DNF_SHB_T1
LJMP ZHJ_DNFXG
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
ZHJ_DNF_SHB_T1: LJMP ZHJ_DNF_SHB
EXIT_5: LJMP EXIT
ZHJ_RSH_1: LJMP ZHJ_RSH
ZHJ_RSH_N_1: LJMP ZHJ_RSH_N
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%% 空 调 状 态 查 询
%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
ZHJ_KT_N: CJNE A,#03H,ZHJ_RSH_N_1 ;若按键为:1
ZHJ_KT: CLR EX0 ;禁止语音提示中途退出
MOV A,#18 ;语音提示:空调
LCALL SOUND
MOV A,#36 ;语音提示:的状态为
LCALL SOUND
JNB YSH2_KG,ZHJ_KT2 ;无延时则跳转
JNB JDQ2_KT,ZHJ_KT1 ;延时关则跳转
MOV A,#26 ;语音提示:延时开
LCALL SOUND
MOV A,#2 ;继电器 2 剩余时间提示
LCALL SOUND_YSH ;延时剩余时间提示子程序
AJMP ZHJ_KTXG
ZHJ_KT1: MOV A,#27 ;语音提示:延时关
LCALL SOUND
MOV A,#2 ;继电器 2 剩余时间提示
LCALL SOUND_YSH ;延时剩余时间提示子程序
AJMP ZHJ_KTXG
ZHJ_KT2: JNB JDQ2_KT,ZHJ_2_K
MOV A,#20 ;语音提示:关
LCALL SOUND
AJMP ZHJ_KTXG
ZHJ_2_K:
MOV A,#21 ;语音提示:开
LCALL SOUND
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 空 调 状 态 修 改
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ZHJ_KTXG: LCALL DELAY_30MS
SETB EX0 ;允许语音提示中途退出
MOV A,#24 ;语音提示:开启
LCALL SOUND
JB OUT_PLAY,ZHJ_KT_SHB
MOV A,#18 ;语音提示:空调
LCALL SOUND
JB OUT_PLAY,ZHJ_KT_SHB
MOV A,#28 ;语音提示:请按
LCALL SOUND
JB OUT_PLAY,ZHJ_KT_SHB
MOV A,#1 ;语音提示:1
LCALL SOUND
JB OUT_PLAY,ZHJ_KT_SHB
MOV A,#25 ;语音提示:关闭
LCALL SOUND
JB OUT_PLAY,ZHJ_KT_SHB
MOV A,#18 ;语音提示:空调
LCALL SOUND
JB OUT_PLAY,ZHJ_KT_SHB
MOV A,#28 ;语音提示:请按
LCALL SOUND
JB OUT_PLAY,ZHJ_KT_SHB
MOV A,#2 ;语音提示:2
LCALL SOUND
JB OUT_PLAY,ZHJ_KT_SHB
MOV A,#26 ;语音提示:延时开
LCALL SOUND
JB OUT_PLAY,ZHJ_KT_SHB
MOV A,#28 ;语音提示:请按
LCALL SOUND
JB OUT_PLAY,ZHJ_KT_SHB
MOV A,#3 ;语音提示:3
LCALL SOUND
JB OUT_PLAY,ZHJ_KT_SHB
MOV A,#27 ;语音提示:延时关
LCALL SOUND
JB OUT_PLAY,ZHJ_KT_SHB
MOV A,#28 ;语音提示:请按
LCALL SOUND
JB OUT_PLAY,ZHJ_KT_SHB
MOV A,#4 ;语音提示:4
LCALL SOUND
JB OUT_PLAY,ZHJ_KT_SHB
MOV A,#15 ;语音提示:返回上级请按 9,挂机请按"*"号键
LCALL SOUND
JB OUT_PLAY,ZHJ_KT_SHB
LCALL STDJC ;检测按键
JB NOINPUT,EXIT_6
;--------------------------------------------------------------------------
;开启空调
ZHJ_KT_SHB: CJNE A,#01H,ZHJ_KTG ;若按键为:1
CLR JDQ2_KT
SETB LED2
CLR YSH2_KG
ZHJ_KTK4: MOV A,#18 ;语音提示:空调
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N_T4
MOV A,#30 ;语音提示:已开启
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N_T4
LJMP ZHJ_ZHT
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
EXIT_6: LJMP EXIT
ZHJ_DFB_N_T4: LJMP ZHJ_DFB_N
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;--------------------------------------------------------------------------
;关闭空调
ZHJ_KTG: CJNE A,#02H,ZHJ_KTY ;若按键为:2
SETB JDQ2_KT
SETB LED2
CLR YSH2_KG
ZHJ_KTG4: MOV A,#18 ;语音提示:空调
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N_T4
MOV A,#31 ;语音提示:已关闭
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N_T4
LJMP ZHJ_ZHT
;--------------------------------------------------------------------------
;空调延时开
ZHJ_KTY: CJNE A,#03H,ZHJ_KTY2
ZHJ_KTY_2: LCALL YSH_IN ;调用延时输入子程序
JB JDQK,EXIT_6
MOV YSH2_TM,TIME ;存延时数据
SETB JDQ2_KT
CLR LED2 ;开延时指示灯
SETB YSH2_KG ;置位延时开标志
CLR EX0
MOV A,#26 ;延时开
LCALL SOUND
MOV A,#32 ;已设定
LCALL SOUND
MOV A,#2 ;继电器 2 剩余时间提示
LCALL SOUND_YSH ;延时剩余时间提示子程序
SETB EX0
LJMP ZHJ_ZHT ;延时设定完毕,转状态查询页
;--------------------------------------------------------------------------
;空调延时关
ZHJ_KTY2: CJNE A,#04H,ZHJ_KTF
ZHJ_KTY2_2: LCALL YSH_IN ;调用延时输入子程序
JB JDQK,EXIT_8
MOV YSH2_TM,TIME ;存延时数据
CLR JDQ2_KT
CLR LED2 ;开延时指示灯
SETB YSH2_KG ;置位延时开标志
CLR EX0
MOV A,#27 ;延时关
LCALL SOUND
MOV A,#32 ;已设定
LCALL SOUND
MOV A,#2 ;继电器 2 剩余时间提示
LCALL SOUND_YSH ;延时剩余时间提示子程序
SETB EX0
LJMP ZHJ_ZHT ;延时设定完毕,转状态查询页
;-----------------------------------------------------------------------------
ZHJ_KTF: CJNE A,#09H,ZHJ_KTF1 ;按键为 9
LJMP ZHJ_ZHT
ZHJ_KTF1: CJNE A,#00001011B,ZHJ_KTF2 ;按键为"*"
LJMP EXIT_3
ZHJ_KTF2: MOV A,#33 ;语音提示:输入错误,请重新输入
LCALL SOUND
JB OUT_PLAY,ZHJ_KT_SHB_T1
LJMP ZHJ_KTXG
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
EXIT_8: LJMP EXIT
ZHJ_KT_SHB_T1:LJMP ZHJ_KT_SHB
ZHJ_ERR_1: LJMP ZHJ_ERR
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%% 电 热 水 器 状 态 查 询
%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
ZHJ_RSH_N: CJNE A,#04H,ZHJ_ERR_1 ;若按键为:1
ZHJ_RSH: CLR EX0 ;禁止语音提示中途退出
MOV A,#19 ;语音提示:电热水器
LCALL SOUND
MOV A,#36 ;语音提示:的状态为
LCALL SOUND
JNB YSH3_KG,ZHJ_RSH2 ;无延时则跳转
JNB JDQ3_RSH,ZHJ_RSH1 ;延时关则跳转
MOV A,#26 ;语音提示:延时开
LCALL SOUND
MOV A,#3 ;继电器 3 剩余时间提示
LCALL SOUND_YSH ;延时剩余时间提示子程序
AJMP ZHJ_RSHXG
ZHJ_RSH1: MOV A,#27 ;语音提示:延时关
LCALL SOUND
MOV A,#3 ;继电器 3 剩余时间提示
LCALL SOUND_YSH ;延时剩余时间提示子程序
AJMP ZHJ_RSHXG
ZHJ_RSH2: JNB JDQ3_RSH,ZHJ_3_K
MOV A,#20 ;语音提示:关
LCALL SOUND
AJMP ZHJ_RSHXG
ZHJ_3_K:
MOV A,#21 ;语音提示:开
LCALL SOUND
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 电 热 水 器 状 态 修 改
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ZHJ_RSHXG:LCALL DELAY_30MS
SETB EX0 ;允许语音提示中途退出
MOV A,#24 ;语音提示:开启
LCALL SOUND
JB OUT_PLAY,ZHJ_RSH_SHB
MOV A,#19 ;语音提示:电热水器
LCALL SOUND
JB OUT_PLAY,ZHJ_RSH_SHB
MOV A,#28 ;语音提示:请按
LCALL SOUND
JB OUT_PLAY,ZHJ_RSH_SHB
MOV A,#1 ;语音提示:1
LCALL SOUND
JB OUT_PLAY,ZHJ_RSH_SHB
MOV A,#25 ;语音提示:关闭
LCALL SOUND
JB OUT_PLAY,ZHJ_RSH_SHB
MOV A,#19 ;语音提示:电热水器
LCALL SOUND
JB OUT_PLAY,ZHJ_RSH_SHB
MOV A,#28 ;语音提示:请按
LCALL SOUND
JB OUT_PLAY,ZHJ_RSH_SHB
MOV A,#2 ;语音提示:2
LCALL SOUND
JB OUT_PLAY,ZHJ_RSH_SHB
MOV A,#26 ;语音提示:延时开
LCALL SOUND
JB OUT_PLAY,ZHJ_RSH_SHB
MOV A,#28 ;语音提示:请按
LCALL SOUND
JB OUT_PLAY,ZHJ_RSH_SHB
MOV A,#3 ;语音提示:3
LCALL SOUND
JB OUT_PLAY,ZHJ_RSH_SHB
MOV A,#27 ;语音提示:延时关
LCALL SOUND
JB OUT_PLAY,ZHJ_RSH_SHB
MOV A,#28 ;语音提示:请按
LCALL SOUND
JB OUT_PLAY,ZHJ_RSH_SHB
MOV A,#4 ;语音提示:4
LCALL SOUND
JB OUT_PLAY,ZHJ_RSH_SHB
MOV A,#15 ;语音提示:返回上级请按 9,挂机请按"*"号键
LCALL SOUND
JB OUT_PLAY,ZHJ_RSH_SHB
LCALL STDJC ;检测按键
JB NOINPUT,EXIT_7
;--------------------------------------------------------------------------
;开启电热水器
ZHJ_RSH_SHB: CJNE A,#01H,ZHJ_RSHG ;若按键为:1
CLR JDQ3_RSH
SETB LED3
CLR YSH3_KG
ZHJ_RSHK4: MOV A,#19 ;语音提示:电热水器
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N_T5
MOV A,#30 ;语音提示:已开启
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N_T5
LJMP ZHJ_ZHT
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
EXIT_7: LJMP EXIT
ZHJ_DFB_N_T5: LJMP ZHJ_DFB_N
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;--------------------------------------------------------------------------
;关闭电热水器
ZHJ_RSHG: CJNE A,#02H,ZHJ_RSHY ;若按键为:2
SETB JDQ3_RSH
SETB LED3
CLR YSH3_KG
ZHJ_RSHG4: MOV A,#19 ;语音提示:电热水器
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N_T5
MOV A,#31 ;语音提示:已关闭
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N_T5
LJMP ZHJ_ZHT
;--------------------------------------------------------------------------
;电热水器延时开
ZHJ_RSHY: CJNE A,#03H,ZHJ_RSHY2
ZHJ_RSHY_2: LCALL YSH_IN ;调用延时输入子程序
JB JDQK,EXIT_7
MOV YSH3_TM,TIME ;存延时数据
SETB JDQ3_RSH
CLR LED3 ;开延时指示灯
SETB YSH3_KG ;置位延时开标志
CLR EX0
MOV A,#26 ;延时开
LCALL SOUND
MOV A,#32 ;已设定
LCALL SOUND
MOV A,#3 ;继电器 3 剩余时间提示
LCALL SOUND_YSH ;延时剩余时间提示子程序
SETB EX0
LJMP ZHJ_ZHT ;延时设定完毕,转状态查询页
;--------------------------------------------------------------------------
;电热水器延时关
ZHJ_RSHY2: CJNE A,#04H,ZHJ_RSHF
ZHJ_RSHY2_2: LCALL YSH_IN ;调用延时输入子程序
JB JDQK,EXIT
MOV YSH3_TM,TIME ;存延时数据
CLR JDQ3_RSH
CLR LED3 ;开延时指示灯
SETB YSH3_KG ;置位延时开标志
CLR EX0
MOV A,#27 ;延时关
LCALL SOUND
MOV A,#32 ;已设定
LCALL SOUND
MOV A,#3 ;继电器 3 剩余时间提示
LCALL SOUND_YSH ;延时剩余时间提示子程序
SETB EX0
LJMP ZHJ_ZHT ;延时设定完毕,转状态查询页
;-----------------------------------------------------------------------------
ZHJ_RSHF: CJNE A,#09H,ZHJ_RSHF1 ;按键为 9
LJMP ZHJ_ZHT
ZHJ_RSHF1: CJNE A,#00001011B,ZHJ_RSHF2 ;按键为"*"
LJMP EXIT_3
ZHJ_RSHF2: MOV A,#33 ;语音提示:输入错误,请重新输入
LCALL SOUND
JB OUT_PLAY,ZHJ_RSH_SHB_T1
LJMP ZHJ_RSHXG
ZHJ_RSH_SHB_T1: LJMP ZHJ_RSH_SHB
ZHJ_DFB_N_T1: LJMP ZHJ_DFB_N
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%% 输 入 错 误
%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
ZHJ_ERR: MOV A,#33 ;语音提示:输入错误,请重新输入
LCALL SOUND
JB OUT_PLAY,ZHJ_DFB_N_T1
LJMP ZHJ_ZHT
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%% 挂 机
%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
EXIT: SETB JDQK
MOV MIMAJSH,#00H
LCALL SAVE
RET
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
ZHJ_GJ_T1: LJMP ZHJ_GJ
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%% 修 改 密 码
%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
ZHJ_GMM: CLR EX0
CJNE A,#02H,ZHJ_GJ_T1 ;若按键为:2 ;修改密码
LCALL DELAY_BS
ZHJ_GMM_RE: MOV A,#35 ;语音提示:请输入 6 位新密码,按"#"号键结束
LCALL SOUND
; JB OUT_PLAY,ZHJ_GMM_SHB
MOV R1,#06H ;密码位数
MOV R0,#MT1 ;密码位首地址
SETB XINMIMA ;新密码校验位置 1。
ZHJ_GMM1: SETB EX0
LCALL STDJC ;检测按键
CLR EX0
JB NOINPUT,EXIT
ZHJ_GMM_SHB: MOV @R0,A ;保存新密码
DEC R0 ;地址位减一,准备输入下一位密码
DJNZ R1,ZHJ_GMM1;检测 6 位是否输入完毕
SETB EX0
LCALL STDJC ;检测按键是否为"#"
CLR EX0
JB NOINPUT,EXIT
CJNE A,#00001100B,ZHJ_GMM2
LCALL DELAY_BS
MOV A,#37 ;语音提示:请再输入一次
LCALL SOUND
; JB OUT_PLAY,ZHJ_GMM_SHB
MOV R1,#06H
MOV R0,#MT1
ZHJ_GMM5: SETB EX0
LCALL STDJC
CLR EX0
JB NOINPUT,EXIT
MOV TEMP2,@R0
CJNE A,TEMP2,ZHJ_GMM3 ;比较密码,若错误,"XINMIMA"位清零
ZHJ_GMM4: DEC R0
DJNZ R1,ZHJ_GMM5
SETB EX0
LCALL STDJC
CLR EX0
JB NOINPUT,EXIT
CJNE A,#00001100B,ZHJ_GMM2
JNB XINMIMA,ZHJ_GMM2
MOV R0,#MT1 ;保存新密码
MOV M6,@R0
DEC R0
MOV M5,@R0
DEC R0
MOV M4,@R0
DEC R0
MOV M3,@R0
DEC R0
MOV M2,@R0
DEC R0
MOV M1,@R0
LCALL DELAY_BS
CLR EX0
MOV A,#38 ;语音提示:密码已更新
LCALL SOUND
SETB EX0
LJMP ZHJ_2
ZHJ_GMM2: CLR EX0
MOV A,#33 ;语音提示:输入错误,请重新输入
LCALL SOUND
SETB EX0
LJMP ZHJ_GMM_RE
ZHJ_GMM3: CLR XINMIMA ;密码错误,"XINMIMA"位清零。
LJMP ZHJ_GMM4
;----------------------------------------------------------------------
ZHJ_GJ: CJNE A,#00001011B,ZHJ_GJ2 ;按键为"*"
LJMP EXIT
ZHJ_GJ2: MOV A,#33 ;语音提示:输入错误,请重新输入
LCALL SOUND
JB OUT_PLAY,ZHJ_JC1_T1
LJMP ZHJ_2
ZHJ_JC1_T1: LJMP ZHJ_JC1
;**********************************************
; 接收并处理延时数据,结果存于 TIME
;**********************************************
YSH_IN: LCALL DELAY_BS
MOV A,#34 ;语音提示:请输入时间,按"#"号键确认,单位为分,请不要超过 255
分
CLR EX0
LCALL SOUND
SETB EX0
JB OUT_PLAY,YSH_IN_SHB_1
MOV YSH_BW,#00H
MOV YSH_SHW,#00H
MOV YSH_GW,#00H
LCALL STDJC
JB NOINPUT,YSH_ERR
YSH_IN_SHB_1: MOV YSH_GW,A ;保存第一位
CLR C ;判断第一位是否为数字 1~9
SUBB A,#0AH
JC YSH_IN2
LCALL DELAY_BS
MOV A,#33 ;语音提示:输入错误,请重新输入
LCALL SOUND
JB OUT_PLAY,YSH_IN_SHB_1
SJMP YSH_IN ;跳转到开始,重新输入延时时间
YSH_IN2: LCALL STDJC
JB NOINPUT,YSH_ERR
CJNE A,#00001010B,YSH_IN222 ;如果输入为 1010 则转换为"0"
MOV A,#00H
YSH_IN222: CJNE A,#00001100B,YSH_IN22 ;判断输入是否是"#"号
LJMP YSH_EXIT ;输入是"#"号,跳到结束
YSH_IN22: MOV YSH_SHW,YSH_GW
MOV YSH_GW,A ;保存第二位
CLR C ;判断第二位是否为数字 0~9
SUBB A,#0AH
JC YSH_IN3
LCALL DELAY_BS
MOV A,#33 ;语音提示:输入错误,请重新输入
LCALL SOUND
JB OUT_PLAY,YSH_IN_SHB_1
SJMP YSH_IN
YSH_IN3: LCALL STDJC
JB NOINPUT,YSH_ERR
CJNE A,#00001010B,YSH_IN333 ;如果输入为 1010 则转换为"0"
MOV A,#00H
YSH_IN333: CJNE A,#00001100B,YSH_IN33 ;判断输入是否是"#"号
AJMP YSH_EXIT
YSH_IN33: MOV YSH_BW,YSH_SHW
MOV YSH_SHW,YSH_GW
MOV YSH_GW,A ;保存第三位
CLR C ;判断第三位是否为数字 0~9
SUBB A,#0AH
JC YSH_IN4
LCALL DELAY_BS
MOV A,#33 ;语音提示:输入错误,请重新输入
LCALL SOUND
JB OUT_PLAY,YSH_IN_SHB_1
LJMP YSH_IN
YSH_IN4: LCALL STDJC
JB NOINPUT,YSH_ERR
CJNE A,#00001100B,YSH_IN44 ;检测最后一位是否是"#"号
AJMP YSH_EXIT ;是"#"号
YSH_IN44: MOV A,#33 ;语音提示:输入错误,请重新输入
LCALL SOUND
JB OUT_PLAY,YSH_IN_SHB_1
LJMP YSH_IN ;不是"#"号,重新输入
;-----------------------------------------------------------
;延时出错
YSH_ERR:
SETB JDQK
RET
;--------------------------------------------------------------------------
;将输入数据由 BCD 码转换为十六进制数,并存储于 TIME
YSH_EXIT: CLR C
MOV TIME,#00H ;采用 百位×100+十位×10+个位 的方法
MOV A,YSH_BW
MOV B,#100
MUL AB
MOV TIME,A
MOV A,B ;判断输入数据是否超过 255
JZ YSH_EXIT1 ;A 等于"0"跳转
AJMP YSH_IN44
YSH_EXIT1: MOV A,YSH_SHW
MOV B,#10
MUL AB
CLR C
ADD A,TIME
JNC YSH_EXIT2
AJMP YSH_IN44
YSH_EXIT2: MOV TIME,A
CLR C
ADD A,YSH_GW
JNC YSH_RET
AJMP YSH_IN44
YSH_RET: MOV TIME,A;将转换后的十六进制延时时间存入 TIME
RET
;**********************************************
; 延时时间显示子程序
;**********************************************
DISPLAY: ;由 A 输入显示时间 1-4
;使用寄存器组 01
MOV DATA_OUT,#10000011B ;显示第 4 位
ACALL SEND
MOV A,DISP_CH
MOV DATA_OUT,A
ACALL SEND
SETB CS
; MOV R6,#3 ;共显示 3 位
;正常显示
DISPLAY_LP:
MOV DATA_OUT,#10000010B ;显示第 3 位
ACALL SEND
MOV DATA_OUT,OUT_BW
ACALL SEND
SETB CS
MOV DATA_OUT,#10000001B ;显示第 2 位
ACALL SEND
MOV DATA_OUT,OUT_SHW
ACALL SEND
SETB CS
MOV DATA_OUT,#10000000B ;显示第 1 位
ACALL SEND
MOV DATA_OUT,OUT_GW
ACALL SEND
SETB CS
; AJMP DISP_DONE
;显示完毕
DISP_DONE:
RET
;--------------------------------------
;发送一个字节到 7279,高位在前
SEND: MOV R6,#8;设定位计数器 R2
CLR CS ;设定 CS 为低电平,可以向 7279 发送数据
ACALL LONG_DELAY
SEND_LOOP: MOV C,
MOV DAT,C
SETB CLK
MOV A,DATA_OUT ;待发送数据左移
RL A
MOV DATA_OUT,A
ACALL SHORT_DELAY
CLR CLK
ACALL SHORT_DELAY
DJNZ R6,SEND_LOOP;检查是否 8 位均发送完毕
CLR DAT ;发送完毕,返回
RET
;------------------------------------------
;延时时间约为 50uS
LONG_DELAY:
MOV R4,#25
DELAY_LOOP: DJNZ R4,DELAY_LOOP
RET
;延时时间约为 8uS
SHORT_DELAY:
MOV R4,#4
SHORT_LP: DJNZ R4,SHORT_LP
RET
;**********************************************
; 延时时间提示子程序
;**********************************************
SOUND_YSH:
CLR EA
LCALL B2BCD
MOV SOUND_OUT_BW,OUT_BW
MOV SOUND_OUT_SHW,OUT_SHW
MOV SOUND_OUT_GW,OUT_GW
SETB EA
CLR EX0
MOV DPTR,#SOUNDTAB
MOV A,#39 ;语音提示:剩余时间
LCALL SOUND
MOV A,SOUND_OUT_BW ;取百位数字
JZ SOUND_YSH_BW_0 ;百位为零跳转
LCALL SOUND ;百位不为零,提示百位数字
MOV A,#11 ;语音提示:百
LCALL SOUND
SJMP SOUND_YSH_SHW_GW
SOUND_YSH_BW_0: ;百位是零
MOV A,SOUND_OUT_SHW
JZ SOUND_YSH_GW ;百位和十位都是零跳转
SOUND_YSH_SHW: LCALL SOUND ;十位不是零,提示十位数字
MOV A,#10 ;语音提示:拾
LCALL SOUND
SJMP SOUND_YSH_GW ;转到提示个位
SOUND_YSH_SHW_GW: ;百位不是零
MOV A,SOUND_OUT_SHW
JNZ SOUND_YSH_SHW ;百位不是零,十位不是零跳转
MOV A,SOUND_OUT_GW
JZ SOUND_YSH_F ;百位不是零,十位是零,个位是零跳转
MOV A,#0 ;百位不是零,十位是零,个位不是零,提示:零
LCALL SOUND
SJMP SOUND_YSH_GW
SOUND_YSH_GW: MOV A,SOUND_OUT_GW
JZ SOUND_YSH_F
LCALL SOUND
SOUND_YSH_F: MOV A,#12 ;语音提示:分
LCALL SOUND
SOUND_YSh_EXIT: RET
;**********************************************
;二进制数转换为 BCD 码
;**********************************************
;将 @A+YSH*_TM 中的二进制数转换为 BCD 码,存于输出缓冲
B2BCD:
MOV R0,#YSH0_TM
B2BCD_3:
JZ B2BCD_2;
INC R0
DEC A
AJMP B2BCD_3
B2BCD_2: MOV A,@R0
MOV B,#100 ;除以 100,分离出百位数
DIV AB
MOV OUT_BW,A
XCH A,B
MOV B,#10 ;除以 10,分离出十位数
DIV AB
MOV OUT_SHW,A
MOV OUT_GW,B
RET
;**********************************************
;STD 检测子程序,检测输入数据,由 A 带回
;**********************************************
STDJC: CLR IS15S
CLR NOINPUT
MOV TMOD,#12H
MOV TH1,#00H
MOV TL1,#00H ;
CLR STD
SETB IT0 ;脉冲触发方式
SETB EA
SETB ET1
; MOV IE,#10001011B
MOV TEMP3,#0CEH
SETB TR1
NOP
NOP
NOP
NOP
NOP
NOP
CLR STD
CLR IS15S
STDJC1:
NOP
NOP
NOP
NOP
NOP
JB STD,STDJC2
JNB IS15S,STDJC1
STDJC3: SETB NOINPUT ;无数据输入,可以挂机
CLR ET1;关外部中断 1 和定时器中断 1
; CLR EX0
CLR STD
RET
STDJC2:
NOP
NOP
NOP
MOV A,MT_IN ;读入数据
ANL A,#0FH
CLR ET1;关外部中断 1 和定时器中断 1
; CLR EX0
CLR STD
RET
;**********************************************
; 中断服务程序
;**********************************************
STD_IN:
SETB STD ;STD 置一,有新数据输入
RETI
INT1_STOP:
SETB ISDINT
RETI
;-------------------------------------------------------------
T0STOP: MOV C,RS1 ;寄存器组备份
MOV BAK_RS1,C
MOV C,RS0
MOV BAK_RS0,C
SETB RS1 ;使用寄存器组 10
CLR RS0
MOV BAK_A,A ;备份 a
MOV BAK_R1,R1
MOV BAK_DPL,DPL
MOV BAK_DPH,DPH
DJNZ T0_TMP,T0_EXIT ;到 ?
DJNZ T0_TMP_S,T0_EXIT_1 ;到 ?
DJNZ T0_TMP_M,T0_LP3 ;到 60S?
MOV T0_TMP_M,#120;重载 60S 倒计时
JNB YSH0_KG,T0_YSH1 ;延时 0 是否开启?
DEC YSH0_TM ;延时 0 开启延时时间减 1
MOV A,YSH0_TM ;时间到?
JNZ T0_YSH1 ;A 不等于零跳转
CPL JDQ0_DFB ;延时时间到,继电器动作
SETB LED0 ;关延时指示灯
CLR YSH0_KG
T0_YSH1: JNB YSH1_KG,T0_YSH2 ;延时 1 是否开启?
DEC YSH1_TM ;延时 1 开启延时时间减 1
MOV A,YSH1_TM ;时间到?
JNZ T0_YSH2 ;A 不等于零跳转
CPL JDQ1_DNF ;延时时间到,继电器动作
SETB LED1 ;关延时指示灯
CLR YSH1_KG
T0_YSH2: JNB YSH2_KG,T0_YSH3 ;延时 2 是否开启?
DEC YSH2_TM ;延时 2 开启延时 0 时间减 1
MOV A,YSH2_TM ;时间到?
JNZ T0_YSH3 ;A 不等于零跳转
CPL JDQ2_KT ;延时时间到,继电器动作
SETB LED2 ;关延时指示灯
CLR YSH2_KG
T0_YSH3: JNB YSH3_KG,T0_LP3 ;延时 3 是否开启?
DEC YSH3_TM ;延时 3 开启延时 0 时间减 1
MOV A,YSH3_TM ;时间到?
JNZ T0_LP3 ;A 不等于零跳转
CPL JDQ3_RSH ;延时时间到,继电器动作
SETB LED3 ;关延时指示灯
CLR YSH3_KG
T0_LP3: MOV T0_TMP_S,#5
T0_LP2: DJNZ DISP_CHT,T0_LP4 ;更换显示时间?
AJMP DISP_CH_LP
T0_LP4: ; MOV T0_TMP,#200
JB DEC_ON,T0_D_OFF
MOV DATA_OUT,#0C0H
LCALL SEND
MOV DATA_OUT,#01FH
LCALL SEND
SETB CS
SETB DEC_ON
AJMP T0_EXIT_1
T0_D_OFF: MOV DATA_OUT,#0E0H
LCALL SEND
MOV DATA_OUT,#01FH
LCALL SEND
SETB CS
CLR DEC_ON
; AJMP T0_EXIT
T0_EXIT_1: MOV T0_TMP,#200
T0_EXIT: MOV A,BAK_A ;恢复 a
MOV R1,BAK_R1
MOV C,BAK_RS1 ;寄存器组备份
MOV RS1,C
MOV C,BAK_RS0
MOV RS0,C
MOV DPH,BAK_DPH
MOV DPL,BAK_DPL
RETI
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
T0_LP4_TEMP: LJMP T0_LP4
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;-----------------------------------------------------
DISP_CH_LP: MOV DISP_CHT,#4 ;4*=2S 更换一次显示内容
MOV A,DISP_CH ;显示位数送 a
DEC A
LCALL B2BCD ;将要显示的时间调整为 BCD 码
JB YSH0_KG,DISP_YSH1 ;延时标志位——字节的变换(为了方便指针寻址
MOV YSH0_KG_1,#00H
AJMP DISP_YSH1_2
DISP_YSH1: MOV YSH0_KG_1,#0AH
DISP_YSH1_2: JB YSH1_KG,DISP_YSH2
MOV YSH1_KG_1,#00H
AJMP DISP_YSH2_2
DISP_YSH2: MOV YSH1_KG_1,#0AH
DISP_YSH2_2: JB YSH2_KG,DISP_YSH3
MOV YSH2_KG_1,#00H
AJMP DISP_YSH3_2
DISP_YSH3: MOV YSH2_KG_1,#0AH
DISP_YSH3_2: JB YSH3_KG,DISP_YSH4
MOV YSH3_KG_1,#00H
AJMP DISP_CH_1
DISP_YSH4: MOV YSH3_KG_1,#0AH
DISP_CH_1: MOV R0,#YSH0_KG_1
MOV A,DISP_CH ;显示位数送 A
DISP_CH_3: DEC A
JZ DISP_CH_2; DEC A ;显示为 1-4,而地址为 0-3,所以这里地址-1
INC R0
AJMP DISP_CH_3
DISP_CH_2: MOV A,@R0
JZ DISP_CH_0 ;若为 0,则显示 *.---
DISP_CH_LP3: MOV A,DISP_CH
LCALL DISPLAY ;显示
INC DISP_CH
MOV A,DISP_CH
CJNE A,#5,T0_LP4_TEMP
AJMP DISP_CH_LP2
DISP_CH_0: MOV OUT_BW,#0AH
MOV OUT_SHW,#0AH
MOV OUT_GW,#0AH
AJMP DISP_CH_LP3
DISP_CH_LP2: MOV DISP_CH,#1
AJMP T0_LP4
;-------------------------------------------------------
T1STOP: MOV BAK_A_T1,A ;备份 a
DEC TEMP3
MOV A,#01H
CLR C
SUBB A,TEMP3
JC T1STOP1
SETB IS15S
T1STOP1: MOV A,BAK_A_T1 ;恢复 a
RETI
;**********************************************
; 振铃检测程序
;**********************************************
ZHENLING1:; jnb zhenljc,zhenling3
; ret
MOV ZHL_CSH,#4 ;振铃次数,如需改变等待振铃次数,请修改此值
JNB ZHENLJC,ZHENLING2 ;检测是否有振铃
RET
ZHENLING2: LCALL DELAY_30mS
lcall delay_30ms
; lcall delay_30ms
JNB ZHENLJC,ZHENLING3 ;延时 500 毫秒后再检测
RET
ZHENLING3: JNB ZHENLJC,ZHENLING3 ;等待本次振铃结束
DJNZ ZHL_CSH,ZHENLING5 ;振铃是否够 6 次
SETB ZHL6C ;振铃次数达到 6 次,可以摘机
RET
ZHENLING5:
LCALL DELAY_Bs ;延时 4 秒
LCALL DELAY_Bs
LCALL DELAY_Bs
LCALL DELAY_Bs
LCALL DELAY_Bs
LCALL DELAY_Bs
LCALL DELAY_Bs
LCALL DELAY_Bs
JNB ZHENLJC,ZHENLING4 ;延时后检测振铃
RET;振铃未达到预定次数,返回主程序
ZHENLING4: nop
nop
nop
nop
nop
nop ;再次检测到振铃,延时后确认
JNB ZHENLJC,ZHENLING3 ;振铃确认,等待本次结束
RET
;***************************************
; 语音提示子程序
;***************************************
SOUND:
MOV B,#2
MUL AB
MOV BAK_A_SOUND,A
MOV DPTR,#SOUNDTAB
MOVC A,@A+DPTR
MOV ADDRESSL,A
INC DPTR
MOV A,BAK_A_SOUND
MOVC A,@A+DPTR
MOV PANDAH,A
LCALL DELAY_30MS
LCALL PLAY
RET
;--------------------------------------------
;从指定地址播放语音
PLAY:
ACALL POWERUP
LCALL DELAY_30MS
ACALL POWERUP
SETB IT1 ;脉冲触发方式
SETB EX1
LCALL DELAY_30MS
CLR ISDINT ;清录音播放完毕标志
LCALL DELAY_30MS
; ; ;
CLR SS
MOV A,ADDRESSL
ACALL SEND4002
MOV A,PANDAH
SETB ;上电后从一个地址开始放音"11100(XA9~A0)"
SETB
SETB
CLR
CLR
ACALL SEND4002
SETB SS
; ; ;
PLAY_WAIT:SETB IT0 ;脉冲触发方式
; SETB EX0
LCALL DELAY_20MS
CLR STD
CLR OUT_PLAY
PLAY_STDJC1:
NOP
NOP
NOP
NOP
NOP
JB STD,PLAY_STDJC2
JNB ISDINT,PLAY_STDJC1
PLAY_STDJC3: CLR OUT_PLAY ;无数据输入,可以继续播放下一段语音
; CLR EX0
CLR EX1
CLR STD
RET
PLAY_STDJC2:
NOP
MOV A,MT_IN ;读入数据
ANL A,#0FH
SETB OUT_PLAY ;有数据输入,停止播放语音,直接进行按键识别
CLR EX1
; CLR EX0
CLR STD
RET
;--------------------------------------------
;ISD4002 上电
POWERUP:CLR EA
MOV A,#20H
CLR SS
ACALL SEND4002
SETB SS
SETB EA
RET
POWEROFF:CLR EA
MOV A,#00H
CLR SS
ACALL SEND4002
SETB SS
SETB EA
RET
;--------------------------------------------
;发送数据子程序
SEND4002:
; ; ;
CLR SCLK
CLR MOSI
MOV R1,#08H
OUT: CLR SCLK ;时钟下降
RRC A
MOV MOSI,C ;输出 1 位
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB SCLK
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R1,OUT
; ; ;
RET
;***************************************
; 24C02 保存/载入 进度子程序
;***************************************
;保存状态
SAVE: LCALL IICSTART ;IIC 起始信号
MOV A, #0A0H
LCALL IICWRITE
LCALL IISACK
JB F0, SAVE
MOV A, #00H
LCALL IICWRITE
LCALL IISACK
JB F0, SAVE
MOV R3, #08H ;连续写入 8 个字节
MOV R0, #GZZHT
WRITELOOP:
MOV A, @R0
LCALL IICWRITE
LCALL IISACK
JB F0, SAVE
INC R0
DJNZ R3,WRITELOOP
LCALL IICSTOP ;IIC 停止信号
NOP
NOP
NOP
NOP
RET
;-------------------------------------------------------
;载入状态
LOAD: LCALL IICSTART ;IIC 起始信号
MOV A, #0A0H
LCALL IICWRITE
LCALL IISACK
JB F0, LOAD
MOV A, #00H
LCALL IICWRITE
LCALL IISACK
JB F0, LOAD
LCALL IICSTART
MOV A, #0A1H
LCALL IICWRITE
LCALL IISACK
JB F0, LOAD
MOV R3, #08H ;连续读出 8 个字节
MOV R0, #GZZHT
READLOOP:
LCALL IICREAD
LCALL IICACK
MOV @R0,A
INC R0
DJNZ R3,READLOOP
LCALL IICSTOP
RET
;-------------------------------------------------------------
;IIC 启动
IICSTART: SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
CLR SCL
NOP
RET
;-------------------------------------------------------------
;IIC 停止
IICSTOP: CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
NOP
NOP
NOP
CLR SCL
NOP
RET
;----------------------------------------------------
;IIC 写子程序
IICWRITE: MOV R7,#08H
NPCFW: RLC A
MOV SDA,C
NOP
NOP
SETB SCL
NOP
NOP
NOP
CLR SCL
NOP
NOP
NOP
DJNZ R7,NPCFW
NOP
RET
;----------------------------------------------------
;IIC 读子程序
IICREAD: MOV R7,#08H
NPCFR: SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
MOV C,SDA
RLC A
CLR SCL
NOP
NOP
NOP
DJNZ R7,NPCFR
NOP
RET
;----------------------------------------------------
;IIC 应答子程序(从)
IICACK: CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR SCL
NOP
RET
;----------------------------------------------------
;IIC 应答检测子程序(主)
IISACK: SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
CLR F0
JNB SDA,IICYACK
SETB F0
IICYACK: CLR SCL
NOP
NOP
NOP
RET
;***************************************
; 语音提示段表
;***************************************
SOUNDTAB:
DB 01H,00H, 08H,00H, 10H,00H, 18H,00H, 20H,00H, 28H,00H, 30H,00H, 38H,00H, 40H,00H,
48H,00H;0~9
DB 50H,00H, 58H,00H, 60H,00H, 69H,00H,
88H,00H,0F0H,01H,0B8H,00H,0C0H,00H,0C8H,00H,0D0H,00H;10~19
DB 0DAH,00H,0E0H,00H,0E8H,00H,0F0H,00H, 00H,01H, 08H,01H, 10H,01H, 18H,01H,
20H,01H, 28H,01H;20~29
DB 0D0H,01H, 38H,01H, 40H,01H, 48H,01H, 5AH,01H, 88H,01H,
0E0H,01H,0A1H,01H,0B0H,01H,0C0H,01H;30~39
;语音提示:
; 1、0 7、6
; 2、1 8、7
; 3、2 9、8
; 4、3 10、9
; 5、4 11、拾
; 6、5 12、分
; 13、欢迎您使用智能家居远程控制系统,请输入密码
; 14、开关状态查询与修改请按"1"修改密码请按"2"
; 15、返回上一级请按 9,挂机请按"*"号键
; 16、电饭煲
; 17、点暖风
; 18、空调
; 19、电热水器
; 20、关
; 21、开
; 22、延时
; 23、请根据提示选择设备
; 24、开启
; 25、关闭
; 26、延时开
; 27、延时关
; 28、请按
; 29、返回上一级
; 30、已开启
; 31、已关闭
; 32、已设定
; 33、输入错误,请重新输入
; 34、请输入时间按"#"号键确认,单位为分,请不要超过 255 分
; 35、请输入 6 位新密码,按"#"号键结束
; 36、的状态为
; 37、请再输入一次
; 38、密码已更新
; 39、剩余时间
;***************************************
; 延时子程序 6M 晶振
;***************************************
DELAY_BS: ; ;2
MOV R5,#25 ;1
DL2: LCALL DELAY_20ms ;9985+2*25
DJNZ R5,DL2;2*25
RET ;2
DELAY_30ms: ; ;2
MOV R1,#30 ;1
DL: MOV R2,#248 ;1*30=30
DJNZ R2,$ ;2*248*30=14880
DJNZ R1,DL ;2*30=60
RET ;2
DELAY_20MS: ; ;2
MOV R1,#20 ;1
DL1: MOV R2,#248 ;1*20=20
DJNZ R2,$ ;2*248*20=9920
DJNZ R1,DL1 ;2*20=40
RET ;2
END