用单片机实现温度远程显示Word格式文档下载.docx
《用单片机实现温度远程显示Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《用单片机实现温度远程显示Word格式文档下载.docx(37页珍藏版)》请在冰豆网上搜索。
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口下载程序,下载软件可从网上下载,这样可节省购买编程器的费用;
)。
●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'
闪烁.
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普通电话线作为单片机装置与两个智能仪表的通讯线进行检验。
七、结束语
用单片机+智能仪表构成的温度远程显示系统较造价比较低,其硬件及软件的设计、制作都较简单,有一定的电子及单片机知识便可完成。
同时对该装置软件稍加修改即可与其他带有RS-485通讯端口的仪器仪表通讯(如变频器、电路传感器等),实现远程测量、监视及控制。
与发达国家相比,我国单片机应用的普及程度较低。
通过该实例说明,我们完全可以把我们学到的单片机知识应用到实际工作中,直接创造经济效益。
八、参考资料
《微型计算机原理与应用》西安电子科技大学出版社
王永山杨宏五杨婵娟编著
《单片机高级语言C51Windows环境编程与应用》电子工业出版社
徐爱钧彭秀华编著
《ATMEL89系列Flash单片机原理与应用》电子工业出版社
余永权主编
《标准集成电路数据手册高速CMOS电路》电子工业出版社
《ATMELAT89S8252数据手册》ATMEL公司
《XJ-08H(S)巡回检测仪使用说明书》重庆川仪十八厂
《工业控制计算机组成原理》清华大学出版社
孙廷才王杰孙中健编著
九、附录(源程序)
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
CSEGAT1BH;
定时器1中断
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;
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
mova,#75
adda,time_20ms
cjnea,time_20ms,$
s_2:
inctd_n
mova,td_n
cjnea,#8,s_0
s_1:
incyd_n100
MOVA,YD_N100
cjnea,#10h,s_0
ajmps_0
-----------------------------
db_work:
setbex1
orldisp_wc,#01h
d_3:
jbkey_up,d_4
mova,#2
d_5:
jnbkey_up,d_5;
等待向上键松开
------------------------------------------------
d_53:
cjnea,#7,d_50
d_52:
cjnea,#10h,d_51
ajmpd_51
d_50:
d_51:
JNZd_52
jnzd_53
mova,#100;
2秒钟定时设定
ajmpd_3
d_4:
jbkey_down,d_10
jbkey_down,d_3
d_6:
jnbkey_down,d_6;
等待向下键松开
-----------------------------------------------
d_43:
cjnea,#0,d_40
movtd_n,#7
d_42:
decyd_n100
cjnea,#9h,d_41
movyd_n100,#0fh
ajmpd_41
d_40:
dectd_n
d_41:
JNZd_42
jnzd_43
d_10:
cjnea,time_20ms,d_30
jnzd_30
m