⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 温度短信息遥测系统的最新源程序.txt

📁 此程序用汇编语言写的
💻 TXT
📖 第 1 页 / 共 2 页
字号:

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -