单片机温度检测系统.docx

上传人:b****5 文档编号:29242032 上传时间:2023-07-21 格式:DOCX 页数:18 大小:564.99KB
下载 相关 举报
单片机温度检测系统.docx_第1页
第1页 / 共18页
单片机温度检测系统.docx_第2页
第2页 / 共18页
单片机温度检测系统.docx_第3页
第3页 / 共18页
单片机温度检测系统.docx_第4页
第4页 / 共18页
单片机温度检测系统.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

单片机温度检测系统.docx

《单片机温度检测系统.docx》由会员分享,可在线阅读,更多相关《单片机温度检测系统.docx(18页珍藏版)》请在冰豆网上搜索。

单片机温度检测系统.docx

单片机温度检测系统

单片机温度检测记录系统

一.设计要求

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();

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1