短信息温度遥测遥传系统
   *双击自动滚屏*
    这是我们新开发的短信息温度遥测遥传系统,它可以把重要设备的温度通过短消息随时发送到特定的手机上,使主人能随时掌握设备的温度,起到远程监控的功能。

设计思路:

    有些系统对温度比较敏感,例如正在高速运转的发电机,当温度出现超高时说明内部有严重的故障,必须马上停机,否则发电机会损坏,或者是一个现代化的暖棚,当温度异常升高或者过低时会引起巨大的经济损失,这些应用场合我们希望能随时掌握其温度,以便在需要的时候加以控制,我们开发的这个系统就能满足这类需要。我们采用AT89C2051单片机,通过DS18B20来采集设备的温度,然后把温度存储到单片机内存中,当满足特定的外部条件触发时,单片机立即把温度数值打包成中文短消息,并且通过TTL串口触发JB35G,让它发送短消息,这样特定的手机就能立即收到例如“现在温度是10.625度,温度过低! 温度过高预定值32度, 温度过低预定值14度, 超限报警:允许”的短消息,非常直观。

产品功能:

0。测温响应时间:从发出振铃遥控指令到收到温度短消息的时间:10~20秒。

1。温度测量范围0~125度,测温精度:0.125度,显示精度:小数点后面三位。

2。温度数据第一位和第二位是0自动不显示,比较美观。

3。温度短消息包含:现场温度、温度是否正常、温度过高预定值、温度过低预定值、超限报警是否允许等信息。

4。当温度超过预定的上限或者下限时,系统自动发出两条(可程序修改成若干条)报警短消息,然后停止发送,只有当温度退回正常温度后,如果再次越限时再发送越限短消息,这个功能既可以保证超限短消息的可靠发送,同时也能防止在温度越限后系统无休止发送报警短消息,在系统温度返回正常温度后重新开启越限短消息报警功能,这个功能可以远程通过DTMF遥控或者短消息遥控来禁止或者允许。

5。可以随时通过振铃遥控的方式让系统发送一次当前的温度短消息。

6。通过发送"打开第七路"可以设置超限报警允许,发送"关闭第七路"可以设置超限报警禁止.

7。ABS塑料外壳大小:145X90X30毫米

8。AT89C2051单片机源程序公开,便于客户二次改进开发。

9。支持短信息温度设定值修改功能。只要发送定值修改中文短信"定值修改038012"可以自动将温度过高定值修改为38度,温度过低定值修改为12度,并自动回复一条短消息确认。

10。带有四路短信继电器遥控功能,可以用于远程遥控加热器或者冷却器电源等

    这里我们采用振铃遥控来触发主机发送一次温度测量结果的短消息。用手机或者电话拔打JB35G内部的手机卡号码,JB35G会发出振铃声,电话听筒内也应听到回铃音“嘟——嘟”,当听到两声回铃音后马上挂断,因为这时通话双方都未进入通话状态,所以是没有费用产生。这时JB35G的第八路输出状态会翻转一次,当主机内部的AT89C2051单片机检测到JB35G的第八路状态发生翻转,就会立即把当时采集到的温度数值,打包到短消息中发送出去。

   当然通过修改单片机软件程序可以实现诸如:现场触发发送、定时发送(每隔若干分钟或者若干小时)等方式。

使用方法:

    首先要插入一张GSM的SIM卡(13xxxxxxxxx),可以是联通的也可以是电信的,要保证这张手机卡有一定的资金余额,用于支付发短信时产生的费用,并且SIM卡在使用前,应先放入手机中设置好短信息中心服务号码,短信息中心服务号码每个地方都不相同,具体可以询问当地的1860或1001。

    然后把SIM卡插入SIM卡座内,并向右滑动SIMLOCK翻盖锁住SIM卡。

  

    将配套的健伍交流电源的电源插头插入主机的电源座中,按下红色的电源开关,这时红色的电源指示灯就会点亮,如果是第一次接通电源,须等待20秒~10分钟,LED0发光二极管才亮,进入待机状态。如果是第二次以后接通电源,则只须等待20~30秒,LED0发光管亮,进入待机状态。(在此等待时间内JB35先进行GSM网络搜寻,再进行SIM卡格式化过程。GSM网络搜寻大约须要20~30秒时间。SIM卡格式化过程大约须要1S~10分钟不等。格式化SIM卡的目的是删除SIM卡内的电话簿和短信箱中的内容,因为这些存储空间是JB35以后用来存储运行中一些重要数据的。格式化时间的长短取决于电话簿里的内容多少,如果电话簿内容本身为空,则只须10秒就完成格式化。)登陆网络成功以后LED0会变成常亮,而且手机模块上侧面的一个绿色贴片LED也会以0.5HZ的频率闪光,表示网络连接成功,可以透过外壳侧面的方形孔中观察到。

    短信息温度遥测遥传系统,使用前必须进行软件功能设置,这样才能充分发挥其功能优势,这里我们来详细介绍一下JB35G专用软件的设置。

    把网上下载到的JB35.CAB文件用WINRVR解压缩软件打开后,直接双击其中的JB35.EXE文件就能免安装运行设置软件。

    首先请用随机附带的串口通讯电缆连接报警器和电脑的串口,根据实际连接的电脑COM1或COM2在软件中正确选择。

    可以点击软件界面的“立即查询本机版本”按钮,这时软件应该能显示是带串口数据传输功能的JB35G,这说明串口通讯正常。

    触发发送温度短消息我们是利用JB35G的第八路继电器输出状态高低平电平变化来完成的,所以我们要确认软件输出设置界面的“第八路继电器输出状态”应该点选“开关状态输出”。

    点击“立即写入本页设置”按钮可以将本页设置写入报警器内部的控制器。

    因为我们触发主机发送温度短消息是通过拨打SIM卡的手机号码来实现遥控的,如果随便哪个电话拨打这个手机号码都能,触发主机发送温度短消息那么这个系统的安全性就会大打折扣,所以我们可以根据需要在软件中对呼叫号码进行过滤,只有特定的号码打入才能触发主机发送温度短消息,其它号码呼叫不予响应,这个功能其实是巧妙利用手机的来电显示功能来完成的,所以必须手机要开通来电显示哦。

    这里我们必须设置一下在发送含有温度测量信息短信息时默认的接收方手机号码。

    点击“立即写入本页设置”按钮可以将本页设置写入报警器内部的控制器。

JB35G的发送特定中文短消息功能

    JB35G所特有的功能就是可以通过串口发送特定的数据,甚至是中文,这就意味这我们可以随意发送所想要的中文短消息内容,例如我们用AT89C2051单片机来采集温度,然后发送一条“现在的温度为XX度,正常!”

   因为单片机的串口只能发送16进制的字符,所以我们必须把中文文字转换成16进制的Unicode码,方法很简单,我们开发了汉字ASCII码=Unicode码专用软件,只要你在下载并安装这个软件,直接在软件窗口中输入需要的中文,在按转化按钮,立即就能得到转换成功的数据代码,然后我们把这个代码利用单片机的串口以9600波特率发送给JB35G,就能发出特定内容。

    网友可以看到图中画红线的四个数值就是温度数据34,数字3对应:00 33、数字4对应:00 34,可以看出其中的规律。我们只要把测到温度替换其中的四个数值,就变成含有有效的温度信息的短消息了。甚至我们还可以在程序加以判断,当温度过高时,短信息就提示温度超高!过低就提示温度过低!真的非常直观哦~

    如果在发送数据时,在数据前面加上ASCII码的“#××××××××××#”其中×××××××是表示一个手机号码,这时数据不会发送给默认手机号,而是直接发送给××××××××这个手机号码。

    网友可以看到JB35G其实不但可以发送任何内容的短消息,而且还能选择接收方的手机号码,这些功能在二次开发时非常有用。

    JB35G每发送一次短信息,最多只能传输130个字节约60个汉字到的数据,因此应用时需要特别注意。

系统的开发扩展

    这里我们举了一个温度方面的详细应用,其实网友只要稍加变通,加上适当的传感器,就能把诸如:电压、频率、流速、电表电量、产品数量等等信息,也打包到短消息中,作为一个特定领域的相关应用。

短信息温度遥测遥传系统的全套清单:

1。短信息温度遥测遥传主机一个(内部包含JB35G模块)

2。配套软件光盘一张

3。健伍高品质12V1000毫安交流稳压电源一个

4。DS18B20测温探头一个

5。串口通讯设置连线一根

(无产品,不供货,请勿询问)

相关键连:多功能GSM短消息遥控系统

相关键连:超级车辆短消息防盗报警器

相关键连:短消息温度遥测遥传系统

相关键连:GPS卫星定位及短信遥传系统

相关键连:家庭短消息防盗报警系统

相关键连:用手机发短消息遥控家电或者汽车

汇款地址:226200 江苏省启东市城河新村103楼401房间 谢刚 收

点击查看邮购需知!        立即进入订货系统!

电话/传真:0513-3342087 小灵通:0513-3082087 联系人:谢刚

主邮箱: (推荐使用)

点击返回《电子制作实验室》网站主页

;这是温度短信息遥测系统的最新源程序
;采用带串口数传功能的JB35G,通过串口触发发送包含温度信息的短消息
;采用AT89C2051单片机,晶振11.0592MHZ,通讯速率9600,采用TTL串口通讯
;P3.4是振铃遥控端,检测到振铃就发送一次温度测量结果的短消息
;P3.2为温度测量芯片DS18B20的数据脚
;P3.5(JB35的第7路)超限报警的标志位0为允许,1为禁止
;P1.1为GSM网络检查端,0为在线,1为断线
;带短信定值修改功能,例如发送中文短信"定值修改038012"可以自动将温度过高定值
;修改为38度,温度过低定值修改为12度,并自动回复一条短消息确认
;位地址38H是否检测到DS18B20标志位,1为检测到,0为检测不到
;位地址39H为温度过低标志位,1为过低,0正常
;位地址3AH为温度过高标志位,1为过高,0正常
;20H--温度百位整数存放地址
;21H--温度十位整数存放地址
;22H--温度个位整数存放地址
;23H--温度小数点存放地址(固定为2EH)
;24H--温度小数第1位存放地址
;25H--温度小数第2位存放地址
;26H--温度小数第3位存放地址
;2FH--温度超高预设值
;2EH--温度过低预设值
;40H--温度过高预定值的百位存放地址
;41H--温度过高预定值的十位存放地址
;42H--温度过高预定值的个位存放地址
;43H--温度过低预定值的百位存放地址
;44H--温度过低预定值的十位存放地址
;45H--温度过低预定值的个位存放地址
;49H--超限后允许发送短消息次数存放地址

ORG 0000H

AJMP MAIN;转入主程序
ORG 0003H
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RETI
ORG 000BH;中断陷阱
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RETI
ORG 0013H;中断陷阱
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RETI
ORG 001BH;中断陷阱
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RETI
ORG 0023H;中断陷阱
AJMP UARTI ;转入串口接收中断程序
NOP
NOP
NOP
NOP
RETI

MAIN:
CLR EA
CLR IT1;立即禁止中断1,否则会错误进入中断!

CLR P1.6;确保红绿LED中只有一个亮
SETB P1.7;确保红绿LED中只有一个亮
HLB:
ACALL DELAY500;延时500毫秒
CPL P1.6;红绿交替变色
CPL P1.7;红绿交替变色
JB P1.1,HLB;检测到JB35上线后结束开机延时!
SETB P1.6;确保红绿ED都熄灭
SETB P1.7;确保红绿ED都熄灭
;开机延时结束,表示可以开始工作

;单片机内存分配申明!
TEMPER_L EQU 29H;用于保存读出温度的低8位
TEMPER_H EQU 28H;用于保存读出温度的高8位(特别是可位寻址,程序中用的着哦)
FLAG1 EQU 38H;是否检测到DS18B20标志位
a_bit equ 22h ;温度个位数存放内存位置
b_bit equ 21h ;温度十位数存放内存位置
c_bit equ 20h ;温度百位数存放内存位置
MOV 2FH,#27;设定高于27度为温度过高
MOV 2EH,#17;设定低于17度为温度过低
MOV 23H,#2EH;这是小数点的汉字内码
MOV 19H,#0;对允许超限报警次数内存清零

MOV SCON,#50H;设置成串口1方式
MOV TMOD,#20H;波特率发生器T1工作在模式2上
MOV TH1,#0FDH;预置初值(按照波特率9600BPS预置初值)
MOV TL1,#0FDH;预置初值(按照波特率9600BPS预置初值)
SETB TR1;启动定时器T1
;以上完成串口9600通讯初始化设置

;-------------------
mov a,2FH;对温度过高预定值取出百位、十位、个位
mov b,#10 ;取出十位和个位
div ab
ORL A,#00110000B
mov 41H,a ;十位
mov 42H,b ;个位
MOV A,42H
ORL A,#00110000B;转化成ASCII码
mov 42H,A
mov a,2FH
mov b,#100 ;取出百位
div ab
ORL A,#00110000B
mov 40H,a ;百位
;---------------------------------------
mov a,2EH;对温度过低预定值取出百位、十位、个位
mov b,#10 ;取出十位和个位
div ab
ORL A,#00110000B
mov 44H,a ;十位
mov 45H,b ;个位
MOV A,45H
ORL A,#00110000B
mov 45H,A
mov a,2EH
mov b,#100 ;取出百位
div ab
ORL A,#00110000B
mov 43H,a ;百位
;------------------

JB P3.4,AA;开机时对P3.4口状态作一个备份(JB35G的第八路,振铃遥控端)
MOV R6,#00H;如果P3.4口为低电平,那么R6=#00H
AJMP KKB
AA:MOV R6,#0FFH;如果P3.4口为高电平,那么R6=#0FFH
;-------------------------------------------------------------
KKB:
SETB EA;允许中断
SETB ES;允许串口数据中断
SETB P1.6;点亮绿灯
CLR P1.7;熄灭红灯
LCALL GET_TEMPER;调用读温度子程序(存放在28H/29H中)

;先对温度值的3位小数加以转化,精度0.125度,存放在24H/25H/26H中
MOV A,29H
RR A;将29H中的第2/3/4位移入A的第1/2/3位
ANL A,#00000111B;屏蔽A的高5位
CJNE A,#0,GO1;000
MOV 24H,#30H
MOV 25H,#30H
MOV 26H,#30H
GO1:CJNE A,#1,GO2;125
MOV 24H,#31H
MOV 25H,#32H
MOV 26H,#35H
GO2:CJNE A,#2,GO3;250
MOV 24H,#32H
MOV 25H,#35H
MOV 26H,#30H
GO3:CJNE A,#3,GO4;375
MOV 24H,#33H
MOV 25H,#37H
MOV 26H,#35H
GO4:CJNE A,#4,GO5;500
MOV 24H,#35H
MOV 25H,#30H
MOV 26H,#30H
GO5:CJNE A,#5,GO6;625
MOV 24H,#36H
MOV 25H,#32H
MOV 26H,#35H
GO6:CJNE A,#6,GO7;750
MOV 24H,#37H
MOV 25H,#35H
MOV 26H,#30H
GO7:CJNE A,#7,GO8;875
MOV 24H,#38H
MOV 25H,#37H
MOV 26H,#35H

GO8:
;将测量到的温度值的整数部分放入29H中
MOV A,29H
MOV C,40H;将28H中的最低位移入C
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV 29H,A;29H中的数值就是温度的整数部分了
;取出温度整数部分的百位/十位/个位
mov a,29H
mov b,#10 ;取出十位和个位
div ab
ORL A,#00110000B
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b
MOV A,a_bit
ORL A,#00110000B
mov a_bit,A
mov a,29H
mov b,#100 ;取出百位
div ab
ORL A,#00110000B
mov c_bit,a ;百位在c

;判断现场温度是否过高或者过低
MOV A,29H;将现场实际温度传递给A
CJNE A,2FH,LL1;和温度超高定值比较,利用C标志位
LL1:JNC LL2;判断温度是否过高?过高跳转
CJNE A,2EH,LL3;和温度过低定值比较,利用C标志位
LL3:JC LL4;判断温度是否过低?过低跳转

CLR 39H
CLR 3AH
MOV 19H,#0;温度正常时恢复超限报警允许次数
AJMP LL5;说明温度在上下限范围内

LL2:SETB 3AH;对温度过高标志位置1

CLR 39H
AJMP MM1

LL4:SETB 39H;对温度过低标志位置1

CLR 3AH

MM1:JNB P3.5,CB2;判断是否允许超限报警?0允许/1禁止
AJMP LL5;如果超限报警禁止,马上返回

CB2:MOV A,19H;比较报警次数是否符合?
CJNE A,#2,PP8;立即发出温度超限报警短消息,默认发送2条!

LL5:;判断是否振铃遥控?
JB P3.4,BB;判断此时P3.4口电平高低?
MOV R7,#00H;如果P3.4口为低电平,那么R7=#00H
AJMP K2
BB:MOV R7,#0FFH;如果P3.4口为高电平,那么R7=#0FFH
K2:MOV A,R6;比较R6和R7是否相同?也就是检测P3.4口电平是否变化过
XRL A,R7;如果P3.4口电平变化A=1;没有变化A=0
JNZ HH;如果P3.4口电平有变化,就改变输出状态

JB P1.5,HPS;判断P1.5的按钮是否按下?
ACALL DELAY100
JB P1.5,HPS;软件抗干扰检测一次!
JNB P1.5,$;等待按键松开
AJMP PP;发送一次温度短信

HPS:AJMP KKB

PP8:INC 19H
AJMP PP

HH:JB P3.4,BBB;检测到P3.4口发生变化(振铃遥控)
MOV R6,#00H;如果此时P3.4口为低电平,那么R6=#00H,对R6更新
AJMP PP
BBB:MOV R6,#0FFH;如果此时P3.4口为高电平,那么R6=#0FFH,对R6更新

PP:ACALL FSWWW;调用发送温度短消息的子程序
AJMP KKB

FS8:MOV R1,#0
CF3:
CLR TI;对TI软件复位
MOV A,R1
MOVC A,@A+DPTR ;查表汉字的内码
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
INC R1
CJNE R1,#18,CF3
RET

;这是“现在的温度是”六个汉字的内码
TAB1: DB 73H,0B0H,57H,28H,76H,84H,6EH,29H
DB 5EH,0A6H,66H,2FH

;这是“度,温度正常! ”七个汉字的内码
TAB2: DB 5EH,0A6H,0FFH,0CH,6EH,29H,5EH,0A6H
DB 6BH,63H,5EH,38H,0FFH,01H

;这是“度,温度过高! ”七个汉字的内码
TAB3:DB 5EH,0A6H,0FFH,0CH,6EH,29H,5EH,0A6H
DB 8FH,0C7H,9AH,0D8H,0FFH,01H

;这是“度,温度过低! ”七个汉字的内码
TAB4:DB 5EH,0A6H,0FFH,0CH,6EH,29H,5EH,0A6H
DB 8FH,0C7H,4FH,4EH,0FFH,01H

;这是“ 温度过高预定值:”9个汉字的内码
TAB5:DB 00H,20H,6EH,29H,5EH,0A6H,8FH,0C7H,9AH,0D8H
DB 98H,84H,5BH,9AH,50H,3CH,0FFH,1AH

;这是“ 温度过低预定值:”9个汉字的内码
TAB6:DB 00H,20H,6EH,29H,5EH,0A6H,8FH,0C7H,4FH,4EH
DB 98H,84H,5BH,9AH,50H,3CH,0FFH,1AH

;这是“度 超限报警:允许”9个汉字的内码
TAB7:DB 5EH,0A6H,00H,20H,8DH,85H,96H,50H,62H,
DB 0A5H,8BH,66H,0FFH,1AH,51H,41H,8BH,0B8H

;这是“度 超限报警:禁止”9个汉字的内码
TAB8:DB 5EH,0A6H,00H,20H,8DH,85H,96H,50H,62H,
DB 0A5H,8BH,66H,0FFH,1AH,79H,81H,6BH,62H

;100毫秒延时子程序,占用R4、R5
DELAY100:MOV R4,#100
D222:MOV R5,#248
DJNZ R5,$
DJNZ R4,D222
RET

FSWWW:;发送温度短消息的子程序
CLR ES;禁止串口中断
JB P1.1,$;判断GSM网络是否正常?0为在线

ACALL DELAY7;延时7秒再发送短消息,否则会掉线

CLR P1.7;点亮绿色指示灯
SETB P1.6;确保红色指示灯在熄灭状态

MOV DPTR,#TAB1;发送“现在的温度是”六个汉字的内码
MOV R1,#0
CF1:
CLR TI;对TI软件复位
MOV A,R1
MOVC A,@A+DPTR ;查表汉字的内码
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
INC R1
CJNE R1,#12,CF1

;发送温度的三位整数/小数点/三位小数

MOV A,20H
CJNE A,#30H,BB1
MOV A,21H
CJNE A,#30H,BB2
MOV R1,#22H
AJMP USA
BB2:MOV R1,#21H
AJMP USA
BB1:MOV R1,#20H;如果百位和十位是0,就自动消隐

USA:CLR TI;对TI软件复位
MOV A,#00H;汉字数字前面必须加00H(双字节)
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
CLR TI;对TI软件复位
MOV A,@R1
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
INC R1
CJNE R1,#27H,USA

;根据现场温度,发出温度是否正常的短信息(7个汉字)
JB 39H,KK1;1为温度过低
JB 3AH,KK2;1为温度超高
MOV DPTR,#TAB2;显示温度正常
AJMP KK3
KK1:MOV DPTR,#TAB4;显示温度过低
AJMP KK3
KK2:MOV DPTR,#TAB3;显示温度过高

KK3:MOV R1,#0
CF2:
CLR TI;对TI软件复位
MOV A,R1
MOVC A,@A+DPTR ;查表汉字的内码
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
INC R1
CJNE R1,#14,CF2

;×××××××××××××××
MOV DPTR,#TAB5;温度过高预定值:
ACALL FS8;调用发送9个汉字的子程序

;发送温度过高预定值

MOV A,40H
CJNE A,#30H,BB11
MOV A,41H
CJNE A,#30H,BB21
MOV R1,#42H
AJMP USA1
BB21:MOV R1,#41H
AJMP USA1
BB11:MOV R1,#40H;如果百位和十位是0,就自动消隐

USA1:CLR TI;对TI软件复位
MOV A,#00H;汉字数字前面必须加00H(双字节)
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
CLR TI;对TI软件复位
MOV A,@R1
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
INC R1
CJNE R1,#43H,USA1
;加一个度字符
CLR TI;对TI软件复位
MOV A,#5EH
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
CLR TI;对TI软件复位
MOV A,#0A6H
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待

MOV DPTR,#TAB6;温度过低预定值:
ACALL FS8;调用发送9个汉字的子程序

;发送温度过低预定值

MOV A,43H
CJNE A,#30H,BB12
MOV A,44H
CJNE A,#30H,BB22
MOV R1,#45H
AJMP USA2
BB22:MOV R1,#44H
AJMP USA2
BB12:MOV R1,#43H;如果百位和十位是0,就自动消隐

USA2:CLR TI;对TI软件复位
MOV A,#00H;汉字数字前面必须加00H(双字节)
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
CLR TI;对TI软件复位
MOV A,@R1
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
INC R1
CJNE R1,#46H,USA2

JB P3.5,CC1;判断超限报警是否允许?0为允许,1为禁止
MOV DPTR,#TAB7
AJMP CC2
CC1:MOV DPTR,#TAB8
CC2:ACALL FS8;调用发送9个汉字的子程序
;×××××××××××××××
CLR P1.6;点亮红色指示灯
SETB P1.7;确保绿色指示灯在熄灭状态

ACALL DELAY7;再延时7秒,确保短消息发送完毕

CLR P1.7;点亮绿色指示灯
SETB P1.6;确保红色指示灯在熄灭状态
SETB ES;允许串口中断
CLR TI;清除串口发送标志位
CLR RI;清除串口接收标志位
RET


;DS18B20复位初始化及判断是否检测到器件的程序
INIT_1820:
SETB P3.2
NOP
CLR P3.2
MOV R0,#06BH;主机发出延时537微秒的复位低脉冲
MOV R1,#03H
TSR1:
DJNZ R0,TSR1
MOV R0,#6BH
DJNZ R1,TSR1
SETB P3.2;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2:
JNB P3.2,TSR3;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3:
SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP TSR5
TSR4:
CLR FLAG1 ; 清标志位,表示DS1820不存在
LJMP TSR7
TSR5:
MOV R0,#06BH
TSR6:
DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7:
SETB P3.2
RET

;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:
MOV R2,#8;一共8位数据
CLR C
WR1:
CLR P3.2
MOV R3,#5
DJNZ R3,$
RRC A
MOV P3.2,C
MOV R3,#21
DJNZ R3,$
SETB P3.2
NOP
DJNZ R2,WR1
SETB P3.2
RET

; 读出转换后的温度值
GET_TEMPER:
LCALL INIT_1820;先复位DS18B20
JB FLAG1,TSS2
RET ; 判断DS1820是否存在?若DS18B20不存在则返回
TSS2:
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
LCALL DELAY100;延时750微秒以上,等待18B20 A/D转换结束
LCALL INIT_1820;准备读温度前先复位
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200; 将读出的温度数据保存到28H/29H
RET

; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOV R2,#8
RE01:
CLR C
SETB P3.2
NOP
NOP
CLR P3.2
NOP
NOP
NOP
SETB P3.2
MOV R3,#08
RE10:
DJNZ R3,RE10
MOV C,P3.2
MOV R3,#21
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET

;7秒延时子程序,占用R4、R5、R3(期间红灯闪光)
DELAY7:
SETB P1.7
MOV R3,#120
FRT:ACALL DELAY100
CPL P1.6
DJNZ R3,FRT
SETB P1.6
RET

;500毫秒延时子程序,占用R4、R5
DELAY500:MOV R4,#248
DA222:MOV R5,#248
DJNZ R5,$
DJNZ R4,DA222
RET

;发送COMSMSXX的子程序
FSDX:
ACALL COMSMS;调用发出COMSMS指令子程序
CLR TI;对TI软件复位
MOV A,28H
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
CLR TI;对TI软件复位
MOV A,29H
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
CLR TI;对TI软件复位
RET

COMSMS:
CLR TI;先对TI进行软件复位
MOV A,#43H;将ASCII码C发送到串口去
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
CLR TI;对TI软件复位
MOV A,#4FH;将ASCII码O发送到串口去
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
CLR TI;对TI软件复位
MOV A,#4DH;将ASCII码M发送到串口去
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
CLR TI;对TI软件复位
MOV A,#53H;将ASCII码S发送到串口去
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
CLR TI;对TI软件复位
MOV A,#4DH;将ASCII码M发送到串口去
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
CLR TI;对TI软件复位
MOV A,#53H;将ASCII码S发送到串口去
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
RET

;**********************************************
;进入串口中断方式接收;进入串口中断方式接收
UARTI:
CLR EA;禁止总中断
CLR RI;清楚串口中断标志

MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#5BH,EXITT;判断串口数据
CLR RI;软件清除串口中断标记
JNB RI,$;等待下一个串口数据 MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#9AH,EXITT;判断串口数据
CLR RI;软件清除串口中断标记
JNB RI,$;等待下一个串口数据

MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#50H,EXITT;判断串口数据
CLR RI;软件清除串口中断标记
JNB RI,$;等待下一个串口数据

MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#3CH,EXITT;判断串口数据
CLR RI;软件清除串口中断标记
JNB RI,$;等待下一个串口数据

MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#4FH,EXITT;判断串口数据
CLR RI;软件清除串口中断标记
JNB RI,$;等待下一个串口数据

MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#0EEH,EXITT;判断串口数据
CLR RI;软件清除串口中断标记
JNB RI,$;等待下一个串口数据

MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#65H,EXITT;判断串口数据
CLR RI;软件清除串口中断标记
JNB RI,$;等待下一个串口数据

MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#39H,EXITT;判断串口数据
CLR RI;软件清除串口中断标记

;检测到"定值修改"的4汉字内码的16进制代码--------

MOV R3,#12;定义接收数据的总长度
MOV R0,#30H;数据在内存的存放位置
ACALL TT;调用接收串口数据子程序

MOV 40H,31H;更新温度过高定值百位

MOV 41H,33H;更新温度过高定值十位

MOV 42H,35H;更新温度过高定值个位

MOV 43H,37H;更新温度过低定值百位

MOV 44H,39H;更新温度过低定值十位

MOV 45H,3BH;更新温度过低定值个位

ACALL DELAY7;延时7秒再发送短消息,否则会掉线
ACALL DELAY7;延时7秒再发送短消息,否则会掉线
ACALL DELAY7;延时7秒再发送短消息,否则会掉线

ACALL FSWWW;调用发送温度短消息的子程序,提醒客户定值已经更新!

EXITT:CLR RI;软件清除串口中断标记,退出串口中断
SETB EA
RETI

;调用接收串口数据子程序
TT:
CLR RI;软件清除串口中断标记
JNB RI,$;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
MOV @R0,A
INC R0;对内存单元地址加1
DJNZ R3,TT;判断是否已经收全数据?
RET

END

 
 

 OICQ:9276432