基于DS18B20的lcd1602的温度检测系统

合集下载

DS18B20与LCD1602的测温显示程序

DS18B20与LCD1602的测温显示程序
delay_15us(40); // 延时 480--960us
ds18B20_data = 1; // 拉高总线,延时 15us-60us 后等待ds18B20 响应
delay_15us(2); // 15us-60us
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
uchar Minus_Flag=0;
uchar code Temp_Disp_Title[]={"Current Temp : "};
uchar Current_Temp_Display_Buffer[]={"TEMP: "};
LCD_RS = 0;
LCD_RW = Байду номын сангаас;
LCD_EN = 0;
_nop_();
_nop_();
LCD_Data = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void Write_LCD_Data(uchar dat)
#define ds18B20_ALARM_SEARCH 0xEC // 报警搜索指令
#define ds18B20_WRITE_SCRATCHPAD 0x4E // 写暂存寄存器指令
#define ds18B20_READ_SCRATCHPAD 0xBE // 读暂存寄存器指令
{
while(LCD_Busy_Check());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;

基于DS18B20的lcd1602的温度检测系统

基于DS18B20的lcd1602的温度检测系统

1.1、来源在人类的生活环境中,温度扮演着极其重要的角色。

无论你生活在哪里,从事什么工作,无时无刻不在与温度打着交道。

温度无时无刻不在,同样也时时刻刻都在变化,为了让人们能更直观的看出此时此刻此地的实时温度,我就利用了单片机来完成这一功能。

1.2、意义温度的检测与控制在现代经济与社会中有举足轻重的地位,与我们的生活息息相关,密不可分,越发占有一席之地。

例如在储粮仓库、智能楼宇、空调控制及其他的工农业生产和科学研究中应用广泛。

在温度的检测与控制方面,DS18B20小型温度检测系统及其数字温度传感器有许多突出的优点,其通过单总线与单片机连接,系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度检测,因此对于我们来设计并研究基于DS18B20的温度检测系统有主要的现实意义,从一方面讲这不仅对于工农业的发展,更对于国防的巩固与建设起到重要的作用;另一方面,本设计能够在一定程度上提高自己的单片机开发能力。

1.3、目的(1)本实验要实现的是通过DS18B20温度传感器采集温度并在LCD上显示,并学会使用单片机控制DS18B20此类单总线器件,并对数字温度传感器DS18B0进行时序分析。

(2)更进一步了解LCD1602的应用。

(3)掌握单片机与PC的远程通信。

2、课题承担人员及分工说明*********:(1)主要负责电路板的制作、焊接与调试。

(2)电路的仿真。

(3)温度主要程序的编写与调试。

**********:(1)Protel画板,材料的收集。

(2)串口的调试与程序编写。

(3)VB界面的设计和上位机程序的编写。

二、课题总体设计说明1、说明总体开发计划和课题所达到的功能目标和技术指标1.1、总体开发计划1.1.1、基本功能(1)以数字传感器DS1820作为前端采集温度,经过单片机处理后,将外部的温度显示在液晶屏上。

(2)可用通过独立式按键来设定温度的上限值和下限值,当坏境温度超过上限值或低于下限值时蜂鸣器会自动报警,并在液晶屏上提示温度大于上限值或温度小于下限值。

DS18B20温度传感器LCD1602显示

DS18B20温度传感器LCD1602显示

DS18B20温度传感器LCD1602显示#include < reg51.h >#include < intrins.h >#define uchar unsigned char#define uint unsigned intsbit DQ = P3^3 ; //定义DS18B20端口DQbit presence ; //检测18b20是否插好sbit RS = P2^4 ;sbit RW = P2^5 ;sbit EN = P2^6 ;uchar code cdis1[ ] = {" The third group"} ;uchar code cdis2[ ] = {" TEMP: . C "} ;uchar code cdis3[ ] = {" DS18B20 ERR0R "} ;uchar code cdis4[ ] = {" PLEASE CHECK "} ;unsigned char data temp_data[2] = {0x00,0x00} ; //读出温度暂放unsigned char data display[5] = {0x00,0x00,0x00,0x00,0x00} ; //显示单元数据,共4个数据和一个运算暂用unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;unsigned char code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ; //自定义字符#define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;void delay1(int ms){unsigned char y ;while(ms--){for(y = 0 ; y<250 ; y++){_nop_() ;_nop_() ;_nop_() ;_nop_() ;}}}bit Lcd_BusyTest() //lcd_busy为1时,忙,等待。

读取DS18B20温度,通过LCD1602显示出来,并输出控制

读取DS18B20温度,通过LCD1602显示出来,并输出控制

读取DS18B20温度,通过LCD1602显示出来,并输出控制电路原理图程序1.main.c#include #include"lcd.h"#include"temp.h" void LcdDisplay(int); sbit K1=P2^0;sbit K2=P2^1;sbit K3=P2^2;sbit K4=P2^3; extern int th=20; extern int tl=-10; sbit beep=P1^0;void main(){LcdInit(); LcdWriteCom(0xc7); LcdWriteData('C'); while(1){if(K1==0){Delay1ms(500);if(K1==0);th++;}if(K2==0){Delay1ms(500);if(K2==0);th--;}if(K3==0){Delay1ms(500);if(K3==0);tl++;}if(K4==0){Delay1ms(500);if(K4==0);tl--;}LcdDisplay(Ds18b20ReadTemp());}}void LcdDisplay(int temp){int i,tt,rr,mm;unsigned char datas[] = {0, 0, 0, 0},datas1[] = {0, 0, 0},datas2[] = {0, 0, 0};float tp;if(temp< 0){LcdWriteCom(0xc0);LcdWriteData('-');i=1;temp=temp-1;temp=~temp;tp=temp;temp=tp*0.0625*10+0.5;mm=-temp;}else{LcdWriteCom(0xc0);LcdWriteData('+');tp=temp;temp=tp*0.0625*10+0.5;mm=temp;}datas[0] = temp / 1000; datas[1] = temp % 1000 / 100; datas[2] = temp % 100 / 10; datas[3] = temp% 10;if(th < 0){LcdWriteCom(0x89);LcdWriteData('-');tt=-th;}else{LcdWriteCom(0x89);LcdWriteData('+');tt=th;}datas1[0] = tt / 100;datas1[1] = tt% 100 / 10; datas1[2] = tt % 10; LcdWriteCom(0x87); LcdWriteData('H'); LcdWriteCom(0x88); LcdWriteData(':'); LcdWriteCom(0x8a); LcdWriteData('0'+datas1[0]); LcdWriteCom(0x8b); LcdWriteData('0'+datas1[1]); LcdWriteCom(0x8c); LcdWriteData('0'+datas1[2]);if(tl < 0){LcdWriteCom(0x90);LcdWriteData('-');rr=-tl;}else{LcdWriteCom(0x90);LcdWriteData('+');rr=tl;}datas2[0] = rr / 100;datas2[1] = rr% 100 / 10; datas2[2] = rr % 10; LcdWriteCom(0x8e); LcdWriteData('L'); LcdWriteCom(0x8f); LcdWriteData(':'); LcdWriteCom(0x91); LcdWriteData('0'+datas2[0]); LcdWriteCom(0x92);LcdWriteData('0'+datas2[1]); LcdWriteCom(0x93); LcdWriteData('0'+datas2[2]);if(mm>=(th*10)||mm<=(tl*10)||th<=tl) beep=0;elsebeep=1;LcdWriteCom(0x80); LcdWriteData('T');LcdWriteCom(0x81); LcdWriteData('A');LcdWriteCom(0x82); LcdWriteData('I');LcdWriteData(' ');LcdWriteCom(0x84); LcdWriteData('A');LcdWriteCom(0x85); LcdWriteData('N');LcdWriteCom(0xc1); LcdWriteData('0'+datas[0]); LcdWriteCom(0xc2); LcdWriteData('0'+datas[1]);LcdWriteCom(0xc3);LcdWriteData('0'+datas[2]);LcdWriteCom(0xc4);LcdWriteData('.');LcdWriteCom(0xc5);LcdWriteData('0'+datas[3]);LcdWriteCom(0xc6);LcdWriteData('"');}2.lcd.h#ifndef __LCD_H_/********************************** 当使用的是4位数据传输的时候定义,使用8位取消这个定义**********************************/ #define LCD1602_4PINS /********************************** 包含头文件#include//---重定义关键词---//#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endif/********************************** PIN口定义**********************************/ #define LCD1602_DATAPINS P0sbit LCD1602_E=P2^7;sbit LCD1602_RW=P2^5;sbit LCD1602_RS=P2^6;/********************************** 函数声明/*在51单片机12MHZ时钟下的延时函数*/ void Lcd1602_Delay1ms(uint c); //误差0us /*LCD1602写入8位命令子函数*/void LcdWriteCom(uchar com);/*LCD1602写入8位数据子函数*/void LcdWriteData(uchar dat) ;/*LCD1602初始化子程序*/void LcdInit();#endif3.temp.h#define __TEMP_H_#includesbit DSPORT=P3^7;void Delay1ms(unsigned int );unsigned char Ds18b20Init();void Ds18b20WriteByte(unsigned char com); unsigned char Ds18b20ReadByte();void Ds18b20ChangTemp();void Ds18b20ReadTempCom();int Ds18b20ReadT emp();#endif4.lcd.c#include"lcd.h"void Lcd1602_Delay1ms(uint c) //延时{uchar a,b;for (; c>0; c--){for (b=19;b>0;b--){for(a=1;a>0;a--);}}}#ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时void LcdWriteCom(uchar com) //写入一个字节命令{LCD1602_E = 0;LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_DATAPINS = com;Lcd1602_Delay1ms(1);LCD1602_E = 1;Lcd1602_Delay1ms(5);LCD1602_E = 0;}#elsevoid LcdWriteCom(uchar com){LCD1602_E = 0;LCD1602_RW = 0;LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1;Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = com << 4; //发送低四位Lcd1602_Delay1ms(1);LCD1602_E = 1;Lcd1602_Delay1ms(5);LCD1602_E = 0;}#endif#ifndef LCD1602_4PINSvoid LcdWriteData(uchar dat) //写入一个字节数据{LCD1602_E = 0;LCD1602_RS = 1;LCD1602_DATAPINS = dat;Lcd1602_Delay1ms(1);LCD1602_E = 1;Lcd1602_Delay1ms(5);LCD1602_E = 0;}#elsevoid LcdWriteData(uchar dat){LCD1602_E = 0;LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = dat << 4; //写入低四位Lcd1602_Delay1ms(1);LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;}#endif#ifndef LCD1602_4PINSvoid LcdInit() //LCD初始化子程序{LcdWriteCom(0x38);LcdWriteCom(0x0c);LcdWriteCom(0x06);LcdWriteCom(0x01);LcdWriteCom(0x80);}#elsevoid LcdInit(){LcdWriteCom(0x32); LcdWriteCom(0x28); LcdWriteCom(0x0c); LcdWriteCom(0x06); LcdWriteCom(0x01); LcdWriteCom(0x80);}#endif5.temp.c#include"temp.h"void Delay1ms(unsigned int y) //延时{ unsigned int x;for(y;y>0;y--)for(x=110;x>0;x--);}unsigned char Ds18b20Init() //初始化{ unsigned int i;DSPORT=0;i=70;while(i--);DSPORT=1;i=0;while(DSPORT){i++;if(i>5000)return 0;//失败}return 1;//成功}void Ds18b20WriteByte(unsigned char dat) //写字节{unsigned int i,j;for(j=0;j<8;j++){DSPORT=0; //每写入一位数据之前先把总线拉低1us (数据手册上模糊)i++;DSPORT=dat&0x01;i=6;while(i--);DSPORT=1;dat>>=1;}}unsigned char Ds18b20ReadByte(){unsigned char byte,bi;unsigned int i,j;for(j=8;j>0;j--){DSPORT=0;i++;DSPORT=1;i++;i++;bi=DSPORT;byte=(byte>>1)|(bi<<7);i=4;while(i--);}return byte;}void Ds18b20ChangTemp() //温度转换{Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);Ds18b20WriteByte(0x44);}void Ds18b20ReadTempCom() //读取温度命令{ Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);Ds18b20WriteByte(0xbe);}int Ds18b20ReadT emp() //读取温度{int temp=0;unsigned char tmh,tml;Ds18b20ChangT emp();Ds18b20ReadTempCom();tml=Ds18b20ReadByte();tmh=Ds18b20ReadByte();temp=tmh;temp<<=8;temp|=tml;。

用1602LCD与DS18B20设计的温度报警器课程设计

用1602LCD与DS18B20设计的温度报警器课程设计

程设计温度报警器共11页,2759字。

目录设计题目 (3)设计目的 (3)设计任务和要求 (3)设计内容 (3)心得体会 (10)参考文献 (10)一、设计题目:温度报警器二、设计目的:1.了解温度传感器AD590的基本原理、性能与应用。

2.熟悉单片机AT89C51工作方式和应用。

3.掌握ADC0809的接口方法及其输入程序的设计和调试方法。

4.将所学的单片机原理及检测技术的知识运用于实践,解决实际问题。

三、设计任务和要求:本设计采用集成温度传感器AD590,设计一个数字显示的温度报警器。

定安全温度值范围为77°C~100°C(可根据具体需要在程序中进行调整),对在这一范围内的温度变化采集后送入A/D转换器,A/D转换器的模拟电压范围为0~5V。

例如传感器采集的温度为80°C,则对应数码管显示值为80°C。

而温度高出100°C或者低于77°C时,不在安全温度范围之内,喇叭会进行报警、二极管发光显示。

ISIS SCHEMATIC DESCRIPTION FORMAT 6.1=====================================设计的温度报警器\22 用1602LCD与DS18B20设计的温度报警器\用1602LCD与DS18B20设计的温度报警器.DSNDoc. no.: <NONE>Revision: <NONE>Author: <NONE>Created: 08/06/19Modified: 09/03/11*PROPERTIES,0*MODELDEFS,0*PARTLIST,18C1,CAP,22PF,EID=2,PACKAGE=CAP10,PINSWAP="1,2"C2,CAP,22PF,EID=3,PACKAGE=CAP10,PINSWAP="1,2"C3,CAP-ELEC,10uF,EID=4,PACKAGE=ELEC-RAD10D1,LED-YELLOW,高温闪烁,BV=4V,EID=45,IMAX=10mA,ROFF=100k,RS=3,TLITMIN=0.1m,VF=2VD2,LED-YELLOW,低温闪烁,BV=4V,EID=47,IMAX=10mA,ROFF=100k,RS=3,TLITMIN=0.1m,VF=2VK1,BUTTON,正常显示温度,EID=3D,PACKAGE=NULL,R(0)=100M,R(1)=100m,STATE=0,TSWITCH=1mK2,BUTTON,显示报警温度,EID=3C,PACKAGE=NULL,R(0)=100M,R(1)=100m,STA TE=0,TSWITCH=1mK3,BUTTON,显示ROM编码,EID=49,PACKAGE=NULL,R(0)=100M,R(1)=100m,STA TE=0,TSWITCH=1mLCD1,LM016L,LM016L,CLOCK=250kHz,EID=7,MODDLL=LCDALPHA,NUMCOLS=16,NU MROWS=2,PACKAGE=CONN-DIL14,ROW1=80-8F,ROW2=C0-CFLS1,SOUNDER,SOUNDER,BUFFERTIME=500ms,EID=40,MODE=CONTINUOUS,SAMPLE RA TE=44100R1,RES,10k,EID=6,PACKAGE=RES40,PINSWAP="1,2",PRIMTYPE=RESISTORR2,RES,4.7k,EID=43,PACKAGE=RES40,PINSW AP="1,2",PRIMTYPE=RESISTORR3,RES,220,EID=46,PACKAGE=RES40,PINSW AP="1,2",PRIMTYPE=RESISTORR4,RES,220,EID=48,PACKAGE=RES40,PINSW AP="1,2",PRIMTYPE=RESISTORRP1,RESPACK-8,RESPACK-8,EID=24,MODTYPE=DIGITAL,PACKAGE=RESPACK-8U1,AT89C51,AT89C51,CLOCK=12MHz,DBG_FETCH=0,DBG_TRACE=0,EEPROM=0,EID=1 ,HWDOG=0,IRAM=256,ITFMOD=A T89,MODDLL=MCS8051.DLL,PACKAGE=DIL40,PROG RAM="Keil C\用1602LCD与DS18B20设计的温度报警器.hex",ROM=4096,X2=0,XRAM=0 U2,DS18B20,DS18B20,ASN=0,EID=44,FC=28,FORMAT=3.1,ITFMOD=DS1822,MAX=128,M IN=-55,PACKAGE=TO92,SETPOINT=-15.5,SN=B8C530,STA TE=0,STEP=1,TCONV=750ms,T D_WRITE=10ms,TPDH=30u,TPDL=120u,TRACE=1,TRSTL=480u,TSLOT=120uX1,CRYSTAL,12M,EID=5,FREQ=12MHz,PACKAGE=XTAL18220v交流电转5v直流电的电源设计(电路图+详解)一.电路实现功能:电路输入家用220v交流电,经过全桥整流,稳压后输出稳定的5v直流电。

DS18b20传感器利用1602显示温度电路图

DS18b20传感器利用1602显示温度电路图

DS18b20传感器利用1602显示温度电路图(附代码)*重要注:图中没有画出单片机最小系统,另外在实际焊接中1602 的1,2,3,15,16引脚要按下图焊接,其他引脚看上图,另外要加排阻;其次ds18b20焊接时要注意引脚,不要焊反。

下面说明书中给出的是bottom view,分清引脚后18b20直接按上图焊即可。

Ds18b20说明书:代码:#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit rs=P3^5;sbit wr=P3^6;sbit lcden=P3^4;uint temp;bit flag;uchar code table1[]="temperature is:"; void delay(uchar x)//延时函数_ms{uchar a,b;for(a=x;a>0;a--)for(b=120;b>0;b--);}/* 18b20 */void delayus(uint t)//延时函数_us{while(t--);}void z_reset()//单总线复位{ds=1;delayus(5);ds=0;delayus(80);ds=1;delayus(14);if(ds==0)flag=1;elseflag=0;delayus(20);}bit z_bit_read()//总线读一位{bit dat;ds=0;_nop_();_nop_();ds=1;_nop_();dat=ds;delayus(10);return dat;}uchar ds_read_byte()//18b20读一字节{uchar i,k,j;for(i=0;i<8;i++){j=z_bit_read();k=(k>>1)|(j<<7);}return k;}void ds_write_byte(uchar dat)//18b20写一字节{uchar i;for(i=0;i<8;i++){ds=0;_nop_();ds=dat&0x01;delayus(6);ds=1;dat=dat>>1;}delayus(6);}uint ds_read_temperature()//从18b20读温度{uchar a,b;z_reset();ds_write_byte(0xcc);ds_write_byte(0xbe);a=ds_read_byte();b=ds_read_byte();temp=b;temp=temp<<8;temp=temp|a;temp=temp*0.0625*10;return temp;}/* 1602 */void write_com(uchar com)//1602写命令{rs=0;wr=0;lcden=0;P0=com;lcden=1;delay(5);lcden=0;}void write_data(uchar dat)//1602写数据{rs=1;wr=0;lcden=0;P0=dat;lcden=1;delay(5);lcden=0;}void init()//1602初始化{write_com(0x38);write_com(0x08);write_com(0x01);write_com(0x06);write_com(0x0f);}main(){uint c,num;uchar i,j,k,z;P0=0;init();for(num=0;num<15;num++) //1602静态显示第一行{write_data(table1[num]);delay(300);}while(1){z_reset();ds_write_byte(0xcc);ds_write_byte(0x44);c=ds_read_temperature(); //读到温度write_com(0x80+0x40); //从第二行写i=c/100;//得十位j=c/10-c/100*10;//得各位k=c%10;//得十分位z='.';write_data(0x30+i);//1602显示数字只能输入ASCII码write_data(0x30+j);write_data(z);write_data(0x30+k);delay(300);}}。

DS18B20温度计 c程序 lcd1602显示

DS18B20温度计 c程序 lcd1602显示

2007-12-14 19:05温度值精确到0.1度,lcd1602显示仿真电路图如下c程序如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P3^7;//ds18b20与单片机连接口sbit RS=P3^0;sbit RW=P3^1;sbit EN=P3^2;unsigned char code str1[]={"temperature: "};unsigned char code str2[]={" "};uchar data disdata[5];uint tvalue;//温度值uchar tflag;//温度正负标志/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void wr_com(unsigned char com)//写指令//{ delay1ms(1);RS=0;RW=0;EN=0;P2=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据//{ delay1ms(1);;RS=1;RW=0;EN=0;P2=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x08);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void display(unsigned char *p)//显示//{while(*p!='\0'){wr_dat(*p);p++;delay1ms(1);}}init_play()//初始化显示{ lcd_init();wr_com(0x80);display(str1);wr_com(0xc0);display(str2);}/******************************ds1820程序***************************************/ void delay_18B20(unsigned int i)//延时1微秒{while(i--);}void ds1820rst()/*ds1820复位*/{ unsigned char x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{ unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){ DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata)/*写数据*/{unsigned char i=0;for (i=8; i>0; i--){ DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}read_temp()/*读取温度值并转换*/{uchar a,b;ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff)tflag=0;else{tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数return(tvalue);}/*******************************************************************/ void ds1820disp()//温度值显示{ uchar flagdat;disdata[0]=tvalue/1000+0x30;//百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30;//个位数disdata[3]=tvalue%10+0x30;//小数位if(tflag==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}wr_com(0xc0);wr_dat(flagdat);//显示符号位wr_com(0xc1);wr_dat(disdata[0]);//显示百位wr_com(0xc2);wr_dat(disdata[1]);//显示十位wr_com(0xc3);wr_dat(disdata[2]);//显示个位wr_com(0xc4);wr_dat(0x2e);//显示小数点wr_com(0xc5);wr_dat(disdata[3]);//显示小数位}/********************主程序***********************************/void main(){ init_play();//初始化显示while(1){read_temp();//读取温度ds1820disp();//显示}}。

DS18B20温度计 c程序 lcd1602显示(word文档良心出品)

DS18B20温度计 c程序 lcd1602显示(word文档良心出品)

2007-12-14 19:05温度值精确到0.1度,lcd1602显示仿真电路图如下c程序如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P3^7;//ds18b20与单片机连接口sbit RS=P3^0;sbit RW=P3^1;sbit EN=P3^2;unsigned char code str1[]={"temperature: "};unsigned char code str2[]={" "};uchar data disdata[5];uint tvalue;//温度值uchar tflag;//温度正负标志/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void wr_com(unsigned char com)//写指令//{ delay1ms(1);RS=0;RW=0;EN=0;P2=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据//{ delay1ms(1);;RS=1;RW=0;EN=0;P2=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x08);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void display(unsigned char *p)//显示//{while(*p!='\0'){wr_dat(*p);p++;delay1ms(1);}}init_play()//初始化显示{ lcd_init();wr_com(0x80);display(str1);wr_com(0xc0);display(str2);}/******************************ds1820程序***************************************/ void delay_18B20(unsigned int i)//延时1微秒{while(i--);}void ds1820rst()/*ds1820复位*/{ unsigned char x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{ unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){ DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata)/*写数据*/{unsigned char i=0;for (i=8; i>0; i--){ DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}read_temp()/*读取温度值并转换*/{uchar a,b;ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff)tflag=0;else{tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数return(tvalue);}/*******************************************************************/ void ds1820disp()//温度值显示{ uchar flagdat;disdata[0]=tvalue/1000+0x30;//百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30;//个位数disdata[3]=tvalue%10+0x30;//小数位if(tflag==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}wr_com(0xc0);wr_dat(flagdat);//显示符号位wr_com(0xc1);wr_dat(disdata[0]);//显示百位wr_com(0xc2);wr_dat(disdata[1]);//显示十位wr_com(0xc3);wr_dat(disdata[2]);//显示个位wr_com(0xc4);wr_dat(0x2e);//显示小数点wr_com(0xc5);wr_dat(disdata[3]);//显示小数位}/********************主程序***********************************/void main(){ init_play();//初始化显示while(1){read_temp();//读取温度ds1820disp();//显示}}。

DS18B20与LCD1602结合显示温度汇总(可编辑修改word版)

DS18B20与LCD1602结合显示温度汇总(可编辑修改word版)
其他字节保留用,不需要看。 三、关于单总线系统
单总线系统包括一个总线控制器和一个或多个从机。DS18B20 总是充当从机。当只有 一只从机挂在总线上时,系统被称为“单点”系统;如果由多只从机挂在总线上,系统被 称为“多点”。 所有的数据和指令的传递都是从最低有效位开始通过单总线。单总线需要 一个约 5KΩ 的外部上拉电阻;单总线的空闲状态是高电平。无论任何理由需要暂停某一 执行过程时,如果还想恢复执行的话,总线必须停留在空闲状态。在恢复期间,如果单总 线处于非活动(高电平)状态,位与位间的恢复时间可以无限长。如果总线停留在低电平 超过 480us,总线上的所有器件都将被复位。 四、操作流程 1.DS18B20 复位。 2.执行 ROM 指令。就是访问,搜索,匹配每个 DS18B20 独有的 64 位序列号。实验板上只 连有一个 DS18B20,故不需识别,也就是不需读出此序列号,写代码时直接写命令 0xcc 跳过。 3.执行 DS18B20 功能指令(RAM 指令,就是读写暂存器指令)。
一个身份证号),这是出厂时被光刻好的。最前面 8 位是单线系列编码:28h。接着的 48 位
是一个唯一的序列号。最后 8 位是以上 56 位的 CRC 编码。64-位的光刻 ROM 又包括 5 个
ROM 的功能命令:读 ROM,匹配 ROM,跳跃 ROM,查找 ROM 和报警查找。ROM 的作
用是使每个 DS18B20 各不相同,这样就8B20 一、DS18B20 的外形及其与单片机的连接图
(a)
(b)
图1
DS18B20 是 Dallas 公司生产的 1-Wire 接口数字温度传感器,其外形如图 1(a)所示,有
三个引脚,分别为:电源地 1(GND); 数字信号输入/输出端 2(DQ);外接供电电源输入端

温度测量DSB1820lcd1602液晶显示

温度测量DSB1820lcd1602液晶显示

温度测量DSB1820lcd1602液晶显示程序中要用到LCD1602display.h头文件可以在我的另一篇文章中取得: 为同一个文件#include <reg52.h>#include <intrins.h>#include "LCD1602display.h"sbit DQ=P2^0; //ds18b20uint wendu=0;uchar num,num1;uint temperature=0;uchar code range[]="===TEMPERTURE===";uchar code ASCII[]="0123456789.";uchar code table0[]="ROME TEMP:00.0C ";uchar code table1[]=" ERRO ";uchar temp[3]={0,0,0};//********************延时void delay1ms(uint z){uint x,y;for(x=z;x>0;x--)for(y=114;y>0;y--);}//*************************初始化bit init_DS18B20(){bit flag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在DQ=1;_nop_(); //先拉高DQ=0;for(num=0;num<200;num++); //要求保持480~960usDQ=1; //释放数据线for(num=0;num<10;num++); //等待DS18B20响应flag=DQ; // 响应for(num=0;num<200;num++); //延时足够长时间(此延时函数为了防止收不到信号而进入死胡同)DQ=1; //释放数据线return (flag); //返回检测成功标志}//*******************************写温度数据void DS18B20_WR_CHAR(uchar byte) // 先写低位{for(num1=0;num1<8;num1++){DQ=1;_nop_();DQ=0; //将数据线从高拉低时即启动写时序for(num=0;num<5;num++);//等待15usDQ=byte&0x01;for(num=0;num<15;num++); //延时约45us,DS18B20在约15~45us期间从数据线上采样byte>>=1;for(num=0;num<1;num++);//延时3us,两个写时序间至少需要1us的恢复期}DQ=1;//释放数据线}//**********************************读出温度数据uchar DS18B20_RD_CHAR() //先读低位{uchar byte=0;for(num1=0;num1<8;num1++){DQ=1;_nop_();DQ=0; //给个低脉冲_nop_();DQ=1;for(num=0;num<5;num++); //延时约15us,使主机在15us内采样byte>>=1;if(DQ==1)byte|=0x80;elsebyte|=0x00;for(num=0;num<1;num++);//延时3us,两个读时序之间必须有大于1us的恢复期}return (byte);}//*********************************温度计算void DS18B20_WENDU(){uchar temperaturel=0,temperatureh=0;if(init_DS18B20()==0){DS18B20_WR_CHAR(0xcc);DS18B20_WR_CHAR(0x44);delay1ms(1000);if(init_DS18B20()==0){DS18B20_WR_CHAR(0xcc);DS18B20_WR_CHAR(0xBE);_nop_();temperaturel=DS18B20_RD_CHAR();temperatureh=DS18B20_RD_CHAR();temperature=(temperatureh*256+temperaturel)*0.625; init_DS18B20();}//return (temperature);}}//******************************温度显示void display_DS18B20(){temp[2]=temperature/100%10;temp[1]=temperature%100/10;temp[0]=temperature%10;DisplayListChar(0, 1, table0);DisplayOneChar(10, 1, ASCII[ temp[2] ] ); DisplayOneChar(11, 1, ASCII[ temp[1] ] ); DisplayOneChar(12, 1, ASCII[10] ); DisplayOneChar(13, 1, ASCII[ temp[0] ] );}//*******************************主函数main(){InitLCM();DisplayListChar(0,0,range); DisplayListChar(0,1,table0); while(1){if( init_DS18B20()==0) {DS18B20_WENDU(); display_DS18B20();}}}。

DS18B20与LCD1602结合显示温度汇总

DS18B20与LCD1602结合显示温度汇总
0x44:开始转换温度。转换好的温度会储存到暂存器字节0和1。
OxBE:读暂存指令。读暂存指令,会从暂存器0到9,一个一个字节读取,如果要停止 的话,必须写下DS18B20复位。
ROM指令和RAM指令的具体情况见表3。
表3
表6:ROM指令隶
捋令
约走代

读ROM
33H
读DS侣20温度传關RON中的编诃(即64位地址)
甘警援亲命

0ECH
执行后只有凰度超过设定值上限或下限的片孑才依吕。內应。
去6:RAM指令表
捋令
约定代码
功館
温发麦挾
44H
启动DS佗凶逬行極濟j维转荻对最氏为7£0ms(9位为93.76ms)»结果存入內部殍爭RAM中。
0BEH
读内®RAM中好节的內容
4EH
发出向力SRAbl豹艮 停节写上、下泌启遵数据命今•紧碣送命令才启,品件送两宇节豹竝据,
符合ROM
曲ROM
55H
OFOH
发出此命令之后,任若抜出64便ROM编码 > 访问虫总絃上与该编码和对应的DS1820使之作出响应 > 为下一步对该
DS1820的读写作陡印
月亍质定挂接在问一总饶上DS1820的丫数和识别64ROM地址-为探作各器件作好准备・
ffibl ROM
0CCH
忽昭64位ROMitt址•直益向DS1820发溫陛变按命筑适用于車片工魚
uchai DS18B20_Read_Byte()
{
uchar i,temp=0;
for(i=0;i<8;i++)
{
temp=temp»l;
DQ=0;〃主机将总线拉至低电平,只需保持1.7us

基于单片机的DS18B20多点测温系统LCD1602显示(完全免费)

基于单片机的DS18B20多点测温系统LCD1602显示(完全免费)

河南科技学院HENANKEJIXUEYUAN毕业论文(设计)中文题目:基于单片机的DS18B20温度传感器测温系统设计英文题目:A Design of the DS18B20 Temperature Test System Based on MCU姓名牛鸿昌刘东学号201018033305专业班级应用电子技术指导教师赵小静提交日期2013年 5 月20 日教务处制基于单片机的DS18B20温度传感器测温系统设计姓名:** 班级:***指导老师:*** 职称:**(惠州学院电子科学系,广东,惠州,516007)摘要随着社会的进步和工业技术的发展,人们越来越重视温度因素,许多产品对温度范围要求严格,而目前市场上普遍存在的温度检测仪器大都是单点测量,同时有温度传递不及时、精度不够的缺点,不利于工业控制者根据温度变化及时作出决定。

在这样的形式下,开发一种能够同时测量多点,并且实时性高、精度高,能够综合处理多点温度信息的测量系统就很有必要。

本课题以AT89C52单片机系统为核心,能对多点温度进行实时巡检。

DS18B20是一种可组网的高精度数字式温度传感器,由于其具有单总线的独特优点,可以使用户轻松的组建起传感器网络,并可使多点温度测量电路变得简单、可靠。

本文结合实际使用经验,介绍了DS18B20数字温度传感器在单片机下的硬件连接及软件编程,并给出了软件流程图。

关键词:DS18B20 多点测温单片机LCD1602AbstractAs the industry and the society developing, the temperature becomes more and more important and a lot of products are sensitive to temperature. However, temperature measuring apparatus in the market now only can check and measure the temperature of one point, at the same time, the temperature information is not real time and the precision is low. It takes a great of troubles for the industry-controllers to make decision .In this situation, design and implement one applicable system which can watch measure and control the temperature and the measuring results is real time and the precision is great is more essential. In order to meeting this application, this paper talk about The Multiple-Point’s temperature Measuring System.This system based on single chip computer, can inspect and control multiple temperatures in real time. As a kind of high-accuracy digital net temperature sensor,DS18 B20 can be used building a sensor net easily. It can also make the net simple and reliable with it's special 1-wire interface .This paper introduces the application of DS18B20 with single chip processor.Key words:DS18B20 Multi-point temperature MCU LCD1602目录摘要 (II)Abstract ........................................................................................................................ I II 第一章绪论.. (1)1.1 课题背景 (1)1.2 本课题研究意义 (2)1.3 本课题的任务 (2)1.4 系统整体目标 (3)第二章方案论证比较与选择 (3)2.1 引言 (3)2.2 方案设计 (3)2.3 方案的比较与选择 (4)第三章硬件设计 (4)3.1 STC89C52单片机简介 (4)3.2 DS18B20介绍 (8)3.3 系统电路设计 (16)3.4 显示电路设计 (17)3.5 按键电路设计 (17)3.6 三点测温电路 (18)第四章软件设计 (18)4.1 软件开发工具的选择 (18)4.2 系统软件设计的一般原则 (19)4.3 系统软件设计的一般步骤 (20)4.4 三路测温软件实现 (20)第五章误差分析 (25)5.1 误差产生 (25)5.2 降低误差方法 (25)5.3 挂接DS18B20个数论证 (26)第六章调试与小结 (26)致谢 (28)参考文献 (29)附录 (30)第一章绪论1.1 课题背景在人类的生活环境中,温度扮演着极其重要的角色。

基于LCD1602液晶的DS18B20温度传感器的温度采集系统设计说明

基于LCD1602液晶的DS18B20温度传感器的温度采集系统设计说明

2012 ~ 2013学年第2学期《单片机原理及应用》课程设计报告题目:基于DS18B20的温度采集系统设计专业:自动化班级:姓名:指导教师:电气工程学院2013年6月6日摘要随着信息技术的飞速发展,嵌入式智能电子技术已渗透到社会生产、工业控制以及人们日常生活的各个方面。

单片机又称为嵌入式微型控制器,在智能仪表、工业控制、智能终端、通信设备、医疗器械、汽车电器、导航系统和家用电器等很多领域都有着广泛的应用,已成为当今电子信息领域应用最广泛的技术之一。

本文主要介绍了一个基于STC89C52RC单片机的测温系统,详细描述了利用液晶显示器件温度传感器DS18B20开发测温系统的原理,重点对传感器与单片机的硬件连接和软件编程进行了详细分析。

主要地介绍了数字温度传感器DS18B20的数据采集过程,进而对各部分硬件电路的工作原理进行了介绍。

温度传感器DS18B20与STC89C52RC结合构成了最简温度检测系统,该系统可以方便的实现温度采集和显示,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。

关键词:单片机STC89C52RC、DS18B20温度传感器、液晶显示器LCD1602 基于DS18B20的温度采集系统设计目录第一章绪论21.1温度检测系统的介绍21.1.1 温度检测系统的组成31.1.2 温度检测的实际意义3第二章温度检测系统方案的选取32.1温度检测系统方案的选取3温度检测模块32.1.2温度显示模块42.2温度检测系统结构的设计4第三章硬件电路的设计53.1STC89C52RC的介绍53.2DS18B20的介绍53.2.1 DS18B20的主要特点53.2.2 DS18B20的结构63.2.3 DS18B20的测温原理63.3 LCD1602的介绍83.4硬件设计9硬件设计目标9硬件功能模块划分9接口和连接方式10硬件仿真电路10第四章软件设计104.11602液晶显示处理部分104.218B20函数处理部分11第五章心得体会13参考文献13附录14第一章绪论1.1 温度检测系统的介绍温度检测在各领域应用的非常广泛,可以说渗透到了社会的每一个领域。

DS18B20+LCD1602+AT24C02智能温度控制系统

DS18B20+LCD1602+AT24C02智能温度控制系统

/*******************************************************************智能温控器问题描述:当温控开关打开时,若测得环境温度大于设定温度,则继电器吸合,启动压缩机工作;若测得环境温度小于设定温度,则继电器释放,压缩机停止工作。

该实验可以应用于对温度控制精度要求不是很高的场合,例如,粮仓,电冰箱,空调,电饭锅等。

如果配以通讯接口,可以做成多点温度检测监控系统。

具有极强的扩展性。

注意:此文档为仿真程序,若要在试验板上验证,需要须改一下函数void lcd_wait(void){DA TAPORT=0xff;LCM_EN=1;LCM_RS=0;LCM_RW=1;_nop_();while(DATAPORT&BUSY);LCM_EN=0;}*******************************************************************/#include<reg51.h>#include<intrins.h>#include <absacc.h>#define uchar unsigned char#define uint unsigned int#define BUSY 0x80 //lcd忙检测标志#define DATAPORT P0 //定义P0口为LCD通讯端口#define PLAYE_ADDR XBYTE[0XBFFF] //语音报警地址sbit RED_ALARM=P1^0; //红色指示灯sbit WRITE_ALARM=P1^1; //白色指示灯sbit GREEN_ALARM=P1^2; //绿色指示灯sbit BLUE_ALARM=P1^3;sbit P1_4=P1^4; //时钟调整sbit P1_5=P1^5; //时钟加sbit P1_6=P1^6; //时钟减sbit DQ = P1^7; //定义ds18b20通信端口sbit LCM_RS=P2^0; //数据/命令端sbit LCM_RW=P2^1; //读/写选择端sbit LCM_EN=P2^2;sbit sda=P2^3; //IO口定义sbit scl=P2^4; //LCD使能信号sbit ad_busy=P3^2; //adc中断方式接口sbit RECLED_EOC=P3^5; //ISD1420放音结束查询标志sbit OUT=P3^7;uchar ad_data; //ad采样值存储uchar seconde; //定义并初始化时钟变量uchar minite;uchar hour;uchar mstcnt=0;uchar temp1,temp2,temp; //温度显示变量uchar t,set;uchar K;bit ON_OFF=0;bit write=0;uchar code str0[]={"--- : : --- "};uchar code str1[]={"SET: C SA: . C"};void delay_LCM(uint); //LCD 延时子程序void initLCM( void);//LCD初始化子程序void lcd_wait(void); //LCD 检测忙子程序void WriteCommandLCM(uchar WCLCM,uchar BusyC); //写指令到ICM子函数void WriteDataLCM(uchar WDLCM); //写数据到LCM子函数void DisplayOneChar(uchar X,uchar Y,uchar DData); //显示指定坐标的一个字符子函数void DisplayListChar(uchar X,uchar Y,uchar code *DData); //显示指定坐标的一串字符子函数void init_timer0(void); //定时器初始化void displayfun1(void);void displayfun2(void);void displayfun3(void);void displayfun4(void);void keyscan(void ); //键盘扫描子程序void set_adj(void);void inc_key(void);void dec_key(void);void delay_18B20(unsigned int i);void Init_DS18B20(void) ;uchar ReadOneChar(void);void WriteOneChar(unsigned char dat);void ReadTemperature(void);void ad0809(void);void playalarm(void);/*********延时K*1ms,12.000mhz**********/void delay_LCM(uint k){for(i=0;i<k;i++){for(j=0;j<60;j++){;}}}/**********写指令到LCM子函数************/void WriteCommandLCM(uchar WCLCM,uchar BusyC) {if(BusyC)lcd_wait();DA TAPORT=WCLCM;LCM_RS=0; // 选中指令寄存器LCM_RW=0; // 写模式LCM_EN=1;_nop_();_nop_();_nop_();LCM_EN=0;}/**********写数据到LCM子函数************/void WriteDataLCM(uchar WDLCM){lcd_wait( ); //检测忙信号DA TAPORT=WDLCM;LCM_RS=1; // 选中数据寄存器LCM_RW=0; // 写模式LCM_EN=1;_nop_();_nop_();_nop_();LCM_EN=0;}/***********lcm内部等待函数*************/void lcd_wait(void){DA TAPORT=0xff;LCM_EN=1;LCM_RS=0;LCM_RW=1;_nop_();while(DATAPORT&BUSY){ LCM_EN=0;_nop_();_nop_();LCM_EN=1;_nop_();_nop_();}LCM_EN=0;}/**********LCM初始化子函数***********/void initLCM( ){DA TAPORT=0;delay_LCM(15);WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号delay_LCM(5);WriteCommandLCM(0x38,0);delay_LCM(5);WriteCommandLCM(0x38,0);delay_LCM(5);WriteCommandLCM(0x38,1); //8bit数据传送,2行显示,5*7字型,检测忙信号WriteCommandLCM(0x08,1); //关闭显示,检测忙信号WriteCommandLCM(0x01,1); //清屏,检测忙信号WriteCommandLCM(0x06,1); //显示光标右移设置,检测忙信号WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号}/****************显示指定坐标的一个字符子函数*************/void DisplayOneChar(uchar X,uchar Y,uchar DData){Y&=1;X&=15;if(Y)X|=0x40; //若y为1(显示第二行),地址码+0X40X|=0x80; //指令码为地址码+0X80WriteCommandLCM(X,0);WriteDataLCM(DData);}/***********显示指定坐标的一串字符子函数***********/void DisplayListChar(uchar X,uchar Y,uchar code *DData){uchar ListLength=0;Y&=0x01;X&=0x0f;while(X<16){DisplayOneChar(X,Y,DData[ListLength]);ListLength++;X++;}}/***********ds18b20延迟子函数(晶振12MHz )*******/void delay_18B20(unsigned int i){while(i--);}/**********ds18b20初始化函数**********************/void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay_18B20(8); //稍做延时DQ = 0; //单片机将DQ拉低delay_18B20(80); //精确延时大于480usDQ = 1; //拉高总线delay_18B20(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(20);}/***********ds18b20读一个字节**************/unsigned char ReadOneChar(void){uchar i=0;uchar dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay_18B20(4);}return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(uchar dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay_18B20(5);DQ = 1;dat>>=1;}}/**************读取ds18b20当前温度************/void ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned char t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay_18B20(100); // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度delay_18B20(100);a=ReadOneChar(); //读取温度值低位b=ReadOneChar(); //读取温度值高位temp1=b<<4;temp1+=(a&0xf0)>>4;temp2=a&0x0f;temp=((b*256+a)>>4); //当前采集温度值除16得实际温度值}/***************液晶显示子函数1正常显示*****************/void displayfun1(void){WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);DisplayOneChar(3,0,hour/10+0x30); //液晶上显示小时DisplayOneChar(4,0,hour%10+0x30);DisplayOneChar(6,0,minite/10+0x30); //液晶上显示分DisplayOneChar(7,0,minite%10+0x30);DisplayOneChar(9,0,seconde/10+0x30); //液晶上显示秒DisplayOneChar(10,0,seconde%10+0x30);DisplayOneChar(4,1,K/10+0x30); //液晶上显示设定的温度DisplayOneChar(5,1,K%10+0x30);DisplayOneChar(11,1,temp1/10+0x30); //液晶上显示测得的温度DisplayOneChar(12,1,temp1%10+0x30);DisplayOneChar(14,1,temp2/10+0x30);if(ON_OFF==0) //若温控标志为0{DisplayOneChar(14,0,0x4f); // 液晶上显示不控温的标志DisplayOneChar(15,0,0x46);}else{DisplayOneChar(14,0,0x4f); // 液晶上显示控温的标志DisplayOneChar(15,0,0x4e);if(outflag==1)DisplayOneChar(0,0,0x7c);elseDisplayOneChar(0,0,0xef);}}/************液晶显示子函数2***************/void displayfun2(void){WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);DisplayOneChar(6,0,minite/10+0x30);DisplayOneChar(7,0,minite%10+0x30);DisplayOneChar(9,0,seconde/10+0x30);DisplayOneChar(10,0,seconde%10+0x30);DisplayOneChar(4,1,K/10+0x30);DisplayOneChar(5,1,K%10+0x30);DisplayOneChar(11,1,temp1/10+0x30);DisplayOneChar(12,1,temp1%10+0x30);DisplayOneChar(14,1,temp2/10+0x30);WriteCommandLCM(0x0f,1); //显示屏打开,光标显示,闪烁,检测忙信号DisplayOneChar(3,0,hour/10+0x30);DisplayOneChar(4,0,hour%10+0x30);}/**************液晶显示子函数3*****************/void displayfun3(void){WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);DisplayOneChar(3,0,hour/10+0x30);DisplayOneChar(4,0,hour%10+0x30);DisplayOneChar(9,0,seconde/10+0x30);DisplayOneChar(10,0,seconde%10+0x30);DisplayOneChar(4,1,K/10+0x30);DisplayOneChar(5,1,K%10+0x30);DisplayOneChar(11,1,temp1/10+0x30);DisplayOneChar(12,1,temp1%10+0x30);DisplayOneChar(14,1,temp2/10+0x30);WriteCommandLCM(0x0f,1); //显示屏打开,光标显示,闪烁,检测忙信号DisplayOneChar(6,0,minite/10+0x30);DisplayOneChar(7,0,minite%10+0x30);}/**************液晶显示子函数4 *****************/void displayfun4(void){WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);DisplayOneChar(3,0,hour/10+0x30);DisplayOneChar(4,0,hour%10+0x30);DisplayOneChar(6,0,minite/10+0x30);DisplayOneChar(7,0,minite%10+0x30);DisplayOneChar(9,0,seconde/10+0x30);DisplayOneChar(10,0,seconde%10+0x30);DisplayOneChar(11,1,temp1/10+0x30);DisplayOneChar(12,1,temp1%10+0x30);DisplayOneChar(14,1,temp2/10+0x30);WriteCommandLCM(0x0f,1); //显示屏打开,光标显示,闪烁,检测忙信号DisplayOneChar(4,1,K/10+0x30);DisplayOneChar(5,1,K%10+0x30);}/**************键盘扫描子函数******************/void keyscan(void){uchar xx; //局部变量P1=0xff;if(P1!=0xff){delay_LCM(50);if(P1!=0xff){xx=P1;switch(xx) // 根据按键状态,调用不同的子函数{case 0xfe:set_adj(); break;case 0xfd:inc_key(); break;case 0xfb:dec_key(); break;case 0xf7:{delay_LCM(150);ON_OFF=!ON_OFF;while(!BLUE_ALARM);} break;default:break;}}}/**************设定工作模式子函数****************/void set_adj(void){delay_LCM(100);set++;if(set>=4)set=0;while(!RED_ALARM);}/****************按键加法子函数******************/void inc_key(void){delay_LCM(150);switch(set){case 0:if(P1==0xf7){delay_LCM(150);ON_OFF=!ON_OFF;} break;case 1:hour++; if(hour>=23)hour=23; break;case 2:minite++; if(minite>=59)minite=59;break;case 3:K++;if(K>=99)K=99; break;default:break;}while(!WRITE_ALARM);}/****************按键减法子函数*****************/void dec_key(void){delay_LCM(150);switch(set){case 0:if(P1==0xf7){delay_LCM(150);ON_OFF=!ON_OFF;} break;case 1:hour--; if(hour<=0)hour=0; break;case 2:minite--;if(minite<=0)minite=0;break;case 3:K--;if(K<=1)K=1; break;default:break;}while(!GREEN_ALARM);/////////24C02读写驱动程序////////////////////void delay1(uchar x){uint i;for(i=0;i<x;i++);}void flash(){ ; ; }void x24c02_init() //24c02初始化子程序{scl=1;flash();sda=1;flash();}void start() //启动I2C总线{sda=1;flash();scl=1;flash();sda=0;flash();scl=0;flash();}void stop() //停止I2C总线{sda=0;flash();scl=1;flash();sda=1;flash();}void writex(uchar j) //写一个字节{uchar i,temp;temp=j;for (i=0;i<8;i++){temp=temp<<1;scl=0;flash();sda=CY;flash();scl=1;flash();}scl=0;flash();sda=1;flash();}uchar readx() //读一个字节{uchar i,j,k=0;scl=0;flash();sda=1;for (i=0;i<8;i++){flash();scl=1;flash();if (sda==1) j=1;else j=0;k=(k<<1)|j;scl=0;}flash();return(k);}void clock() //I2C总线时钟{uchar i=0;scl=1;flash();while ((sda==1)&&(i<255))i++;scl=0;flash();}////////从24c02的地址address中读取一个字节数据/////uchar x24c02_read(uchar address){uchar i;start();writex(0xa0);clock();writex(address);clock();start();writex(0xa1);clock();i=readx();stop();delay1(10);return(i);}//////向24c02的address地址中写入一字节数据info/////void x24c02_write(uchar address,uchar info){EA=0;start();writex(0xa0);clock();writex(address);clock();writex(info);clock();stop();EA=1;delay1(50);}/***************定时器t0初始化*******************/void init_timer0(void){TMOD=0x01; //time0为定时器,方式1 TH0=0x3c; //预置计数初值TL0=0xb0;EA=1;ET0=1;TR0=1;}/***********定时器t0中断子函数**************/void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次{TH0=0x3c;TL0=0xb0;mstcnt++;if(mstcnt>=20 ) {seconde++; write=1; mstcnt=0; }if(seconde>=60) {minite++; seconde=0;}if(minite>=60 ) {hour++; minite=0; }if(hour>=24 ) {hour=0;}keyscan( ); //按键扫描}/***********the main funtion*************/void main(void){P1=0xff; //初始化p1口,全设为1x24c02_init(); //初始化24C08K=x24c02_read(2); //读出保存的数据赋于Kseconde=x24c02_read(4);minite=x24c02_read(6);hour=x24c02_read(8);delay_LCM(500); //延时500ms启动initLCM( ); //LCD初始化init_timer0( ); //时钟定时器0初始化Init_DS18B20( ) ; //DS18B20初始化DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);while (1){keyscan(); //按键扫描ReadTemperature(); //温度采集switch(set) //LCD根据工作模式显示{case 0:displayfun1();delay_LCM(1000);break; //正常工作显示case 1:displayfun2();delay_LCM(1000);break; //调整时显示case 2:displayfun3();delay_LCM(1000);break; //调整分显示case 3:displayfun4();delay_LCM(1000);break; //温度设定default:break;}keyscan( ); //相当于延时if(ON_OFF==1) //若温控标志位1,控制LAMP动作{if(temp1>=K+1){outflag=1;OUT=0;}if(temp1<K){delay_LCM(1000);if(temp1<K){outflag=0;OUT=1;} //}}else{outflag=0;OUT=1;}if(write==1) //判断计时器是否计时一秒{write=0; //清零x24c02_write(8,hour); //在24c08的地址2中写入数据hourdelay_LCM(11);x24c02_write(6,minite);delay_LCM(11);x24c02_write(4,seconde);delay_LCM(11);x24c02_write(2,K);}}}。

基于DS18B20的多点温度检测系统的设计LCD

基于DS18B20的多点温度检测系统的设计LCD

目录前言 (3)1 系统方案设计 (4)1.1方案设计 (4)1.2方案论证 (5)2 硬件设计 (5)2.1工作原理 (5)2.2单元电路设计 (6)2.1.1 DS18B20与单片机接口电路设计 (6)2.1.2 按键电路设计 (11)2.1.3显示电路设计 (12)1602液晶显示模块特点及引脚图: (12)2.1.4 报警电路设计 (17)3 软件设计 (18)3.1软件流程设计 (18)3.2软件设计 (22)4 系统仿真 (22)4.1原理图绘制 (22)4.2程序加载 (22)4.3系统仿真 (22)5 整机制作 (23)5.1PCB板设计 (23)5.1.1 PCB板面规划 (23)5.1.2 PCB网络表导入、元件布局 (23)5.1.3布线 (23)5.2PCB板制作 (24)5.2.1 PCB打印、转印 (24)5.2.2 PCB蚀刻、钻孔和表面处理 (24)5.3整机制作与调试 (25)5.3.1 元器件焊接 (25)5.3.2 整机调试 (26)总结 (26)参考资料 (26)致谢 (27)附录1 部分子程序 (28)前言21世纪,科学技术的发展日新月异,科技的进步带动了测量技术的发展,现代控制设备的性能和结构发生了翻天覆地的变化。

我们已经进入了高速发展的信息时代,测量技术也成为当今科技的一个主流,广泛地深入到研究和应用工程的各个领域。

温度是一个和人们生活环境有着密切关系的物理量,也是一种在生产、科研、生活中需要测量和控制的重要物理量,是国际单位制七个基本量之一。

温度的变化会给我们的生活、工作、生产等带来重大影响,因此对温度的测量至关重要。

其测量控制一般使用各式各样形态的温度传感器。

随着现代计算机和自动化技术的发展,作为各种信息的感知、采集、转换、传输相处理的功能器件,温度传感器的作用日显突出,已成为自动检测、自动控制系统和计量测试中不可缺少的重要技术工具,其应用已遍及工农业生产和日常生活的各个领域。

DS18B20测量温度液晶1602显示

DS18B20测量温度液晶1602显示

DS18B20测量温度液晶1602显示DS18B20温度传感器简介DS18B20是一种数字温度传感器。

它输出的是数字信号,同时具有体积小,硬件资源耗费少,抗干扰能力强,精度高等特点。

DS18B20温度传感器特点1、单线接口:DS18B20仅需一条线可实现与微处理器双向通信。

2、测温范围: DS18B20温度传感器的测温范围可达-55℃~+125℃,在-10℃到+85℃范围内误差为±0.4°。

3、支持多点组网功能:多个DS18B20温度传感器可以并联在一条数据线上,最多可以并联8个,实现多点测温。

4、工作电源: 3.0~5.5V/DC ,DS18B20温度传感器可以采用外部独立电源供电,也可以用数据线寄生电源供电。

5、DS18B20温度传感器在应用过程中不需要任何外围元件。

6、DS18B20测量温度的结果以9~12位数字量方式串行传送。

7、掉电保护功能, DS18B20温度传感器内部含有 EEPROM ,通过配置寄存器可以设定数字转换精度和报警温度。

在DS18B20温度传感器掉电以后仍可保存分辨率及报警温度的设定值。

8、DS18B20温度传感器返回16位二进制数代表此刻探测的温度值,其高五位代表正负。

如果高五位全部为1,则代表返回的温度值为负值。

如果高五位全部为0,则代表返回的温度值为正值。

后面的11位数据代表温度的绝对值,将其转换为十进制数值之后,再乘以0.0625即可获得此时的温度值。

DS18B20温度传感器引脚说明DS18B20温度传感器接口电路液晶1602接口电路DS18B20测量温度程序源代码/*****************DS18B20测量温度,用1602显示温度值******************* 单片机:51单片机* 开发环境:keil* 功能: DS18B20测量温度,并在LCD1602中显示出来**********************************************************************/#include <reg51.h>#define LCD_Data P0#define Busy 0x80#define uchar unsigned char#define uint unsigned intuchar code table0[] = {" SL-51A "};uchar code table1[] = {" TEMP: XX.X "};uchar temperature[5]; //温度值uint temp;sbit LCD_RS = P1^0;sbit LCD_RW = P1^1;sbit LCD_E = P2^5;sbit DS = P2^2;void Delay5Ms(void);void delay(uint count);void WriteDataLCD(unsigned char WDLCD);void WriteCommandLCD(unsigned char WCLCD,BuysC);unsigned char ReadDataLCD(void);unsigned char ReadStatusLCD(void);void LCDInit(void);void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); void Info_display(void);void dsreset(void);bit tmpreadbit(void);uchar tmpread(void);void tmpwritebyte(uchar dat);void tmpchange(void);uint tmp();void delay(uint count){uint i;while(count){i=200;while(i>0)i--;count--;}}void dsreset(void) //发复位命令{uint i;DS=0;i=103;while(i>0)i--;DS=1;i=4;while(i>0)i--;}bit tmpreadbit(void) //读取一位{uint i;bit dat;DS=0;i++;DS=1;i++;i++;dat=DS;i=8;while(i>0)i--;return (dat);}uchar tmpread(void) //读取一个字节{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tmpreadbit();dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面 }return(dat);}void tmpwritebyte(uchar dat) //向ds18b20写入一个字节{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb){DS=0;i++;i++;DS=1;i=8;while(i>0)i--;}else{DS=0;i=8;while(i>0)i--;DS=1;i++;i++;}}}void tmpchange(void) //DS18B20开始转换{dsreset();delay(1);tmpwritebyte(0xcc); //命令的含义可以查18b20的手册 tmpwritebyte(0x44);}uint tmp() //获取温度值{float tt;uchar a,b;dsreset();delay(1);tmpwritebyte(0xcc);tmpwritebyte(0xbe);a=tmpread();b=tmpread();temp=b;temp<<=8;temp=temp|a;tt=temp*0.0625;temp=tt*10+0.5;return temp;}/*************************5ms延时函数***************************/void Delay5Ms(void){unsigned int TempCyc = 3552;while(TempCyc--);}/**************************写数据函数***************************/void WriteDataLCD(unsigned char WDLCD){ReadStatusLCD(); //检测忙LCD_Data = WDLCD;LCD_E = 0; //若晶振速度太高可以在这后加小的延时 LCD_E = 0; //延时LCD_RS = 1;LCD_RW = 0;LCD_E = 1;LCD_E = 0;}/*************************写指令函数****************************/void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCD(); //根据需要检测忙LCD_Data = WCLCD;LCD_E = 0;LCD_E = 0;LCD_RS = 0;LCD_RW = 0;LCD_E = 1;LCD_E = 0;}/**************************读状态函数***************************/unsigned char ReadStatusLCD(void){LCD_Data = 0xFF;LCD_RS = 0;LCD_RW = 1;LCD_E = 0;LCD_E = 0;LCD_E = 1;while (LCD_Data & Busy); //检测忙信号return(LCD_Data);}/***************************LCD初始化***************************/void LCDInit(void) //LCD初始化{LCD_Data = 0;WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,1); //显示模式设置, 开始要求每次检测忙信号WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置}/**********************按指定位置显示一个字符*********************/void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码WriteDataLCD(DData);}/***********************按指定位置显示一串字符********************/void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]>=0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]);//显示单个字符ListLength++;X++;}}}/*****************************************************************/ void temp_display(unsigned int temp) //显示程序{unsigned char A1,A2,A2t,A3;A1=temp/100; //百位A2t=temp%100;A2=A2t/10; //十位A3=A2t%10; //个位temperature[1]=A1 + 0x30;temperature[2]=A2 + 0x30;temperature[3]=A3 + 0x30;DisplayOneChar(9,1,temperature[1]);DisplayOneChar(10,1,temperature[2]);DisplayOneChar(12,1,temperature[3]);}/******************************************************************/ void init(){LCDInit();DisplayListChar(0,0,table0);DisplayListChar(0,1,table1);}void main(){int i;init();while(1){tmpchange();for(i=0;i<=10;i++){if(i==10){temp_display(tmp());}}}}。

51单片机ds18b20和lcd1602显示温度

51单片机ds18b20和lcd1602显示温度

/*本程序为基于51单片机的DS18b20与lcd1602显示温度程序,1602数据线友P0口提供*/程序已通过硬件测试直接使用作者:liuzqiang1016#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P2^0;//ds18b20sbit lcd_rw=P2^5;sbit lcd_rs=P2^6;sbit lcd_en=P2^7;unsigned char code str1[]={"temperature: "};unsigned char code str2[16]={" "};uchar data disdata[5];uint value;//温度值uchar flag;//正负标志/*************************lcd1602程序**************************/void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void write_com(unsigned char com)//写指令//{ delay1ms(1);lcd_rs=0;lcd_rw=0;lcd_en=0;P0=com;delay1ms(1);lcd_en=1;delay1ms(1);lcd_en=0;}void write_dat(unsigned char dat)//写数据//{ delay1ms(1);;lcd_rs=1;lcd_rw=0;lcd_en=0;P0=dat;delay1ms(1);lcd_en=1;delay1ms(1);lcd_en=0;}void lcd_init()//初始化设置//{write_com(0x38);delay1ms(5);write_com(0x08);delay1ms(5);write_com(0x01);delay1ms(5);write_com(0x06);delay1ms(5);write_com(0x0c);delay1ms(5);}void display(unsigned char *p)//显示//{while(*p!='\0'){write_dat(*p);p++;delay1ms(1);}}init_play()//初始化显示{ lcd_init();write_com(0x80);display(str1);write_com(0xc0);display(str2);}void delay_18B20(unsigned int i)//延时1微秒{while(i--);}void ds1820rst()/*ds1820复位*/{unsigned char x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){ DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata)/*写数据*/ {unsigned char i=0;for (i=8; i>0; i--){ DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}read_temp()/*读取温度值并转换*/{uchar a,b;ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();b=ds1820rd();value=b;value<<=8;value=value|a;if(value<0x0fff)flag=0;else{value=~value+1;flag=1;}value=value*(0.625);//温度值扩大10倍,精确到1位小数return(value);}/*******************************************************************/ void ds1820disp()//温度值显示{ uchar flagdat;disdata[0]=value/1000+0x30;//百位数disdata[1]=value%1000/100+0x30;//十位数disdata[2]=value%100/10+0x30;//个位数disdata[3]=value%10+0x30;//小数位if(flag==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}write_com(0xc0);write_dat(flagdat);//显示符号位write_com(0xc1);write_dat(disdata[0]);//显示百位write_com(0xc2);write_dat(disdata[1]);//显示十位write_com(0xc3);write_dat(disdata[2]);//显示个位write_com(0xc4);write_dat(0x2e);//显示小数点write_com(0xc5);write_dat(disdata[3]);//显示小数位}/********************主程序***********************************/ void main(){ init_play();//初始化显示while(1){read_temp();//读取温度ds1820disp();//显示}}。

基于DS18B20的温度采集系统(1602显示)的设计_课程设计

基于DS18B20的温度采集系统(1602显示)的设计_课程设计

目录摘要 (2)一.设计内容及要求 (4)1.1 设计工艺要求 (4)1.2 设计任务 (4)1.3 要求 (4)二.芯片资料 (5)2.1 DS18B20 (5)2.1.1 DS18B20的工作原理 (5)2.1.2 DS18B20的使用方法 (7)2.2 AT89C51 (11)2.2.1 AT89C51简介 (11)2.2 .2 A T89C51功能 (11)2.2.3 A T89C51引脚 (11)三.系统流程 (14)3.1读DS18B20的子程序 (14)3.2 读转换温度子程序 (15)3.写DS18B20的子程序 (15)四.程序与电路设计 (17)4.1 程序设计 (17)4.1.1 main程序(部分) (17)4.1.2 DS18B20初始化程序 (18)4.1.3 DS18B20全处理 (18)4.2 电路图 (19)4.2.1 最小系统设计图 (19)4.2.2 DS18B20模块电路图 (19)4.2.3 1602LCD显示模块设计图 (20)4.2.4 整机原理图 (21)五.系统调试与分析 (22)六.设计体会 (23)参考文献 (24)教师评语 (25)摘要随着人们生活水平的不断提高,单片机技术已经普及到我们生活,工作,科研等各个领域。

单片机控制无疑是人们追求的目标之一,它所给人带来的方便是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。

本文利用单片机结合传感器技术开发设计,把传感器理论与单片机实际应用有机结合,详细地讲述了利用温度传感器DS18B20测量环境温度,设置上下报警温度,当温度不在设置范围内是,可以报警。

同时51单片机在现代电子产品中广泛应用以及其技术已经非常成熟,DS18B20可以直接读出被测温度值,而且采用一线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。

基于DS18B20的温度测量系统设计

基于DS18B20的温度测量系统设计

基于DS18B20的温度测量系统设计一、引言温度测量是现代生活中很常见的一项测量工作。

在很多领域中,如农业、医疗和工业等,温度的准确测量对于保持合适的环境和防止设备损坏至关重要。

因此,设计一种高精度、稳定可靠的温度测量系统至关重要。

本文将基于DS18B20温度传感器进行详细的设计。

二、DS18B20概述DS18B20是一种数字温度传感器,它可以提供9至12位的温度数据精度。

它使用单总线接口进行通信,并且可以在不同分辨率下进行配置以满足不同的应用需求。

该传感器具有很多优点,如精度高、体积小、能够长时间稳定工作等。

三、系统设计1.硬件设计硬件设计是温度测量系统设计的基础。

设计中需要考虑到供电电源、连接方式和传感器位置等因素。

(1)供电电源:传感器和测量电路通常需要稳定的电源供应,可以选择直流电源或者电池供电,需要根据实际需求进行选择。

(2)连接方式:DS18B20可以通过单总线接口进行连接,可以选择串行线连接传感器和控制器。

(3)传感器位置:传感器的位置也是需要考虑的因素,需要确保传感器可以完全接触到被测物体表面,并且避免外部因素对测量结果的影响。

2.软件设计软件设计是温度测量系统设计中非常重要的一部分,它主要包括传感器数据采集和数据处理等方面。

(1)传感器数据采集:DS18B20可以通过单总线接口进行数据采集,基于单总线协议,可以实现多个传感器的并行测量。

在软件设计中,需要使用相应的驱动程序来实现对传感器的读取,并通过相应的接口将数据传输给控制器。

(2)数据处理:采集到的温度数据需要进行处理,可以选择直接将数据输出,也可以进行一些算法处理,如平均值滤波、差值滤波等,以提高数据的稳定性和准确性。

四、系统测试设计完成后,需要进行系统测试以验证设计的正确性和可靠性。

1.传感器测试:首先需要测试传感器的准确性和响应时间等指标,可以将传感器置于稳定温度环境下,并使用标准温度计进行对比,以验证传感器的准确性。

温度传感器DS18B及LCD1602的使用

温度传感器DS18B及LCD1602的使用

温度传感器DS18B及LCD1602的使用温度传感器DS18B20是一种数字温度传感器,可以通过单线数字接口与单片机进行通信。

它采用了Dallas的1-Wire总线协议,具有高精度、低功耗、长传输距离等特点。

而LCD1602是一种常用的字符型液晶显示屏,可以显示16×2个字符。

使用DS18B20温度传感器需要先进行硬件连接。

它需要三个引脚,即VCC、GND和DQ。

VCC连接到3.3V或5V电源,GND连接到地线,DQ连接到单片机的一个GPIO口。

在连接时要注意使用上拉电阻将DQ引脚连接到VCC,以确保通信的可靠性。

在软件方面,需要使用1-Wire总线的协议进行通信。

可以使用基于C语言或者Arduino的库来实现。

在Arduino中,可以使用OneWire库来方便地读取DS18B20的数据。

首先需要创建一个OneWire对象,并指定DQ引脚,然后在setup(函数中初始化该对象。

接下来在loop(函数中可以使用`reset_search(`函数来连接的设备,并通过`search(`函数来获取设备的地址。

而后使用`reset(`函数重置总线,`select(`函数选择设备进行通信,`write(`函数发送指令,`read(`函数读取数据。

其中,读取温度数据需要先发送读取温度的指令,使用`read_bytes(`函数读取9个字节的数据,低字节在前,高字节在后,然后将读取到的数据处理转换为摄氏温度。

接下来是LCD1602的使用。

LCD1602需要连接到单片机的多个引脚,包括VCC、GND、SCL、SDA等。

在Arduino中,可以使用LiquidCrystal库来方便地控制LCD1602、首先需要创建一个LiquidCrystal对象,并指定连接的引脚,然后在setup(函数中初始化该对象。

接下来可以使用一系列函数来向LCD1602写入数据,如`begin(`函数用于初始化LCD1602,`print(`函数用于显示字符,`setCursor(`函数用于设置光标位置等。

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

1.1、来源在人类的生活环境中,温度扮演着极其重要的角色。

无论你生活在哪里,从事什么工作,无时无刻不在与温度打着交道。

温度无时无刻不在,同样也时时刻刻都在变化,为了让人们能更直观的看出此时此刻此地的实时温度,我就利用了单片机来完成这一功能。

1.2、意义温度的检测与控制在现代经济与社会中有举足轻重的地位,与我们的生活息息相关,密不可分,越发占有一席之地。

例如在储粮仓库、智能楼宇、空调控制及其他的工农业生产和科学研究中应用广泛。

在温度的检测与控制方面,DS18B20小型温度检测系统及其数字温度传感器有许多突出的优点,其通过单总线与单片机连接,系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度检测,因此对于我们来设计并研究基于DS18B20的温度检测系统有主要的现实意义,从一方面讲这不仅对于工农业的发展,更对于国防的巩固与建设起到重要的作用;另一方面,本设计能够在一定程度上提高自己的单片机开发能力。

1.3、目的(1)本实验要实现的是通过DS18B20温度传感器采集温度并在LCD上显示,并学会使用单片机控制DS18B20此类单总线器件,并对数字温度传感器DS18B0进行时序分析。

(2)更进一步了解LCD1602的应用。

(3)掌握单片机与PC的远程通信。

2、课题承担人员及分工说明*********:(1)主要负责电路板的制作、焊接与调试。

(2)电路的仿真。

(3)温度主要程序的编写与调试。

**********:(1)Protel画板,材料的收集。

(2)串口的调试与程序编写。

(3)VB界面的设计和上位机程序的编写。

二、课题总体设计说明1、说明总体开发计划和课题所达到的功能目标和技术指标1.1、总体开发计划1.1.1、基本功能(1)以数字传感器DS1820作为前端采集温度,经过单片机处理后,将外部的温度显示在液晶屏上。

(2)可用通过独立式按键来设定温度的上限值和下限值,当坏境温度超过上限值或低于下限值时蜂鸣器会自动报警,并在液晶屏上提示温度大于上限值或温度小于下限值。

(3)当单片机检测到DS18B20存在时会在在LCD1602上显示“DS18B20 Succes”,反之则显示“DS18B20 is Wrong,TEMP is No on”。

1.1.2、扩展功能以数字传感器DS1820作为前端采集温度,经过单片机处理后,再通过串口通信,把实时温度值、上限值和下限值显示在用VB语言编辑的计算机软件的界面上并显示出实时温度的变化曲线,当实时温度超过所设定的上限值和下限值时会在用VB语言编辑的计算机软件的界面上提示当前温度超过上限值或下限值,模拟实现设备与计算机的通信,通过计算机对设备的温度检测以及实时监控。

1.2、课题所达到的功能目标和技术指标(1)能在LCD1602上准确的显示出实时温度;(2)独立式按键能设置报警温度的上限值、下限值和查看所设定的上限值、下限值;(3)当温度大于上限值或低于下限值时蜂鸣器会报警;(4)通过串口和PC机连接,能够把实时温度值、上限值和下限值显示在用VB语言编辑的计算机软件的界面上并显示出实时温度的变化曲线,当实时温度超过所设定的上限值和下限值时会在用VB语言编辑的计算机软件的界面上提示当前温度超过上限值或下限值。

总之,课题所达到的功能和技术指标与前期计划的一样。

2、计划课题总体设计方案,比较几个备选方案,确定最终方案(1)本系统的温度检测有两套方案方案一:采用AD590,使用AD590作为温度传感器,需要进行电流电压变换,电压放大以及A/D转换。

方案二:采用DS18B20作为温度传感器进行温度测量。

DS18B20可以满足从-55摄氏度到+125摄氏度测量范围,在一秒内把温度转化成数字,测得的温度值的存储在两个八位的RAM中,单片机直接从中读出数据转换成十进制就是温度,使用方便。

另外采用外加电源供电对DS18B20的VDD引脚供电。

它的好处是无须MOSFET,而且在温度转换期间总线可自由搭载其它器件。

它试用于对性能要求不高,成本严格控制的应用,是经济型产品。

它具有线性好、精度适中、灵敏度高、体积小和使用方便等优点,得到广泛应用。

因为AD590需要模拟转数字电路,精确度低,测温点数少对线阻有要求,电路繁多,成本也较高,故本系统采用方案二。

(2)本系统的显示有两套方案方案一:数码管显示方案二:液晶显示采用1602字符型LCD,它是一种专门用于显示字母、数字、符号等点阵式LCD。

其有显示质量高、数字接口、功耗低、体积小等优点。

因为数码管只能显示数字和简单的字母,LCD可以显示字符,图形等,并能更形象的体现出字符与图像。

故本系统采用方案二。

(3)按键的选择方案一:行列式按键方案二:独立式按键独立式按键电路配置灵活,硬件结构简单,但每个按键必须占用一根I/O口线。

在按键数量较多时,I/O口浪费较大。

故只在按键数量不多时,采用这种按键。

因为本系统只用到4个按键且I/O口够用,所以采用方案二。

(4)单片机的选择本系统采用了51单片机,其体积小巧,携带方便,价格便宜。

且USB接口通讯及供电,通讯速度快,无须外接电源。

51单片机有一个全双工的串通信口,非常适合与电脑进行通信。

三、硬件设计说明1、硬件总体设计方案1.1、硬件设计目标本系统中通过温度传感器DS18B20的数据线DQ与主控芯片51单片机的P3.3相连接,DS18B20将采集到的数据送给单片机,经过单片机出来后,显示在8位数据线与单片机P0口的液晶LCD上。

蜂鸣器经过三极管9012的驱动后接到单片机的P3.7,来实现当实时温度大于下限或高于上限的报警。

4个按键K1~K4接到单片机的P1.0~P1.4,来实现对上限值和下限值的查看与设定。

串口经过MAX232的电平转换后R1 OUT和T1 IN接到单片机的RXD与TXD来实现与用VB语言编辑的计算机软件的界面间的通信。

液晶LCD的RS、—W/R、E分别接到单片机的P2.0~P2.2来实现单片机控制液晶的读写命令和数据的控制。

1.2、硬件功能模块划分(1)AT89S51:实现对整个系统的控制。

(2)DS18B20、LCD1602:温度传感器DS18B20的数据线DQ与主控芯片51单片机的P3.3相连接,DS18B20将采集到的数据送给单片机,经过单片机处理后,显示在8位数据线与单片机P0口的液晶LCD上。

(3)按键输入:对报警温度上限值TH和下限值TL的设置。

(4)串口通信:实现与与用VB语言编辑的计算机软件的界面间的通信。

1.3、主控芯片和关键元器件的选型、接口和连接方式定义1.3.1、主控芯片和关键元器件的选型(1)主控芯片:A T89S51(2)温度采集:DS18B20(3)按键:独立式按键(K1~K4)(4)显示:LCD1602(5)串口:通过MAX232与单片机的10脚11脚相连(6)报警:蜂鸣器1.3.2、接口和连接方式定义(1)液晶LCD1602的数据和指令选择控制端RS接到单片机的P2.0,读写控制—W/R接到单片节的P2.1,数据读写控制位E接到单片机的P2.2,8位数据线DB0~DB7接到单片机的P0口。

(2)4个按键K1~K4分别接到单片机的P1.0~P1.3。

(3)蜂鸣器接到单片机的P3.7。

(4)DS18B20的DQ接到单片机的P3.3.2、硬件单元设计(1)主控电路:实现对整个系统的控制(2)串口通信电路:串口经过MAX232的电平转换后R1 OUT和T1 IN接到单片机的RXD 与TXD来实现与用VB语言编辑的计算机软件的界面间的通信。

(3)液晶LCD1602、DS18B20电路:温度传感器DS18B20的数据线DQ与主控芯片51单片机的P3.3相连接,DS18B20将采集到的数据送给单片机,经过单片机处理后,显示在8位数据线与单片机P0口的液晶LCD上。

(4)按键、蜂鸣器电路:按键K1用来查看所设置的上限温度TH、下限温度TL和设置上限温度TH、下限温度TL增加或减少的切换,K2用来设置上限温度TH,K3用来设置下限温度TL和查看上限温度和下限温度的退出,K4是设置好上限温度和上限温度的确定键;蜂鸣器用来当实时温度大于TH或TL的报警。

四、软件设计说明1、软件总体设计方案1.1、软件设计目标(1)结构合理程序应该采用结构模块化设计。

这不仅有利于程序的进一步扩充,而且也有利于程序的修改和维护。

在程序编程时,要尽量使得程序的层次分明。

易于阅读和理解,同时还可以简化程序减小程序对于内存的使用量,当程序中有经常需要加以修改或变化的参数时,应该设计成独立的参数传递群序,避免程序的频繁修改。

(2)操作性能好操作性能好是指使用方便。

这点是、对数据采集系统来说是很重要的。

在开发程序时,应该考虑如何降低对操作人员专业知识的要求。

(3)系统应设计一定的检测程序例如状态检测利于诊断程序,以便系统发生故障时容易确定故障部位,对于重要的参数要定时存储,以防止因掉电而丢失数据。

(4)提高程序的执行速度。

2、软件设计2.1、主程序主程序首先设置堆栈为5FH,设置定时器工作方式T1为方式2,设置串口方式。

接着开始启动定时器,调用LCD初始化子程序,调用DS18B20复位子程序去判断DS18B20是否存在,如果存在调用显示“success”子程序,接着调用上下限写入暂存器子程序,把EEROM 里的温度报警值拷贝回暂存器,调用读取温度子程序,调用处理显示子程序,调用实际温度值与标记温度值比较子程序,调用按键扫描子程序后返回到调用读取温度子程序;如果DS18B20不存在,则调用显示“wrong”信息子程序后返回到调用DS18B20复位子程序。

(1)流程图(2)重要代码2.2、键扫描子程序按键扫描子程序首先判断按键K1是否按下,如果按下就掉用鸣响子程序,接着判断K1是否放开,直到K1放开,存M-ALAX表,调用显示字符子程序,然后去判断K3是否按下,直到K3按下,调用鸣响子程序,调用显示“OK”信息子程序,最后放回;如果K1没有按下去判断K2是否按下,如果没按下就跳到返回,如果有按下就调用鸣响子程序,然后去判断K3是否放开直到K3放开才存TA1表,接着调用显示字符子程序,调用设定报警TH、TL子程序,调用报警上下限写入暂存器子程序,调用报警值拷贝EEROM子程序,最后跳到调用显示“OK”信息子程序。

(1)流程图2.3、LCD显示子程序LCD显示子程序开始先让LCD初始化,接着光标定位,显示字符,最后放回。

(1)流程图五、软硬件调试说明1、硬件性能测试(1)LCD 测试:通过单片机小系统将所需要的字符送给LCD,LCD能正常显示出所送内容,且LCD的亮度可调。

(2)按键与蜂鸣器:通过单片机小系统使蜂鸣器受按键的控制,即按下按键蜂鸣器响,放开即停。

相关文档
最新文档