温度控制.docx
- 文档编号:4055309
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:18
- 大小:20.57KB
温度控制.docx
《温度控制.docx》由会员分享,可在线阅读,更多相关《温度控制.docx(18页珍藏版)》请在冰豆网上搜索。
温度控制
温度报警器
中小
主要硬件构成:
显示部分1602液晶
温度采集部分DS18B20
报警部分蜂鸣器
单片机:
AT89S52
基本 功能:
可测温范围-55~+125摄氏度
超出安全温度范围报警
测温精度0.1摄氏度
可通过外部按键设定不同的报警温度
硬件连接原理图:
原理:
ds18b20传感器感应到外界温度,然后将温度值经过P27脚送进单片机处理。
温度值处理后再转换为数码管显示码再经P0口送到液晶显示显示。
如果当前温度大于设定的温度或者小于设定的温度,单片机输出一个信号驱动蜂鸣器发声。
按键s1、s2、s3可以设定最大温度最小温度值。
最终实现功能、现象:
开始工作,液晶第一行显示DS18B20OK第二行显示TEMP:
当前温度值按s3切换按键,界面切换到设定温度值界面,第一行显示最高温度值,第二行显示最低温度,此时并进入了设定最高温度的状态。
按s1按键可以可以增大最高温度值,按s2可以减小最高温度值。
再按s3切换按键就进入了设计最小温度状态,按s1增大最小温度,按s2减小最小温度。
设定的时候,最大温度不应低于最小温度,最小温度不能大于最大温度。
测量的当前温度如果超过所设的最大温度或者低于设定的最小温度,蜂鸣器就会报警。
该作品的可以用于不同的环境测温,并对当前的温度值进行控制。
在不同的温度环境的应用都是非常的方便,而且体积小,易于安装,例如可以在电机里面或者其他的用电器件里进行温度监测。
这个作品的检测精度高,可以用于对温度变化要求比较高的器件或者环境。
主要器件的介绍:
Ds18b20:
DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产生;多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
以上特点使DS18B20非常适用于远距离多点温度检测系统。
DS18B20主要由4部分组成:
64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的管脚,DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。
64位ROM的排的循环冗余校验码(CRC=X8+X5+X4+1)。
ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
1602液晶显示屏:
1602采用标准的16脚接口,其中:
第1脚:
VSS为地电源
第2脚:
VDD接5V正电源
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15~16脚:
空脚
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”
At89s52单片机:
at89s52单片机是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得at89s52单片机为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
at89s52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下
一个中断或硬件复位为止
附录:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P2^7;//定义DS18B20端口DQ
sbitBEEP=P3^5;//蜂鸣器驱动线
bitpresence;
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_EN=P2^2;
voidkey_s1(void);
voidkey_s2(void);
voidkey_s4(void);
chartemp1=0;
chartemp2=0;
chartemperature;
ucharstatus_flag;
charH=0,L=0;
unsignedintTH=0,TL=0;
ucharcodecdis1[]={"DS18B20OK"};
ucharcodecdis2[]={"TEMP:
.C"};
ucharcodecdis3[]={"H:
"};
ucharcodecdis4[]={"L:
"};
unsignedchardatatemp_data[2]={0x00,0x00};
unsignedchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};
unsignedchardatadisplay1[5]={0x00,0x00,0x00,0x00,0x00};
unsignedcharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
voidbeep();
unsignedcharcodemytab[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};
#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};
voidkey_s1(void)//按键1增大设定的最小最大温度值
{
P3=0xff;
if(P3==0xfb)
{switch(status_flag)
{case1:
temp1++;
if(temp1<0)TH--;if(temp1>127)temp1=0;break;
case2:
temp2++;
if(temp2<0)TL--;if(temp2>127)temp1=0;break;
default:
break;
}
}
}
voidkey_s2(void)//按键2减小设定的最大最小温度值
{P3=0xff;
if(P3==0xf7)
{switch(status_flag)
{case1:
temp1--;
if(temp1<0)TH++;if(temp1<-50)temp1=0;break;
case2:
temp2--;
if(temp2<0)TL++;if(temp2<-50)temp2=0;break;
default:
break;
}
}
}
voidkey_s4(void)//各种状态间的转换
{P3=0xff;
if(P3==0xef)status_flag++;
if(status_flag>2)status_flag=0;
}
voiddelay1(intms)//延时
{
unsignedchary;
while(ms--)
{
for(y=0;y<50;y++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
bitlcd_busy()//测试lcd忙碌状态
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&0x80);
LCD_EN=0;
return(result);
}
voidlcd_wcmd(ucharcmd)//写指令数据到lcd
{
while(lcd_busy());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P0=cmd;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
voidlcd_wdat(uchardat)//写显示数据到lcd
{
while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
voidlcd_init()//lcd初始化
{
delay1(15);
lcd_wcmd(0x01);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x0c);
delay1(5);
lcd_wcmd(0x06);
delay1(5);
lcd_wcmd(0x01);
delay1(5);
}
voidlcd_pos(ucharpos)//设定显示参数
{
lcd_wcmd(pos|0x80);
}
voidwritetab()//
{
unsignedchari;
lcd_wcmd(0x40);
for(i=0;i<8;i++)
lcd_wdat(mytab[i]);
}
voidDelay(unsignedintnum)//
{
while(--num);
}
Init_DS18B20(void)//
{
DQ=1;
Delay(8);
DQ=0;
Delay(90);
DQ=1;
Delay(8);
presence=DQ;
Delay(100);
DQ=1;
return(presence);
}
ReadOneChar(void)//
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
WriteOneChar(unsignedchardat)//
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delay(5);
DQ=1;
dat>>=1;
}
}
Read_Temperature(void)//
{
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
temp_data[0]=ReadOneChar();
temp_data[1]=ReadOneChar();
}
Disp_Temperature()//
{
temperature=temp_data[0]&0x0f;
display[0]=ditab[temperature]+0x30;
temperature=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
display[3]=temperature/100+0x30;
display[1]=temperature%100;
display[2]=display[1]/10+0x30;
display[1]=display[1]%10+0x30;
if(display[3]==0x30)
{
display[3]=0x20;
if(display[2]==0x30)
display[2]=0x20;
}
lcd_pos(0x48);
lcd_wdat(display[3]);
lcd_pos(0x49);
lcd_wdat(display[2]);
lcd_pos(0x4a);
lcd_wdat(display[1]);
lcd_pos(0x4c);
lcd_wdat(display[0]);
}
Disp_shezhi()//
{
display1[4]=H/100+0x30;
display1[3]=(H%100)/10+0x30;
display1[2]=(H%100)%10+0x30;
display1[1]=L/10+0x30;
display1[0]=L%10+0x30;
if(display1[4]==0x30)
{
display1[4]=0x20;
if(display1[3]==0x30)
display1[3]=0x20;
}
lcd_pos(3);
lcd_wdat(display1[4]);
lcd_pos(4);
lcd_wdat(display1[3]);
lcd_pos(5);
lcd_wdat(display1[2]);
if(display1[1]==0x30)
{
display1[1]=0x20;
}
lcd_pos(0x44);
lcd_wdat(display1[1]);
lcd_pos(0x45);
lcd_wdat(display1[0]);
}
voidshezhi1()//
{
display1[3]=TH/10+0x30;
display1[2]=TH%10+0x30;
display1[1]=L/10+0x30;
display1[0]=L%10+0x30;
if(display1[3]==0x30)
{
display1[3]=0x20;
}
lcd_pos(4);
lcd_wdat(display1[3]);
lcd_pos(5);
lcd_wdat(display1[2]);
lcd_pos
(2);
lcd_wdat(0x2d);
if(display1[1]==0x30)
{
display1[1]=0x20;}
lcd_pos(0x44);
lcd_wdat(display1[1]);
lcd_pos(0x45);
lcd_wdat(display1[0]);}
voidshezhi2()//
{display1[4]=H/100+0x30;
display1[3]=(H%100)/10+0x30;
display1[2]=(H%100)%10+0x30;
display1[1]=TL/10+0x30;
display1[0]=TL%10+0x30;
if(display1[4]==0x30)
{
display1[4]=0x20;
if(display1[3]==0x30)
display1[3]=0x20;
}
lcd_pos(3);
lcd_wdat(display1[4]);
lcd_pos(4);
lcd_wdat(display1[3]);
lcd_pos(5);
lcd_wdat(display1[2]);
if(display1[1]==0x30)
{
display1[1]=0x20;
}
lcd_pos(0x44);
lcd_wdat(display1[1]);
lcd_pos(0x45);
lcd_wdat(display1[0]);
lcd_pos(0x42);
lcd_wdat(0x2d);
}
voidshezhi3()//
{display1[3]=TH/10+0x30;
display1[2]=TH%10+0x30;
display1[1]=TL/10+0x30;
display1[0]=TL%10+0x30;
if(display1[3]==0x30)
{
display1[3]=0x20;
}
lcd_pos(4);
lcd_wdat(display1[3]);
lcd_pos(5);
lcd_wdat(display1[2]);
lcd_pos
(2);
lcd_wdat(0x2d);
if(display1[1]==0x30)
{
display1[1]=0x20;
}
lcd_pos(0x44);
lcd_wdat(display1[1]);
lcd_pos(0x45);
lcd_wdat(display1[0]);
lcd_pos(0x42);
lcd_wdat(0x2d);
}
voidbeep()//
{
unsignedchary;
for(y=0;y<100;y++)
{
Delay(60);
BEEP=!
BEEP;
}
Delay(40000);
}
voidOk_Menu()//
{
ucharm;
lcd_init();
lcd_pos(0);
m=0;
while(cdis1[m]!
='\0')
{
lcd_wdat(cdis1[m]);
m++;
}
lcd_pos(0x40);
m=0;
while(cdis2[m]!
='\0')
{
lcd_wdat(cdis2[m]);
m++;
}
writetab();
delay1(5);
lcd_pos(0x4d);
lcd_wdat(0x00);
}
voidshezhi_Menu1()//
{
ucharm;
lcd_init();
lcd_pos(0);
m=0;
while(cdis3[m]!
='\0')
{
lcd_wdat(cdis3[m]);
m++;
}
lcd_pos(0x40);
m=0;
while(cdis4[m]!
='\0')
{
lcd_wdat(cdis4[m]);
m++;
}
writetab();
delay1(5);
lcd_pos(6);
lcd_wdat(0x00);
lcd_pos(0x46);
lcd_wdat(0x00);
lcd_pos(0x08);
lcd_wdat(0x7f);delay1
(1);
lcd_wdat(0x20);
delay1
(1);
}
voidshezhi_Menu2()//
{
ucharm;
lcd_init();
lcd_pos(0);
m=0;
while(cdis3[m]!
='\0')
{
lcd_wdat(cdis3[m]);
m++;
}
lcd_pos(0x40);
m=0;
while(cdis4[m]!
='\0')
{
lcd_wdat(cdis4[m]);
m++;
}
writetab();
delay1(5);
lcd_pos(6);
lcd_wdat(0x00);
lcd_pos(0x46);
lcd_wdat(0x00);
lcd_pos(0x48);
lcd_wdat(0x7f);delay1
(1);
lcd_wdat(0x20);
delay1
(1);
}
voidmain()//主程序
{
while
(1)
{key_s4();delay1(100);
switch(status_flag)
{case1:
key_s1();H=temp1;delay1(100);
ke
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度 控制