DS18B20与LCD1602的测温显示程序
ds18b20温度传感C语言程序、LCD1602显示

程序主体#include<reg52.h>#define uchar unsigned char#define uint unsigned intextern TemperatuerResult(); //声明引用外部函数extern unsigned int idata Temperature;sbit lcd_e=P2^7;sbit lcd_rs=P2^6;sbit lcd_rw=P2^5;void delay_ms(uchar i) //延时毫秒{int j;for(i;i>0;i--)for(j=110;j>0;j--);}bit lcd_check() //检测忙{bit result;lcd_rs=0;lcd_rw=1;lcd_e=1;delay_ms(1);result=(bit)(P0&0x80);lcd_e=0;return (result);}void write_cmd(uchar cmd) //向lcd写命令{while(lcd_check());lcd_rs=0;delay_ms(1);lcd_rw=0;delay_ms(1);P0=cmd;delay_ms(1);lcd_e=1;delay_ms(1);lcd_e=0;}void write_data(uchar shuju) //向lcd写数据{while(lcd_check());lcd_rs=1;delay_ms(1);lcd_rw=0;delay_ms(1);P0=shuju;delay_ms(1);lcd_e=1;delay_ms(1);lcd_e=0;}void lcd_init() //初始化{delay_ms(15);write_cmd(0x38);delay_ms(5);write_cmd(0x0c);delay_ms(5);write_cmd(0x06);delay_ms(5);write_cmd(0x01);}void display(uchar i,uchar j,uchar shuju) //在指定位置显示{write_cmd(0x80+j*0x40+i);delay_ms(1);write_data(shuju);delay_ms(1);}void main(){lcd_init();while(1){TemperatuerResult();display(0,0,'T');display(1,0,'e');display(2,0,'m');display(3,0,'p');display(4,0,'e');display(5,0,'r');display(6,0,'a');display(7,0,'t');display(8,0,'u');display(9,0,'r');display(10,0,'e');display(11,0,' ');display(12,0,'i');display(13,0,'s');display(0,1,(Temperature/16%10000/1000+0x30));display(1,1,(Temperature/16%1000/100+0x30));display(2,1,(Temperature/16%100/10+0x30));display(3,1,(Temperature/16%10+0x30));display(4,1,'.');display(5,1,(Temperature*10/16%10+0x30));display(6,1,'`');display(7,1,'C');}}温度采集子程序/*************************此部分为18B20的驱动程序*************************************/#include <reg52.H>#include <intrins.h>sbit D18B20=P3^7;#define NOP() _nop_() /* 定义空指令*/#define _Nop() _nop_() /*定义空指令*/bit flag;unsigned int idata Temperature;unsigned char idata temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID 为8字节unsigned char idata id_buff[8];unsigned char idata *p,TIM;unsigned char idata crc_data;//************************************************************void TempDelay (unsigned char idata us){while(us--);}//************************************************************void Init18b20 (void){D18B20=1;_nop_();D18B20=0;TempDelay(80); //delay 530 uS//80_nop_();D18B20=1;TempDelay(14); //delay 100 uS//14_nop_();_nop_();_nop_();if(D18B20==0)flag = 1; //detect 1820 success!elseflag = 0; //detect 1820 fail!TempDelay(20); //20_nop_();_nop_();D18B20 = 1;}//************************************************************ void WriteByte (unsigned char idata wr) //单字节写入{unsigned char idata i;for (i=0;i<8;i++){D18B20 = 0;_nop_();D18B20=wr&0x01;TempDelay(3); //delay 45 uS //5_nop_();_nop_();D18B20=1;wr >>= 1;}}//************************************************************ unsigned char ReadByte (void) //读取单字节{unsigned char idata i,u=0;for(i=0;i<8;i++){D18B20 = 0;u >>= 1;D18B20 = 1;if(D18B20==1)u |= 0x80;TempDelay (2);_nop_();}return(u);}//************************************************************ void read_bytes (unsigned char j){unsigned char idata i;for(i=0;i<j;i++){*p = ReadByte();p++;}}//************************************************************ void TemperatuerResult(void){Init18b20 ();WriteByte(0xcc); //skip romWriteByte(0x44); //Temperature convertInit18b20 ();WriteByte(0xcc); //skip romWriteByte(0xbe); //read Temperaturep = temp_buff;read_bytes (2);Temperature = temp_buff[1]*0x100 + temp_buff[0];TempDelay(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;。
DS18B20 PIC测温用1602显示温度C程序

DS18B20+PIC测温用1602显示温度C程序//熟悉使用单片机运用DS18B20温度传感器测试温度,并用1602显示屏显示温度//1、第一行显示:Temperature//2、第二行显示:实测温度值//*********************************************** ***//*********************************************** ***//硬件设置://1、SW2,SW4开关全部断开//2、插上DS18B20温度传感器//*********************************************** ***//*********************************************** ***//*****************定义头文件**********************//**************************************************#include;#include "delay.h"//*********************************************** ***//******************定义配置位*********************//*********************************************** ***__CONFIG(0x3545);//FLASH代码不保护,RB6和RB7为调试模式,FLASH不写保护,数据代码不保护//RB3为数字IO口,低电压复位使能,上电延时开,看门狗开,4M晶体XT振荡器//*********************************************** ***//******************定义常量***********************//*********************************************** ***#define uchar unsigned char#define uint unsigned int//*********************************************** ***//***************定义DS18B20引脚*******************//*********************************************** ***#define DQRE0#define DQ_IO TRISE0//*********************************************** ***//******************定义LCD引脚*********************//*********************************************** ***#define RS RA1#define RW RA2#define E RA3//*********************************************** ***//******************定义变量***********************//*********************************************** ***uchar lowtemp,hightemp; //低8位温度变量,高8位温度变量uchar zhengshu,xiaoshu; //温度整数变量,温度小数变量uint temperature;//转换后的温度值BCD码形式uchar temp[7];//转换后温度存放变量//*********************************************** ***//******************定义数据***********************//**************************************************//显示: Temperature//显示:WWW*PICAVR*COMconst uchar name[16]=//{0x20,0x20,0x20,0x54,0x65,0x6d,0x70,0x65,0x72,0x61,0x74,0x75,0x72,0x65,0x20,0x20};{0x20,0x57,0x57,0x57,0x2E,0x50,0x49,0x43,0x41,0x5 6,0x52,0x2E,0x43,0x4F,0x4D,0x20};//*********************************************** //函数名:delayms(uchar time);//入口参数:time//出口参数:无//函数作用:毫秒延时//说明://*********************************************** void delayms(uchar time){uint i;while(time--){for(i=93;i>;0;i--){;}}}//*********************************************** //函数名:port_init();//入口参数:无//出口参数:无//函数作用:端口初始化//说明://*********************************************** void port_init(void){ADCON1=0X07;//设置RA,RE口为数字口TRISA=0X00;//设置RA口为输出口TRISD=0X00;//设置RD口为输出口TRISE=0X00;//设置RE口为输出口OPTION=0X8F;//分频给WDT,分频比为128}//*********************************************** //函数名:lcd_enable();//入口参数:无//出口参数:无//函数作用:LCD写使能//说明://*********************************************** void lcd_enable(void){RS=0;//写命令RW=0;//写操作E=0;//低电平信号delayms(10); //低电平信号保持E=1;//拉高电平信号}//*********************************************** //函数名:lcd_writebyte(uchar data);//入口参数:data//出口参数:无//函数作用:LCD写一个字节数据//说明://*********************************************** void lcd_writebyte(uchar data){PORTD=data;//向RD口写数据RS=1;//写数据RW=0;//写操作E=0;//低电平信号delayms(10); //低电平信号保持E=1;//拉高电平信号}//*********************************************** //函数名:lcd_writedata(const uchar *ptt);//入口参数:*ptt//出口参数:无//函数作用:LCD写数据块函数//说明://*********************************************** void lcd_writedata(const uchar *ptt){uchar i;for(i=0;i;0;i--)//写8位数据{temp=data&0x01;//先写低位数据DQ_IO=0;//设置RE0为输出口DQ=0;//RE0输出低电平DelayUs(1);//延时6us(15us之内把数据送到总线上)if(temp){DQ_IO=1;} //设置RE0为输入口(写1时序) DelayUs(25);//延时61us(总线采样时间15-60us)DQ_IO=1;//设置RE0为输入口(写0时序)DelayUs(1);//延时6us(写第二位时间间隙大于1us)data=data>;>;1;//右移一位}}//*********************************************** //函数名:ds18b20_readbyte();//入口参数:无//出口参数:无//函数作用:DS18B20读一个字节数据//说明://*********************************************** unsigned char ds18b20_readbyte(void){uchar i,data=0;//读出温度for(i=8;i>;0;i--)//读8位数据{data=data>;>;1;//数据先右移一位DQ_IO=0;//设置RE0为输出口DQ=0;//RE0输出低电平DelayUs(1);//延时6us(低电平时间大于1us)DQ_IO=1;//拉高总线,产生读时间间隙(设置RE0为输入口) DelayUs(1);//延时6us(从拉低电平开始15us之内完成读位)if(DQ){data=data|0x80;} //先读高位数据,高位为1else {data=data|0x00;} //高位为0DelayUs(25);//延时61us(从拉低电平开始60-120us之内释放总线)}return(data);}//*********************************************** //函数名:read_ds18b20_data();//入口参数:无//出口参数:无//函数作用:读DS18B20测试的温度数据//说明://*********************************************** void read_ds18b20_data(void){DQ_IO=1;//设置RE0为输入口ds18b20_reset();//调用复位函数ds18b20_writebyte(0XCC);//跳过ROM匹配ds18b20_writebyte(0X44);//发送温度变换命令ds18b20_reset();//再次复位ds18b20_writebyte(0XCC);//跳过ROM匹配ds18b20_writebyte(0XBE);//发送读温度命令lowtemp=ds18b20_readbyte();//读出低8位温度值hightemp=ds18b20_readbyte();//读出高8位温度值DQ_IO=1;//释放总线zhengshu=((lowtemp>;>;4)|(hightemp<<4))&0X3F; xiaoshu=lowtemp<<4;temp[0]=(zhengshu/100)%10;//整数百位temp[1]=(zhengshu/10)%10;//整数十位temp[2]=zhengshu%10;//整数个位temperature=0;if(xiaoshu&0x80)//下面是把小数部分转换为BCD码形式 {temperature+=5000;}if(xiaoshu&0x40){temperature+=2500;}if(xiaoshu&0x20){temperature+=1250;}if(xiaoshu&0x10){temperature+=625;}temp[3]=(temperature/1000)%10;//十分位temp[4]=(temperature/100)%10;//百分位temp[5]=(temperature/10)%10;//千分位temp[6]=temperature%10;//万分位DelayUs(1);//延时6us}//*********************************************** //函数名:lcd_display_temp();//入口参数:无//出口参数:无//函数作用:LCD显示测试温度程序//说明://*********************************************** void lcd_display_temp(void){PORTD=0X80;//设置第1行显示地址lcd_enable();lcd_writedata(name);//调用显示函数PORTD=0XC0;//设置第2行显示地址lcd_enable();//调用写使能函数lcd_writebyte(0x20);lcd_writebyte(0x20);lcd_writebyte(0x20);if(temp[0]==0){lcd_writebyte(0x20);}else{lcd_writebyte(temp[0]+0x30);}lcd_writebyte(temp[1]+0x30);lcd_writebyte(temp[2]+0x30);lcd_writebyte(0x2e);lcd_writebyte(temp[3]+0x30);lcd_writebyte(temp[4]+0x30);lcd_writebyte(temp[5]+0x30);lcd_writebyte(temp[6]+0x30);lcd_writebyte(0x20);lcd_writebyte(0x43);lcd_writebyte(0x20);lcd_writebyte(0x20);lcd_writebyte(0x20);}//*********************************************** //函数名:main();//入口参数:无//出口参数:无//函数作用:MAIN函数//说明://*********************************************** void main(void){port_init();//调用端口初始化函数lcd_init();//调用LCD初始化函数while(1){read_ds18b20_data(); //调用温度转换函数CLRWDT();//清看门狗lcd_display_temp(); //调用温度显示函数}}。
51单片机lcd1602显示温度源程序18b20测温

LCD1 twice/////////////////////////////////////////////////////III ////// ======================================= //b5E2RGbCAP //// ===作者:Ni 的年少 W A O 轻狂========== //// plEanqFDPw //// ===创建时间:2008.07.03 ========== //// DXDiTa9E3d/// =======================================////RTCrpUDGiT///// 5PCzVD7HxA//////////////////////////////////////////////////////jLBHrnAlLg//////////////////////////////////// ///// DS18b20 温度传感器////////////////////////////////////////////*注:1、当用到循环左移或右移时 <>> 或 <<),不能超出变的范围例如:un sig ned char i,j 。
j=(i<<8>>>4得到的结果出错。
un sig ned char j 。
unsignedint i 。
j=(i<<8>>>4。
- b i»'is'PODXADClKTAL2RSTFu 1/ADl P&.2XAD2 PD 3怕D3 FO.OAIK P0.«/AM P0.7XAD7 卩工唤PSEN 叱担⑴ P2.-3/A11 ALE P2.4/A1JEAP1J 5JA1SP2J8M14P2.7;A15 P1.D P3.O/RXDP1.1 PM ™ PI.2 P3.2/INTD PI.3 P3 3/INTIPI.4PI.5 F3.57T1Pl.6 p 财硕 PI.7F3.7/1RDNOU TEF1P : -49 163°iishenton9弍 ... I:.代「旳匚引203Q_3i 85SBSaBb?4 毎--R1J weDOOND ••3S1SB2F「:斗It 26,2L28 16得到的结果正确••…2、LCD 的清屏时间 ——1.64ms 。
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程序(含1602显示液晶程序)

lcden=0;
write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c); //设置开显示,不显示光标
write_com(0x06); //写一个字符后地址指针加1
write_com(0x01); //显示清0,数据指针清0
{
uint i; //初始化,先将数据线置高电平(单片机管脚默认高电平,故不用拉高),延时,时间尽可能短
ds=0; //数据线拉到低电平0
i=103;
while(i>0)i--; //循环执行相当于延时,延时480-960us,一条指令周期相当于1~4个及其周期(1us)
b=tempread(); //读高8位
temp=b;
temp<<=8; //temp=temp<<8,左移8位
temp=temp|a; //两个8位数据合并成一个数据,两个字节组合为1个字
f_temp=temp*0.0625; //温度在寄存器中为12位 分辨率位0.0625°
{
do
{
SBUF = *parr++; //发送数据
while(!TI); //等待发送完成标志为1
TI =0; //标志清零
}while(*parr); //保持循环直到字符为'\0'
uint temp;
float f_temp;
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
多个18B20测温度1602液晶显示C语言程序

/*-----------------------------------------------名称:DS18b20 温度检测液晶显示论坛:编写:shifang日期:2009.5修改:无内容:------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<stdio.h>#include "18b20.h"#include "18b20a.h"#include "1602.h"#include "delay.h"bit ReadTempFlag;//定义读时间标志void Init_Timer0(void);//定时器初始化/*------------------------------------------------串口通讯初始化------------------------------------------------*/void UART_Init(void){SCON = 0x50; // SCON: 模式1, 8-bit UART, 使能接收TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装TH1 = 0xFD; // TH1: 重装值9600 波特率晶振11.0592MHzTR1 = 1; // TR1: timer 1 打开//EA = 1; //打开总中断//ES = 1; //打开串口中断TI=1;}/*------------------------------------------------主函数------------------------------------------------*/void main (void){int temp;float temperature;char displaytemp[16];//定义显示区域临时存储数组LCD_Init(); //初始化液晶DelayMs(20); //延时有助于稳定LCD_Clear(); //清屏Init_Timer0();UART_Init();Lcd_User_Chr(); //写入自定义字符LCD_Write_Char(13,0,0x01);//写入温度右上角点LCD_Write_Char(14,0,'C'); //写入字符CLCD_Write_Char(13,1,0x01);//写入温度右上角点LCD_Write_Char(14,1,'C'); //写入字符Cwhile (1) //主循环{if(ReadTempFlag==1){ReadTempFlag=0;temp=ReadTemperature();temperature=(float)temp*0.0625;sprintf(displaytemp,"Temp1 %7.3f",temperature);//打印温度值LCD_Write_String(0,0,displaytemp);//显示第二行temp=ReadTemperature_a();temperature=(float)temp*0.0625;sprintf(displaytemp,"Temp2 %7.3f",temperature);//打印温度值LCD_Write_String(0,1,displaytemp);//显示第二行}}}/*------------------------------------------------定时器初始化子程序------------------------------------------------*/void Init_Timer0(void){TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响//TH0=0x00; //给定初值//TL0=0x00;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}/*------------------------------------------------定时器中断子程序------------------------------------------------*/void Timer0_isr(void) interrupt 1{static unsigned int num;TH0=(65536-2000)/256; //重新赋值2ms TL0=(65536-2000)%256;num++;if(num==600) //{num=0;ReadTempFlag=1; //读标志位置1}}/*------------------------------------------------读取一个字节------------------------------------------------*/unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;DelayUs2x(25);}return(dat);}/*------------------------------------------------写入一个字节------------------------------------------------*/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;DelayUs2x(25);DQ = 1;dat>>=1;}DelayUs2x(25);}/*------------------------------------------------读取温度------------------------------------------------*/unsigned int ReadTemperature(void){unsigned char a=0;unsigned int b=0;unsigned int t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换DelayMs(10);Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar(); //低位b=ReadOneChar(); //高位b<<=8;t=a+b;return(t);}/*-----------------------------------------------名称:18B20温度传感器网站:编写:shifang日期:2009.5修改:无内容:18B20单线温度检测的应用样例程序------------------------------------------------*/#include"delay.h"#include"18b20a.h"/*------------------------------------------------18b20初始化------------------------------------------------*/bit Init_DS18B20_a(void){bit dat=0;DQ1 = 1; //DQ1复位DelayUs2x(5); //稍做延时DQ1 = 0; //单片机将DQ1拉低DelayUs2x(200); //精确延时大于480us 小于960us DelayUs2x(200);DQ1 = 1; //拉高总线DelayUs2x(50); //15~60us 后接收60-240us的存在脉冲dat=DQ1; //如果x=0则初始化成功, x=1则初始化失败DelayUs2x(25); //稍作延时返回return dat;}/*------------------------------------------------读取一个字节------------------------------------------------*/unsigned char ReadOneChar_a(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ1 = 0; // 给脉冲信号dat>>=1;DQ1 = 1; // 给脉冲信号if(DQ1)dat|=0x80;DelayUs2x(25);}return(dat);}/*------------------------------------------------写入一个字节------------------------------------------------*/void WriteOneChar_a(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--)DQ1 = 0;DQ1 = dat&0x01;DelayUs2x(25);DQ1 = 1;dat>>=1;}DelayUs2x(25);}/*------------------------------------------------读取温度------------------------------------------------*/unsigned int ReadTemperature_a(void){unsigned char a=0;unsigned int b=0;unsigned int t=0;Init_DS18B20_a();WriteOneChar_a(0xCC); // 跳过读序号列号的操作WriteOneChar_a(0x44); // 启动温度转换DelayMs(10);Init_DS18B20_a();WriteOneChar_a(0xCC); //跳过读序号列号的操作WriteOneChar_a(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar_a(); //低位b=ReadOneChar_a(); //高位b<<=8;t=a+b;return(t);}#include "delay.h"/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t)while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*------------------------------------------------判忙函数------------------------------------------------*/bit LCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/void LCD_Write_Com(unsigned char com)while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/void LCD_Write_Data(unsigned char Data){while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/void LCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {if (y == 0){LCD_Write_Com(0x80 + x); //表示第一行}else{LCD_Write_Com(0xC0 + x); //表示第二行}while (*s){LCD_Write_Data( *s);s ++;}}/*------------------------------------------------写入字符函数------------------------------------------------*/void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {if (y == 0){LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}/*------------------------------------------------初始化函数------------------------------------------------*/void LCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/}/*------------------------------------------------设定二个自定义字符,LCD1602中自定义字符的地址为0x00--0x07,即可定义8个字符这里我们设定把一个自定义字符放在0x00位置(000),另一个放在0x01位子(001)------------------------------------------------*/void Lcd_User_Chr(void){ //第一个自定义字符LCD_Write_Com(0x40); //"01 000 000" 第1行地址(D7D6为地址设定命令形式 D5D4D3为字符存放位置(0--7),D2D1D0为字符行地址(0--7))LCD_Write_Data(0x00); //"XXX 11111" 第1行数据(D7D6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭)LCD_Write_Com(0x41); //"01 000 001" 第2行地址LCD_Write_Data(0x04); //"XXX 10001" 第2行数据LCD_Write_Com(0x42); //"01 000 010" 第3行地址LCD_Write_Data(0x0e); //"XXX 10101" 第3行数据LCD_Write_Com(0x43); //"01 000 011" 第4行地址LCD_Write_Data(0x0e); //"XXX 10001" 第4行数据LCD_Write_Com(0x44); //"01 000 100" 第5行地址LCD_Write_Data(0x0e); //"XXX 11111" 第5行数据LCD_Write_Com(0x45); //"01 000 101" 第6行地址LCD_Write_Data(0x1f); //"XXX 01010" 第6行数据LCD_Write_Com(0x46); //"01 000 110" 第7行地址LCD_Write_Data(0x04); //"XXX 11111" 第7行数据LCD_Write_Com(0x47); //"01 000 111" 第8行地址LCD_Write_Data(0x00); //"XXX 00000" 第8行数据//第二个自定义字符LCD_Write_Com(0x48); //"01 001 000" 第1行地址LCD_Write_Data(0x03); //"XXX 00001" 第1行数据LCD_Write_Com(0x49); //"01 001 001" 第2行地址LCD_Write_Data(0x03); //"XXX 11011" 第2行数据LCD_Write_Com(0x4a); //"01 001 010" 第3行地址LCD_Write_Data(0x00); //"XXX 11101" 第3行数据LCD_Write_Com(0x4b); //"01 001 011" 第4行地址LCD_Write_Data(0x00); //"XXX 11001" 第4行数据LCD_Write_Com(0x4c); //"01 001 100" 第5行地址LCD_Write_Data(0x00); //"XXX 11101" 第5行数据LCD_Write_Com(0x4d); //"01 001 101" 第6行地址LCD_Write_Data(0x00); //"XXX 11011" 第6行数据LCD_Write_Com(0x4e); //"01 001 110" 第7行地址LCD_Write_Data(0x00); //"XXX 00001" 第7行数据LCD_Write_Com(0x4f); //"01 001 111" 第8行地址LCD_Write_Data(0x00); //"XXX 00000" 第8行数据}。
DS18B20温度1602显示程序

{
write1602_com(0x38);
write1602_com(0x0c);
write1602_com(0x06);
write1602_com(0x01);
}
void display(uint temp)
delay(1000);// 启动温度转换,需要750ms
readtemp(); // 读取温度
while(1)
{
display1();
convert();
display(readtemp());
}
}
sbit en=P2^7; //连接1602 E脚
uchar code table[]="TEMP IS";
uchar tplsb,tpmsb; // 温度值低位、高位字节
uint temp;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P2^3; //连接DS18B20
sbit rs=P2^5; //连接1602 RS脚
sbit rw= P2^6; //连接1602 的R/W脚,可选择是否编译
delay(1);
write1602_date(a3+0x30);
delay(1);
52单片机DS18B20温度计(1602显示)

//按下K1显示序列码,按下K2显示实时温度(本实验适合初学者调试理解18B20用,)#include <reg52.h>//52单片机#define uchar unsigned char#define uint unsigned int //uint 无符号整数sbit DQ=P2^2; //单总线(与自己的开发板相匹配)uint temp; //温度uchar flag1; //符号sbit rs = P1^0; // 控制LCD (与自己的开发板相匹配)sbit rw = P1^1; // 控制LCD (与自己的开发板相匹配)sbit lcden = P2^5; //led使能端(与自己的开发板相匹配)sbit K1=P3^4; //独立按键k1(与自己的开发板相匹配)sbit K2=P3^5; //独立按键k2 (与自己的开发板相匹配)sbit du=P2^6; //位选(防LED灯乱闪)(与自己的开发板相匹配)sbit we=P2^7; //段选(防LED灯乱闪) (与自己的开发板相匹配)uchar a,b,c,d,e,f,g,h,A1,A2,A2t,A3,A4,A5;//写在LCD上的字符,具体在程序中看void delay(uint count) //延迟程序 (200*count)/8 毫秒{uint i;while(count){i=200;while(i>0)i--;count--;}}void DQreset(void) //初始化,主机将DQ拉高 (上升沿) (从机检测到上升沿后延时15到60毫秒,从机拉低总线60到240毫秒表示“我”在线){ //从机的工作是自动完成的uint i;DQ=0;i=103;while(i>0)i--;DQ=1;i=4;while(i>0)i--;}bit tmpreadbit() //从18b20读1位{uint i;bit dat;DQ=0;i++;DQ=1;i++;i++;dat=DQ;i=8;while(i>0)i--;return (dat); //返回dat}uchar tmpread() //从18b20读1字节{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) //18b20写1bit (只能用于写命令){uint i;uchar j;bit testb;for(j=1;j<=8;j++) //一位一位地传{testb=dat&0x01;dat=dat>>1;if(testb){DQ=0;i++;i++;DQ=1;i=8;while(i>0)i--;}else{DQ=0;i=8;while(i>0)i--;DQ=1;i++;i++;}}}void tmpchange(void) //温度转换子程序{DQreset();delay(1);tmpwritebyte(0xcc); //CCH跳过ROMtmpwritebyte(0x44); //44H温度转换}uint tmp() //读取温度子程序{float tt;uchar a,b;DQreset(); //无论什么命令, 首先都要发起初始化delay(1);tmpwritebyte(0xcc); //跳过ROM(本实验中实验板上只连接一块18B20) tmpwritebyte(0xbe); //读便签存储器(温度以二进制储存于BEH)a=tmpread(); //a为低八位b=tmpread(); //b为高八位temp=b;temp<<=8;temp=temp|a;tt=temp*0.0625; //二进制乘0.0625为十进制temp=tt*1000; //精度为0.001return temp;}void LCD_WriteCom(uchar )//LCD写入命令{rs = 0;rw = 0;P0 = ;delay(5);lcden = 0;delay(5);lcden = 1;delay(5);lcden = 0;}void LCD_WriteData(uchar dat)//LCD写入数据{rs = 1;rw = 0;lcden = 0;P0 = dat;delay(5);lcden = 1;delay(5);lcden = 0;delay(5);}void LCD_Init() //LCD初始化{LCD_WriteCom(0x38);delay(15);LCD_WriteCom(0x08);delay(3);LCD_WriteCom(0x01);delay(3);LCD_WriteCom(0x06);delay(3);LCD_WriteCom(0x0c);}void Display18B20Rom(char Rom) //display rom {uchar h,l;l = Rom & 0x0f;h = Rom & 0xf0;h >>= 4;if( ( h >= 0x00 )&&( h <= 0x09 ) )LCD_WriteData(h+0x30); elseLCD_WriteData(h+0x37);if( ( l >= 0x00 )&&( l <= 0x09 ) )LCD_WriteData(l+0x30); elseLCD_WriteData(l+0x37); }void temshow() //温度显示{//LCD_WriteCom(0x01); 写命令不能放在此位置DQreset(); //无论什么命令, 首先都要发起初始化tmpchange(); //温度转换(相当于读温度前的初始化)temp=tmp(); //读温度A1=temp/10000;A2=(temp%10000)/1000;A3=((temp%10000)%1000)/100;A4=(((temp%10000)%1000)%100)/10;A5=(((temp%10000)%1000)%100)%10;LCD_WriteCom(0x80) ;LCD_WriteData('t') ;LCD_WriteData('e');LCD_WriteData('m') ;LCD_WriteData('p') ;LCD_WriteData(':') ;LCD_WriteCom(0x80+0x40) ;LCD_WriteData('+') ;LCD_WriteData('0'+A1);LCD_WriteData('0'+A2) ;LCD_WriteData('.') ;LCD_WriteData('0'+A3) ;LCD_WriteData('0'+A4) ;LCD_WriteData('0'+A5) ;}void romshow() //序列码显示{LCD_Init();rw = 0;DQreset(); //无论什么命令, 首先都要发起初始化delay(1);tmpwritebyte(0x33); //读ROM,允许主机读出DS18B20的64为二进制序列码(仅限于总线上存在单只DS18B20)delay(1);a = tmpread();b = tmpread();c = tmpread();d = tmpread();e = tmpread();f = tmpread();g = tmpread();h = tmpread();LCD_WriteCom(0x80);//LCD第一行开始LCD_WriteData('n');LCD_WriteData('u');LCD_WriteData('m');LCD_WriteData('b');LCD_WriteData('e');LCD_WriteData('r');LCD_WriteCom(0x80+0x40);//lCD第二行开始Display18B20Rom(a);Display18B20Rom(b);Display18B20Rom(c);Display18B20Rom(d);Display18B20Rom(e);Display18B20Rom(f);Display18B20Rom(g);Display18B20Rom(h);}void main(){du=0;//(防LED灯乱闪)we=0;//(防LED灯乱闪)if(K2==0) //独立键盘k2按下{LCD_WriteCom(0x01);while(K1!=0) //用while循环实时扫描,当K1没被按下,一直扫描{temshow();}}if(K1==0) //独立键盘k1按下{LCD_WriteCom(0x01);romshow();}}。
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显示温度程序,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测温程序,使用51单片机,STC89C52。
1602的RW引脚连接单片机P2.1,E连接P2.2,1602数据口接单片机P0口。
DS18B20引脚连接P3^3。
#include<reg52.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件#define uint unsigned int#define uchar unsigned charsbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚//1602引脚定义sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚//1602数据口接单片机P0口sbit ds=P3^3; //DS18B20引脚定义uint temp;float f_temp;unsigned char code User[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//自定义字符℃/*****************************************************以下为1602模块语句***************************************************//*****************************************************函数功能:延时1ms***************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/void delay(unsigned int n){unsigned int i;for(i=0;i<n;i++)delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。
DS18B201602多点测温(51_C程序)解析

DS18B20多点测温(读序列,匹配序列,51 C程序,1602显示)由于本人在前两天找DS18B20多点测温(51 C程序),网上下载了很多,但是都不是很理想,后来,自己总结前人的知识,重新写了这个程序。
其中包括程序一:单个读序列号。
程序二,匹配并且读两个DS18B20,当然,读多个与读两个基本原理一样,只要加上其序列号等即可。
本程序所有显示都是用LCD1602显示。
程序一:度序列号,并用1602显示,1602从左到右分别是低到高位。
#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P2^3;//ds18b20与单片机连接口sbit RS=P2^5;sbit RW=P2^6;sbit EN=P2^7;unsigned char code str1[]={" "};unsigned char code str2[]={" "};uchar fCode[8];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;P0=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据//{ delay1ms(1);;RS=1;RW=0;EN=0;P0=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);}}void 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复位*/{ uchar x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480us DQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{ uchar i=0;uchar 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)/*写数据*/ {uchar 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 DispCode(){unsigned char i,temp;ds1820rst();ds1820wr(0x33);for (i=0;i<8;i++){fCode[i]=ds1820rd();}wr_com(0x80+0x40);for (i=0;i<8;i++){temp = fCode[i]>>4; //显示高四位if (temp<10)wr_dat(temp + 0x30);elsewr_dat(temp + 0x37);temp = fCode[i]&0x0f;//显示低四位if (temp<10)wr_dat(temp+ 0x30);elsewr_dat(temp + 0x37);}}/********************主程序***********************************/ void main(){init_play();//初始化显示DispCode(); //系列号显示delay1ms(1000);while(1){//read_temp();//读取温度// ds1820disp();//显示;}}程序二:匹配序列号,并读温度。
温度传感器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(`函数用于设置光标位置等。
基于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温度采集与1602显示程序

DS18B20温度采集与1602显示程序#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P1^4; //DS18B20口sbit LCD_RS=P2^7;sbit LCD_RW=P2^6;sbit LCD_EN=P2^5; //液晶有关控制位//unsigned char code str1[]={"welcome "};unsigned char code str2[]={"temp and 1602:"};unsigned char code str3[]={"temp: "};unsigned char data temp_data[2] = {0x00,0x00} ;unsigned char code mytab[8]= {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;uchar data disdata[5] = {0x00,0x00,0x00,0x00,0x00} ;uint tvalue;//温度值/*************延时程序***************/void delay1(int ms){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<250;j++);}void delay2( unsigned int k){unsigned int n;n=0;while(n < k){n++;}return;}/***********************************//***********lcd1602程序*************//***********************************//*************写指令****************/void lcd_wcmd(unsigned char cmd){delay1(1);LCD_RS=0;LCD_RW=0;LCD_EN=0;P0=cmd;delay1(1);LCD_EN=1;delay1(1);LCD_EN=0;}/*************写数据****************/void lcd_wdat(unsigned char dat){delay1(1);LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;delay1(1);LCD_EN=1;delay1(1);LCD_EN=0;}/*************初始化****************/void lcd_init(){delay1(15) ;lcd_wcmd(0x01) ; //清除LCD的显示内容lcd_wcmd(0x38) ; //16*2显示,5*7点阵,8位数据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) ; //清除LCD的显示内容delay1(5) ;}/**********设定显示位置*************/void lcd_pos(uchar pos){lcd_wcmd(pos | 0x80) ; //数据指针=80+地址变量}/***********************************//************DS18B20程序************//***********************************//***********ds1820初始化************/Init_DS18B20(void){DQ = 1 ; //DQ复位delay2(8) ; //稍做延时DQ = 0 ; //单片机将DQ拉低delay2(85) ; //精确延时大于480usDQ = 1 ; //拉高总线delay2(18) ;}/**********读一个字节数据*************/ ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ=1;delay2(1);DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay2(4);}return(dat);}/**********写一个字节数据*************/ WriteOneChar(unsigned char dat){unsigned char i = 0 ;for (i=8;i>0;i--){DQ = 0 ;DQ = dat&0x01 ;delay2(5) ;DQ = 1 ;dat>>=1 ;}delay2(4);}/*************读取温度值**************/Read_Temperature(void){Init_DS18B20() ;WriteOneChar(0xCC) ; // 跳过读序号列号的操作WriteOneChar(0x44) ; // 启动温度转换delay2(125);Init_DS18B20() ;WriteOneChar(0xCC) ; //跳过读序号列号的操作WriteOneChar(0xBE) ; //读取温度寄存器temp_data[0] = ReadOneChar() ; //温度低8位temp_data[1] = ReadOneChar() ; //温度高8位tvalue=((temp_data[1]*256)+temp_data[0])*0.625;//return(tvalue);}/*************温度转换**************/Disp_Temperature()//温度值显示{disdata[0]=tvalue/1000+0x30;//百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30;//个位数disdata[3]=tvalue%10+0x30;//小数位if(disdata[0]==0x30){disdata[0]=0x20; //如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20; //如果百位为0,十位为0也不显示}}lcd_pos(0x48);lcd_wdat(disdata[0]);//显示百位lcd_pos(0x49);lcd_wdat(disdata[1]);//显示十位lcd_pos(0x4a);lcd_wdat(disdata[2]);//显示个位lcd_pos(0x4b);lcd_wdat(0x2e); //显示小数点lcd_pos(0x4c);lcd_wdat(disdata[3]);//显示小数位}/**************显示函数***************/void dis_play(){uchar m ;lcd_init() ; //初始化LCDlcd_pos(0) ; //设置显示位置为第一行的第1个字符m = 0 ;while(str1[m] != '\0'){ //显示字符lcd_wdat(str1[m]) ;m++ ;}lcd_pos(0x40); //设置显示位置为第二行第1个字符m = 0 ;while(str2[m] != '\0'){lcd_wdat(str2[m]); //显示字符m++ ;}delay1(3000);lcd_init() ; //初始化LCDlcd_pos(0) ; //设置显示位置为第一行的第1个字符m = 0 ;while(str3[m] != '\0'){ //显示字符lcd_wdat(str3[m]) ;m++ ;}/***************主函数****************/ void main(){dis_play();//初始化显示while(1){Read_Temperature() ;//读取温度Disp_Temperature() ;//显示温度}。
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();//显示}}。
18b20温度传感器1602 液晶显示程序

uchar i;
sbit lcdrs=P2^7; sbit lcdrw=P2^6; sbit lcden=P2^5;
//数据命令选择控制 //读/写选择控制 //使能信号
uchar code t0[]="The temperature ";
uchar code t1[]=" is
C ";
uchar code wendu[]="0123456789";
display();
delay(10); } }
{ write_date(t1[i]); delay(0);
} }
/*************DS18B20 温度读取模块*************/ void tmpDelay(int num)//延时函数 {
while(num--) ; }
void Init_DS18B20()//初始化 ds1820
tmpDelay(20); }
unsigned char ReadOneChar()//读一个字节 {
unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) {
DS = 0; // 给脉冲信号 dat>>=1; DS = 1; // 给脉冲信号 if(DS) dat|=0x80; tmpDelay(4); } return(dat); }
//定义的时候用 uchar 宏定义就会出错 //这里的 num,shi,ge,xiaoshu 必须用 uint 无符号整数来表示,用
write_com(0x80+0x40+5); write_date(wendu[shi]);
STC15单片机DS18B20在LCD1602上显示程序

敬告:没有51单片机基础的人请慎重下载高质量实用性51单片机STC15W系列程序(7),STC8A系列可参考STC15单片机DS18b20在LCD1602上显示程序//main.c#include "Library.h"unsigned char code temp_reg1[4]={1,2,4,8};unsigned char code temp_reg2[3]={16,32,64};unsigned char code temp_reg3[2]={25,50};unsigned char ValToTemp(unsigned char *buf1,unsigned char *buf2);void ValToStr(unsigned char *str,unsigned char source); unsigned char DecToTemp(unsigned char *buf3);void main(){unsigned char strbuf[2];unsigned char strbuf1[2];unsigned char rec_buf1[8];unsigned char rec_buf2[8];unsigned char temp_sum;bit test;P3M1 &= 0xBF; P3M0 &= 0xBF;P2M1 &= 0xE5; P2M0 &= 0xE5;P0M1 = 0x00; P0M0 = 0x00;LCD1602_init();LCD1602_wBytes(2,0,"temperature:",sizeof("temperature:")-1);LCD1602_wBytes(7,1,".",1);Convert_T();while(1){test = Read_start(rec_buf1,rec_buf2);if(test){test = 0;temp_sum = ValToTemp(rec_buf1,rec_buf2);ValToStr(strbuf,temp_sum);LCD1602_wBytes(5,1,strbuf,2);temp_sum = DecToTemp(rec_buf1);ValToStr(strbuf1,temp_sum);LCD1602_wBytes(8,1,strbuf1,2);}Convert_T();}}unsigned char ValToTemp(unsigned char *buf1,unsigned char *buf2){unsigned char i;unsigned char sum = 0;for(i=4;i<8;i++){if(buf1[i]==1){sum += temp_reg1[i-4];}}if(buf2[0]==1)sum += temp_reg2[0];if(buf2[1]==1)sum += temp_reg2[1];if(buf2[2]==1)sum += temp_reg2[2];return sum;}unsigned char DecToTemp(unsigned char *buf3) {unsigned char sum = 0;if(buf3[2]==1){sum += temp_reg3[0];}if(buf3[3]==1){sum += temp_reg3[1];}return sum;}void ValToStr(unsigned char *str,unsigned char source) {str[0] = source/10 + '0';str[1] = source%10 + '0';}/*****************************************************/ //LCD1602.c#include "Library.h"void LCD1602_rsta(){unsigned char tmp;P0 = 0xFF;//this is a mustrs = 0;rw = 1;do{en = 1;//Delay1us();tmp = P0;//Delay1us();en = 0;}while(tmp&0x80);}void LCD1602_wdat(unsigned char dat){LCD1602_rsta();rs=1;rw=0;P0 = dat;en = 1;//Delay1us();en = 0;}void LCD1602_wcmd(unsigned char cmd){LCD1602_rsta();rs=0;rw=0;P0 = cmd;en = 1;//Delay1us();en = 0;}void Setcursor(unsigned char x,unsigned char y) {if(y==0)x = x + 0x00;else if(y==1)x = x + 0x40;LCD1602_wcmd(x|0x80);}void LCD1602_wBytes(unsigned char x,unsigned char y,unsigned char *buf,unsigned char buf_len){Setcursor(x,y);while(buf_len>0){LCD1602_wdat(*buf++);buf_len--;}}void OnCursor(){LCD1602_wcmd(0x0F);}void OffCursor(){LCD1602_wcmd(0x0C);}void LCD1602_init(){// Delay15ms();// LCD1602_wcmd(0x38);// Delay5ms();LCD1602_wcmd(0x38);// LCD1602_wcmd(0x08);LCD1602_wcmd(0x06);LCD1602_wcmd(0x0C);LCD1602_wcmd(0x01);}/***************************************************/ //DS18b20.c#include "Library.h"void Delay1us() //@11.0592MHz{_nop_();_nop_();_nop_();}void Delay60us() //@11.0592MHz{unsigned char i, j;i = 1;j = 162;do{while (--j);} while (--i);}void Write_L(){DSport = 0;Delay60us();DSport = 1;}void Write_H(){DSport = 0;Delay1us();Delay1us();DSport = 1;Delay60us();}void Write_dat(unsigned char dat) {unsigned char mask;for(mask=0x01;mask!=0;mask<<=1) {if((dat&mask)==0)Write_L();elseWrite_H();}}bit Read_bit(){bit bitval;DSport = 0;Delay1us();DSport = 1;Delay1us();bitval = DSport;return bitval;}void Read_byte(unsigned char *buf) {unsigned char i;for(i=0;i<8;i++){if(Read_bit())buf[i] = 1;elsebuf[i] = 0;Delay60us();}}void Delay500us() //@11.0592MHz{unsigned char i, j;_nop_();_nop_();i = 6;j = 93;do{while (--j);} while (--i);}bit CheckPulse(){bit ack;DSport = 0;Delay500us();//480us~960usDSport = 1;Delay60us();ack = DSport;while(!DSport);//DS18b20 pull down 60us~240usreturn ack;}void Delay750us() //@11.0592MHz{unsigned char i, j;_nop_();_nop_();i = 9;j = 13;do{while (--j);} while (--i);}bit Convert_T(){bit ack;ack = CheckPulse();if(ack==0){Write_dat(0xCC);//read scratchpadWrite_dat(0x44);//convert temperatureDelay750us();}return ~ack;}bit Read_start(unsigned char *buf1,unsigned char *buf2) {bit ack;ack = CheckPulse();if(ack==0){Write_dat(0xCC);Write_dat(0xBE);Read_byte(buf1);Read_byte(buf2);}return ~ack;}/****************************************************/ //Library.h#ifndef _Library_H#define _Library_H#include <STC15.h>#include <intrins.h>sbit DSport = P3^6;bit Convert_T();bit Read_start(unsigned char *buf1,unsigned char *buf2);sbit rs = P2^4;sbit rw = P2^3;sbit en = P2^1;void LCD1602_init();void LCD1602_wBytes(unsigned char x,unsigned char y,unsigned char *buf,unsigned char buf_len);#endif。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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;
LCD_Data = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void LCD_Initialise()
ds18B20_data = 1; // 拉高总线,准备接收数据
_nop_();
ch = ch>>1;
if (ds18B20_data == 1) // 接收 ds18B20 的数据
ch = ch+0x80;
delay_15us(2); // 延时 45us,保证整个读命令有 60us
uchar Readds18B20(void); // 读一个字节ds18B20 数据子程序
uint GetTempValue(void); // 启动 ds18B20 温度转换程序
/***********************ds18B20 复位程序**********************/
void Writeds18B20(uchar ch)
{
uchar i;
ds18B20_data = 1; // 拉高总线,延时 1us,准备启动
_nop_();
for (i=0;i<8;i++)
{
ds18B20_data = 0; // 拉低总线
uchar Temp_Value[]={0x00,0x00};
uchar Display_Digit[]={0,0,0};
void Delay(uint x)
{
while(--x);
}
/****************************延时10us*************************/
#define ds18B20_MATCH_ROM 0x55 // 匹配 ROM 指令
#define ds18B20_SKIP_ROM 0xCC // 跳过 ROM 指令
#define ds18B20_SEARCH_ROM 0xF0 // 搜索 ROM 指令
#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}
/********************** DS18B20 指令*********************/
#define ds18B20_READ_ROM 0x33 // 读 ROM 指令
ch = ch>>1; //先写低位,后写高位
_nop_();
}
}
/******************读一个字节 ds18B20 数据子程序********************
功能:从 ds18B20 读出数据
//先执行一个LCALL指令(2 μs),然后执行6个_NOP_( )语句(6 μs),最后执行了一个RET指令(2 μs)
void Delay_10us(void)
{ _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
DelayXus(5);
Write_LCD_Command(0x06); //当读写一个字节后,光标自动加1
DelayXus(5);
}
void Set_LCD_POS(uchar pos)
{
Write_LCD_Command(pos|0x80);
}
#define ds18B20_READ_POWER_SUPPLY 0xB4 // 读电源
#define LCD_Data P1 //定义数据指令端口
sbit ds18B20_data = P3^3; //温度探头(DQ)数据端口对应的单片机引脚
}
void DelayXus(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<200;i++);
}
}
bit LCD_Busy_Check()
{
bit result;
LCD_RS = 0; //zhi ling
LCD_RW = 1; //du zhuang tai
/*************** writer:shopping.w ******************/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
/************************温度探头程序************************/
bit Rstds18B20(void); // DS18B20 复位程序, 返回 0-有设备连接,1-无设
void Writeds18B20(uchar ); // 写一个字节 ds18B20 数据、命令子程序
入口:无
出口:读出的 ds18B20 的数据
******************************************************************/
uchar Readds18B20(void)
{
uchar i,ch;
ch = 0;
#define ds18B20_COPY_SCRATCHPAD 0x48 // 复制暂存寄存器指令
#define ds18B20_CONVERT_T 0x44 // 启动温度转换指令
#define ds18B20_RECALL_E2 0xB8 // 重新调出 E2PROM 的数据
for (i=0;i<6;i++) // 60us-240us
{
delay_15us(1);
if (ds18B20_data==0)
RstFlag=0; // 接收 ds18B20 的存在信号
}
delay_15us(20); // 240us
bit Rstds18B20(void) // 返回,0-有设备连接;1-无设备连接
{
uchar i;
bit RstFlag;
RstFlag = 1;
ds18B20_data = 1;
_nop_();
ds18B20_data=0; // 发送复位脉冲,时间>480us
LCD_EN = 1;
delayNOP();
result = (bit)(LCD_Data&0x80);
LCD_EN=0;
return result;
}
void Write_LCD_Command(uchar cmd)
{
while(LCD_Busy_Check()); //bu mang lu
{
Write_LCD_Command(0x01); //清屏
DelayXus(5);
Write_LCD_Command(0x38); //设置16*2显示,5*7点阵,8位数据接口
DelayXus(5);
Write_LCD_Command(0x0c); //画面开,禁止光标显示闪烁
ds18B20_data = 1; // 拉高总线,延时 1us,准备启动
_nop_();
for (i=0;i<8;i++)
{
ds18B20_data = 0; // 拉低总线
Delay_10us(); // 延时10us
_nop_();
}
/***************************延时 time*15us******************** */