(一)、系統簡介
下面是用西門子3508手機開發的報警系統,采用AT89C2051單片機,晶振11.0592MHZ,通訊速率19200,單片機與手機之間采用TTL串口通訊。該系統的優點是不需要網線,沒有流量,當電源切斷后還可以用手機電池繼續供電,小巧隱蔽不易被小偷發現,缺點是需要手機sim卡,會產生一定費用,比如月租費。報警方式有2種,一是向預置的聯系人發短信,二是向預置的聯系人打電話,發短信會產生費用,打電話可以不接,振鈴當做報警音,不會產生費用。本系統還可以遠程控制家電,通過發短信的方式發送控制命令,根據短信的不同控制不同的裝置。本系統還可以作為溫度監測、報警應用。系統外觀如下圖,因電路簡單,電路板直接放到了電話機充電器外殼里。
(二)、工作原理
Siemens 3508手機底部預留了數據線接口一共12腳分別定義為:1)充電IN-(充電負級或DATA地)、2)AUDIO_L(耳機左聲道)、3)充電IN+(充電正級)、4)DC+(3.6V供電正極)、5)DATA_OUT(數據輸出)、6)DATA_IN(數據輸入)、7)MODE(線控MIC模式選擇)、8)CTRL(線控按鍵輸入端)、9)GND(話筒地)、10)MIC_IN(話筒正極)、11)AUDIO_R(耳機右聲道)、12)AUDIO_GD(音頻地)。其中5、6腳正是我們需要的串口數據通信發送和接收端,5腳接單片機的串口輸入端,6腳接單片機的串口輸出端,1腳地接電路板的地。如下圖所示: 電路原理圖如下圖,電路非常簡單,一片單片機,一個無線接收模塊和一個無線發射模塊。單片機采用AT89C2051用于和手機通訊,單片機接收到無線接收模塊RX3400經PT2272譯碼后的報警信息后,向預置的電話號碼發送短信程序或向預置的手機號碼打電話,還可以通過其它手機向該裝置發短信,接收到短信后,單片機程序解析短信命令,通過PT2262編碼、無線輸出短信命令來控制家用電器。pnp三極管Q2用于控制PT2272的電源,LED顯示工作狀態。實際應用時要注意熱釋紅外報警器的編碼與接收模塊的編碼(A8接地,其它懸空)要相同,熱釋紅外報警器的震蕩電阻與接收模塊震蕩電阻要配套,你所控制的家用電器的無線接收模塊與本機的發射模塊編碼和震蕩電阻也要配合好。 另外,如果手頭上沒有西門子3508手機,有其它型號的西門子手機,只要有串口端子都可以應用,但是要查清其它型號手機的串口端子編號以便和單片機串口連接,也可以買華為或中興的手機模塊,或者是西門子的手機模塊也可以。 (三)、預置手機電話號碼 本裝置需要預置2個接收報警信息的手機號碼,以便于有報警時,向這2個手機號發短信或打電話,預置的方法是,直接操作西門子手機菜單,刪除所有通訊錄中的電話號,再重新錄入2個報警用的電話號,或者把通訊錄的第一、第二個電話號改成要接收報警的手機號。第二種方法是下載SiMoCoSetup228程序,安裝在XP系統上,連接手機,在微機上刪除通訊錄或錄入新的電話號,SiMoCoSetup228程序不支持win7。SiMoCoSetup228程序是西門子手機連接微機用的。 (四)、AT命令 利用GSM手機的串行接口,單片機向手機收發一系列的AT命令,就能達到控制GSM模塊收發短消息的目的。必須注意的是,用單片機實現時,編程必須注意它發送指令與接收到的響應都是字符的ASCII碼。用單片機控制GSM模塊收發短信息所涉及到的AT指令見下表。 ASCI碼指令
| 功能
| 手機回答
| AT回車
| 握手
| OK
| ATE
| 簡化顯示
| OK
| AT+CLCC
|
| +CLCC:1,1,4,0,0,"05133082087",129
| AT+CNMI=1,1,2
AT+CNMI=[[,[,[,[,]]]]]
| 設置收到短消息提示
| OK+CMTI:“SM”,4 4表示手機內短消息數量 | ATD05133082087;
| 撥打05133082087電話
| AT+CMGL=0
| 讀取電話上全部未讀過的SMS消息ok
| AT+CMGL=2
| 列出已有的短信息+CMGL:1,2,,10
| AT+CMGL=4
| 讀取全部SMS消息 +CMGL: 1,1,,24
| AT+CMGR
| 讀取短信息
| AT+CMGD=0
| 刪除全部短信息
| AT+CMGR=X回車
| 讀取第X條短消息
| AT+CMGF=0回車
| 用PDU格式
|
| 來電話!
|
| RING +CLIP: 13306285091,129
| AT+CMGS=6
| 發送短消息的字節數
| >
| AT+CMGR=1
AT+CPMS="MT","SM"
| 讀取第1條短信1表示讀取第幾條短信
| +CMGR:2,,10
0891683108403505F0110000813208F4024E86
|
經常用到的一些AT指令舉例:
1、AT+IPR?(查詢模塊的波特率)
模塊會返回+IPR:9600之格式的信息,9600即波特率,注意9600與冒號之間是有空格的;
2、AT+IPR=9600;&W(設置模塊的固定波特率)
此命令寫一次之后就可以了,simcom支持掉電保護,之后此模塊波特率就一直為9600了,成功返回OK,錯誤返回ERROR,說明命令格式錯誤;
3、AT+CLIP=1(顯示來電號碼)
顯示來電號碼,如果沒有這條指令,則來電話模塊只送出ring,不送出號碼;
4、ATH(掛斷電話)
這個就不用多說了,送出就掛斷電話,在Benq里還可以做完全斷開gprs網絡用;
5、ATA(接聽電話)
接聽電話,也不用多說了,來電話發這個給模塊就可以接聽了;
6、AT+CMGS=(發送短信的長度)
當然你也可以不用發=號,則可以寫任意長度短信(模塊支持長度范圍內);
7、AT+CMGL=0(讀取新sms)
返回+CMGL:21(如果有短消息的話)之格式的信息,后面回車換行跟著就是短信內容了;
8、AT+CMGD=(刪除第幾條短信)
后面是幾就刪除第幾條短信咯;;
9、AT+CSCA?(讀取sms服務中心號碼)
返回+CSCA:"+8613800532500",145之格式的信息,我是青島的,所以返回是這個號碼;
10、AT+CCLK?(讀取日期時間)
返回+CCLK:"03/01/01,16:07:46+00"之格式的信息;
11、AT+CSQ(讀取信號強度)
返回+CSQ:20,0之格式的信息,20為有用的值對我來說,信號強度;
12、AT+CBC(讀取電池電量)
返回 返回+CBC:0,100,,, 格式的信息,0模塊由電池供電,1 模塊裝有電池,但不由電池供電,2模塊沒有電池,3 模塊電源無效,禁止呼叫,1-100表示電量百分比。
(五)、軟件設計2011-12-13修改
;采用AT89C2051單片機,晶振11.0592MHZ,通訊速率19200,采用TTL串口通訊
;20H,21H存,22H存報警狀態,26h保存接收的短信號,25h保存手機狀態23h,24h定時器占用
;短信內容緩存在48H-57Hde內存中,也是顯示區
;短信中心的號碼存放在58H-63Hde內存中
;密碼存放在64H-73Hde內存中
;手機號碼存放在74H-7Fde內存中 ;P1.3 2262控制端
;P1.4 2262數據輸入端
;P1.5 2262數據輸入端
;P1.6 2262數據輸入端
;P1.7 2262數據輸入端
;P3.0串行接收端(RXD)
;P3.1串行發射端(TXD)
XL EQU P1.2;2272電源控制端
JSF EQU P1.3;2262發射控制端
BF EQU P3.3;布防
JS EQU P3.4;解鎖
;CD EQU P3.2;定義充電控制端
BJ EQU P3.5;定義報警觸發控制端
DD EQU P3.7;工作狀態LED顯示
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORG 0000H
AJMP MAIN;轉入主程序
ORG 0003H ;外部中斷P3.2腳INT0入口地址
RETI
ORG 000BH;中斷陷阱
LJMP CT
RETI
ORG 0013H;中斷陷阱
RETI
ORG 0023H
; AJMP UARTI
RETI
;以下為初始化程序
MAIN:
MOVSCon,#50h; 方式1,REN=1.SM0,SM1,SM2,REN,TB8,RB8,TI,RI
MOV TMOD,#21H;波特率發生器T1工作在模式2上
MOV TH1,#0FDH;預置初值(按照波特率9600BPS預置初值)
MOV TL1,#0FDH;預置初值(按照波特率9600BPS預置初值)
ORL PCON,#80H ;SMOD=1倍頻
SETB TR1;啟動定時器T1
MOV TH0,#10H ;3.6864M最大定時213.3ms,1000h定時200ms
MOV TL0, #00H
MOV 42H,#31H;開機即布防20=1
MOV P1,#80H
MOV DPTR,#1000;延時5秒
LCALL DelayXmS
SETBJSF ;關閉2262te端
; CLRDY ;給2272供電
cpl dd;
ML: LCALL ATEOK;開機發送ATE指令
LCALL CNMI ;發送(AT+CNMI=1,1,0,0,1),短信到達TE
LCALL SCQBDX;調用刪除SIM卡中所有短信de子程序
LCALLCMGL;列出所有短信
MOV DPTR,#1000;延時5秒
LCALLDelayXmS
LCALL CBC;SETBCD ;停止充電
LCALL XRSJ ;讀出剛撥出的授權電話號碼1,寫入內存中
MOV DPTR,#1000;延時5秒
LCALL DelayXmS
LCALLCSCS ;+CSCS: "GSM"
MOV DPTR,#1000;延時5秒
LCALL DelayXmS
LCALL CPBS1 ;AT+CPBR=?
MOV DPTR,#1000;延時5秒
LCALL DelayXmS
LCALL CPBR;AT+CPBR=1,23
MOV A,#31H ;1
LCALL FS
MOV A,#2CH ;,
LCALL FS
MOV A,#32H ;AT+CPBR=1,23+CPBR: 1,"13136868158",129,"1"
LCALL FS ;+CPBR:2,"13836305876",129,"2"
MOV A,#33H
LCALL FS
LCALL HC
MOVDPTR,#8000;延時5秒AT+CMGR=1
LCALL DelayXmS
LCALL CPMS ;AT+CPMS="MT","SM"
MOV DPTR,#1000;延時5秒AT+CMGR=1
LCALL DelayXmS
LCALL CMGR1
LCALL SPST
CLR XL
ORL0A8H, #82H;允許定時器0中斷
MOV 24H,#00H
SETB TR0
;***************下面是主程序*******************************
KKS: JNBBJ,BJ8 ;檢查熱釋紅外報警器動作
JBRI,UARTI ;檢測短信,有短信轉UARTI
JB BF,KKS2 ;檢查布防,如果布防轉kks2
JNBJS,KKS ;解鎖
MOV 42H,#31H ;解鎖信息存42h單元
AJMP KKS1
KKS2: MOV 42H,#33H;42存布防信息
KKS1: LCALL SPST
AJMP KKS
BJ8: MOVA,42H
CJNEA,#33H, KKS ;沒有布防返回
CLRTR0 ;已經布防,向預存電話號打電話報警
SETB XL
LCALL XRSJ ;讀出授權電話號碼1,寫入內存中
LCALLATD ;打電話
MOV DPTR,#5000;延時5秒
LCALL DelayXmS
MOV DPTR,#5000
LCALL DELAYXMS
MOV DPTR,#5000
LCALL DELAYXMS
LCALLCHUP ;掛斷電話
FDX2: MOV DPTR,#5000
LCALL DELAYXMS
LCALL CPBR;讀出授權電話AT+CPBR=1
MOVA,#32H ;2
LCALL XRSJ0;讀出授權電話號碼2,寫入內存中
MOV DPTR,#9000;5000;延時5秒
LCALL DelayXmS
LCALLATD ;打電話
MOV DPTR,#9000;延時5秒
LCALLDelayXmS
LCALL CHUP
CLR XL;;停止2272供電
MOV 42H,#31H
BAOJIN3: AJMP ML;KKS
;**********************************************
UARTI: CLR TR0
CLR RI;清楚串口中斷標志
LCALL PDDA;調用串口接收0D/0A數據子程序
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#2BH,EXITT;判斷串口數據+PDR ;"+" ;+CMTI:"SM",7短信到達存放位置
CLRRI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#43H,EXITT;判斷串口數據;"C"
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A 西門子2118接到短信后返回+CMTI: "SM",2
CJNE A,#4DH,EXITT;判斷串口數據M S57返回+CMGR:0,,29 +CMTI: "ME",19
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#54H,EXITT;判斷串口數據T 47=G T=54
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNEA,#49H,EXITT;判斷串口數據I 52=R I=49
CLR RI;軟件清除串口中斷標記
;檢測到"CMTI"deASCII碼--------
;跳過7個內存(: "SM",)
MOV R3,#7;定義接收數據de總長度 5
LCALL TGSJ;調用接收串口數據子程序
;短信序號存放在26H中,刪除后只有1條26H=1
MOV R0,#26H;數據在內存de存放位置
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
MOV@R0,A
LCALL DXNR;解析短信內容
JNB F0,EXITT
EXITT1: CLR RI
AJMP ML
PDRD: ; LCALL RING;電話呼入提示
EXITT: CLR RI;軟件清除串口中斷標記,退出串口中斷
SETB TR0
AJMP KKS
調用的子程序:
ATEOK:
MOV DPTR,#500
LCALL DELAYXMS
;發送ATE指令!
LCALL AT1 ;"AT"
MOV A,#45H;將ASCII碼E發送到串口去
LCALL FS
LCALL HC;回車!
LCALL PDOK;判斷手機shi否回答OK?
JZ ATEOK;如果沒有檢測到OK,重復發
RET
PDOK: LCALL PDDA
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#4FH,SB;判斷串口數據 "O"=4F
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#4BH,SB;判斷串口數據"K"=4BH
LCALL PDDA
;判斷是不是手機回答的OK代碼?0D 0A 4F 4B 0D 0A MOV A,#0FFH;檢測到OK,對A置1
RET
;檢測手機shi否回答0D/0A?
PDDA: CLR RI;清除有串口數據標志
LCALL PDRI;2秒內檢測串口shi否有數據返回?
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#0DH,SB;判斷串口數據
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#0AH,SB;判斷串口數據
CLR RI;軟件清除串口中斷標記
RET
SB: CLR A;沒有檢測到OK,對A清零
CLR RI;清除有串口數據標志
RET
PDRI: SETB REN;占用R4/R5/R1
MOV R1,#60;300毫秒超時退出!
PBZ: MOV R4,#200
DY2: MOV R5,#25
DY1: JB RI,KKQ;檢測到RI變1就退出
DJNZ R5,DY1;25微秒檢測一次
JB RI,KKQ;檢測到RI變1就退出
SETB C;程序正常時C=1
DJNZ R4,DY2;內循環50毫秒
DJNZ R1,PBZ;超時退出
CLR C;對串口接收超時退出C=0
CLR RI;清除有串口數據標志
KKQ: RET
;讀出授權電話號碼及密碼,寫入內存中
XRSJ:
MOV DPTR,#2000
LCALL DELAYXMS
LCALL CPBR;讀出授權電話ATCPBR=1
MOVA,#31H ;1
XRSJ0: LCALL FS
LCALL HC
XRS: CLR RI;軟件清除串口中斷標記 ;;;;;;
LCALL PDRI;等待下一個串口數據 ;;;;;;;;
MOV A,SBUF;將串口寄存器中接收到de數據給A;;;;;;;;;;;
CJNEA,#22H,XRS ;;;;;;;;;;
;手機號碼存放在74H-7Fde內存中
MOV R3,#12;定義接收手機號碼de數據長度
MOV R0,#74H;數據在內存de存放位置
LCALL GPSSJ;調用接收串口數據子程序
MOV R3,#16;跳過16個數據
LCALL TGSJ;調用跳過串口數據子程序
CLRRI;軟件清除串口中斷標記;;;;;;;;;;
RET
;發送ATCPBR=1,
CPBR:
LCALL ATC
MOVA,#50H ;P
LCALL FS
MOVA,#42H ;B
LCALL FS
MOV A,#52H ;R
LCALL FS
MOVA,#3DH ;=
LCALL FS
RET
;發送ATCPMS="MT","SM" AT CPMS="MT","SM"
CPMS:
LCALL ATC
MOV R2,#13
MOV DPTR,#TABCPMS
XX1: CLRA
MOVC A,@A DPTR
LCALL FS;
INC DPTR
DJNZ R2,XX1
LCALL HC;回車!
RET
;接收短信授權后的手機號碼子程序
GPSSJ:
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
MOV @R0,A
INC R0;內存單元地址
DJNZ R3,GPSSJ;判斷shi否已經收全部數據?
RET
FS: CLR ES
MOV SBUF,A
JNB TI, $
CLR TI
SETB ES
RET
;跳過接收數據的子程序(專門針對PDU碼數據)
TGSJ:
SETB C
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
JNCXPAS;如果檢測到發生超時退出,就跳出這段程序
DJNZ R3,TGSJ;判斷是否已經收全部數據?
XPAS: RET
;發送HC回車指令!
HC:
MOV A,#0DH
LCALL FS
MOV A,#0AH
LCALL FS
RET
;發送AT指令!
AT1:
MOV A,#41H;將ASCII碼A發送到串口去
LCALL FS
MOV A,#54H;將ASCII碼T發送到串口去
LCALL FS
RET
;發送ATC,應答
ATC:
LCALL AT1
MOVA,#2BH ;
LCALLFS
MOVA,#43H ;C
LCALL FS
RET
;入口參數:DPTR=MS(毫秒1-65535mS)
DELAYXMS:
MOV A,DPH
MOV R7,#01
JZ DF1
MOV R7,DPH
DF1: MOV A,DPl
MOV R6,#1
JZ DEL1
MOV R6,DPl
DEL1: MOV B,#0
DJNZ B,$
DJNZ B,$
DJNZ R6,DEL1
DJNZ R7,DF1
RET
JCDYH:
CLR RI;清除有串口數據標志
LCALL PDRI;2秒內檢測串口shi否有數據返回?
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#0DH,WD;判斷串口數據
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#0AH,WD;判斷串口數據
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#3EH,WD;判斷串口數據
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#20H,WD;判斷串口數據
CLR RI;軟件清除串口中斷標記
;判斷手機shi不shi回答>代碼?0D 0A 3E 20
MOV A,#0FFH;檢測到>,對A置1
RET
WD: CLR A;沒有檢測到>,對A清零
CLR RI;清除有串口數據標志
RET
CSJ:
RET
;手機號碼存放在74H-7Fde內存中
JSFSJ: ;3131868651F8
MOVA,75H ;3
LCALL FS
MOVA,74H ;1
LCALL FS
MOVA,77H ;3
LCALL FS
MOVA,76H ;1
LCALL FS
MOVA,79H ;8
LCALL FS
MOVA,78H ;6
LCALL FS
MOV A,7BH ;8
LCALL FS
MOVA,7AH ;6
LCALL FS
MOVA,7DH ;5
LCALL FS
MOVA,7CH ;1
LCALL FS
MOVA,#46H ;F
LCALL FS
MOVA,7EH;#38H ;8
LCALL FS
RET
;發送短信中間固定數據00080子程序
DYZXSJ:
MOV A,#30H
LCALL FS
MOV A,#30H
LCALL FS
MOV A,#30H
LCALLFS
MOV A,#38H
LCALL FS
MOV A,#30H
LCALL FS
RET
;**********************************************
DXNR:;來信電話號碼和信息內容存儲在64H-6FH,48H-
MOV DPTR,#333
LCALL DELAYXMS
LCALL CMGR;調用讀短信子程序
LCALL JCXMGR
MOV R3,#28D;跳過42個數據;跳過4 1226個內存 CMGR:0,,29
LCALL TGSJ;調用跳過串口數據子程序跳26時是36=628的時候是33=3
LCALLDXJC ;保存發短信的電話號碼
DXJS: MOV R3,#20d;定義接收數據de總長度 20=35
LCALL TGSJ;調用接收串口數據子程序 18=38
;查詢信息 54084E0A75356E90合上電源35H,34H,30H,38H,34H,45H,30H,41H,37H,35H,33H,35H,36H,45H,39H,30H MOV R3,#16D ;保存短信內容
MOV R0,#48H
PDCX: CLR RI
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
MOV @R0,A
INC R0
DJNZ R3, PDCX
CLR RI;軟件清除串口中斷標記
MOV R3,#6;跳過8個數據
LCALLTGSJ;調用跳過串口數據子程序
SETBF0 ;;;;;;;;
LCALLDHJC1 ;比較來信電話號碼與電話中授權的第一個電話號是否一致
JNBF0,DX ;電話號碼對了,檢查短信內容是否對
MOV DPTR,#3000 ;第一個電話號碼不對,檢查第二個對不對,先讀出第二個授權電話
LCALLDELAYXMS ;延時等待串口數據走完
LCALL CPBR;讀出授權電話ATCPBR=1
MOVA,#32H ;2
LCALL XRSJ0;讀出授權電話號碼2,寫入內存中
SETBF0 ;;;;;;;;
LCALLDHJC1 ;檢測電話號碼
JNBF0,DX
MOV DPTR,#3000 ;第2個電話號碼不對,檢查第3個對不對,先讀出第3個授權電話
LCALL DELAYXMS
LCALL CPBR;讀出授權電話ATCPBR=1
MOVA,#33H ;2
LCALL XRSJ0;讀出授權電話號碼2,寫入內存中
SETB F0
LCALL DHJC1;檢測電話號碼
JNB F0,DX
AJMP XSSJ2
DX: MOV DPTR,#1000
LCALL DELAYXMS
MOV DPTR,#TAB1
SETB F0
ACALL DXBJ
JBF0,DXNR1
MOV 42H,#31H;合上電源操作時觸發了BJ端(紅外報警)所以置判斷標志42H=55用于解除報警,如果再啟動報警必須發“開始布防”短信
XSSJ1: MOV A,#10H
XSSJ: CLR TR1
MOV P1,A ;P3.3=0 開始發射
CPL DD
MOV DPTR,#9000
LCALL DELAYXMS
SETBJSF ;停止發射
CPL DD
SETB TR1
XSSJ2: RET
DHJC1: MOV R0,#64H ;dhjc發來短信的電話號碼存放在64h-6fh
MOV R1,#74H ;XSSJ讀取的存入手機卡的電話號號碼,存放在74h-7fh
MOV R2,#10;應該12位電話號,只檢測10位就夠了
DHJC2: MOV A,@R0
XRL A,@R1
JNZ DHJC3
INC R0
INC R1
DJNZ R2,DHJC2
CLR F0
; MOV 80H,#6DH
DHJC3: RET
;**********************************************
DXNR1:;信息內容2檢測”關閉電源“
MOV DPTR,#TAB2
SETB F0
ACALL DXBJ
JB F0,DXNR7;2
MOV A,#00H
AJMP XSSJ
;DXNR2:;信息內容3檢測“打開電燈"
; MOV DPTR,#TAB3
; ACALL DXBJ
; JB F0,DXNR3
; MOV A,#40H
; AJMP XSSJ
;DXNR3:;信息內容4檢測”關閉電燈“
; MOV DPTR,#TAB4
; ACALL DXBJ
; JB F0,DXNR4
; MOV A,#80H
; AJMP XSSJ
;DXNR4:;信息內容5檢測”開始運行“
; MOV DPTR,#TAB5
; ACALL DXBJ
; JB F0,DXNR5
; SETBCD ;開始充電
; MOV A,#10H
; AJMP XSSJ
;DXNR5:;信息內容6檢測”停止運行“
; MOV DPTR,#TAB6
; ACALL DXBJ
; JB F0,DXNR7
; CLRCD ;停止充電
; MOV A,#20H
; AJMPXSSJ
;DXNR6:;信息內容7檢測”數據采集
; MOV DPTR,#TAB7
; ACALL DXBJ
; JB F0,DXNR7
; MOV DPTR,#1666;延時5秒
; LCALL DelayXmS
; LCALL CMGS1 ;發送ATCMGS=021
; LCALL FSCG;調用短信發送檢測子程序,發送編碼數據
; JNZ DXNR6
; MOV P1,#80H
; LJMP XSSJ
DXNR7:;信息內容8檢測;64A495005E039632撤銷布防
MOV DPTR,#TAB9
ACALL DXBJ
JBF0,DXNR8
SETB DD
; SETBDY ;停止2272供電
MOV 42H,#31H
;MOV A,#00H
LJMP XSSJ2
DXNR8:;信息內容9檢測;5F0059CB5E039632開始布防
MOV DPTR,#TAB10
ACALLDXBJ
JB F0,XSSJ2
CLR DD
MOV 42H,#33H
LJMP XSSJ2
DXBJ: ; MOV DPTR,#1000
; LCALL DELAYXMS
MOV R3,#16D
MOV R0,#48H
CLR A
BK1: MOVC A,@A DPTR
XRL A,@R0
JNZ BK2
INC DPTR
INC R0
CLR A
DJNZ R3,BK1
CLR F0
BK2: RET
ATE0:
LCALL AT1
MOV A,#45H
LCALL FS
MOV A,#30H
LCALL FS
LCALL HC;回車!
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 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
MOVA,#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
LCALLFS
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;判斷手機shi否回答OK?
JZ CNMI;如果沒有檢測到OK,重復發
RET
;發送AT CMGR=26H,讀短信
;00 43 00 4D 00 47 00 52 00 3D
CMGR:
LCALL ATC
MOV A,#4DH ;M
LCALL FS
MOVA,#47H ;G
LCALL FS
MOV A,#52H ;R
LCALL FS
MOV A,#3DH ;=
LCALL FS
MOV A,26H ;126H
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;回車!
; LCALLPDOK;判斷手機shi否回答OK? ;;;;;;;;;;;
; JZ CMGL;如果沒有檢測到OK,重復發 ;;;;;;;;;;;;;;
RET
;短信發送檢測, CMGS: 138
FSCG: CLR RI;清除有串口數據標志
LCALL PDDXRI;5秒內檢測串口shi否有數據返回?
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#0DH,SBB;判斷串口數據
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOVA,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#0AH,SBB;判斷串口數據
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#2BH,SBB;判斷串口數據
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#43H,SBB;判斷串口數據C
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#4DH,SBB;判斷串口數據M
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#47H,SBB;判斷串口數據G
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOVA,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#53H,SBB;判斷串口數據S
CLR RI;軟件清除串口中斷標記
;檢測到"CMGS"的ASCII碼--------
;跳過5個內存(:116)
MOV R3,#5;定義接收數據的總長度
LCALL TGSJ;調用接收串口數據子程序
AJMP FSCG1
SBB: LCALL SB
FSCG1: RET
;判斷短信是否發送成功?超時退出
PDDXRI:;占用R4/R5/R1
MOV R1,#5000;5秒超時退出!
PBZ1:MOV R4,#200
DY22:MOV R5,#25
DY33:JB RI,KKQ1;檢測到RI變1就退出
DJNZ R5,DY33;延時25微秒檢測一次
JB RI,KKQ1;檢測到RI變1就退出
SETB C;程序正常時C=1
DJNZ R4,DY22;內循環50毫秒
DJNZ R1,PBZ1;超時退出
CLR C;對串口接收超時退出C=0
CLR RI;清除有串口數據標志
KKQ1:RET
;手機號碼存放在74H-7Fde內存中
DXJC:
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
MOV65H,A ;33h
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOVA,SBUF;將串口寄存器中接收到de數據給A
MOV 64H,A
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
MOV 67H,A
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
MOV 66H,A
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
MOV 69H,A
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
MOV 68H,A
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
MOV 6BH,A
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
MOV 6AH,A
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
MOV 6DH,A
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
MOV 6CH,A
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
MOV 6FH,A
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
DXJC1: CLR A;沒有檢測到OK,對A清零
CLR RI;清除有串口數據標志
DXJC2: RET
JCXMGR: CLR RI;清楚串口中斷標志
LCALLPDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#2BH,JCXMGR;PDRD;判斷串口數據PDR ;"" ; CMTI:"SM",7短信到達存放位置
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#43H,JCXMER1;判斷串口數據;"C"
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A 西門子2118接到短信后返回CMTI: "SM",2
CJNE A,#4DH,JCXMER1;判斷串口數據M S57返回 CMGR:0,,29 CMTI: "ME",19
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#47H,JCXMER1;判斷串口數據T 47=G T=54
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#52H,JCXMER1;判斷串口數據I 52=R I=49
CLR RI;軟件清除串口中斷標記
;檢測到"CMTI"deASCII碼--------
;跳過7個內存(:"SM",)
MOV R3,#7;定義接收數據de總長度 5
LCALL TGSJ;調用接收串口數據子程序
JCXMER1: CLR RI;軟件清除串口中斷標記,退出串口中斷
JCXMER2: RET
;刪除SIM卡中所有短信的子程序
SCQBDX:
LCALL CMGL
LCALL PDOK
JNZ DXSCT
JNB RI,$
MOV DPTR,#100
LCALL DELAYXMS
MOV R2,#1;;;;;;;;1
DXSC: LCALL DXSZ;調用將R2轉化成兩位ASCII數值子程序
;十位為20H,個位為21H
LCALL SCDD;調用刪除短信程序,同一條短信刪除1次
INC R2
CJNE R2,#26,DXSC;刪除超過25條也退出循環
DXSCT: RET
SCDD: LCALL SCDX;調用刪除第X條短信指令子程序
MOV A,20H
LCALL FS
MOV A,21H
LCALL FS
LCALL HC
MOV DPTR,#1200 ;1200/3
LCALL DELAYXMS
RET
;取出刪除短信條數的十位/個位
DXSZ:
MOVA,R2
MOV B,#10 ;取出十位和個位
DIV AB
ORL A,#00110000B;調整為ASCII碼
MOV 20H,A ;十位在a
MOV 21H,B ;個位在b
MOV A,21H
ORL A,#00110000B;調整為ASCII碼
MOV21H,A
RET
;發送AT CMGD=刪除第X條短消息指令!
SCDX:
LCALL ATC
MOV A,#4DH
LCALL FS
MOV A,#47H
LCALL FS
MOV A,#44H
LCALL FS
MOVA,#3DH
LCALL FS
RET
;發送AT CSCS?
CSCS:
LCALL ATC
MOVA,#53H ;S
LCALL FS
MOVA,#43H ;C
LCALL FS
MOVA,#53H ;S
LCALL FS
MOVA,#3FH ;?
LCALL FS
LCALL HC;回車!
RET
CPBS1:
LCALL ATC
MOVA,#50H ;P
LCALL FS
MOVA,#42H ;B
LCALL FS
MOVA,#53H ;S
LCALL FS
MOVA,#3DH ;=
LCALL FS
MOVA,#3FH ; ?
LCALL FS
LCALL HC;回車!
RET
SPST: LCALL AT1
MOV A,#5EH ;^
LCALL FS
MOVA,#53H ;S
LCALL FS
MOVA,#50H ;P
LCALL FS
MOVA,#53H ;S
LCALLFS
MOV A,#54H ;T
LCALL FS
MOV A,#3DH ;=
LCALL FS
MOV A,42H ;=31OR33
LCALL FS
MOV A,#2CH ;,
LCALL FS
MOV A,#31H ;1
LCALL FS
LCALL HC;回車!
LCALL PDOK;判斷手機shi否回答OK?
JZ SPST;如果沒有檢測到OK,重復發
RET
CMGR1:
LCALL ATC
MOV A,#4DH ;M
LCALL FS
MOV A,#47H ;G
LCALL FS
MOV A,#52H ;R
LCALL FS
MOV A,#3DH ;=
LCALL FS
MOV A,#31H ;126H
LCALL FS
LCALL HC;回車!
RET
ATD:
LCALL AT1
MOV A,#44H ;D
LCALL FS
MOV A,74H ;1
LCALL FS
MOV A,75H ;3
LCALL FS
MOV A,76H ;1
LCALL FS
MOV A,77H
LCALL FS
MOV A,78H
LCALL FS
MOV A,79H
LCALL FS
MOV A,7AH
LCALL FS
MOV A,7BH
LCALL FS
MOV A,7CH
LCALL FS
MOV A,7DH
LCALL FS
MOV A,7EH
LCALL FS
MOV A,#3BH ;"; "
LCALLFS
LCALL HC;回車!
RET
CT: MOV TH0,#00H ;11.0592M最大定時71.1ms,1000h定時200ms
MOV TL0, #00H
CPL DD
INC 23H
MOV A,23H
CJNE A, #250, DONE ;71*250=17.7s
MOV 23H, #00H
INC 24H
MOV A,24H
CJNE A,#90H, DONE;50*144=7200s/60=120分鐘檢測一次電池電壓90 65
MOV 24H, #00H
CLR TR0
LCALL CBC
SETB TR0;
DONE: RETI
CBC:
LCALL ATC
MOVA,#42H ;B
LCALL FS
MOVA,#43H ;C
LCALL FS
LCALL HC
CBC1: CLR RI;清除有串口數據標志
LCALL PDRI;2秒內檢測串口shi否有數據返回?
MOV A,SBUF;將串口寄存器中接收到de數據給A
CJNE A,#2CH,CBC1;判斷串口數據, AT CBC 返回CBC: 0,100,,,
CLR RI;軟件清除串口中斷標記
LCALL PDRI;等待下一個串口數據
MOV A,SBUF;將串口寄存器中接收到de數據給A
MOV R2,A
XRL A,#31H
JZ CBC4
MOV A,R2
CLR C
SUBBA,#38H;XRL A,#32H ;電池容量剩余20%開始充電;
JC CBC2
CBC4: CLR CD
AJMP CBC3
CBC2: MOV A,R2
CLR C
SUBB A,#36H
JNC CBC3
SETB CD
CBC3: CLR RI
RET
;AT CHUP
CHUP: LCALL ATC
MOV A,#48H ;H
LCALL FS
MOV A,#55H ;U
LCALL FS
MOV A,#50H ;P
LCALL FS
LCALL HC;回車!
RET
;**********************************************
TAB1:DB35H,34H,30H,38H,34H,45H,30H,41H,37H,35H,33H,35H,36H,45H,39H,30H;54084E0A75356E90合上電源
TAB2:DB35H,31H,37H,33H,39H,35H,45H,44H,37H,35H,33H,35H,36H,45H,39H,30H;517395ED75356E90關閉電源
;TAB3:DB36H,32H,35H,33H,35H,46H,30H,30H,37H,35H,33H,35H,37H,30H,36H,46H;62535F007535706F打開電燈
;TAB4:DB35H,31H,37H,33H,39H,35H,45H,44H,37H,35H,33H,35H,37H,30H,36H,46H;517395ED7535706F關閉電燈
;TAB5:DB35H,46H,30H,30H,35H,39H,43H,42H,38H,46H,44H,30H,38H,38H,34H,43H;5F0059CB8FD0884C開始運行
;TAB6:DB35H,30H,35H,43H,36H,42H,36H,32H,38H,46H,44H,30H,38H,38H,34H,43H;505C6B628FD0884C停止運行
;TAB7:DB36H,35H,37H,30H,36H,33H,36H,45H,39H,31H,43H,37H,39H,36H,43H,36H;6570636E91C796C6數據采集
;TAB8:DB31H,30H,34H,34H,46H,36H,30H,35H,39H,37H,44H,1AH;你好 1044F60597D
TAB9:DB36H,34H,41H,34H,39H,35H,30H,30H,35H,45H,30H,33H,39H,36H,33H,32H;64A495005E039632撤銷布防
TAB10:DB35H,46H,30H,30H,35H,39H,43H,42H,35H,45H,30H,33H,39H,36H,33H,32H;5F0059CB5E039632開始布防
ASCII:DB30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,41H,42H,43H,44H,45H,46H;
TABCPMS:DB50H,4DH,53H,3DH,22H,4DH,54H,22H,2CH,22H,53H,4DH,22H;PMS="MT","SM" LCALLATC
END
(六)、發送PDU短信
發送短消息常用Text和PDU(Protocol DataUnit,協議數據單元)模式。使用Text模式收發短信代碼簡單,實現起來十分容易,但最大的缺點是不能收發中文短信;而PDU模式不僅支持中文短信,也能發送英文短信。西門子手機模塊只支持PDU格式,所以有必要了解PDU短信的發送過程。下面以一個實例來說明用AT指令發送PDU短信的全過程,假如我要發送下面的短信:
接收號碼:+8613602433649
短信內容:工作愉快!
短信中心號碼:+8613800200500
1、短信中心號碼處理:用字符串 addr 表示
(1)、將短信息中心號碼去掉+號,看看長度是否為偶數,如果不是,最后添加F
即 addr ="+8613800200500" addr =”8613800453500F”
=> addr = "8613800200500F" addr = "8613800453500F"
(2)、將奇數位和偶數位交換。
=> addr = "683108200005F0" addr=”683108403500F0”
(3)、將短信息中心號碼前面加上字符91,91是國際化的意思
=> addr = "91683108200005F0" addr ="91683108403500F0”
(4)、算出 addr長度,結果除2,格式化成2位的16進制字符串,16 / 2 = 8=> "08"
=> addr = "0891683108200005F0" ,addr ="0891683108403505F0”
2、手機號碼處理:用字符串 phone表示
(1)、將手機號碼去掉+號,看看長度是否為偶數,如果不是,最后添加F
即 phone ="+8613602433649"
=> phone = "8613602433649F" phone = "8613602433649F "
(2)、將手機號碼奇數位和偶數位交換。
=> phone = "683106423346F9" phone = "683106423346F9"
3、短信息部分處理:用字符串 msg 表示
(1)、把字符串轉換為Unicode代碼:例如“工作愉快!”的unicode代碼為 5DE54F5C61095FEBFF01,用轉換工具PDUSMS115轉換結果如圖。

(2)、將 msg長度除2,保留兩位16進制數,即 5DE54F5C61095FEBFF01 = 20 / 2 => "0A",再加上 msg
=> msg = "0A5DE54F5C61095FEBFF01"
4、組合 (1)、手機號碼前加上字符串 11000D91(1100:固定,0D:手機號碼的長度,不算+號,十六進制表示,91:發送到手機為91,發送到小靈通為81),
即 phone ="11000D91" + phone
=> 11000D91683106423346F9
(2)、手機號碼后加上 000800 和剛才的短信息內容,000800也寫死就可以了
即 phone = phone +"000800" + msg
即 11000D91683106423346F9 + 000800 +0A5DE54F5C61095FEBFF01
=> phone =11000D91683106423346F90008000A5DE54F5C61095FEBFF01
(3)、phone長度除以2,格式化成2位的十進制數
即 11000D91683106423346F90008000A5DE54F5C61095FEBFF01 =>50位 / 2=> 25
5、發送 要發送的內容為: 0891683108403505F011000D918613131868651F80008000A5DE54F5C61095FEBFF01(換了一個手機號)發送過程是:先利用串口工具連接手機模塊,AT+CMGF=0 <</span>回車>,點手動發送(用PDU格式發送的命令)

如果返回ok說明通信成功,再發送短信長度命令:
AT+CMGS=25<</span>回車>當返回“>”號時,發送0891683108403505F011000D918613131868651F80008000A5DE54F5C61095FEBFF01
,如果返回不是ERROR,恭喜你,發送成功了。
(七)、PDU模式的短信息編解碼方法
PDU模式短信息結構中,較難實現的是對用戶數據部分的編/解碼,例如要發送數據為“123456789abc”,經過編碼后變成“31 D9 8C 56 B3 DD 70 B9 B0 780C”。例如如果想用短信方式監控蔬菜大棚中的溫度,就需要用PDU方式動態發送溫度數字,因為數字是隨機的,就需要動態的把0-9的數字編碼成PDU模式的短信息,下面以Test這四個字符為例講解把Test的ASCII 碼轉換成PDU模式的短信息編解碼方法,如下圖所示。
第一步把字符Test的ASCII碼01010100(T),01100101(e),01110011(s),01110100(t)的最高位去掉變成1010100(T),1100101(e),1110011(s),1110100(t)。 第二步把第二個字符e的最低位1移到第一個字符T的最高位,再把第三個字符s的2個最低位字符11移到第二個字符e的最高位,接著把第四個字符的低3位100移到第三個字符s的最高位,最后第四個字符t的最高位補3個0。完成后的GSM編碼是11010100(T),11110010(e),10011100(s),00001110(t)。 下面是把“123456789abc”轉換結果的示例:
按上面的方法用51匯編語言編寫的程序如下:
ASCTOSMS: MOV R0,#30H ;指向短消息工作緩沖區首地址
MOV R1,#31H ;指向移位地址
MOV R5,#01H ;移位計數器
ASCTOSMS1: ;左移變成7位ASCII碼
MOV A,R5
MOV R4,A
CLR C
MOV A, @R0
RLC A
MOV @R0, A
MOV A,@R1 ;保存要變換的值
MOV R2,A
ASCTOSMS2: CLR C ;右移取進位C
MOV A,@R1
RRC A
MOV @R1,A
MOV A,@R0 ;右移R4次把C移入R0
RRC A
MOV @R0,A
DJNZ R4,ASCTOSMS2
MOVA,R2 ;恢復要變換的值
MOV @R1,A
INC R0
INC R1
INC R5
CJNE R5,#08H,ASCTOSMS1
RET
使用時,調用以下函數就可以了。
LCALLDS18B20;用DS18B20溫度傳感器采集溫度數據存到30H開始的單元位置。 MOV DPTR,#3000;延時5秒
LCALL DelayXmS
LCALL CMGS1 ;發送AT+CMGS=021,短信長度
LCALL FSCG ;調用短信發送檢測子程序。發AT+CREG?命令
;返回:+CREG,判斷發送短信是否成功。
CMGS1: ;發送AT+CMGS=021,發送短信8位數字 12345678
LCALL ATC ;AT+C
MOV A,#4DH ;”4D”的ASCII碼是M
LCALL FS
MOV A,#47H;”47”的ASCII碼是G
LCALL FS
MOV A,#53H
LCALL FS
MOV A,#3DH
LCALL FS
MOVA,#30H ;”0”
LCALL FS
MOVA,#32H “2”
LCALL FS
MOVA,#31H “1”
LCALL FS
LCALL HC;回車!
LCALL JCDYH;調用等待手機回答">"de子程序
JNC CSJ1;檢測到>,轉入CSJ1
MOV DPTR,#680;延時2秒
LCALL DelayXmS
MOV WDT_CONTR ,#37H;喂狗
LJMPCMGS1
CSJ1: MOV DPTR,#2000;延時2秒
LCALL DelayXmS
LCALL DZZB1;調用短信中部固定數據0011000B81
LCALL JSFSJ;調用發送短信接收方手機號碼子程序3131868651F8
LCALL DYZXSJ1;0000A808
LCALL ASCTOSMS;把30--38H單元的12345678=31,32,33,34,35,36,37,38轉成PUD碼
MOV R2,#7
MOV R0,#30h
FSSJ: MOVDPTR,#ASCI;
MOV A,@R0
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
LCALLFS;
MOV A,@R0
ANL a,#0FH
MOVC A,@A+DPTR
LCALL FS;
INC R0
INC R1
DJNZ R2,FSSJ
MOV A,#1AH
LCALL FS
RET
|