?? clbj.txt
字號:
;采用AT89C2051單片機,晶振11.0592MHZ,通訊速率19200,采用TTL串口通訊
;手機號碼緩存在28H-33H的內(nèi)存中
;短信內(nèi)容緩存在48H-57H的內(nèi)存中
;短信中心的號碼存放在58H-63H的內(nèi)存中
;密碼"車輛報警"存放在64H-73H的內(nèi)存中
;手機號碼存放在74H-7F的內(nèi)存中
;P1.0為手機開關(guān)機控制端
;P1.1為串口接收模塊數(shù)據(jù)OK
;P1.2為解防/設(shè)防控制端
;P1.3
;P1.4
;P1.5
;P1.6
;P1.7
;P3.0串行接收端(RXD)
;P3.1串行發(fā)射端(TXD)
;P3.2
;P3.3
;P3.4
;P3.5
;P3.7
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORG 0000H
AJMP MAIN;轉(zhuǎn)入主程序
ORG 0003H ;外部中斷P3.2腳INT0入口地址
NOP
NOP
NOP
NOP
NOP
NOP
RETI
ORG 000BH;中斷陷阱
NOP
NOP
NOP
NOP
NOP
NOP
RETI
ORG 0013H;中斷陷阱
NOP
NOP
NOP
NOP
NOP
NOP
RETI
ORG 001BH;中斷陷阱
NOP
NOP
NOP
NOP
NOP
NOP
RETI
ORG 0023H
NOP
NOP
NOP
NOP
RETI
FOK EQU P1.0;定義為串口接收模塊數(shù)據(jù)OK
KGJ EQU P1.1;定義手機開關(guān)機控制端
SX EQU P1.2;定義手機模塊上線狀態(tài)
JSF EQU P1.3;定義解防/設(shè)防控制端(解防 0 設(shè)防1)
TC EQU P1.4;定義
ZK EQU P1.5;定義中控控制端
;EQU P1.6;定義
KK EQU P1.7;定義
BJ EQU P3.2;定義報警觸發(fā)控制端
DY EQU P3.3;定義電源斷線控制端
CM EQU P3.4;定義車門控制端
XL EQU P3.5;定義行李廂
JJ EQU P3.6;定義緊急
DD EQU P3.7;定義低電壓報告
MAIN:
;以下為主程序進行CPU中斷方式設(shè)置
SETB IT0 ;設(shè)定INT0的觸發(fā)方式為脈沖負邊沿觸發(fā)
MOV SCON,#50H;設(shè)置成串口1方式
MOV TMOD,#20H;波特率發(fā)生器T1工作在模式2上
MOV TH1,#0FDH;預(yù)置初值(按照波特率9600BPS預(yù)置初值)
MOV TL1,#0FDH;預(yù)置初值(按照波特率9600BPS預(yù)置初值)
SETB TR1;啟動定時器T1
MOV PCON,#10000000B;設(shè)定SMOD為1,波特率翻倍!
;以上完成串口19200通訊初始化設(shè)置
LCALL YUSJ;開機清除接收短消息手機號碼
CLR KGJ;打開手機
MOV DPTR,#1000;延時1秒
LCALL DELAYXMS;開機延時
SETB KGJ;復(fù)位手機控制
;MOV DPTR,#10000;延時10秒
;LCALL DelayXmS;開機延時
LCALL ATEOK;開機發(fā)送ATE指令!
LCALL CNMI ;發(fā)送(AT+CNMI=1,1,0,0,1),短信到達TE
LCALL SCQBDX;調(diào)用刪除SIM卡中所有短信的子程序
;完成和手機通信握手,和SIM卡刪除所有短消息初始化
START:
LCALL XRDXZX;調(diào)用詢問手機SIM卡中短信中心號碼子程序
LCALL XRSJ;讀出授權(quán)電話號碼及密碼,寫入內(nèi)存中
LCALL MJCS
LCALL MJCS
CLR SX;模塊上線
;**********************************************
KKS:
JB RI,UARTI;檢測到RI變1就退出
JNB BJ,BAOJIN
JB RI,UARTI;檢測到RI變1就退出
JNB DY,DYBJ
JB RI,UARTI;檢測到RI變1就退出
JNB CM,CMBJ
JB RI,UARTI;檢測到RI變1就退出
JNB XL,XLBJ
JB RI,UARTI;檢測到RI變1就退出
JNB JJ,JJBJ
AJMP KKS
;**********************************************
DYBJ:
LCALL FDYBJ
AJMP KKS
CMBJ:
LCALL FCMBJ
AJMP KKS
XLBJ:
LCALL FXLBJ
AJMP KKS
JJBJ:
LCALL FJJBJ
AJMP KKS
;報警程序
BAOJIN:
LCALL CPAS;調(diào)用模塊狀態(tài)報告子程序
MOV A,25H
CJNE A,#34H,BAOJIN1;判斷串口數(shù)據(jù)
AJMP BAOJIN3;如果模塊正在呼出或通話,就退出
BAOJIN1:
LCALL CPAS
MOV A,25H
CJNE A,#34H,BAOJIN2
AJMP BAOJIN3
BAOJIN2:
LCALL ATH;調(diào)用串口發(fā)送ATH掛機子程序
LCALL PDOK;判斷手機是否回答OK?
JZ BAOJIN2;如果沒有檢測到OK,重復(fù)發(fā)
LCALL FBJDX
MOV DPTR,#5000;延時5秒
LCALL DelayXmS
LCALL ATD;調(diào)用串口發(fā)送13906079959子程序
BAOJIN3:
AJMP KKS
;**********************************************
;**********************************************
;進入串口中斷方式接收
UARTI:
CLR RI;清楚串口中斷標(biāo)志
LCALL PDDA;調(diào)用串口接收0D/0A數(shù)據(jù)子程序
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#2BH,PDRD;判斷串口數(shù)據(jù)+PDR
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#43H,EXITT1;判斷串口數(shù)據(jù)C
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
;+CMTI: "SM",7短信到達存放位置
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#4DH,EXITT1;判斷串口數(shù)據(jù)M
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#54H,EXITT1;判斷串口數(shù)據(jù)T
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#49H,EXITT1;判斷串口數(shù)據(jù)I
CLR RI;軟件清除串口中斷標(biāo)記
;檢測到"CMTI"的ASCII碼--------
;跳過7個內(nèi)存(: "SM",)
MOV R3,#7;定義接收數(shù)據(jù)的總長度
LCALL TGSJ;調(diào)用接收串口數(shù)據(jù)子程序
;短信位置,存放在26H中
MOV R0,#26H;數(shù)據(jù)在內(nèi)存的存放位置
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
MOV @R0,A
INC R0;內(nèi)存單元地址0
;跳過8個內(nèi)存
MOV R3,#8;定義接收數(shù)據(jù)的總長度
LCALL TGSJ;調(diào)用接收串口數(shù)據(jù)子程序
LCALL DXNR;解析短信內(nèi)容
EXITT1:LJMP EXITT
PDRD:LCALL RING;電話呼入提示
EXITT:
CLR RI;軟件清除串口中斷標(biāo)記,退出串口中斷
AJMP KKS
;**********************************************
RING:;電話呼入提示
CLR RI;清楚串口中斷標(biāo)志
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#52H,RING1;判斷串口數(shù)據(jù)R
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#49H,RING1;判斷串口數(shù)據(jù)I
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#4EH,RING1;判斷串口數(shù)據(jù)N
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#47H,RING1;判斷串口數(shù)據(jù)G
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDDA;調(diào)用串口接收0D/0A數(shù)據(jù)子程序
MOV DPTR,#100;延時0.1秒
LCALL DelayXmS
;發(fā)送AT+CLCC
LCALL CLCC;調(diào)用來電顯示指令子程序
;跳過20個內(nèi)存(: 1,1,4,0,0,")
MOV R3,#20;定義接收數(shù)據(jù)的總長度
LCALL TGSJ;調(diào)用接收串口數(shù)據(jù)子程序
LCALL DHHM;判斷來電號碼
JZ GJ
;跳過13個內(nèi)存
MOV R3,#13;定義接收數(shù)據(jù)的總長度
LCALL TGSJ;調(diào)用接收串口數(shù)據(jù)子程序
MOV DPTR,#100;延時0.1秒
LCALL DelayXmS
;檢查是否繼續(xù)呼入
;等待第二次RING電話呼入提示
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDDXRI;5秒內(nèi)檢測串口是否有數(shù)據(jù)返回?
JNC RING1;如果5秒內(nèi)沒檢查到鈴音,就退出
;震鈴2次后關(guān)機,解防/設(shè)防
;震鈴5次后進入通話狀態(tài)
;跳過8個內(nèi)存
MOV R3,#8;定義接收數(shù)據(jù)的總長度
LCALL TGSJ;調(diào)用接收串口數(shù)據(jù)子程序
;**********************************************
PDLYT:
;發(fā)送AT+CPAS,模塊狀態(tài)報告
MOV R2,#30
ZLYKK1:
MOV DPTR,#500;延時0.5秒
LCALL DelayXmS
LCALL CPAS;調(diào)用模塊狀態(tài)報告子程序
MOV A,25H
CJNE A,#30H,ZL1
AJMP ZLYK;如果沒有檢測到呼入,就進入振鈴遙控
ZL1:
DJNZ R2,ZLYKK1
MOV R2,#15
ZLYKK2:
MOV DPTR,#500;延時0.5秒
LCALL DelayXmS
LCALL CPAS;調(diào)用模塊狀態(tài)報告子程序
MOV A,25H
CJNE A,#30H,ZL2
AJMP RING2;如果沒有檢測到呼入,就退出
ZL2:
DJNZ R2,ZLYKK2
;**********************************************
LCALL ATA;應(yīng)答
RING1:AJMP RING2
GJ:
MOV DPTR,#500;延時1秒
LCALL DelayXmS
LCALL ATH;調(diào)用串口發(fā)送ATH掛機子程序
AJMP RING2
ZLYK:
MOV DPTR,#500;延時0.5秒
LCALL DelayXmS
LCALL CPAS;調(diào)用模塊狀態(tài)報告子程序
MOV A,25H
CJNE A,#30H,ZLYKK1;如果沒有檢測到呼入,就退出
JB JSF,ZLYK1
SETB JSF;設(shè)防
AJMP RING2
ZLYK1:CLR JSF;解防
RING2:
RET
;**********************************************
;**********************************************
DXNR:;信息內(nèi)容檢測
MOV DPTR,#1000
LCALL DELAYXMS
LCALL CMGR;調(diào)用讀短信子程序
MOV R3,#42;跳過42個數(shù)據(jù)
LCALL TGSJ;調(diào)用跳過串口數(shù)據(jù)子程序
LCALL DXJC;檢測電話號碼
JZ DPDSQ;如果電話號碼是默認值,就檢測信息內(nèi)容
;跳過20個內(nèi)存(含0 4)
MOV R3,#20;定義接收數(shù)據(jù)的總長度
LCALL TGSJ;調(diào)用接收串口數(shù)據(jù)子程序
;**********************************************
PDCX:;查詢信息
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#36H,PDJF;判斷串口數(shù)據(jù)6
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#37H,PDJF;判斷串口數(shù)據(jù)7
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#45H,PDJF;判斷串口數(shù)據(jù)E
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#35H,PDJF;判斷串口數(shù)據(jù)5
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#38H,PDJF;判斷串口數(shù)據(jù)8
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#42H,PDJF;判斷串口數(shù)據(jù)B
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#45H,PDJF;判斷串口數(shù)據(jù)E
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#32H,PDJF;判斷串口數(shù)據(jù)2
CLR RI;軟件清除串口中斷標(biāo)記
MOV R3,#8;跳過8個數(shù)據(jù)
LCALL TGSJ;調(diào)用跳過串口數(shù)據(jù)子程序
JB JSF,DFASF
LCALL FAJF;調(diào)用發(fā)送"解防"子程序
AJMP SCC
DFASF:LCALL FASF;調(diào)用發(fā)送"設(shè)防"子程序
AJMP SCC
;**********************************************
DPDSQ:LCALL PDSQ
;**********************************************
;檢測"(解)防",PDU碼--0489E39632
;30 34 38 (39 45 33) 39 36 33 32
PDJF:
MOV DPTR,#1000;延時1秒
LCALL DelayXmS
LCALL CMGR;再次調(diào)用讀短信子程序
MOV R3,#74;跳過74個數(shù)據(jù)
LCALL TGSJ;調(diào)用跳過串口數(shù)據(jù)子程序
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#38H,PDSQ;判斷串口數(shù)據(jù)8
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#39H,SHEFAN;判斷串口數(shù)據(jù)9
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#45H,PDSQ;判斷串口數(shù)據(jù)E
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#33H,PDSQ;判斷串口數(shù)據(jù)3
CLR RI;軟件清除串口中斷標(biāo)記
LCALL FANG;調(diào)用(防)接收串口數(shù)據(jù)子程序
JZ SC
CLR JSF;解防
AJMP SCC
;**********************************************
;檢測"(設(shè))防",PDU碼--048BBE9632
;30 34 38 (42 42 45) 39 36 33 32
SHEFAN:;(設(shè))
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#42H,PDSQ;判斷串口數(shù)據(jù)B
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#42H,PDSQ;判斷串口數(shù)據(jù)B
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,#45H,PDSQ;判斷串口數(shù)據(jù)E
CLR RI;軟件清除串口中斷標(biāo)記
LCALL FANG;調(diào)用(防)接收串口數(shù)據(jù)子程序
JZ SC
SETB JSF;設(shè)防
SC:AJMP SCC
;**********************************************
;**********************************************
PDSQ:;短信授權(quán)檢測
;如果電話號碼不是默認值,就檢測信息內(nèi)容
MOV DPTR,#1000
LCALL DelayXmS
LCALL CMGR;再次調(diào)用讀短信子程序
MOV R3,#74;跳過74個數(shù)據(jù)
LCALL TGSJ;調(diào)用跳過串口數(shù)據(jù)子程序
;校驗存放在64H-73H的內(nèi)存中密碼"車輛報警"
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
MOV A,SBUF;將串口寄存器中接收到的數(shù)據(jù)給A
CJNE A,64H,SC;判斷串口數(shù)據(jù)8
CLR RI;軟件清除串口中斷標(biāo)記
LCALL PDRI;等待下一個串口數(shù)據(jù)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -