📄 温度短信息遥测系统的最新源程序.txt
字号:
;这是温度短信息遥测系统的最新源程序
;采用带串口数传功能的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,就自动消隐
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -