找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3213|回复: 0
打印 上一主题 下一主题
收起左侧

单片机+手机报警器制作

[复制链接]
跳转到指定楼层
楼主
ID:105323 发表于 2016-3-4 00:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
(一)、系统简介
下面是用西门子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保存手机状态23h24h定时器占用
;短信内容缓存在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.2INT0入口地址
                        RETI
                        ORG 000BH;中断陷阱
                         LJMP CT
                        RETI
                        ORG 0013H;中断陷阱
                         RETI
                        ORG 0023H
                       ; AJMP UARTI
                        RETI
;以下为初始化程序
MAIN:
            MOVSCon,#50h; 方式1,REN=1.SM0SM1SM2REN,TB8RB8TI,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.3ms1000h定时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;延时5AT+CMGR=1
               LCALL DelayXmS
               LCALL CPMS   ;AT+CPMS="MT","SM"
               MOV DPTR,#1000;延时5AT+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中,删除后只有126H=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;ASCIIE发送到串口去
               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,A1
               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;检测到RI1就退出
              DJNZ R5,DY1;25微秒检测一次
              JB RI,KKQ;检测到RI1就退出
              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;ASCIIA发送到串口去
                 LCALL FS
                 MOV A,#54H;ASCIIT发送到串口去
                 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;软件清除串口中断标记
               ;判断手机shishi回答>代码?0D 0A 3E 20
               MOV A,#0FFH;检测到>,A1
               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;检测到RI1就退出
                DJNZ R5,DY33;延时25微秒检测一次
                JB RI,KKQ1;检测到RI1就退出
                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.1ms1000h定时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)、将短信息中心号码前面加上字符9191是国际化的意思
    => 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)、手机号码前加上字符串 11000D911100:固定,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这四个字符为例讲解把TestASCII 码转换成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:    ;左移变成7ASCII
               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=3132333435363738转成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



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表