历史上的今天
今天是:2024年12月19日(星期四)
2020年12月19日 | 基于RS-485总线的单片机温控系统程序
2020-12-19 来源:51hei
1. 采用DS18B20数字温度传感器对两处进行温度的实时测量,通过LCD1602进行显示,并通过RS-485总线上传到主机。
2. 当温度超过设定值时能够报警,同时启动相关降温设备。
3. 主机通过按键和无线遥控能够对温度报警上限值及时间进行设置。
4. 能够对重要数据进行保存。
二、设计方案
主机和从机选用STC89C52单片机,通过RS-485总线进行数据通信。主机采用LCD2002显示各从机的温度和当前时间,根据按键或无线遥控的输入命令对控制温度上限值、温度报警值和时间进行设置,并通过RS-485总线传递温度报警值给从机和读取从机温度。从机通过DS18B20采集现场温度,利用LCD1602进行显示,通过RS-485总线接收温度报警值,同时上传温度检测值给主机。
整个系统主要分3大块(主机、从机1和从机2)和十二个模块。(1)主机键盘部分,用来实现输入和设定温度等工作;(2)主机LCD1602显示电路;(3)主机单片机最小系统;(4)主机时钟电路;(5)主机存储电路;(6)主机继电器输出控制电路;(7)主机蜂鸣器报警电路;(8)主机RS-485通信部分;(9)从机RS-485通信部分;(10)从机单片机最小系统;(11)从机LCD1602显示部分;(12)从机温度检测电路。从机1和从机2硬件电路一样,都包括第9模块到第12模块。整个系统方案如图10-1所示。

图10-1 系统方案框图
三、硬件设计
系统原理图如图10-2和图10-3所示,对应仿真图如图10-4所示。

图10-2 主机电路原理图

图10-3 从机电路原理图

图10-4 整个系统仿真图
从图10-4仿真图可以看出从机1当前的温度值为42.0℃,从机2当前的温度为34.0℃,温度报警上限温度值为39.0℃,主机与从机显示温度一致,说明Proteus仿真是完全正确的。
1.主机键盘。调整按键8个,其中S2、S3、S4和S5是手动按键,分别为设置键、加键、减键、退出键。通过调整按键可以对温度上限值、时间、星期、年月日的调整状态。
2.主机LCD显示电路。主机通过LCD1602液晶显示从机1和从机2实时采集的温度值、时间和日期。
3. 主机单片机最小系统。主机单片机最小系统是电路的控制中心,主要包括单片机、时钟电路和复位电路。
4.主机时钟电路。
采用DS1302实时时钟芯片进行年、月、日、时、分、秒刷新。可以通过按键调整时间,并具有系统掉电后启用备用电池向DS1302继续供电的功能,使用户不必每次上电调整时间。
5.主机存储电路。AT24C02用于存储用户设定的温度上限值和其他重要数据。
6.主机继电器输出控制电路。当温度大于等于用户设定的上限值时,P20和P21输出低电平,通过三极管VT1和VT2驱动继电器吸合,控制电扇通风降温,同时继电器接通指示灯亮。
7.主机蜂鸣器报警电路。当温度大于等于用户设定的上限值时,主机蜂鸣器报警。
8.主机RS-485通信部分。RS-485通信芯片选用的是SN65HVD3082ED,收发使能端由主机P3.7进行控制,R2用于防止末端信号发射,J5和J6为通信接口。
9.从机RS-485通信部分。RS-485通信芯片选用的是SN65HVD3082ED,收发使能端由主机P3.7进行控制,R2用于防止末端信号发射,J2和J3为通信接口。
10. 从机单片机最小系统。主要包括单片机、时钟电路、复位电路、电源接口和LED指示、ISP下载。
11.从机LCD1602显示部分。第一行显示主机发来的温度上限值,第二行显示从机1所在位置的温度值和下限值。
12. 从机温度检测电路。通过DS18B20进行温度采集,数据端口DQ连接到单片机的P3.3。
四、软件设计
1. RS-485总线通信协议
主机STC89C52采用查询方式,从机STC89C52采用中断方式,具体协议如下:
(1)主机STC89C52发送查询地址。
(2)从机STC89C52都接收查询地址,并与本从机地址比较,若一样则发送从机地址、采集温度十位、采集温度个位、采集温度小数位和累加和校验。
(3)主机STC89C52接收数据。
(4)主机STC89C52发送温度上限报警值十位、温度上限报警值个位。
(5)从机STC89C52接收温度上限报警值命令。
(6)主机STC89C52未查询完所有的STC89C52,则返回(1)继续查询下一个从机。
(7)通信速率9600bps,数据帧格式:一位起始位,9位数据位,一位停止位,即串行口工作于方式3。
(8)主机发送从机地址和温度上限值采用奇校验(每帧数据的第8位(即D7)为奇校验位);主机接收从机发送的匹配地址和采集到的温度值时采用累加和校验。
(9)从机机接收主机发送的从机地址和温度上限值采用奇校验(每帧数据的第8位(即D7)为奇校验位);从机发送匹配地址和采集到的温度值时采用累加和校验。
2.主机程序设计
(1)主机主程序
主机主流程图如图10-5所示。当工作状态标志为1时,进入参数调整;否则进入正常工作状态。

图10-5主机主程序流程图
(2)液晶显示功能程序

图10-6 主机液晶显示界面
主机LCD1602液晶显示从机1和从机2实时采集的温度值、时间和日期。如图10-6所示。从机1温度为28.3℃,从机2温度为28.7℃,温度上限为30℃、下限为28℃,当前日期为5月16日17点47分。
(3)DS1302实时时钟功能程序
采用DS1302实时时钟芯片进行年、月、日、时、分、秒刷新。可以通过按键调整或者无线遥控调整时间,并具有系统掉电后启用备用电池向DS1302继续供电的功能,使用户不必每次上电调整时间。
(4)AT24C02 掉电存储功能程序。用于存储用户设定的温度上限值。
(5)蜂鸣器报警功能程序。当温度大于等于用户设定的上限值时,主机蜂鸣器报警。
(6)继电器输出控制程序。当温度大于等于用户设定的上限值时,P20和P21输出低电平,通过三极管VT1和VT2驱动继电器吸合,控制电扇通风降温,同时继电器接通指示灯亮。
(7) 按键键盘程序

图10-7 按键键盘布局
按键功能如图10-7所示,当set键按下时进入调整模式,并且可以通过set键切换进入对温度上限值、时间、星期、年月日的调整状态。当进入某种调整状态时其对应值会快速闪烁,通过up键或者down键进行调整。调整完毕后按下out键保存并退出调整模式。
(8)主机通信程序
主机通信流程图如图10-8所示。在数据发送时,采用奇校验校验;在接收数据时,使用累加和校验。

图10-8 主机通信流程图 图10-9从机通信流程图
3.从机程序设计
(1)从机通信程序设计。从机通信程序流程图如图10-9所示。
(2)从机主程序设计。从机主程序流程图如图10-10所示。首先进行系统初始化,然后关中断读取DS18B20中温度值,读完温度值后,开中断,调用温度决策函数。

图10-10从机主程序流程图
五、实物照片
系统实物照片如图10-11所示。

图10-11 实物照片
六、设计制作要点
1.STC89C52单片机多机通信实现的原理。 因多机通信是在方式2和方式3下进行,因此SM2位主要用于方式2和方式3。当串行口以方式2或方式3接收时,如SM2 =1,则只有当接收到的第9位数据(RB8)为“1”,才将接收到的前8位数据送入SBUF,并置位RI产生中断请求;否则,将接收到的前8位数据丢弃。而当SM2=0时,则不论第9位数据为“0”还是为“1”,都将前8位数据装入SBUF中,并产生中断请求。
2. 单片机晶振频率建议选择11.0592MHz。
3. 通信芯片建议选择TI公司的SN65HVD3082ED,尽量不要选择MAX485(国产)。
单片机源程序如下:
#include #include"1602.h" //调用LCD1602库 #include"ds18b20.h" //调用ds18b20温度传感器 #define uint unsigned int #define uchar unsigned char uchar hour,min,sec,count,hour1,hour2, //定义小时 分钟 秒 对应的十位个位 以及 count计数 sec1,sec2,min1,min2; sbit speaker=P2^1; //定义蜂鸣器 sbit key1=P1^0; //最低温度设置 sbit key2=P1^1; //最高温度设置 sbit key3=P1^2; //连接切换模式的备用开关 P33和P12口短接 用于切换模式和退出报警中断 sbit keyh=P1^5; //校时 sbit keym=P1^6; //校分 sbit keys=P1^7; //校秒 //定义时间按键 uint tem; //定义采集温度 int htem,htem2,time,time2,x,y,z,dot,dot2,maxtem,mintem; //定义温度十位数、个位数、小数,以及其三种模式的标记值 int cnt1=1,cnt2=1,cnt3=1,cnt4=1,cnt5=1,cnt6=1,cnt7=1; //定义计数变量 int i; uchar mode=0; //定义模式变量 uchar code t3[]={" H/L=0/1: C"}; //显示调最值温度的十位 uchar code t4[]={"O/D: C"}; //显示调最值温度的个位/小数位字模 uchar code table2[]={ '0','1','2','3','4','5','6','7','8','9',':'}; //显示时间的字模 uchar code t5[]={"Max . CD"}; //显示最高温度的字模 uchar code t6[]={"Min . CD"}; //显示最低温度的字模 //延时函数 void delay1(uint i) { while(i--); } //显示函数1 初始显示 void display(uint dat,uchar add) { uchar bai,shi ,ge; bai=dat/100; shi=dat%100/10; ge=dat%10; writelcd_cmd(add); writelcd_dat(bai+0x30); writelcd_dat(shi+0x30); writelcd_cmd(add+3); writelcd_dat(ge+0x30); } void lcd_min() //定义最小温度显示 { uchar l; writelcd_cmd(0x38); //初始化屏那迤粱 delay(5); writelcd_cmd(0x38); delay(5); writelcd_cmd(0x38); writelcd_cmd(0x08); writelcd_cmd(0x01); writelcd_cmd(0x06); writelcd_cmd(0x0c); writelcd_cmd(0x80); writelcd_cmd(0xc0); for(l=0;l<16;l++) //依次读取t6并显示 { writelcd_dat(t6[l]); } display(mintem,0xca); delay1(5000000000); //延时显示 } void lcd_max() //定义最大温度显示 { uchar k; writelcd_cmd(0x38); //初始化屏幕清屏 delay(5); writelcd_cmd(0x38); delay(5); writelcd_cmd(0x38); writelcd_cmd(0x08); writelcd_cmd(0x01); writelcd_cmd(0x06); writelcd_cmd(0x0c); writelcd_cmd(0x80); writelcd_cmd(0xc0); for(k=0;k<16;k++) //依次读取t5并显示 { writelcd_dat(t5[k]); } display(maxtem,0xca); delay1(5000000000); } void write_Char(unsigned char a,unsigned char b,unsigned char dat) //显示时间程序母程序 定位 { if (b == 0) { writelcd_cmd(0x80 + a); } else { writelcd_cmd(0xC0 + a); } writelcd_dat(dat); } void display4(uchar hour1,uchar hour2,uchar min1,uchar min2,uchar sec1,uchar sec2) //显示时间子程序 取值 { write_Char(4,0,table2[hour1]); //显示小时 write_Char(5,0,table2[hour2]);
史海拾趣
|
把下面的程序下到单片机后,除了能显示自定义的字符\"现在的温度为:\",就是在温度显示的位置显示“22”,无论怎么样弄18b20也无法改变数值,还请论坛的各位高手解答,调试了很多天了也没找出原因,很急!拜托各位帮忙,先谢谢了 #include #incl ...… 查看全部问答> |
|
一、仿真工具的选择 模拟电路的仿真软件并不多,现在常用的就是三家大的EDA公司的Hspice(Synopsys), Spectre(Cadence), Eldo(Mentor)。Eldo我没用过,不好说。Hspice和Spectre各有特点,Spetre图形界面好,使用容易上手,可视化更好;Hspice还是文 ...… 查看全部问答> |
|
对于50Hz的干扰信号不一定用陷波器, 对于50Hz的干扰不一定用陷波器因为在要求高时陷波器通常很难调试. 如果只是对信号处理用而言,信号频率在高端的话,比如300Hz以上,那最佳方法是作一个300Hz的高通滤波器,这样对50Hz的衰减可达100分 ...… 查看全部问答> |
|
eeworld论坛这里怎么获得积分啊,我初学者,很多问题又都回答不了,拿不了分,但我的分又快用完了…… eeworld论坛这里怎么获得积分啊,我初学者,很多问题又都回答不了,拿不了分,但我的分又快用完了……… 查看全部问答> |
|
IAR编译器以下显示是不是说 FLASH 程序占用8 884 bytes对吗?那也可以说是9K不到是吗? 8 884 bytes of CODE memory 788 bytes of CONST memory (+ 14 bytes shared) 357 bytes of DATA memory (+ 64 bytes shared)… 查看全部问答> |
|
需要将Launchpad的驱动软件拷贝到该软件所在文件夹,压缩包里已经有我在64位win7里的驱动,不知道在其它系统下行不行,如果不行,找到自己操作系统下的驱动拷贝替换。点击工具栏“SETUP”进行配置Erase Info不知道是否也擦除infoA,我没有试验,请 ...… 查看全部问答> |
|
请教各位大神: 我最近做FPGA采集100MHz的信号,另一路同步触发。但触发信号上升沿在40ns左右,最后导致信号波形左右晃动。 请问在FPGA中如何处理可以准确采集到触发信号,排除左右晃动的情况? 目前程序如下: //触发信号提取 always @(posed ...… 查看全部问答> |




