基于DS18B20的lcd1602的温度检测系统
DS18B20与LCD1602的测温显示程序

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的温度检测系统

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显示#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显示出来,并输出控制电路原理图程序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设计的温度报警器课程设计

程设计温度报警器共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显示温度电路图(附代码)*重要注:图中没有画出单片机最小系统,另外在实际焊接中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显示

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文档良心出品)

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();//显示}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)按键与蜂鸣器:通过单片机小系统使蜂鸣器受按键的控制,即按下按键蜂鸣器响,放开即停。