?? gsmal.asm
字號:
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,65H,SC;判斷串口數據F
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,66H,SC;判斷串口數據 6
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,67H,SC;判斷串口數據 6
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,68H,SC;判斷串口數據8
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,69H,SC;判斷串口數據F
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,6AH,SC;判斷串口數據 8
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,6BH,SC;判斷串口數據 6
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,6CH,SCC;判斷串口數據 6
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,6DH,SCC;判斷串口數據2
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,6EH,SCC;判斷串口數據A
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,6FH,SCC;判斷串口數據 5
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,70H,SCC;判斷串口數據 8
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,71H,SCC;判斷串口數據B
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,72H,SCC;判斷串口數據6
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,73H,SCC;判斷串口數據 6
;"車輛報警"檢測成功!判斷是否要修改密碼?
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,#36H,FSQR;判斷串口數據
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,#35H,FSQR;判斷串口數據
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,#33H,FSQR;判斷串口數據
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,#39H,FSQR;判斷串口數據
;檢測到"改"的漢字內碼
;密碼"車輛報警"存放在64H-73H的內存中
;將"改"后面的兩個漢字作為密碼保存到單片機64H-73H的內存中!
MOV R3,#16;定義接收數據的總長度為16個
MOV R0,#64H;數據從內存的64H開始依次往后存放
LCALL GPSSJ;調用接收串口數據子程序
MOV R3,#8;跳過8個數據
LCALL TGSJ;調用跳過串口數據子程序
FSQR:
LCALL JPA
SCC:;刪除短信
LCALL SCJSDX
RET
JPA:
MOV DPTR,#1000
LCALL DELAYXMS
LCALL CMGR;再次調用讀短信子程序
MOV R3,#42;跳過42個數據
LCALL TGSJ;調用跳過串口數據子程序
;把短信授權的手機號碼存儲起來
;手機號碼存放在74H-7F的內存中
MOV R3,#12;定義接收手機號碼的數據長度
MOV R0,#74H;數據在內存的存放位置
LCALL GPSSJ;調用接收串口數據子程序
MOV DPTR,#1000
LCALL DELAYXMS
;校驗短信授權的手機號碼
LCALL CMGR;再次調用讀短信子程序
MOV R3,#42;跳過42個數據
LCALL TGSJ;調用跳過串口數據子程序
LCALL DXJC
JZ JPA
LCALL FDX;發送授權成功的短信息通知客戶!
JNZ JPA1
LCALL FDX;發送授權成功的短信息通知客戶!
JPA1:LCALL BCDM;保存授權電話號碼及密碼
RET
;發送AT指令!
AT:
MOV A,#41H;將ASCII碼A發送到串口去
LCALL FS
MOV A,#54H;將ASCII碼T發送到串口去
LCALL FS
RET
;發送ATH,掛機
ATH:
LCALL AT
MOV A,#48H
LCALL FS
LCALL HC;回車!
RET
;發送ATA,應答
ATA:
LCALL AT
MOV A,#41H
LCALL FS
LCALL HC;回車!
RET
;發送AT+C,應答
ATC:
LCALL AT
MOV A,#2BH
LCALL FS
MOV A,#43H
LCALL FS
RET
;發送HC回車指令!
HC:
MOV A,#0DH
LCALL FS
MOV A,#0AH
LCALL FS
RET
;發送AT+CMGD=刪除第X條短消息指令!
SCDX:
LCALL ATC
MOV A,#4DH
LCALL FS
MOV A,#47H
LCALL FS
MOV A,#44H
LCALL FS
MOV A,#3DH
LCALL FS
RET
;發送AT+CPBW=
CPBW:
LCALL ATC
MOV A,#50H
LCALL FS
MOV A,#42H
LCALL FS
MOV A,#57H
LCALL FS
MOV A,#3DH
LCALL FS
RET
;發送AT+CPBR=
CPBR:
LCALL ATC
MOV A,#50H
LCALL FS
MOV A,#42H
LCALL FS
MOV A,#52H
LCALL FS
MOV A,#3DH
LCALL FS
RET
;發送AT+CNMI=1,1,0,0,1,短信到達TE
CNMI:
LCALL ATC
MOV A,#4EH;4E
LCALL FS
MOV A,#4DH;4D
LCALL FS
MOV A,#49H;49
LCALL FS
MOV A,#3DH;3D
LCALL FS
MOV A,#31H;31
LCALL FS
MOV A,#2CH;2C
LCALL FS
MOV A,#31H;31
LCALL FS
MOV A,#2CH;2C
LCALL FS
MOV A,#30H;30
LCALL FS
MOV A,#2CH;2C
LCALL FS
MOV A,#30H;30
LCALL FS
MOV A,#2CH;2C
LCALL FS
MOV A,#31H;31
LCALL FS
LCALL HC;回車!
LCALL PDOK;判斷手機是否回答OK?
JZ CNMI;如果沒有檢測到OK,重復發
RET
;發送AT+CMGR=26H,讀短信
;00 43 00 4D 00 47 00 52 00 3D
CMGR:
LCALL ATC
MOV A,#4DH
LCALL FS
MOV A,#47H
LCALL FS
MOV A,#52H
LCALL FS
MOV A,#3DH
LCALL FS
MOV A,26H
LCALL FS
LCALL HC;回車!
RET
;發送AT+CMGL=4列出所有短消息指令!
CMGL:
LCALL ATC
MOV A,#4DH
LCALL FS
MOV A,#47H
LCALL FS
MOV A,#4CH
LCALL FS
MOV A,#3DH
LCALL FS
MOV A,#34H
LCALL FS
LCALL HC;回車!
RET
FANG:
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,#39H,FANG1;判斷串口數據9
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,#36H,FANG1;判斷串口數據6
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,#33H,FANG1;判斷串口數據3
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,#32H,FANG1;判斷串口數據2
CLR RI;軟件清除串口中斷標記
;跳過8個內存(0D 0A 0D 0A 4F 4B 0D 0A)
MOV R3,#8;定義接收數據的總長度
LCALL TGSJ;調用接收串口數據子程序
AJMP FANG2
FANG1:LCALL SB
FANG2:
RET
;和手機握手,單片機發ATE手機回答OK子程序
ATEOK:
MOV DPTR,#500
LCALL DELAYXMS
;發送ATE指令!
LCALL AT
MOV A,#45H;將ASCII碼E發送到串口去
LCALL FS
LCALL HC;回車!
LCALL PDOK;判斷手機是否回答OK?
JZ ATEOK;如果沒有檢測到OK,重復發
RET
;發送AT+CSCA?查詢短信中心號碼子程序
CSCA:
MOV DPTR,#500
LCALL DELAYXMS
LCALL ATC
MOV A,#53H
LCALL FS
MOV A,#43H
LCALL FS
MOV A,#41H
LCALL FS
MOV A,#3FH
LCALL FS
LCALL HC;回車!
RET
;檢測手機是否回答短信中心號碼?
XRDXZX:
LCALL CSCA
MOV R3,#13;跳過13個數據
LCALL TGSJ;調用跳過串口數據子程序
JNC XRDXZX1
;準備接收短信中心號碼
MOV R3,#5;循環接收5次
MOV R0,#58H;數據從58H-63H內存開始存放
TFSJ:
INC R0;內存單元地址
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
MOV @R0,A
DEC R0
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
MOV @R0,A
INC R0;內存單元地址
INC R0;內存單元地址
DJNZ R3,TFSJ;判斷是否已經接收完10個短信中心號碼?
MOV A,#46H;字母F的固定代碼
MOV @R0,A
INC R0;內存單元地址
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
MOV @R0,A
INC R0;內存單元地址
;短信中心的號碼已經存放在58H-63H的內存中
MOV R3,#13;跳過13個數據
LCALL TGSJ;調用跳過串口數據子程序
LCALL CSCA;調用詢問手機SIM卡中短信中心號碼子程序
MOV R3,#13;跳過13個數據
LCALL TGSJ;調用跳過串口數據子程序
LCALL JYZXHM;調用校驗短信中心號碼子程序
JZ XRDXZX
AJMP XRDXZX2
XRDXZX1:LCALL XRDXZX
XRDXZX2:
RET
;檢測13800597500,PDU碼--3108507905F0
;短信中心的號碼存放在58H-63H的內存中
JYZXHM:
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,59H,JYZXHM1;判斷串口數據1
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,58H,JYZXHM1;判斷串口數據3
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,5BH,JYZXHM1;判斷串口數據8
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,5AH,JYZXHM1;判斷串口數據0
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,5DH,JYZXHM1;判斷串口數據0
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,5CH,JYZXHM1;判斷串口數據5
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,5FH,JYZXHM1;判斷串口數據9
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,5EH,JYZXHM1;判斷串口數據7
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,61H,JYZXHM1;判斷串口數據5
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,60H,JYZXHM1;判斷串口數據0
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到的數據給A
CJNE A,63H,JYZXHM1;判斷串口數據0
CLR RI;軟件清除串口中斷標記
MOV R3,#13;跳過13個數據
LCALL TGSJ;調用跳過串口數據子程序
AJMP JYZXHM2
JYZXHM1:LCALL SB
JYZXHM2:
RET
;讀出授權電話號碼及密碼,寫入內存中
XRSJ:
MOV DPTR,#2000
LCALL DELAYXMS
LCALL CPBR;讀出授權電話AT+CPBR=1
MOV A,#31H
LCALL FS
LCALL HC
LCALL DCSJ
JNC XRSJ1
;手機號碼存放在74H-7F的內存中
MOV R3,#12;定義接收手機號碼的數據長度
MOV R0,#74H;數據在內存的存放位置
LCALL GPSSJ;調用接收串口數據子程序
MOV R3,#16;跳過16個數據
LCALL TGSJ;調用跳過串口數據子程序
;讀出密碼AT+CPBR=2
LCALL CPBR
MOV A,#32H
LCALL FS
LCALL HC
LCALL DCSJ
JNC XRSJ1
;密碼"車輛報警"存放在64H-73H的內存中
MOV R3,#16;定義接收手機號碼的數據長度
MOV R0,#64H;數據在內存的存放位置
LCALL GPSSJ;調用接收串口數據子程序
MOV R3,#16;跳過16個數據
LCALL TGSJ;調用跳過串口數據子程序
RET
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -