📄 家庭无线报警系统.asm
字号:
LCALL PDOK;判断手机是否回答OK?
JZ ATE0OK;如果没有检测到OK,重复发,收到OK时A==FFH,否则A==0。
RET
;读出授权电话号码及密码,写入内存中
XRSJ:
MOV DPTR,#2000
LCALL DELAYXMS
LCALL CPBR;读出授权电话AT+CPBR=1
MOV A,#31H
LCALL FS
LCALL HC
LCALL DCSJ
JNC XRSJ1
;手机号码暂存放在50H-5BH的内存中
MOV R3,#11;定义接收手机号码的数据长度
MOV R0,#50H;数据在内存的存放位置
LCALL GPSSJ;调用接收串口数据子程序
MOV R3,#16;跳过16个数据
LCALL TGSJ;调用跳过串口数据子程序
LCALL SJHCR;调用手机号从暂存50H-5BH中存入74H-7FH
;读出密码AT+CPBR=2
LCALL CPBR
MOV A,#32H
LCALL FS
LCALL HC
LCALL DCSJ
JNC XRSJ1
;密码"车辆报警"存放在5CH-73H的内存中
MOV R3,#24;定义接收手机号码的数据长度
MOV R0,#5CH;数据在内存的存放位置
LCALL GPSSJ;调用接收串口数据子程序
MOV R3,#16;跳过16个数据
LCALL TGSJ;调用跳过串口数据子程序
RET
;手机号从暂存50H-5BH中存入74H-7FH
SJHCR:
MOV 74H,51H;3
MOV 75H,50H;1
MOV 76H,53H;1
MOV 77H,52H;5
MOV 78H,55H;1
MOV 79H,54H;0
MOV 7AH,57H;3
MOV 7BH,56H;8
MOV 7CH,59H;6
MOV 7DH,58H;2
MOV 7EH,#46H;F
MOV 7FH,5AH;2
RET
DCSJ:
;+CPBR: 1,"13906079959",129,""
MOV R3,#12;跳过12个数据
LCALL TGSJ;调用跳过串口数据子程序
XRSJ1:
RET
;写入授权电话号码及密码
BCDM:
; AT+CPBW=1,"13906079959"
DDH:;写入授权电话号码
LCALL CPBW
MOV A,#31H
LCALL FS
MOV A,#2CH
LCALL FS
MOV A,#22H;"
LCALL FS
LCALL CSJHM;调用存向SIM卡存入手机号码
MOV A,#22H;"
LCALL FS
LCALL HC
LCALL PDOK
JZ DDH
;写入密码
;AT+CPBW=2,"8F 66 8F 86 62 A5 8B 66"
XMM:
LCALL CPBW
MOV A,#"2"
LCALL FS
MOV A,#",";
LCALL FS
MOV A,#22H;"
LCALL FS
;写入"******"6个汉字 从内存5CH-73H一共24个内存
MOV R3,#24;定义发送的数据总长度为24个
MOV R0,#5CH;数据从内存的5CH开始
LCALL HZSZ;调用发送内存数据的子程序
MOV A,#22H
LCALL FS
LCALL HC
LCALL PDOK
JZ XMM
RET
;向SIM卡存入手机号码时要每两位调反一下
CSJHM:
MOV A,75H
LCALL FS
MOV A,74H
LCALL FS
MOV A,77H
LCALL FS
MOV A,76H
LCALL FS
MOV A,79H
LCALL FS
MOV A,78H
LCALL FS
MOV A,7BH
LCALL FS
MOV A,7AH
LCALL FS
MOV A,7DH
LCALL FS
MOV A,7CH
LCALL FS
MOV A,7FH
LCALL FS
RET
JCDYH:
CLR RI;清除有串口数据标志
LCALL PDRI;2秒内检测串口是否有数据返回?
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#0DH,WD;判断串口数据
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#0AH,WD;判断串口数据
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#3EH,WD;判断串口数据
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#20H,WD;判断串口数据
CLR RI;软件清除串口中断标记
;判断手机是不是回答>代码? 0D 0A 3E 20
MOV A,#0FFH;检测到>,对A置1
RET
WD:CLR A;没有检测到>,对A清零
CLR RI;清除有串口数据标志
RET
;检测手机是否回答OK?
PDOK:
LCALL PDDA;检测手机是否回答0D/0A
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#4FH,SB;判断串口数据 O
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#4BH,SB;判断串口数据 K
LCALL PDDA;检测手机是否回答0D/0A
;判断是不是手机回答的OK代码? 0D 0A 4F 4B 0D 0A
MOV A,#0FFH;检测到OK,对A置1
RET
;检测手机是否回答0D/0A?
PDDA:
CLR RI;清除有串口数据标志
LCALL PDRI;2秒内检测串口是否有数据返回?
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#0DH,SB;判断串口数据
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#0AH,SB;判断串口数据
CLR RI;软件清除串口中断标记
RET
SB:CLR A;没有检测到OK,对A清零
CLR RI;清除有串口数据标志
RET
;发送AT+CLCC,来电显示
;00 43 00 4C 00 43 00 43
CLCC:
LCALL ATC
MOV A,#4CH
LCALL FS
MOV A,#43H
LCALL FS
MOV A,#43H
LCALL FS
LCALL HC;回车!
RET
;发送AT+CPAS查询手机状态子程序 AT+CPAS 报告移动设备的错误 +CMEERROR:﹤XXX﹥
;+CMSERROR:﹤XXX﹥ ERROR
CPAS:
LCALL ATC;发AT+C
MOV A,#50H;P
LCALL FS
MOV A,#41H;A
LCALL FS
MOV A,#53H;S
LCALL FS
LCALL HC;回车!
;手机状态子程序
;跳过9个内存
MOV R3,#9;定义接收数据的总长度 0D 0A 2B 43 50 41 53 3A 20 33 0D 0A
LCALL TGSJ;调用接收串口数据子程序
MOV R0,#25H;数据在内存的存放位置
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
MOV @R0,A;收到33
INC R0;内存单元地址
;跳过8个内存
MOV R3,#8;定义接收数据的总长度
LCALL TGSJ;调用接收串口数据子程序
RET
;发送AT+CMGS=R7 R6 R5,发送短信
;00 43 00 4D 00 47 00 53 00 3D
CMGS:
LCALL ATC
MOV A,#"M";M
LCALL FS
MOV A,#"G";G
LCALL FS
MOV A,#"S";S
LCALL FS
MOV A,#"=";=
LCALL FS
MOV A,R7
LCALL FS
MOV A,R6
LCALL FS
MOV A,R5
JZ TGA
LCALL FS
TGA:
LCALL HC;回车!
LCALL JCDYH;调用等待手机回答“>”的子程序
JNC CSJ;检测到>,转入CSJ
MOV DPTR,#2000;延时2秒
LCALL DelayXmS
LJMP CMGS
CSJ:
MOV DPTR,#TAB11
MOV R0,#12
LCALL DXZT;调用发固定的短信字头0011000D9168子程序
MOV R0,#74H;手机号码存放首址
LCALL JSFSJ;调用发送短信接收方手机号码子程序13906079959
LCALL DYZXSJ;调用下部固定数据0008A9
RET
;发送短信固定字头0011000D9168子程序
DXZT:;0011000D9168
MOV R3,#0
FZT:
MOV A,R3
MOVC A,@A+DPTR
LCALL FS
INC R3
DJNZ R0,FZT
RET
;发送短信接收方手机号码子程序
JSFSJ:
MOV A,@R0
LCALL FS
INC R0
CJNE R0,#80H,JSFSJ
RET
;发送短信中间固定数据000801子程序
DYZXSJ:
MOV A,#"0"
LCALL FS
MOV A,#"0"
LCALL FS
MOV A,#"0"
LCALL FS
MOV A,#"8"
LCALL FS
MOV A,#"0"
LCALL FS
MOV A,#"1"
LCALL FS
RET
;短信发送检测,+CMGS: 138
FSCG:
CLR RI;清除有串口数据标志
LCALL PDDXRI;5秒内检测串口是否有数据返回?
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#0DH,SBB;判断串口数据
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#0AH,SBB;判断串口数据
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#2BH,SBB;判断串口数据+
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#43H,SBB;判断串口数据C
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#4DH,SBB;判断串口数据M
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#47H,SBB;判断串口数据G
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#53H,SBB;判断串口数据S
CLR RI;软件清除串口中断标记
;检测到"CMGS"的ASCII码--------
;跳过5个内存(: 116)
MOV R3,#5;定义接收数据的总长度
LCALL TGSJ;调用接收串口数据子程序
MOV A,#0FFH
LJMP FSCG1
SBB:LCALL SB;对ACC清零
FSCG1:
RET
/*;发送ATD,拨打电话13906079959
ATD:
LCALL FAT
MOV A,#44H
LCALL FS
MOV A,75H
LCALL FS
MOV A,74H
LCALL FS
MOV A,77H
LCALL FS
MOV A,76H
LCALL FS
MOV A,79H
LCALL FS
MOV A,78H
LCALL FS
MOV A,7BH
LCALL FS
MOV A,7AH
LCALL FS
MOV A,7DH
LCALL FS
MOV A,7CH
LCALL FS
MOV A,7FH
LCALL FS
MOV A,#3BH
LCALL FS
LCALL HC;回车!
RET*/
;发送"恭喜您!您已经获得家庭报警系统的控制权限!"短消息的子程序
FDX:
MOV R7,#"7";短信长度60+15=75
MOV R6,#"5"
MOV R5,#00H
LCALL CMGS;发送AT+CMGS=75短信长度子程序
;发送汉字的字数(24+6个汉字)60---3CH
MOV A,#"3"
LCALL FS
MOV A,#"C"
LCALL FS
;准备发送"恭喜您!您已经获得家庭报警系统的控制权限!密码:"汉字
MOV DPTR,#TAB1
MOV R1,#96;发送24个汉字
LCALL FSS;调用发送汉字的子程序
;发送"家庭报警"4个汉字 从内存5CH-73H一共16个内存
MOV R3,#24;定义发送的数据总长度为16个
MOV R0,#5CH;数据从内存的64H开始
LCALL HZSZ;调用发送内存数据的子程序
MOV A,#1AH;发送16进制的1A结束字符
LCALL FS
LCALL FSCG;调用短信发送检测子程序
RET
;发送"大门已被打开,请检查!"短消息的子程序
FDMBJ:
MOV R7,#33H;短信长度22+15=37
MOV R6,#37H
MOV R5,#00H
LCALL CMGS;发送AT+CMGS=37短信长度子程序
;发送汉字的字数(11个汉字)22---16H
MOV A,#31H
LCALL FS
MOV A,#36H
LCALL FS
;准备发送"大门已被打开,请检查!"
MOV DPTR,#TAB2
MOV R1,#44;发送11个汉字
LCALL FSS;调用发送汉字的子程序
MOV A,#1AH;发送16进制的1A结束字符
LCALL FS
LCALL FSCG;调用短信发送检测子程序
JNZ FDMBJ1
MOV DPTR,#500
LCALL DELAYXMS
LJMP FDMBJ
FDMBJ1:
RET
;发送"家里有人走动,请注意!"短消息的子程序(红外报警)
FHWBJ:
MOV R7,#33H;短信长度22+15=37
MOV R6,#37H
MOV R5,#00H
LCALL CMGS;发送AT+CMGS=37短信长度子程序
;发送汉字的字数(11个汉字)22---16H
MOV A,#31H
LCALL FS
MOV A,#36H
LCALL FS
;准备发送"家里有人走动,请注意!"
MOV DPTR,#TAB3
MOV R1,#44;发送11个汉字*4
LCALL FSS;调用发送汉字的子程序
MOV A,#1AH;发送16进制的1A结束字符
LCALL FS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -