基于RS485总线的无线遥控温控系统设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于RS-485总线的无线遥控
温控系统设计
系部:电气信息工程系
班级:应用电子技术0931
姓名:韩俊乾(主力)杨国喜张娜
指导老师:瓮嘉民
时间:2011年10月24日-11月4日
基于RS-485总线的无线遥控温控系统设计
1 设计要求
采用DS18B20数字温度传感器对两处进行温度的实时测量,通过LCD1602进行显示,并通过RS-485总线上传到主机;当温度超过设定值时能够报警,同时启动相关降温设备。

主机通过按键和无线遥控能够对温度报警上限值及时间进行设置。

能够对重要数据进行保存。

2 系统方案
根据设计要求,系统方案如图37-1所示,主机和从机选用AT89S52单片机,通过RS-485总线进行数据通信。

主机采用LCD2002显示各从机的温度和当前时间,根据按键或无线遥控的输入命令对控制温度上限值、温度报警值和时间进行设置,并通过RS-485总线传递温度报警值给从机和读取从机温度。

从机通过DS18B20采集现场温度,利用LCD1602进行显示,通过RS-485总线接收温度报警值,同时上传温度检测值给主机。

河南工程学院单片机课程设计
图37-1 系统方框图
3 硬件电路设计
3.1 主机硬件电路设计
主机硬件电路如图37-2所示。

主机实物如图37-3所示。

图37-2 主机硬件电路原理图
主机通过LCD2002液晶显示从机1和从机2实时采集的温度值、时间和日期。

采用DS1302实时时钟芯片进行年、月、日、时、分、秒刷新。

可以通过按键调整或者无线遥控调整时间,并具有系统掉电后启用备用电池向DS1302继续供电的功能,使用户不必每次上电调整时间。

AT24C02用于存储用户设定的温度上限值和其他重要数据。

当温度大于等于用户设定的上限值时,主机蜂鸣器报警。

当温度大于等于用户设定的上限值时,继电器吸合,控制电扇通风降温,同时继电器接通指示灯亮。

调整按键8个,其中S2、S3、S4和S5是手动按键,P32~P35用于连接无线接收模块,遥控器上的四个按键功能分别和S2、S3、S4、S5对应。

通过调整按键可以对温度上限值、时间、星期、年月日的调整状态。

3.2从机硬件电路设计
从机硬件电路如图37-3所示。

从机通过DS18B20进行温度采集,然后通过LCD1602进行显示,第一行显示主机发来的温度上限值,第二行显示从机1所在位置的温度值。

图37-3 从机硬件电路原理图
4 软件设计
4.1 RS-485总线通信协议
主机AT89S52采用查询方式,从机AT89S52采用中断方式,具体协议如下:(1)主机AT89S52发送查询地址。

(2)从机AT89S52都接收查询地址,并与本从机地址比较,若一样则发送从机地址、采集温度十位、采集温度个位、采集温度小数位和累加和校验。

(3)主机AT89S52接收数据。

(4)主机AT89S52发送温度上限报警值十位、温度上限报警值个位。

(5)从机AT89S52接收温度上限报警值命令。

(6)主机AT89S52未查询完所有的AT89S52,则返回(1)继续查询下一个从机。

(7)通信速率9600bps,数据帧格式:一位起始位,9位数据位,一位停止位,即串行口工作于方式3。

(8)主机发送从机地址和温度上限值采用奇校验(每帧数据的第8位(即D7)为奇校验位);主机接收从机发送的匹配地址和采集到的温度值时采用累加和校验。

(9)从机机接收主机发送的从机地址和温度上限值采用奇校验(每帧数据的第8位(即D7)为奇校验位);从机发送匹配地址和采集到的温度值时采用累加和校验。

4.2 主机程序设计
(1)主机主程序
主机主流程图如图37-4所示。

当工作状态标志为1时,进入参数调整;否则进入正常工作状态。

图37-4 主机主程序流程图
(2)液晶显示功能程序
图37-5 主机液晶显示界面
主机LCD2002液晶显示从机1和从机2实时采集的温度值、时间和日期。

如图37-5所示。

(3)DS1302实时时钟功能程序
采用DS1302实时时钟芯片进行年、月、日、时、分、秒刷新。

可以通过按键
调整或者无线遥控调整时间,并具有系统掉电后启用备用电池向DS1302继续供电的功能,使用户不必每次上电调整时间。

(4)A T24C02 掉电存储功能程序
用于存储用户设定的温度上限值。

(5)蜂鸣器报警功能程序
当温度大于等于用户设定的上限值时,主机蜂鸣器报警。

(6)继电器输出控制程序
当温度大于等于用户设定的上限值时,P20和P21输出低电平,通过三极管VT1和VT2驱动继电器吸合,控制电扇通风降温,同时继电器接通指示灯亮。

(7)按键键盘程序
图37-6 按键键盘布局
按键功能如图37-6所示,当set键按下后进入调整模式,此时主机液晶显示界面如图37-7。

图37-7 进入调整模式界面
当set键按下时进入调整模式,并且可以通过set键切换进入对温度上限值、时间、星期、年月日的调整状态。

当进入某种调整状态时其对应值会快速闪烁,通过up键或者down键进行调整。

调整完毕后按下out键保存并退出调整模式。

(8)无线遥控程序
通过无线遥控可远距离调整各个参数值,无线遥控的键盘界面如图37-8所示。

图37-8 无线遥控器键盘
无线遥控按键功能如下:
A :对应按键键盘上的down键(调整参数减少)。

B:对应按键键盘上的out键(保存退出)。

C: 对应按键键盘上的set键(进入参数调整模式)。

D: 对应按键键盘上的up键(调整参数增加)。

具体操作详见(6)按键键盘。

(9)主机通信程序
主机通信流程图如图37-9所示。

在数据发送时,采用奇校验校验;在接收数据时,使用累加和校验。

图37-9 主机通信流程图4.3 从机程序设计
(1)从机主程序设计
从机主程序流程图如图37-10所示。

首先进行系统初始化,然后关中断读取DS18B20中温度值,读完温度值后,开中断,调用温度决策函数。

图37-10从机主程序流程图
(2)从机通信程序设计
图37-11从机通信流程图(3)DS18B20测温程序设计
4.3 主机主程序
void main(void)
{ uchar i;
flag=1; //时钟停止标志
WDTA;//喂狗
LCD_Initial(); //液晶初始化
Initial_DS1302(); //时钟芯片初始化
up_flag=0; //增加键Up按下标志位清0
down_flag=0; //减少键Down按下标志位清0
done=0; //进入默认液晶显示
Relay1=1; //关闭继电器1输出,指示LED灭
Relay2=1; //关闭继电器2输出,指示LED灭
wireless_4=0;wireless_3=0;wireless_2=0;wireless_1=0; //仿真用
//wireless_4=1;wireless_3=1;wireless_2=1;wireless_1=1; //实物用
RdFromROM(TemperatureSetUp,0xfc,2);//从AT24C02中读出温度的上限值
init_232_11m(); //串行口和T0初始化
while(1)
{
while(done==1) keydone(); //进入时间调整模式
while(done==0)//进入正常工作模式
{ WDTA;//喂狗
show_temperature_time(); //调液晶显示温度和时间函数
flag=0;
WDTA;//喂狗
Setkey(); //扫描各功能键
for(i=0;i<2;i++){ TransRev(i); //调串行通信函数
}
if((temp_value[0][1]*10+temp_value[0][2])>= (TemperatureSetUp[0]*10 +TemperatureSetUp[1])) //从机1的温度大于温度上限值
{ beep(); // 蜂鸣器响1声报警
Relay1=0; //打开继电器1输出控制,指示LED亮
}
else {
BEEP=1; // 关闭蜂鸣器
Relay1=1; //关闭继电器1输出控制,指示LED灭
}
WDTA;//喂狗
if((temp_value[1][1]*10+temp_value[1][2])>= (TemperatureSetUp[0]*10 +TemperatureSetUp[1])) //从机2的温度大于温度上限值
{ beep(); beep(); // 蜂鸣器响2声报警
Relay2=0; //打开继电器2输出控制,指示LED亮
}
else {BEEP=1; // 关闭蜂鸣器
Relay2=1; //关闭继电器2输出控制,指示LED灭}}}}
4.4 从机部分源程序
/*从机主程序*/
void main(void)
{
uchar m;//温度临时变量
WDTRST = 0x1E; //喂狗
WDTRST = 0xE1;
init_232_11m();
LCD_Initial(); //液晶初始化
addr=0x01; //从机地址初始化
wenduH=99; //温度上限值
for(m=0;m<20;m++)
{
ReadTemp(); //读温度准备
TempL=ReadOneChar(); //先读的是温度值低位
WDTRST = 0x1E; //喂狗
WDTRST = 0xE1;
TempH=ReadOneChar(); //接着读的是温度值高位
WDTRST = 0x1E; //喂狗
WDTRST = 0xE1;
Temperature=TempH*16+TempL/16;
if( Temperature!=85 && Temperature!=0x00 )
{
TempN=TempH*16+TempL/16;
TempD=(TempL%16)*10/16;
}
}
while(1) //不断检测并显示温度
{
EA=0;
ReadTemp(); //读温度准备
WDTRST = 0x1E; //喂狗
WDTRST = 0xE1;
TempL=ReadOneChar(); //先读的是温度值低位
WDTRST = 0x1E; //喂狗
WDTRST = 0xE1;
TempH=ReadOneChar(); //接着读的是温度值高位
EA=1;
Temperature=TempH*16+TempL/16;
if(Temperature!=85 )
{
TempN=TempH*16+TempL/16;
TempD=(TempL%16)*10/16;
}
CurrentTempBuffer[7]=(TempN%100)/10+'0'; //十位
CurrentTempBuffer[8]=TempN%10+'0'; //个位
CurrentTempBuffer[10]=TempD+'0'; //小数位
WDTRST = 0x1E; //喂狗
WDTRST = 0xE1;
show_UpTemp_CurrentTemp();//显示温度报警上限值和当前温度
WDTRST = 0x1E; //喂狗
WDTRST = 0xE1;
if(TempN>wenduH) { beep();beep();beep();beep();// 蜂鸣器响4声
}
else { BEEP=1;//关闭蜂鸣器
} } }
/*从机通信程序*/
void int_232(void) interrupt INTERRUPT_UART using REG_BANK_1
{
uchar data ck,rec,rec1,tran;
_nop_();
if(RI==1)
{
RI=0;
rec=SBUF; //读接收地址数据
WDTRST = 0x1E; //喂狗
WDTRST = 0xE1;
ck=0;
if(((rec>>6) & 0x01)==1) {ck++;} //对接收到的地址数据进行奇校验
if(((rec>>5) & 0x01)==1) {ck++;}
if(((rec>>4) & 0x01)==1) {ck++;}
if(((rec>>3) & 0x01)==1) {ck++;}
if(((rec>>2) & 0x01)==1) {ck++;}
if(((rec>>1) & 0x01)==1) {ck++;}
if(((rec>>0) & 0x01)==1) {ck++;}
if(((rec>>7) & 0x01) != (ck & 0x01)){goto exit;} //接收到的数据的最高位//为奇校验位,即第七位,若不同则表示接收的地址错误,退出串行口中断//与本机地址进行比较
if( (rec & 0x1f) ==addr) //是本机地址?
{
TXEN; //发送使能,接收禁止
WDTRST = 0x1E; //喂狗
WDTRST = 0xE1;
flag =0x55;//读取温度期间发生串行口中断,本次温度读取舍弃标志ES=0; //关串行口中断
SM2=0;TI=0; //SM2=0,清发送中断标志
TB8=0; //准备发送数据的第九位数据
SBUF=addr; //发送本机地址
while(TI==0){ ;} //发送等待
WDTRST = 0x1E; //喂狗
WDTRST = 0xE1;
TI=0; //发送完本从机地址信号,清发送完中断标志位TI
//发送温度整数部分奇校验
ck=0;
tran=(TempN%100)/10; //取十位1;//
SBUF=tran; //发送温度整数部分的十位;
while(TI==0){ ;} //发送等待
WDTRST = 0x1E; //喂狗
WDTRST = 0xE1;
TI=0; //发送完本从机地址信号,清发送完中断标志位TI
ck=0;
tran=TempN%10; //取个位
SBUF=tran; //发送温度整数部分的个位
while(TI==0){ ;} //发送等待
WDTRST = 0x1E; //喂狗
WDTRST = 0xE1;
TI=0; //发送完本从机地址信号,清发送完中断标志位TI
//发送温度小数部分奇校验
ck=0;
tran=TempD; //取小数位
SBUF=tran; //发送温度整数部分的个位
while(TI==0){ ;} //发送等待
WDTRST = 0x1E; //喂狗
WDTRST = 0xE1;
TI=0; //发送完本从机地址信号,清发送完中断标志位TI
SBUF=addr+(TempN%100)/10+TempN%10+TempD; //发送累加和
while(TI==0){ ;} //发送等待
WDTRST = 0x1E; //喂狗
WDTRST = 0xE1;
TI=0; //发送完本从机地址信号,清发送完中断标志位TI RXEN; //禁止发送,接收使能
while(RI==0){;} //接收等待
WDTRST = 0x1E; //喂狗
WDTRST = 0xE1;
RI=0; //接收温度上限值的十位数据,清接收标志位,准备接收下一个字节rec=SBUF; //读接收的数据
while(RI==0){;} //接收等待
WDTRST = 0x1E; //喂狗
WDTRST = 0xE1;
RI=0; //接收温度上限值的十位数据,清接收标志位,准备接收下一个字节
rec1=SBUF; //读接收的数据
ck=0;
if(((rec>>6) & 0x01)==1) {ck++;}//奇校验
if(((rec>>5) & 0x01)==1) {ck++;}
if(((rec>>4) & 0x01)==1) {ck++;}
if(((rec>>3) & 0x01)==1) {ck++;}
if(((rec>>2) & 0x01)==1) {ck++;}
if(((rec>>1) & 0x01)==1) {ck++;}
if(((rec>>0) & 0x01)==1) {ck++;}
if(((rec>>7) & 0x01) != (ck & 0x01)) {goto exit;}
WDTRST = 0x1E; //喂狗
WDTRST = 0xE1;
ck=0;
if(((rec1>>6) & 0x01)==1) {ck++;}//奇校验
if(((rec1>>5) & 0x01)==1) {ck++;}
if(((rec1>>4) & 0x01)==1) {ck++;}
if(((rec1>>3) & 0x01)==1) {ck++;}
if(((rec1>>2) & 0x01)==1) {ck++;}
if(((rec1>>1) & 0x01)==1) {ck++;}
if(((rec1>>0) & 0x01)==1) {ck++;}
if(((rec1>>7) & 0x01) != (ck & 0x01)) {goto exit;}
//温度上限值通过奇校验,更新温度上限值
//wenduH=((rec & 0x0f)<<4 ) | (rec1 & 0x0f);
WDTRST = 0x1E; //喂狗
WDTRST = 0xE1;
UpTempBuffer[7]=(rec & 0x7f) +'0';//若校验正确更新温度报警上限显示缓冲区值UpTempBuffer[8]=(rec1 & 0x7f )+'0';
wenduH=(rec & 0x7f ) *10+ (rec1 & 0x7f); //更新温度的上限值}
}
exit: SM2=1;ES=1;//开串行口中断
RXEN; //发送禁止,接收使能
}
5 实物照片
主机和从机照片分别如图37-8和37-9所示。

以前用手拍摄,回来改成相机重新拍摄。

图37-8 主机实物照片
图37-9 从机实物照片6 元件清单
主机和从机元器件清单详见表37-1和表37-2。

表37-1 主机元件清单
名称参数数量
电阻1K、10K、10欧若干
电位器10K 2
发光二极管 3
电源接口 1
电解电容22uf 1
电解电容220uf 1
独石电容104 1
瓷片电容30pf 2
按键 5
自锁开关 1
晶振11.0592M 1
晶振32768 1
排针若干
1
AT89S52单
片机
SN65HVD3082
1
ED
DS1302 1
AT24C02 1
LCD1602 1
ISP口 1
三极管 1
二极管1N4007 3
排阻10K 1
继电器 2
蜂鸣器 1
表37-2 从机元件清单
名称参数数量电阻1K 4 电阻10K 2 电阻10欧 2 电位器10K 4 发光二极管 2 电阻 4.7K 2 电解电容22uf 2 电解电容220uf 2
独石电容104 2
瓷片电容30pf 4
按键 2
DS18B20 2
晶振11.0592M 2
排针若干
AT89S52单片机 2
SN65HVD3082ED 2
LCD2002 2
ISP口 2
三极管8550 2
排阻10K 1
蜂鸣器 2
7 Proteus仿真
8 设计制作要点
在设计制作中注意如下事项:
(1)单片机晶振频率建议选择11.0592MHz。

(2)通信芯片建议选择TI公司的SN65HVD3082ED,尽量不要选择MAX485(国产)。

(3)从机1和从机2的程序区别,仅在下面一条语句。

uchar addr=0x01; //本机地址注意从机2,只需将0x01修改为0x02即可
若果I/O有宽裕,可以采用地址自动识别,也就是说从机上电复位后,首先读取地址I/O口状态,从而确定自己的地址,这样所有从机的硬件和软件都一样。

具体实现方式参考文献[2]。

(4)本案例可以进行Proteus仿真,仿真时注意遥控部分I/O和实际硬件电路是不同的,还要注意仿真元件和实际硬件电路元件不完全一致。

(5)从机的DS18B20工作期间,要关闭所有中断。

(6)由于通信对时序有严格要求故必须按以下步骤操作,系统方可正常工作。

上电后先将从机1和从机2手动复位;将主机手动复位;按键操作按照按键键盘说明和无线遥控按键功能说明操作。

个人感受
注意:每人单独一页
河南工程学院单片机课程设计
参考文献
[1] 瓮嘉民等. 单片机应用开发技术-基于protes单片机仿真和C语言编程[M].北京:
中国电力出版社,2010.
[2] 瓮嘉民等. 编组常尾部停车器的上下位机串行通信设计[J],河南纺织高等专科学校学报,2006年第一期。

[3] 侯玉宝等编著.基于Proteus的51系列单片机设计与仿真[M].北京:电子工业出
版社,2008.
[4] 刘同法等编著.单片机外围接口电路与工程实践[M]. 北京:北京航空航天大学出版社,2009.
[5] 徐玮,沈建良编著.单片机快速入门[M].北京:北京航空航天大学出版社,2008.
[6] 王东锋等编著.单片机C语言应用100例[M].北京:电子工业出版社,2009.。

相关文档
最新文档