单片机毕业设计用单片机实现温度远程显示.docx
《单片机毕业设计用单片机实现温度远程显示.docx》由会员分享,可在线阅读,更多相关《单片机毕业设计用单片机实现温度远程显示.docx(47页珍藏版)》请在冰豆网上搜索。
单片机毕业设计用单片机实现温度远程显示
用单片机实现温度远程显示
摘要:
文章介绍了用AT89S8252单片机的串行接口与智能温度巡回检测仪(XJ-08S)通过RS—485总线相互通讯实现热水温度远程显示的一种低成本解决方案,内容涉及RS—485总线通讯、单片机驱动数码管显示、数据转换以及键盘处理软硬件设计等内容。
关键词:
单片机RS—485总线数码管显示数据转换键盘处理
一、前言
目前检测温度一般采用热电偶或热敏电阻作为传感器,这种传感器至仪表之间一般都要用专用的温度补偿导线,而温度补偿导线价格很贵,并且线路太长也会影响测量精度。
在实际应用中往往需要对较远处(1KM左右)的温度信号进行监视。
现有的解决方案有很多,例如:
1、在现场用智能仪表对温度信号进行测量,用计算机作上位机与智能仪表进行通讯来实现远程温度监测(采用这种方案要增加计算机设备及相关计算机软件)。
2、NCU+DDC实现远程温度监测。
用两个DDC,一个安装在现场测量温度,另一个安装在监视地,两个DDC通过NCU进行通讯从而实现远程温度监测。
但以上方案都存在成本高的问题,有没有低成本的解决方案呢?
其实,在单片机应用日益广泛的今天,完全可以用单片机以极低的成本来实现远程温度监测。
二、问题的提出
我单位管理的锅炉房同时给两栋建筑物内的两家酒店供应蒸汽,由安装在两栋建筑物地下室的热交换器进行热交换后产生热水送给客房。
从锅炉房至两个热交换站的距离分别约600米,值班人员要不停地奔波于两个热交换站与锅炉房之间进行设备巡视,检查热水温度是否控制在规定的范围,这样不仅增加了值班人员的劳动强度,同时也使锅炉房经常无人(因每班1人值班)。
如果能在锅炉房显示两个热交换站内各热交换器的热水温度,则值班人员仅在热水温度异常时才需到各热交换站检查设备,这样便可解决上述问题。
我公司曾就此问题找专业公司作过方案,其报价在人民币10万元左右,后因种种原因该项目未实施。
经过分析,本人发现可以用单片机+智能仪表以低成本实现温度远程显示,并且经过实验取得了成功,现将设计方案简述如下:
三、控制要求及解决方案选择
1、两个热交换站分高低区共安装有8个热交换器,正常水温在45oC至65oC之间;两个热交换站与锅炉房的距离分别为500米和600米左右。
2、要求在锅炉房能以巡回及定点两种方式显示8个热交换器的热水温度,巡回方式以3秒为周期轮流更新及显示各热交换器热水温度。
定点方式时每按上键或下键一次则显示上或下一个热交换器热水温度,每3秒自动更新数据一次。
3、根据控制要求选择单片机+智能仪表的解决方案:
用带通讯接口的智能仪表安装在现场测量温度,设计制作一个单片机装置完成与智能仪表的通讯及数据显示。
四、通讯协议、智能仪表选择及其参数介绍
因热水温度信号变化较慢,因而对通信的速度要求不高,对于这种低速率远距离的通讯选用RS-485总线适宜。
RS-485是EIA(美国电子工业联合会)在1983年公布的新的平衡传输标准,是工业界使用最为广泛的双向、平衡传输线标准接口,它以半双工方式通信,支持多点连接,传统驱动器允许创建多达32个节点的网络,且其具有传输距离远(最大传输距离为1200M),传输速度快(1200M时为100KBPS)等优点。
其连接方法如下图所示。
为了满足现场温度检测及与单片机装置通讯的要求,必须选择至少有5个温度检测点及具有RS—485通讯端口的智能仪表。
经过对市场上常用的温度检测仪进行分析,选择由重庆川仪十八厂生产的XJ-08S型巡回检测仪作现场测量仪表。
(一)该仪表主要特点如下:
1、多量程方式,热电偶、热电阻,1-5V标准信号混合输入,可通过键盘进行设置;
2、最多8个测量通道(能测量8个温度信号);
3、采用RS-485通讯标准,可将各通道最新数据向上位机传送。
重要的是,该仪表的说明书详细介绍了与该仪表进行数据交换的命令及格式,其通讯协议也相对较简单,这给我们用单片机实现温度远程显示降减低了难度(虽然有RS-485端口的仪表很多,但大多没有通讯命令的详细说明,给我们用单片机编程增加了难度)。
(二)XJ-08S巡回检测仪通讯协议
1、通讯口设置
●通讯方式:
RS-485标准电平
●同步方式:
起停同步方式
●波特率:
9600BPS
●通讯距离:
不大于1200M
●通讯线:
二线
●数据代码:
ASCII码
●数据格式:
每字符10位,1个起始位,8个数据位,1个停止位
2、数据传输格式
●地址:
2字节(高字节在前,低字节在后);
●数据:
按地址顺序,仪表数据传输格式为十六进制2字节定点数;
2字节定点数=低字节高4位(ASCII码)+低字节低4位(ASCII码)
高字节高4位(ASCII码)+高字节低4位(ASCII码)
若数据为负数,则采用补码方式传输;
●在传输实时测量值时,传输完2字节定点数后,紧接着又传输2字节定点数,其中高字节低4位为小数点位数。
例:
(50.0)10表示为4634303130303031
低字节高字节小数位数
3、仪表通讯格式:
@DE帧类型帧数据CRCCR
●@:
通讯起始符
●DE:
仪表设备号(地址)
●帧类型:
操作命令
●帧数据:
各种操作命令所对应的命令及数据
●CRC:
校验字节(除@外CRC之前的其他几个字节的异或值)
●CR:
结束符(回车符)
4、应用中用到的命令及数据格式:
●读仪表全部动态数据命令帧@DERDCRCCR
●命令回送帧正确@DERD帧数据CRCCR
错误@DE**CRCCR
例:
读28号仪表的全部动态数据
命令:
’@1CRD64’,0D(ASCII码403143524436340d)
错误返回码‘@1C**72’,0D(ASCII码4031432A2A37320D)
正确返回数据’@1CRDXXXXXXXXXXXXXXXXXXXXXXXX
第0通道第1通道第2通道
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
第3通道第4通道第5通道第6通道
XXXXXXXXXX’,0D
第7通道校验
五、单片机选择及硬件电路设计
1、选用ATMEL公司生产的AT89S8252-24PC单片机,其主要参数及特点如下:
●与MCS-51产品兼容(其引脚图见原理图)
●具有8K字节可擦写的FLASH内部程序存储器,可擦写1000次;2K字节EEPROM,可擦写100,000次,SPI口(用PC机的并口连接5条线即可通过SPI口下载程序,下载软件可从网上下载,这样可节省购买编程器的费用;)。
注:
笔者现已制作成了ISP2000三合一烧写器,详情见
●256字节RAM,32根可编程I/O线,可编程串行口,内置看门狗。
与看门狗有关的特殊功能寄存器WMCON地址=96H,与看门狗有关的控制位为96h第0、1、5、6、7位,第5、6、7位用于设置看门狗定时时间(具体见第5页表格),本应用中第5、6、7位均置1,设置看门狗溢出时间为2048ms,第0位为看门狗使能控制位,该位置1将使能看门狗,其第1位为复用位,向第1位写1将复位看门狗定时器,具体操作如下:
a,使能看门狗,并将其溢出时间设定为2048ms:
ORL96H,#0E1H;
b,看门狗定时器清0:
ORL96H,#2
2、按键设计:
为方便使用,设计了三个按键,分别为巡回/定点切换键、上键、下键。
切换键用于巡检与定点模式的切换,上键向上切换通道,下键向下切换通道;其中巡检/定点切换键通过外部中断1以中断方式工作,中断程序将巡回/定点标志取反后直接跳到主程序中巡回/定点标志判断程序前运行,由判断程序完成巡回/定点的切换。
按键信号由单片机P3.3,P3.4,P3.5引脚输入。
3、显示电路设计
为方便观察,选用三个二位共阳级8段数码显示管(TOD5201AE)动态显示,一位显示仪表地址(从A至F),一位显示通道号(从0至7通道),其余四位用来显示实时温度值;用单片机P1口驱动一片74HC244以吸收电流的方式控制段码,用单片机P0.0至P0.5引脚驱动六个PNP三极管(9012)控制位选。
4、电源选用5V/1A市售成品开关电源。
5、根据智能仪表通讯协议的要求,串行口定义为方式1工作,一帧10位:
1个起始位、8个数据位、一个停止位;用一片75176完成数据的发送与接收,由于RS-485为半双工,故用单片机P3.2引脚控制发送与接收的切换;两个智能仪表处于RS-485总线的两个端点,为提高可靠性,在RS-485总线的两个端点上分别并联一个120Ω、1/4W终端电阻。
●系统方框图如右示:
●单片机装置电原理图见下页:
六、单片机软件设计说明及程序流程图
为方便调试,采用模块化编程,共分1个主模块及5个子模块,各模块功能说明及流程图如下(源程序见附录):
1、主模块(rand_main.a51)
上电后程序显示初始化标志并等待3秒,然后进入巡回模式,自动检测地址为A(10)至F(15)的智能仪表,对在线的仪表及已使用通道以3秒为周期自动巡回读取实时温度并送数码管显示,仪表未在线或未用通道则自动跳过;定点模式时根据上、下按键情况自动向前或向后移动一个通道后等待下一次按键(向上至最高通道号时跳到上一个仪表的最低在用通道,向下至最低通道号时跳到下一个仪表的最高在用通道);等待期间以3秒为周期读取当前仪表当前通道实时温度并送数码管显示,另外,为了区分巡回、定点工作模式,定点工作模式时最低位数码管以约0.5Hz的频率闪烁显示。
当检测到巡回/定点切换键按下时自动在巡回及定点模式间转换,当检测到温度值低于-199.9度时显示-199.9度。
主模块流程图见下页:
2、数据转换子模块(rand_data.a51)
功能:
本模块先将ASCII码转换成BIN码,然后将BIN码转换成BCD码并将数据转换成可直接显示的格式
入口:
a=通道号
出口:
r1=个位,r2=十位,r3=百位,r4=千位(显示数据)
a=非0表示该通道未用
注:
本子模块中直接将小数点信息加到相应位数据上,如需在某位显示小数点,则将该位数据加10H,显示子模块根据此信息显示小数点。
各子程序功能介绍:
●bcd2_bcd1:
将r3,r4中的4位bcd码由低至高分别存入r1,r2,r3,r4中;
●ascii4_bcd3:
将(r0)为首地址的4字节ascii码转换成bcd码并将bcd码由低至高依次存放在r3,r4,r5中,r3,r4中各存放2位bcd码,r5中存放一位bcd码;
●bin_bcd:
将r1,r2中的bin码转换成bcd码并将bcd码由低至高依次存放在r3,r4,r5中,r3,r4中各存放2位bcd码,r5中存放一位bcd码;
●ascii4_bin2:
将(r0)为首地址的4字节ascii码转换成2位bin码存放在r1(低字节),r2(高字节)中;
注:
[(r0)指r0中内容]
●ascii_bin:
将(r0)为地址的一位ascii码转换成bin码存A中。
(高级子程序调用低级子程序以实现更强的功能,源程序中对各子程序有较详细的注释,故此处仅画出主流程图)
3、显示、软件看门狗、20ms定时器子程序(rand_disp.a51)
功能:
通过定时器0以1MS为周期动态显示缓冲区中的内容;同时完成20ms定时器及软件看门狗计数;当软件看门狗定时器溢出时自动复位。
入口:
以disp_buf为首地址依次存放从个位至十万位待显示数据,以disp_wc为首地址(位地址)依次存放个位至千位闪烁控制位信息,为'0'常亮,为'1'闪烁.
Disp_s:
闪烁控制计数器
Disp_s_c:
闪烁控制标志
Disp_c:
显示控制计数器
出口:
wdt中存放软件看门狗计数值,time_20ms中存放20ms的计数值。
Wdt溢出时跳至程序存储器0000H单元
●
将定时器0设定为模式1定时工作,每ms产生一次中断,即显示一位,每10ms6位数据轮流显示1ms;为进一步提高可靠性,在该模块中设计了软件看门狗,实现方法见源程序。
模块流程图如本页所示:
4、命令发送及接收控制子模块(rand_send.a51)
功能:
发送命令缓冲区中命令并等待接收完毕,然后检查接收到的数据,接收错误则重发命令,达到设定的次数仍错则存入错误码后退出.
入口:
A=仪表地址
出口:
A=0表示接收正确1表示校验错'*'表示命令错'N'表示无回应
模块流程图如下:
5、串行接收子模块(rand_rec.a51)
功能:
串行接收模块通过中断自动执行,程序检测到@时置ri_f标志并开始接收,检测到回车符时清ri_f后退出,接收到的数据存放在以rec_buf为首地址的缓冲区中。
串行中断(rand_rec.a51)流程图巡回/定点键中断(rand_key.a51)流程图
6、巡回/定点转换检测模块(rand_key.a51)
功能:
模块通过外部中断1自动执行,检测到巡回/定点按键后先延时去抖动,并等待按键释放后将巡回/定点标志位取反,然后自动跳至主模块中start处,并不返回原中断点。
模块流程图如见本页:
七、调测及运行情况介绍
1、调试步骤:
●硬件连接:
将各芯片插在面包板上并用导线按原理图连接
●软件开发环境:
KeiluVision2forWindows,该软件的模拟调试器支持C语言及汇编语言源代码调试,其汇编程序支持宏汇编及模块化编程,使用方便。
●首先在模拟调试器中调试各子模块,各子模块调试正常后再将各子模块及主模块全部汇编连接成目标文件,最后将目标代码下载到单片机中并连接智能仪表进行统调。
2、该系统软件部分除报警子模块外已全部开发完成并实际测试通过,测试时用一对长度约1100M的0.5mm2普通电话线作为单片机装置与两个智能仪表的通讯线,经过一个多星期的连续运行观察,运行可靠稳定,完全满足使用要求。
[注:
报警子模块的开发及硬件制版工作正在进行中。
]
八、结束语
用单片机+智能仪表构成的温度远程显示系统总造价约人民币7000元(两块智能仪表+温度传感器约3500元,通讯电缆约2000元,单片机装置及施工费用约1500元),与采用其它方案的系统比较造价较低,其硬件及软件的设计、制作都较简单,有一定的电子及单片机知识便可完成。
同时对该装置软件稍加修改即可与其他带有RS-485通讯端口的仪器仪表通讯(如变频器、电路传感器等),实现远程测量、监视及控制。
与发达国家相比,我国单片机应用的普及程度较低。
通过该实例说明,我们完全可以把我们学到的单片机知识应用到实际工作中,直接创造经济效益。
九、参考资料
<<单片机高级语言C51Windows环境编程与应用>>电子工业出版社
徐爱钧彭秀华编著
<>电子工业出版社
余永权主编
<<标准集成电路数据手册高速CMOS电路>>电子工业出版社
<>ATMEL公司
<>重庆川仪十八厂
<<工业控制计算机组成原理>>清华大学出版社
孙廷才王杰孙中健编著
<<电子技术>>2001年11期
十、附录(源程序)
1、主模块(rand_main.a51)
;------------1--------rand_main.a51----------------
namerand_main
EXTRNCODE(I_T0,send_order,rec_si,ascii_bcd,key)
extrndata(DISP_buf,disp_wc,time_20ms,wdt)
extrnidata(rec_buf)
publicTH0_H,TL0_L,START,ri_f,wdt_time,key_work,key_f
progSEGMENTCODE;定义代码段
byte_buffsegmentdata;定义字节数据段1
byte_buffIsegmentidata;定义字节数据段2
bit_buffsegmentdatabitaddressable;定义位数据段
bit_flagsegmentbit
stacksegmentidata;定义堆栈数据段
rsegstack;为堆栈保留20个字节
ds20
CSEGAT00H;定义绝对代码段
USING0;选择工作寄存器组第0组
lJMPrand;复位时程序执行执行点
CSEGAT03H;外部中断0
RETI
CSEGAT0BH;定时器0中断
lJMPI_T0
CSEGAT13H;外部中断1
ljmpkey
RETI
CSEGAT1BH;定时器1中断
RETI
CSEGAT23H;串行中断
ljmprec_si
RSEGBYTE_BUFF
td_temp:
ds1
TD_n:
DS1;通道号
YD_n100:
ds1;仪表地址
;----------------------------------
rsegbit_flag
key_work:
dbit1
ri_f:
dbit1;串行口正在接收标志
;----主程序
RSEGprog
;------------------------------符号定义
key_fequp3.3
key_upequp3.4
key_downequp3.5
wdt_timeequ100;软件看门狗定时器计数值
scon_cequ01010000b;串行口设置为10位UART,允许接收
th1_hequ0fdh;晶振为11.0592M,波特率为9600时初值
tmod_nequ21h;设置定时器(T1作为波特率发生器工作在模式2,T0为模式1)
ie_nequ82h;设置串行,定时器0中断
ip_nequ12h;设置串行,定时器0中断为高级中断
TH0_HEQU0FCH
TL0_LEQU06BH;设定定时器0为1MS中断初值
;------------------初始化代码
clear_wdtmacro;清硬看门狗宏定义
orl96h,#2
ENDM
rand:
ORL96H,#0E1H;启动硬件看门狗
movp0,#0ffh
movr0,#20h
mova,#0
start_300:
mov@r0,a
incr0
cjner0,#128,start_300
setbkey_work;置巡回/定点标志
movp3,#0ffh
movp2,#0ffh
movdisp_wc,#0;初始化闪烁控制位
movip,#ip_n;设置串行,定时器0中断为高级中断
movscon,#scon_c
MOVTMOD,#tmod_n
MOVTH0,#TH0_H;设定定时器初值
MOVTL0,#TL0_L
movth1,#th1_h
movtl1,#th1_h
movie,#ie_n
movpcon,#0
SETBtr1
SETBTR0
;-------显示初始化提示
acallchuhao
CLEAR_WDT
start:
clrea
movsp,#stack-1
setbea
clrri_f;清接收中标志
clrp3.2;置75176为接收状态
jnbkey_work,db_work
;-----------------------------------
setbex1
movyd_n100,#0ah
movtd_n,#0
s_0:
anldisp_wc,#0f0h
movwdt,#0;清看门狗定时器
clear_wdt
mova,yd_n100
lcallsend_order
JNZs_1
movdisp_buf+5,yd_n100
mova,td_n
lcallascii_bcd
jnzs_2
movdisp_buf+4,td_n
acallmov_to_disp
movwdt,#0
clear_wdt
mova,#75
adda,time_20ms
cjnea,time_20ms,$
movwdt,#0
clear_wdt
mova,#75
adda,time_20ms
cjnea,time_20ms,$
s_2:
inctd_n
mova,td_n
cjnea,#8,s_0
movtd_n,#0
s_1:
incyd_n100
MOVA,YD_N100
cjnea,#10h,s_0
movyd_n100,#0ah
ajmps_0
;-----------------------------
db_work:
setbex1
orldisp_wc,#01h
d_3:
movwdt,#0;清看门狗定时器
clear_wdt
jbkey_up,d_4
mova,#2
adda,time_20ms
cjnea,time_20ms,$
jbkey_up,d_4
d_5:
movwdt,#0
clear_wdt
jnbkey_up,d_5;等待向上键松开
;------------------------------------------------
d_53:
mova,td_n
cjnea,#7,d_50
movtd_n,#0
d_52:
incyd_n100
mova,yd_n100
cjnea,#10h,d_51
movyd_n100,#0ah
ajmpd_51
d_50:
inctd_n
d_51:
mova,yd_n100
lcallsend_order
JNZd_52
movdisp_buf+5,yd_n100
mova,td_n
lcallascii_bcd
jnzd_53
movdisp_buf+4,td_n
acallmov_to_disp
mova,#100;2秒钟定时设定
adda,time_20ms
ajmpd_3
;------------------------------------------------
d_4:
jbkey_down,d_10
mova,#2
adda,time_20ms
cjnea,time_20ms,$