历史上的今天
返回首页

历史上的今天

今天是: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  //调用52单片机库

#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]);  

推荐阅读

史海拾趣

ABI Electronics公司的发展小趣事

ABI Electronics公司深知研发实力是企业发展的核心竞争力。因此,公司不断加大对研发的投入,引进了一批高素质的研发人才,建立了完善的研发体系。通过与高校、科研机构等合作,ABI不断吸收新的技术和知识,推动产品的升级换代,保持了在行业内的技术领先地位。

HP(Keysight)公司的发展小趣事

为了进一步拓展业务,ABI Electronics公司开始积极寻求全球市场的布局。通过与各地的电子分销商、代理商建立合作关系,ABI的产品逐渐进入了全球各地的市场。同时,ABI还积极参加各类国际电子展会,展示其最新技术和产品,与全球同行建立了广泛的联系和合作。

ETC公司的发展小趣事

在ETC领域,速通科技始终保持着技术创新的步伐。公司不断投入研发资源,致力于提高ETC系统的性能、稳定性和安全性。经过多年的努力,速通科技成功研发出了基于国标ETC的自由流收费技术,并获得了多项发明专利。这一技术的推出,大大提高了车辆的通行效率,减少了交通拥堵现象。

GREEGOO公司的发展小趣事
时钟信号线上尽量少打过孔,以避免信号衰减和反射。
Crystek公司的发展小趣事

为了进一步扩大市场份额和提升品牌影响力,Crystek公司积极拓展国际市场,与全球多家知名企业建立了合作关系。通过与这些企业的深入合作,Crystek公司的产品得以广泛应用于无线、微波无线电、电信、工业、企业、航空航天和政府部门等各个领域。同时,公司还积极参加国际电子展览和技术交流会议,与全球同行交流学习,不断提升自身的技术水平和市场竞争力。

Dover Corporation公司的发展小趣事

Dover Corporation的电梯业务始于1955年,当时Dover Elevator从Rotary Lift中分离出来,成为一家独立运营的公司。此后,公司通过一系列的收购,如谢泼德华纳电梯公司、Acme Elevator等,迅速扩大了其电梯业务。这些收购不仅使Dover成为美国第三大电梯公司,也为其在电梯行业中的持续领先地位奠定了基础。

问答坊 | AI 解惑

灌水,发一个平面螺旋天线的资料

欢迎搞天线的同行一起探讨,唉,一个巴掌拍不响啊…

查看全部问答>

超声波流量计原理

超声波在流动的流体中传播时就载上流体流速的信息。因此通过接收到的超声波就可以检测出流体的流速,从而换算成流量。根据检测的方式,可分为传播速度差法、多普勒法、波束偏移法、噪声法及相关法等不同类型的超声波流量计。起声波流量计是近十几年 ...…

查看全部问答>

在线等高手解答!关于ds18b20与液晶12864的问题

把下面的程序下到单片机后,除了能显示自定义的字符\"现在的温度为:\",就是在温度显示的位置显示“22”,无论怎么样弄18b20也无法改变数值,还请论坛的各位高手解答,调试了很多天了也没找出原因,很急!拜托各位帮忙,先谢谢了 #include #incl ...…

查看全部问答>

模拟电路设计流程--仿真工具的使用

一、仿真工具的选择 模拟电路的仿真软件并不多,现在常用的就是三家大的EDA公司的Hspice(Synopsys), Spectre(Cadence), Eldo(Mentor)。Eldo我没用过,不好说。Hspice和Spectre各有特点,Spetre图形界面好,使用容易上手,可视化更好;Hspice还是文 ...…

查看全部问答>

对于50Hz的干扰信号不一定用陷波器

对于50Hz的干扰信号不一定用陷波器, 对于50Hz的干扰不一定用陷波器因为在要求高时陷波器通常很难调试.   如果只是对信号处理用而言,信号频率在高端的话,比如300Hz以上,那最佳方法是作一个300Hz的高通滤波器,这样对50Hz的衰减可达100分 ...…

查看全部问答>

eeworld论坛这里怎么获得积分啊,我初学者,很多问题又都回答不了,拿不了分,但我的分又快用完了……

eeworld论坛这里怎么获得积分啊,我初学者,很多问题又都回答不了,拿不了分,但我的分又快用完了………

查看全部问答>

MSP430 FLASH 请教

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直接烧写软件MSPFET

需要将Launchpad的驱动软件拷贝到该软件所在文件夹,压缩包里已经有我在64位win7里的驱动,不知道在其它系统下行不行,如果不行,找到自己操作系统下的驱动拷贝替换。点击工具栏“SETUP”进行配置Erase Info不知道是否也擦除infoA,我没有试验,请 ...…

查看全部问答>

求教FPGA准确采集同步信号

请教各位大神: 我最近做FPGA采集100MHz的信号,另一路同步触发。但触发信号上升沿在40ns左右,最后导致信号波形左右晃动。 请问在FPGA中如何处理可以准确采集到触发信号,排除左右晃动的情况? 目前程序如下: //触发信号提取 always @(posed ...…

查看全部问答>

请高手帮忙分析电路图

请问图中C1的作用是什么 \0\0\0eeworldpostqq…

查看全部问答>