远程温度控制.docx
- 文档编号:4072660
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:28
- 大小:399.19KB
远程温度控制.docx
《远程温度控制.docx》由会员分享,可在线阅读,更多相关《远程温度控制.docx(28页珍藏版)》请在冰豆网上搜索。
远程温度控制
远程温度控制
技术报告
参赛队员:
黄雪峰
刘才勇
应佳行
摘要
本设计以单片机STC89C52为核心部件,采用单总线型数字式的温度传感器DS18B20作为温度采集,分别用1602和数码管作为显示部件,用1838红外传送数据。
该系统既可以对当前温度进行实时显示,又可以对温度进行无线发送与接收。
两位整数两位小数的显示方式具有更高的显示精度。
通过对系统软件和硬件的合理规划,发挥单片机自身集成多系统功能单元的优势,在不减少功能的前提下有效降低了成本,系统操作简便。
关键词:
STC89C52DS18B20红外传送
第一章系统硬件电路设计
1.1电路总体原理框图
温度测量,温度显示输出及加热系统控制的总体结构如图3-1所示。
体统主要包括现场温度采集、实时温度显示、系统运行时间显示、加热控制参数设置、加热电路控制输出、报警装置和系统核心STC89C52单片机作为微处理器。
图3-1恒温控制系统设计方案框图
温度采集电路以数字量形式将现场温度传至单片机。
单片机结合现场温度与功能要求设定的目标温度,按照PID控制算法进行实时控制量。
以此控制量控制继电器开通和关断,决定加热电路的工作状态,使水温逐步稳定于要求设定的目标值。
在水温到达设定的目标温度后,由于自然冷却而使其温度下降时,单片机通过采样回的温度与设置的目标温度比较,作出响应的控制,开启加热器。
系统运行过程中的各种状态均可由液晶显示器1602实时显示。
1.2单片机的选择
用STC89C52的单片机作为控制主机。
之所以选择89C52作为主机,是因为89C52作为51系列单片机的一种,其使用性能稳定,价格便宜,完全能够满足此次设计的需求。
而且89C52内部集成了程序存储器,可以装载用户程序,方便后续的课程设计需要,不像8031因为要外接程序存储器而是电路相对麻烦了。
其实物图如图3-2:
图3-2STC89C52实物图
1.3温度采集电路的设计
由于本设计是精确控制系统,并且有控制范围上的要求,所以在选择传感器上要着重考虑其精度和测试范围。
AD590和DS18B20都包含一个可以精确测量环境温度的片内温度传感器,但AD590是模拟传感器,需对温度模拟信号进行数字化处理,在调理和放大信号时,又会带来新的误差,影响精度,而DS18B20包含一个10位AD转换器,是一个以0.0625的分辨力将温度数字化的数字式温度传感器,并且其测温理论范围为-55度到125度,因其精确度高,范围可选这两大特点,故本设计的传感器选为DS18B20。
温度采集电路模块如图3-3所示。
DS18B20内部结构主要有四个部分组成:
1)64为光刻ROM;2)温度传感器;3)非易失性温度报警触发器TH和TL;4)配置寄存器。
其中DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端。
器件用如下方式从单线通讯线上汲取能量:
在信号线处于高电平期间把能量存储在内部电容里,在信号线处于低电平期间消耗电容上的电能工作,直到高电平到来再给寄生电源(电容)充电。
DS18B20也可以用外部5V电源供电。
图3-3温度采集电路
DS18B20中的温度传感器可完成对温度的测量,用12位存储温值度,用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位,负温度S=1,正温度S=0。
如下图3-4为18B20的温度存储方式:
图3-418B20的温度存储方式
这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测得的数值乘以0.0625即可得到实际温度。
例如:
0550H为+85℃,0191H为+25.0625℃,FC90H为-55℃。
1.4LCD显示接口电路的设计
显示电路采用字符型液晶显示模块,它是一种专门用于显示字母、数字、符号等点阵式的LCD,本设计采用的是SMC1602ALCM,其显示容量16×2个字符。
我们在经典电路上做了一点修改,就是没有在3号引脚上加一个电位器,直接接在5V电压上面,使液晶一直处于最大亮度,因为我们觉得调不调节亮度在这次设计中起的作用不大,所以就省掉了。
模块电路如下图3-6:
图3-6LCD显示接口电路的设计
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。
要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,图3-7是1602的内部显示地址。
图3-71602的内部显示地址
1.7红外发送与接收部分
1、编码原理
这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NEC为例说明编码原理。
NEC码产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器在设备,防止不同机种遥控码互相干扰。
后16位为8位功能码及其反码。
NEC数据帧格式:
当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms的高电平),一个结果码(4.5ms低电平),低8位地址码(9~18ms),高8位地址码(9~18ms),8位数据码(9~18ms)和这8位数据码的反码(9~18ms)组成。
数据串行发送,低位(bit0)在前,高位(bit7)在后。
如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms的高电平)和结束码(2.5ms低电平)组成。
在NEC编码格式中“0”,“1”的表示方法(脉宽调制)如下:
为了降低电源功耗,上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率。
注意:
代码格式应以接收代码为准(接收代码与发射代码反向)。
2.VS_1838红外一体化接收头的使用
红外线遥控信号的接收,可以使用一种集红外线接收和放大于一体的一体化红外线接收器,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,比如:
VS_1838b,体积和普通的塑封三极管大小一样。
接收器对外只有3个引脚:
Out、GND、Vcc与单片机接口非常方便。
型号:
VS1838B
1.特性
●小型设计;
●内置专用IC;
●宽角度及长距离接收;
●抗干扰能力强;
●能抵御环境光线干扰;
●低电压工作;
●工作电压Vcc2.7~5.5V
●接收距离L1820M
●载波频率f38kHz
●低电平输出VOLVin=0VVcc=5V0.20.4V
●高电平输出VOHVcc=5V4.5V
注意:
VS_1838b的初状态(空闲状态)Out引脚输出高电平。
VS_1838b输出电平格式如下:
VS_1838b与单片机的连接图:
1.8总电路的设计
发射部分
接收部分
图3-10总电路图的设计
参考文献
[1]李全利、迟荣强.单片机原理及接口技术.北京:
高等教育出版社,2004.1
[2]谭浩强.C程序设计(第二版).北京:
清华大学出版社,1999.12
[3]康华光.电子技术基础数字部分(第四版).北京:
高等教育出版社,1900.1
[4]黄智伟.全国大学生电子设计竞赛电路设计.北京:
北京航空航天大学出版社,2006.12
[5]黄智伟.全国大学生电子设计竞赛系统设计.北京:
北京航空航天大学出版社,2006.12
程序清单
//*****************************LCD部分****************************//
#include
#include"1602.h"
#include"delay.h"
sbite=P2^2;
sbitrw=P2^1;
sbitrs=P2^0;
ucharline1[]="WD:
00.00";
ucharline2[]="SD:
00";
voidwrite_com(ucharcom)//writethedata
{
e=0;
rs=0;
rw=0;
P1=com;
delay_50us(10);
e=1;
delay_50us(20);
e=0;
}
voidwrite_data(uchardat)//writetheorder
{
e=0;
rs=1;
rw=0;
P1=dat;
delay_50us(10);
e=1;
delay_50us(20);
e=0;
}
voidinit()//initiate
{
delay_1ms(15);
write_com(0x38);
delay_1ms(5);
write_com(0x38);
delay_1ms(5);
write_com(0x38);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
voiddisplay_init()//显示初始化函数
{
uintj;
init();
write_com(0x80);
for(j=0;j<16;j++)
{
write_data(line1[j]);//displaythefirstline
delay_50us
(1);
}
write_com(0xc0);
for(j=0;j<16;j++)
{
write_data(line2[j]);//displaythescendline
delay_50us
(1);
}
}
voidshow1(ucharadd,uchardat)//显示第一行在哪一位上的那一个字符
{//add是位地址偏移量
ucharshi,ge;//dat为要显示的数据
shi=dat/10;
ge=dat%10;
write_com(0x80+add);
write_data(0x30+shi);//此时只为数值
write_data(0x30+ge);
}
voidshow2(ucharadd,uchardat)//显示第二行在哪一位上的那一个字符
{//add是位地址偏移量
ucharshi,ge;//dat为要显示的数据
shi=dat/10;
ge=dat%10;
write_com(0xc0+add);//此时只为数值
write_data(0x30+shi);
write_data(0x30+ge);
}
//***************************DS18B20部分**************************//
#include
#include"DS18B20.h"
#include"delay.h"
#include"1602.h"
sbitDQ=P2^3;//definethebus
ucharT_int,T_dot;//整数部分与小数部分
floatt;//温度返回值
voidinit_DS18b20()//initds18b20
{
ucharn;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(8);
n=DQ;
delay(4);
while(!
DQ);
}
voidwrite_byte(uchardat)//writethebytetobus
{
uchari;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay(4);
DQ=1;
dat>>=1;
}
delay(4);
}
ucharread_byte()//readthebytefrombus
{
uchari,value;
for(i=0;i<8;i++)
{
DQ=0;
value>>=1;
DQ=1;
if(DQ)
value|=0x80;
delay(4);
}
returnvalue;
}
floatread_temperature(void)//readthetemperaturefromrom
{
ucharT_L,T_H,dot;
floattemp;
init_DS18b20();//初始化
write_byte(0xcc);//跳过ROM
write_byte(0x44);//开始记录温度
delay(300);//等待BS18b20读完
init_DS18b20();//初始化一次
write_byte(0xcc);//跳过ROM
write_byte(0xbe);//读取ROM
T_L=read_byte();
T_H=read_byte();
dot=T_L&0x0f;
T_H<<=4;
T_H+=((T_L&0xf0)>>4);
temp=T_H+dot*0.0625;
returntemp;
}
//**************************红外发送部分***************************//
#include
#include"ir_send.h"
bitirout;//红外管状态
sbitir=P2^7;//红外发射管控制脚
uintcount,set_count;//中断计数,设定中断次数
bitflag,keyflag;//红外发送标志,按键标志位
ucharircode,irdata1,irdata2;
/**********************************************
延时1ms
***********************************************/
//************************************************
//延时函数,在12MHZ情况下
//一次大约延时1ms
//************************************************
voiddelayn(uintt)
{
uintj;
for(;t>0;t--)
for(j=19;j>0;j--);
}
voidsend_data(uchara,ucharb)
{
irdata1=a;
irdata2=b;
}
/*******************************************
发送8位红外数据
*******************************************/
voidsendcode_8(void)
{
uchari;
for(i=0;i<8;i++)
{
set_count=43;//发送0.56ms38k红外波(编码中的0.56ms低电平)
flag=1;
count=0;
TR0=1;
while(count TR0=0; if(ircode&0x01)//判断红外编码最低位,1宽的高电平,0窄的高电平 { set_count=130;//1 } else { set_count=43;//0 } flag=0; count=0; TR0=1; while(count TR0=0; ircode=ircode>>1; } } /******************************************* 发送红外数据 *******************************************/ voidsendcode(void) { set_count=346;//发送4.5ms38K红外光 flag=1; count=0; TR0=1; while(count TR0=0; set_count=346;//间隔4.5ms flag=0; count=0; TR0=1; while(count TR0=0; ircode=irdata1;//发送8位数据码 sendcode_8(); ircode=irdata2;//发送8位数据反码 sendcode_8(); set_count=43;//发送0.56ms38k红外波(编码中的0.56ms低电平) flag=1; count=0; TR0=1; while(count TR0=0; ir=1; delayn(23);//延时23ms(编码中的23ms高电平) set_count=346;//发送4.5ms38k红外波 flag=1; count=0; TR0=1; while(count TR0=0; set_count=346;//间隔4.5ms flag=0; count=0; TR0=1; while(count TR0=0; set_count=43;//发送0.56ms38k红外波(编码中的0.56ms低电平) flag=1; count=0; TR0=1; while(count TR0=0; ir=1; } /******************************************* 定时器初始化 *******************************************/ voidinit_timer() { EA=1; TMOD=0X02;//8位自动重载模式 ET0=1; TH0=0Xf4;//定时13us,38K红外波,晶振11.0592 TL0=0Xf4; count=0; flag=0; irout=1; } /******************************************* 定时器中断 *******************************************/ voidtimer0(void)interrupt1 { count++; if(flag==1) { irout=~irout; } else { irout=1; } ir=irout; } //*************************发送主程序部分*************************// #include"1602.h" #include"DS18B20.H" #include"ir_send.h" #include"delay.h" voidmain() { floatt;//温度返回值 ucharT_int; ucharT_dot; ucharsd;//湿度 display_init(); init_timer(); while (1) { sd=78; t=read_temperature();//检测温度 T_int=(int)t;//取温度的整数部分 T_dot=(t-T_int)*100;//取温度的小数部分 show1(9,T_int);//小数点前两位 show1(12,T_dot);//小数点后两位 //show1(3,T_int);//小数点前两位 show2(9,sd); send_data(T_int,sd); sendcode(); } } //*************************数码管部分*************************// #include"smg.h" #include sbitdu=P2^0; sbitwe=P2^1; ucharcodesmg_du[17]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E, 0xbf}; ucharsmg_we[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //************************************************** //用指针的方法显示放在数组中的数 //************************************************** voiddisplay_table(uchar*p) { uchari; for(i=0;i<8;i++) { P1=0xff; we=1; we=0; P1=smg_du[*p++]; du=1; du=0; P1=smg_we[i]; we=1; we=0; delay_1ms (1); } } //*************************************** //直接输入要显示的数 //*************************************** /* voiddisplay(ucharnum0,ucharnum1,ucharnum2,ucharnum3,ucharnum4,ucharnum5,ucharnum6,ucharnum7) { P1=0xff; we=1; we=0; P1=smg_du[num0]; du=1; du=0; P1=smg_we[0]; we=1; we=0; delay_1ms (1); P1=0xff; we=1; we=0; P1=smg_du[num1]; du=1; du=0; P1=smg_we[1];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 远程 温度 控制