硬件整体设计主要由五部分组成:MCU单元,指示电路,报警信号输入
电路,GSM通信模块接口部分,电源部分。硬件设计原理框图见图1。
报警信号输入
GSM接口 MCU 电源部分 指示电路
图1 硬件设计原理框图
1.1 MCU中央控制部分
(1)MCU的选用
AT89S51是一个低电压,高性能CMOS 8位单片机,片内含4k bytes的可反复擦写的只读程序存储器(FLASHROM)和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,内置功能强大的微型计算机的AT89S52提供了高性价比的解决方案。
(2)控制系统的主要功能
1)处理传感器采集到的报警信息,对各种报警信号进行综合判断,确定警情,从而做出正确的判断。
2)与GSM模块建立通讯,完成对GSM模块的初始化以及报警系统的个性化设置。
3)完成单片机系统与GSM模块之间的数据协议转换,包括将报警信息转换成符合SMS协议的数据格式并传递给GSM模块进行发送,以及将GSM模块收到的短信控制命令转换成相应的控制信号。 1.2 指示电路部分
采用四个LED发光管来指示整个系统的工作状态,其中一个为电源指示,一个为GSM与MCU成功建立连接指示,一个为传感器有信号输入指示,一个为短信发送成功指示。 1.3 报警信号输入接口电路
报警信号输入接口电路主要是用于引入有传感器发出的信号。这里传感器可
以是多种的。但是必须注意的是,无论是什么传感器,必须转换成开关信号之后才能送到单片机里面。 1.4 GSM通信模块接口部分
虽然整个系统设计主要按照3.3V接口进行设计,然而像RS485电路的输入、输出需要5V电平,同时GSM终端需要向用户提供TTL电平的串口输出。因此需要进行5V~3.3V或者3.3V~5V的电平转换。我们选用MAX232电平转换电路实现了电平的相互转换,电路如图2所示。
图2 电平转换电路
RS-232是由美国电子工业协会(EIA)正式公布的、在异步串行通讯中应用最广的标准总线。它包括了按位串行传输率和机械方面的规定。适合短距离或带调制解调器的通讯场合。它不仅已经被内置于每台PC,而且已被内置于从微控制器到主机的多种类型的电脑和与它们连接的设备。你也可以将RS-232用在任何类型得计算机之间的简单连接中,它是一个被广泛使用的接口之一。
目前,国内已经开始使用的GSM模块有Falcom的A2D系列、Wavecome的WMO2系列、西门子的TC35系列、爱立信的DM10/DM20系列、中兴的ZXGM18系列等,而且这些模块的功能、用法差别不大。其中西门子的TC35系列模块性价比很高,并且已经有国内的无线电设备入网证。所以本设计选用的是西门子TC35系列的TC35i。这是西门子推出的最新的无线模块,功能上与TC35兼容,
设计紧凑,大大缩小了用户产品的体积。TC35i与GSM2/2+兼容、双频(GSM900/GSMl800)、RS232数据口、符合ETSI标准GSM0707和GSM0705,且易于升级为GPRS模块。该模块集射频电路和基带于一体,向用户提供标准的AT命令接口,为数据、语音、短消息和传真提供快速、可靠、安全的传输,方便用户的应用开发及设计。
TC35i有40个引脚,通过一个ZIF(Zero Insertion Force,零阻力插座)连接器引出。这40个引脚可以划分为5类,即电源、数据输入/输出、SIM卡、音频接口和控制。第1~14脚为电源部分:1~5为电源电压输入端Vbatt+,6~10为电源地GND,11、12为充电引脚,13为对外输出电压(共外电路使用),14为ACCU-TEMP接负温度系数的热敏电阻。24~29为SIM卡引脚,分别为CCIN、CCRST、CCIO、CCCLK、CCVCC和CCGND。33~40为语音接口,用来接电话手柄。15、30、31和32脚为控制部分:15为点火线IGT(Ignition),当TC35i通电后必须给IGT一个大于100ms低电平,模块才启动;30为RTC backup,31为Power down,32为SYNC。16-23为数据输入/输出,分别为DSR0、RING0、RxD0、TxD0、CTS0、RTS0、DTR0和DCD0。 1.5 系统供电部分
为了保证系统运行的安全性,要给电路提供稳定的5V电源。GSM模块要用专用电源。
二 系统软件设计
2.1 下位机软件组成
程序主流程图如图2所示。图3中的个人参数设置主要用来设定用户用作报警的电话、个性化报警短信文字等,既可以用计算机通过串口进行设置,也可以通过手机短信的方式设置。参数中有个人密码项,一旦设定,整个系统只受密码持有者控制。
软件的一项重要工作是协议转换,GSM模块以及手机支持的是GSM协议,要想使得单片机能够控制GSM模块的短信收发,必须将相应的控制指令、报警状态等数据转换为相关格式,例如,手机短信支持的PDU或Unicode码格式。
终端系统设计的核心部分是单片机与GSM无线模块的通信,串口通信与AT命令的设置和使用是程序设计的难点。
系统软件设计采用模块化设计思想,主要分为单片机系统初始化模块、通信模块初始化模块、数据传输模块、数据采集模块等组成。
开始 初始化 与GSM建连接 查询并存储中心号码 判断是否有警情 读电话号码 发送信息 是否完成群发
图2
三 系统总体工作过程
系统上电后,MCU进行初始化,之后通过程序控制,经串口与GSM模块建
立连接。这里用到了TTL电压于232电压之间的一个转换芯片RS232,上面已经对这个电路做了详细描述,在此不再叙述。于GSM模块成功建立连接之后,相应的指示灯D2点亮。建立连接后,开始查询短信中心号码,然后将查询到的号码存储在MCU的片内ROM。
查询过中心号码之后,对GSM模块的初始化也全部完成。开始等待外部报警信号的输入。当有报警信号输入时。相应的警情指示灯D2点亮。通过程序进行对SIM卡内电话本的查询,这也是我们提前自己设置好的电话号码。查询成功后开始发送短信内容。短信内容是PDU格式,主要由中心号码,收短信人的电话号码,发出短信的字节数,短信内容及发送结束符和一些固定的字头组成。发送成功后,相应的指示灯D3点亮,并检验是否设置的几个电话号码发送完了,如果还没发送完毕,返回电话查询,重复上述步骤。如果发送完毕,则熄灭警情指示灯和和发送成功指示灯,并返回是否出现警情的判断部分。
附录1 整体电路图
VCCU140393837D2D3D436353433323130R51KR61KR71K292827262524232221VCCP0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7EA/VPALE/PPSENP2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.08052C633PFGNDC733PFP1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7RSTP3.0P3.1P3.2P3.3P3.4P3.5P3.6P3.7XTAL2XTAL1GND1234567891011121314151617181920CRY112MHzS210KR3RESETC122uFR2R120010KGNDS113C21uF451uF6C4151uFGNDMAX232C3C2-V-R2OUTGNDT2INT1INR1OUTU2C1+C1-C2+VCCC5V+T2OUTR2INR1INT1OUTVCC16278131491011121uF162738495GNDDB1VCCD1LEDR41K
附录2 程序清单
;短信中心号码存放在40H到4BH
;电话号码存放在50H到5BH
SR EQU P1.7 ;信号输入端口 WSZS EQU P0.0 ;握手成功指示指示 JQZS EQU P0.1 ;警情指示
FSCG EQU P0.2 ;短信发送成功指示
HMBH EQU 30H ;查询电话本中电话号码的编号存储单元 HMZS EQU 31H ;发送号码的总数 DLYSJ EQU 33H SHIZAIS EQU 35H SHIZAIG EQU 36H
ORG 0000H
AJMP MAIN ;转入主程序 ORG 000BH LJMP T0INT ORG 0013H
LJMP EXTJDA ORG 0030H
;***************以下为主程序进行CPU中断方式设置******************* MAIN:
MOV 30H,#31H ;SIM卡里的号码编号起始位置 MOV 31H,#2 ;发送人个数的设定
SETB IT0 ;设定INT0的触发式为脉冲负边沿触发 MOV SCON,#50H ;设置成串口1方式
MOV TMOD,#21H ;波特率发生器T1工作在模式2上
MOV TH1,#0FDH ;预置初值(按照波特率9600BPS预置初值)
MOV TL1,#0FDH ;预置初值(按照波特率9600BPS预置初值) MOV TH0,#3CH MOV TL0,#0B0H MOV DLYSJ,#60H SETB EA SETB ET0
SETB EX1 SETB EX0 SETB IT0 SETB IT1
SETB TR1 ;启动定时器T1
;*****************和手机建立连接及询问和存储中心号码*************** START: LCALL ATEOK ;开机发送ATE指令!
LCALL CNMI ;发送(AT+CNMI=1,1,0,0,1),短信到达TE CLR WSZS ;清零握手成功指示灯
LCALL XRDXZX ;调用询问手机SIM卡中短信中心号码子程序 ;*************完成和手机通信握手及询问及存储中心号码***************
;***************判断是否有警情,如果有则发送短信******************* PDJQ: JB SR,PDJQ ;判断是否有警情 LCALL YS10MS JB SR,PDJQ
CLR JQZS ;警情指示灯亮
DDHB: LCALL XRSJ ;读出授权电话号码,写入内存中 DXFSC: LCALL CMGS ;调用短信发送指令
LCALL PDGS ;判断短信发送指令是否发送成功,返回发送短信的符号
JNZ DXFS ;指令发送成功则发送短信内容 MOV DPTR,#1000 ;延时一秒钟 LCALL DELAYXMS AJMP DXFSC
MOV PCON,#128 ;设定SMOD为1,波特率翻倍!
;**************以上完成串口19200通讯初始化设置*********************
DXFS: LCALL DXZT ;调用发固定的短信字头089168子程序
LCALL ZXHM ;调用发送短信中心号码子程序 LCALL DZZB ;调用短信中部固定数据11000D9168 LCALL SJHM ;调用手机号码发送子程序 LCALL DYZXSJ ;调用下部固定数据000800 LCALL FSZS ;调用发送短信字数子程序 MOV A,#1AH ;发送短信发送结束符 LCALL FS
LCALL DXJC ;调用检测短信是否发送成功子程序
DXNRC: LCALL DXNR ;调用发送短信内容子程序
JZ DXFS ;如果短信发送成功顺序执行,反之,跳转 MOV DPTR,#1000 ;延时一秒钟 LCALL DELAYXMS
CLR FSCG ;清零发送指示灯 INC 30H ;电话号码编号加一 DJNZ 31H,DDHB ;判断是否完成群发 SETB FSCG ;熄灭发送成功指示灯 SETB JQZS ;新灭警情指示灯 MOV 30H,#31H MOV 31H,#2 AJMP PDJQ
;*******************完成警情判断及短信发送**********************
;********************手机握手子程序***************************** ;和手机握手,单片机发ATE手机回答OK子程序 ATEOK: MOV DPTR,#500 ;延时五十毫秒
LCALL DELAYXMS ;发送ATE指令! LCALL AT_0
MOV A,#45H ;将ASCII码E发送到串口去
LCALL FS
LCALL HC ;回车!
LCALL PDOK ;判断手机是否回答OK? JZ ATEOK ;如果没有检测到OK,重复发 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
;**************************************************************
;*******************检测及存储短信中心号码********************* XRDXZX: LCALL CXZH ;调用查询中心号码子程序 MOV R3,#13 ;跳过13个数据
LCALL TGSJ ;调用跳过串口数据子程序 JNC XRDXZX1 ;准备接收短信中心号码
MOV R3,#5 ;循环接收5次
MOV R0,#40H ;数据从40H-4BH内存开始存放 CLR RI ;软件清除串口中断标记
TFSJ: INC R0 ;内存单元地址 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 ;内存单元地址
;短信中心的号码已经存放在40H-4BH的内存中 MOV R3,#13 ;跳过13个数据
LCALL TGSJ ;调用跳过串口数据子程序
LCALL CXZH ;调用询问手机SIM卡中短信中心号码子程序 MOV R3,#13 ;跳过13个数据
LCALL TGSJ ;调用跳过串口数据子程序 LCALL JYZXHM ;调用校验短信中心号码子程序 JZ XRDXZX AJMP XRDXZX2 XRDXZX1:LCALL XRDXZX XRDXZX2:RET
;发送AT+CSCA?查询短信中心号码子程序 CXZH: MOV DPTR,#500
LCALL DELAYXMS LCALL ATC MOV A,#53H LCALL FS MOV A,#43H LCALL FS
;校验短信中心号码子程序
JYZXHM: CLR RI ;软件清除串口中断标记
LCALL PDRI ;等待下一个串口数据 MOV A,#41H LCALL FS MOV A,#3FH LCALL FS LCALL HC;回车! RET
MOV A,SBUF ;将串口寄存器中接收到的数据给A CJNE A,41H,JYZXHM1 ;判断串口数据1 LCALL PDRI ;等待下一个串口数据
MOV A,SBUF ;将串口寄存器中接收到的数据给A CJNE A,40H,JYZXHM1 ;判断串口数据3 CLR RI ;软件清除串口中断标记 CLR RI ;软件清除串口中断标记
LCALL PDRI ; MOV A,SBUF ; CJNE A,43H,JYZXHM1 ; CLR RI ; LCALL PDRI ; MOV A,SBUF ; CJNE A,42H,JYZXHM1 ; CLR RI ; LCALL PDRI ; MOV A,SBUF ; CJNE A,45H,JYZXHM1 ; CLR RI ; LCALL PDRI ; MOV A,SBUF ; CJNE A,44H,JYZXHM1 ; CLR RI ; LCALL PDRI ; MOV A,SBUF ; CJNE A,47H,JYZXHM1 ; CLR RI ; LCALL PDRI ; MOV A,SBUF ; CJNE A,46H,JYZXHM1 ; CLR RI ; LCALL PDRI ; MOV A,SBUF ;
CJNE A,49H,JYZXHM1 ;等待下一个串口数据
将串口寄存器中接收到的数据给A 判断串口数据8 软件清除串口中断标记 等待下一个串口数据
将串口寄存器中接收到的数据给A 判断串口数据0 软件清除串口中断标记 等待下一个串口数据
将串口寄存器中接收到的数据给A 判断串口数据0 软件清除串口中断标记 等待下一个串口数据
将串口寄存器中接收到的数据给A 判断串口数据5 软件清除串口中断标记 等待下一个串口数据
将串口寄存器中接收到的数据给A 判断串口数据9 软件清除串口中断标记 等待下一个串口数据
将串口寄存器中接收到的数据给A 判断串口数据7 软件清除串口中断标记 等待下一个串口数据
将串口寄存器中接收到的数据给A 判断串口数据5
CLR RI ;软件清除串口中断标记 LCALL PDRI ;等待下一个串口数据
MOV A,SBUF ;将串口寄存器中接收到的数据给A CJNE A,48H,JYZXHM1 ;判断串口数据0 CLR RI ;软件清除串口中断标记 LCALL PDRI ;等待下一个串口数据
MOV A,SBUF ;将串口寄存器中接收到的数据给A CJNE A,4BH,JYZXHM1 ;判断串口数据0 CLR RI ;软件清除串口中断标记
MOV R3,#13 ;跳过13个数据
LCALL TGSJ ;调用跳过串口数据子程序 AJMP JYZXHM2 JYZXHM1:LCALL SB JYZXHM2:RET
;**************************************************************
;**********************读电话本子程序************************** ;读出授权电话号码,写入内存中 XRSJ: MOV DPTR,#2000
LCALL DELAYXMS MOV A,30H
LCALL CPBR ;读出授权电话AT+CPBR= LCALL FS LCALL HC
LCALL DCSJ ;跳过十二个数据 JNC XRSJ
;手机号码存放在50H-5BH的内存中
MOV R3,#11 ;定义接收手机号码的数据长度
MOV R0,#50H ;数据在内存的存放位置 LCALL GPSSJ ;调用接收串口数据子程序 LCALL TGSJ ;调用跳过串口数据子程序
MOV R3,#16 ;跳过16个数据
MOV 5BH,#46H RET
DCSJ: MOV R3,#12 ;跳过12个数据
LCALL TGSJ ;调用跳过串口数据子程序 XRSJ1: 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
;接收短信授权后的手机号码子程序
GPSSJ: CLR RI ;软件清除串口中断标记
;**************短信发送指令AT+CMGS= 69的发送******************* CMGS: LCALL ATC
MOV A,#4DH LCALL FS MOV A,#47H LCALL FS
LCALL PDRI ;等待下一个串口数据
MOV A,SBUF ;将串口寄存器中接收到的数据给A MOV @R0,A
INC R0 ;内存单元地址
DJNZ R3,GPSSJ ;判断是否已经收全部数据? RET
;**************************************************************
MOV A,#53H LCALL FS MOV A,#3DH LCALL FS MOV A,#20H LCALL FS MOV A,#36H LCALL FS LCALL FS RET
MOV A,#39H LCALL HC
;**************************************************************
;**************判断短信发送指令是否成功子程序****************** PDGS: CLR RI
LCALL PDDA ;判断是否返回0D 0A LCALL PDRI
MOV A,SBUF ;将串口寄存器中接收到的数据给A CJNE A,#3EH,WD ;判断串口数据
CLR RI ;软件清除串口中断标记 LCALL PDRI ;等待下一个串口数据
MOV A,SBUF ;将串口寄存器中接收到的数据给A
CJNE A,#20H,WD ;判断串口数据
CLR RI ;软件清除串口中断标记
;判断手机是不是回答>代码? 0D 0A 3E 20 MOV A,#0FFH ;检测到>,对A置1 RET
WD: CLR A;没有检测到>,对A清零
CLR RI;清除有串口数据标志 RET
;**************************************************************
;***************发送短信固定字头089168子程序******************* DXZT: MOV A,#30H LCALL FS MOV A,#38H LCALL FS
;*********************中心号码发送子程序*********************** ZXHM: MOV A,40H
LCALL FS MOV A,41H LCALL FS MOV A,42H LCALL FS MOV A,43H LCALL FS MOV A,44H LCALL FS MOV A,45H LCALL FS MOV A,#39H LCALL FS MOV A,#31H LCALL FS MOV A,#36H LCALL FS MOV A,#38H LCALL FS RET
;**************************************************************
MOV A,46H LCALL FS MOV A,47H LCALL FS MOV A,48H LCALL FS MOV A,49H LCALL FS MOV A,4AH LCALL FS MOV A,4BH LCALL FS RET
;**************************************************************
;*************发送短信中间固定数据11000D9168子程序************* DZZB: MOV A,#31H
LCALL FS MOV A,#31H LCALL FS MOV A,#30H LCALL FS MOV A,#30H LCALL FS MOV A,#30H
LCALL FS MOV A,#44H
LCALL FS MOV A,#39H LCALL FS MOV A,#31H LCALL FS
MOV A,#36H
LCALL FS MOV A,#38H
;********************手机号码发送子程序************************ SJHM: MOV A,51H
LCALL FS MOV A,50H LCALL FS MOV A,53H LCALL FS MOV A,52H LCALL FS MOV A,55H LCALL FS MOV A,54H LCALL FS MOV A,57H LCALL FS MOV A,56H LCALL FS MOV A,59H LCALL FS MOV A,58H LCALL FS MOV A,5BH LCALL FS LCALL FS RET
;**************************************************************
MOV A,5AH LCALL FS RET
;**************************************************************
;**************发送短信中间固定数据000800子程序**************** DYZXSJ:MOV A,#30H
LCALL FS MOV A,#30H LCALL FS MOV A,#30H LCALL FS MOV A,#38H LCALL FS MOV A,#30H LCALL FS MOV A,#30H LCALL FS
RET
;**************************************************************
;********************发送的短信字数子程序********************** FSZS: MOV A,#33H LCALL FS
;**********************发送短信内容子程序********************** DXNR: MOV DPTR,#TAB MOV R2,#108 MOV R3,#0 DXNR1: MOV A,R3 MOVC A,@A+DPTR
MOV A,#36H LCALL FS RET
;**************************************************************
LCALL FS INC R3 DJNZ R2,DXNR1 RET
;**************************************************************
;*************************短信发送检测************************* DXJC: MOV R3,#15 LCALL TGSJ JNC DXJC1
LCALL PDOK ;短信发送成功,判断OK DXJC1:RET
;**************************************************************
;跳过接收数据的子程序(专门针对PDU码数据) TGSJ: SETB C
;发送AT指令!
AT_0: MOV A,#41H ;将ASCII码A发送到串口去
FS: CLR TI ;先对TI进行软件复位
LCALL FS
MOV A,#54H ;将ASCII码T发送到串口去 LCALL FS RET
CLR RI ;软件清除串口中断标记 LCALL PDRI ;等待下一个串口数据
MOV A,SBUF ;将串口寄存器中接收到的数据给A
JNC XPAS ;如果检测到发生超时退出,就跳出这段程序 DJNZ R3,TGSJ ;判断是否已经收全部数据?
XPAS: RET
MOV SBUF,A
LCALL PDTI ;调用检测TI变为高电平的子程序 RET
;发送HC回车指令! HC: MOV A,#0DH
;检测手机是否回答OK? PDOK:LCALL PDDA
;检测手机是否回答0D/0A?
PDDA:CLR RI ;清除有串口数据标志
LCALL PDRI ;2秒内检测串口是否有数据返回? CJNE A,#0DH,SB ;判断串口数据
CLR RI ;软件清除串口中断标记
MOV A,SBUF ;将串口寄存器中接收到的数据给A
LCALL PDRI ;等待下一个串口数据
MOV A,SBUF ;将串口寄存器中接收到的数据给A CJNE A,#4FH,SB ;判断串口数据
CLR RI ;软件清除串口中断标记 LCALL PDRI ;等待下一个串口数据
MOV A,SBUF ;将串口寄存器中接收到的数据给A CJNE A,#4BH,SB ;判断串口数据 LCALL PDDA
MOV A,#0FFH ;检测到OK,对A置1 RET LCALL FS MOV A,#0AH LCALL FS RET
;判断是不是手机回答的OK代码? 0D 0A 4F 4B 0D 0A
LCALL PDRI ;等待下一个串口数据
MOV A,SBUF ;将串口寄存器中接收到的数据给A CJNE A,#0AH,SB ;判断串口数据
CLR RI ;软件清除串口中断标记 RET
SB: CLR A
;判断串口数据是否接收成功?超时退出
PDRI:MOV R1,#60 ;300毫秒超时退出! PBZ: MOV R4,#200 DY2: MOV R5,#25
DY1: JB RI,KKQ ;检测到RI变1就退出
;判断串口数据时候发送成功?超时退出 PDTI:MOV R1,#200;5毫秒超时退出! PSZ: MOV R4,#5 DT2: MOV R5,#5 DT1: JB TI,KQ
DJNZ R5,DT1 JB TI,KQ
DJNZ R4,DT2;25毫秒检测一次
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 ;清除有串口数据标志 CLR RI ;清除有串口数据标志 RET
KKQ: RET
DJNZ R1,PSZ;超时退出
KQ: RET
;发送AT+C,应答 ATC: LCALL AT_0
MOV A,#2BH LCALL FS MOV A,#43H LCALL FS
RET
;十毫秒延时子程序 YS10MS:MOV R6,#10H ys0: MOV R7,#0FFH YS1: DJNZ R7,YS1 DJNZ R6,YS0 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
T0INT: PUSH ACC MOV TH0,#3CH MOV TL0,#0B0H DEC DLYSJ MOV A,DLYSJ CJNE A,#5,T0N1 SJMP T0N2 T0N1: CJNE A,#0,T0N2 MOV DLYSJ,#70 T0N2: POP ACC RETI EXTJDA:PUSH ACC PUSH 00H MOV A,SHIZAIS SUBB A,#30H MOV B,#10 MUL AB MOV R0,A MOV A, SHIZAIG SUBB A,#30H ADD A, R0 CJNE A,#00,EXTD0 SJMP EXTD2 EXTD0: DEC A
CJNE A,#200,ESTD6 ESTD6: JC EXTD2 CLR A EXTD2: MOV B,#10 DIV AB ADD A,#30H
RET
MOV SHIZAIS,A MOV A,B ADD A,#30H MOV SHIZAIG,A POP 00H POP ACC RETI
;要发送的短信内容 TAB:DB
36H,37H,30H,39H,38H,42H,36H,36H,36H,30H,43H,35H,46H,46H,30H,43H,38H,42H DB
46H,37H,38H,46H,43H,35H,39H,30H,31H,46H,35H,39H,30H,34H,37H,34H,30H,36H DB
33H,30H,30H,32H,35H,37H,33H,30H,35H,37H,34H,30H,46H,46H,31H,41H,36H,43H DB
42H,33H,35H,33H,35H,37H,37H,39H,44H,31H,36H,32H,38H,30H,35H,42H,36H,36H DB
39H,36H,36H,32H,36H,37H,33H,41H,37H,35H,33H,35H,36H,39H,37H,43H,30H,30H DB
33H,33H,30H,30H,33H,30H,30H,30H,33H,31H,35H,42H,41H,34H,33H,30H,30H,32H
;内容为有警情,请迅速处理。地址:河南科技学院机电楼301室。
SJMP $ END
因篇幅问题不能全部显示,请点此查看更多更全内容