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