单片机温度检测系统.docx
- 文档编号:29242032
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:18
- 大小:564.99KB
单片机温度检测系统.docx
《单片机温度检测系统.docx》由会员分享,可在线阅读,更多相关《单片机温度检测系统.docx(18页珍藏版)》请在冰豆网上搜索。
单片机温度检测系统
单片机温度检测记录系统
一.设计要求
1.LCD显示实时时钟
2.每30秒采样温度,LCD更新显示温度值
3.按键触发存储当前温度和时钟信息
4.按键触发串口传输存储温度和时钟信息
5.温度测量精度±1度
二.设计方案
1)系统框图
硬件总体框图
2)器件选择
单片机采用80C51
Lcd采用LM1602
外部时钟采用DS1302
数字温度传感器采用DS18B20
3)电路图
三.器件功能:
(1)时钟显示模块DS1302
1)Vcc1:
后备电源,VCC2:
主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
2)X1、X2:
振荡源,外接32.768kHz晶振。
3)RST:
复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
上电运行时,在Vcc>2.0V之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
4)I/O为串行数据输入输出端(双向)。
5)SCLK为时钟输入端。
(2)LM016L显示模块
引脚说明:
引脚
符号
功能说明
1
VSS
一般接地
2
VDD
接电源(+5V)
3
V0
液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
4
RS
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
5
R/W
R/W为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
6
E
E(或EN)端为使能(enable)端,下降沿使能。
7
DB0
底4位三态、双向数据总线0位(最低位)
8
DB1
底4位三态、双向数据总线1位
9
DB2
底4位三态、双向数据总线2位
10
DB3
底4位三态、双向数据总线3位
11
DB4
高4位三态、双向数据总线4位
12
DB5
高4位三态、双向数据总线5位
13
DB6
高4位三态、双向数据总线6位
14
DB7
高4位三态、双向数据总线7位(最高位)(也是busyflang)
寄存器选择控制表
RS
R/W
操作说明
0
0
写入指令寄存器(清除屏等)
0
1
都busyflag(DB7),以及读取位址计数器(DB0~DB6)值
1
0
写入数据寄存器(显示各字型等)
1
1
从数据寄存器读取数据
(3)数字温度传感器DS18B20
引脚定义:
(1)DQ为数字信号输入/输出端;
(2)GND为电源地;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
图2:
DS18B20内部结构图
DS18B20工作原理
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。
DS18B20测温原理如图3所示。
图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
图3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
DS18B20有4个主要的数据部件:
(1)光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。
64位光刻ROM的排列是:
开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。
光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
(2)DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:
用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。
表1:
DS18B20温度值格式
这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得实际温度。
例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。
(3)DS18B20温度传感器的存储器
DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。
(4)配置寄存器
该字节各位的意义如下:
表3:
配置寄存器结构
TMR1R011111
低五位一直都是"1",TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。
在DS18B20出厂时该位被设置为0,用户不要去改动。
R1和R0用来设置分辨率,如下表所示:
(DS18B20出厂时被设置为12位)
温度分辨率设置表
R1
R0
分辨率
温度最大转换时间
0
0
9位
93.75ms
0
1
10位
187.5ms
1
0
11位
375ms
1
1
12位
750ms
DS1302实时时钟送LM016L显示程序(结果不能显示,找不到原因)
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitrs=P2^0;//LM016L指令/数据寄存器(0/1)
sbite=P2^1;//LM016L使能控制端
sbitsclk=P3^6;//DS1302串行时钟,输入,控制数据的输入输出
sbitio=P3^7;//DS1302数据端
sbitrst=P3^5;//DS1302复位端
uinttemp;//定义整形温度数据
floatf_temp;
ucharcodenum[]="0123456789";
ucharcodenian[]="20--";
ucharcodeshi[]=":
:
";
ucharread_add[]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//DS1302读数据地址端
ucharwrite_add[]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//DS1302写数据地址端
uchartime_data[]={11,1,12,5,18,00,00};//设置初始时间
ucharcodetable[]={0x3e,0x7f,0x08,0x18,0x7e,0x5a,0xff,0x00};
uchardisp[14];//定义数组
/***************************************************/
voiddelayms(uintz)
{
uinti,j;
for(i=z;i>0;i--)
for(j=120;j>0;j--);
}
voiddelayus(uinttime)
{
while(time--);
}
/**************************************************************/
voidwrite_com(ucharcom)
{
rs=0;//选择指令寄存器
P0=com;//把命令写入P0
delayms(5);//延时,让1602准备接受数据
e=1;
delayms(5);
e=0;
}
voidwrite_data(uchardate)
{
rs=1;//选择数据寄存器
P0=date;//把要显示的数据送入P0口
delayms(5);//延时,使1602做好准备
e=1;//数据送入显示屏显示
delayms(5);
e=0;
}
/*****************************************************************/
voidinit()
{
ucharnum;
write_com(0x38);
write_com(0x06);
write_com(0x0c);
write_com(0x01);
write_com(0x80+0x40);//第二行地址
for(num=0;num<8;num++)
{
write_data(shi[num]);
delayms
(1);
}
write_com(0x80);//第一行地址
for(num=0;num<10;num++)
{
write_data(nian[num]);
delayms
(1);
}
}
/*********************************************************/
voidwrite_ds1302_byte(uchardat)
{
uchari;
for(i=0;i<8;i++)
{
io=dat&0x01;//输出最低位
sclk=1;
sclk=0;
dat=dat>>1;//dat右移一位
//0->1制造上升沿,写数据
}
}
voidwrite_ds1302(ucharadd,uchardat)
{
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add);
write_ds1302_byte(dat);
rst=0;
_nop_();
sclk=1;
}
ucharread_ds1302(ucharadd)
{
uchari,value;
rst=0;_nop_();
sclk=0;_nop_();
rst=1;_nop_();
write_ds1302_byte(add);
for(i=0;i<8;i++)
{
value=value>>1;
sclk=0;
if(io)value=value|0x80;
sclk=1;
_nop_();
}
rst=0;_nop_();
sclk=0;_nop_();
sclk=1;
_nop_();
io=0;
returnvalue;
}
voidread_rtc(void)
{
uinti;
for(i=0;i<7;i++)
{
time_data[i]=read_ds1302(read_add[i]);
}
}
voidz()
{
write_com(0x80+0x40+9);
switch(disp[2])
{
case1:
write_data('M');
delayms(5);
write_data('o');
delayms(5);
write_data('n');
break;
case2:
write_data('T');
delayms(5);
write_data('u');
delayms(5);
write_data('e');
break;
case3:
write_data('W');
delayms(5);
write_data('e');
delayms(5);
write_data('n');
break;
case4:
write_data('T');
delayms(5);
write_data('h');
delayms(5);
write_data('u');
break;
case5:
write_data('F');
delayms(5);
write_data('r');
delayms(5);
write_data('i');
break;
case6:
write_data('S');
delayms(5);
write_data('a');
delayms(5);
write_data('t');
break;
case7:
write_data('S');
delayms(5);
write_data('u');
delayms(5);
write_data('n');
break;
}
}
/**********************************************************/
voidtime_change(void)
{
disp[0]=time_data[0]%16;//年
disp[1]=time_data[0]/16;
disp[2]=time_data[1]%16;//周
disp[3]=time_data[1]/16;
disp[4]=time_data[2]%16;//月
disp[5]=time_data[2]/16;
disp[6]=time_data[3]%16;//日
disp[7]=time_data[3]/16;
disp[8]=time_data[4]%16;//时
disp[9]=time_data[4]/16;
disp[10]=time_data[5]%16;//分
disp[11]=time_data[5]/16;
disp[12]=time_data[6]%16;//秒
disp[13]=time_data[6]/16;
}
voiddisplay()
{
write_com(0x82);//年
write_data(0x30+disp[1]);
write_com(0x83);
write_data(0x30+disp[0]);
z();//周
write_com(0x85);//月
write_data(0x30+disp[5]);
write_com(0x86);
write_data(0x30+disp[4]);
write_com(0x88);//日
write_data(0x30+disp[7]);
write_com(0x89);
write_data(0x30+disp[6]);
write_com(0xc0);//时
write_data(0x30+disp[9]);
write_data(0xc1);
write_data(0x30+disp[8]);
write_com(0xc3);//分
write_data(0x30+disp[11]);
write_com(0xc4);
write_data(0x30+disp[10]);
write_com(0xc6);//秒
write_data(0x30+disp[13]);
write_com(0xc7);
write_data(0x30+disp[12]);
}
/**********************************************************************/
//////主程序///////
///////////////////////////////////////////////////////////
voidmain(void)
{
init();
Delay_2Us(200);
temp=Ds18b20_Read_Temperature();
Delay_50Us(1000);//空读一次,读出默认的85
while
(1)
{
gotoxy(20,1);
change();
LCD_display(tmp);
Delay_50Us(100);
write_com(0x80+14);
write_data('m');
delayms(100);
write_com(0x80+14);
write_data('');
write_com(0x80+14);
write_data('x');
delayms(100);
write_com(0x80+14);
write_data('');
write_com(0x80+14);
write_data('l');
delayms(100);
write_com(0x80+14);
write_data('');
read_rtc();
display();
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 温度 检测 系统
![提示](https://static.bdocx.com/images/bang_tan.gif)