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温度传感C语言程序、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显示出来,并输出控制

读取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;。

STC15单片机DS18B20在LCD1602上显示程序

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。

DS18B20温度采集+1602显示

DS18B20温度采集+1602显示

/*************************************************************************************************************** 名称:DS18B20采集温度+1602LCD显示编写:超时间:2012-11-29内容:***************************************************************************************************************/ #include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P3^7; //ds18b20与单片机连接口sbit RS=P3^0; //1602写数据/写命令选择端口//RS=1写数据,即要显示的内容//RS=0写命令,即一些LCD设置命令sbit RW=P3^1; //1602读/写选择端,RW=0为写模式sbit EN=P3^2; //给EN一个高脉冲,将数据送入液晶控制器,完成写操作uchar code str1[]={"^_^ Zhang Chao"};uchar code str2[]={" T= "};uchar data disdata[5];//百、十、个、小数位uint tvalue; //温度值uchar tflag; //温度正负标志/*************************lcd1602设置子函数*******************************************************************/ void delay1ms(uint ms) //延时1毫秒子函数,形参为ms(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<110;j++);}void wr_com(uchar com)//lcd写控制指令子函数,形参为com{delay1ms(1); //调用延时子函数,并用实参1代替延时子函数中的形参msRS=0; //RS=0进入写命令状态,即一些LCD设置命令RW=0; //RW=0为写模式EN=0; //EN=0时不能完成写操作P2=com; //把要设置的指令码com送给P2口delay1ms(1);EN=1; //给EN一个高脉冲,将数据送入液晶控制器,完成写操作delay1ms(1);EN=0; //EN=0时不能完成写操作}void wr_dat(uchar dat)//lcd写显示数据子函数,形参为dat{delay1ms(1);RS=1; //RS=1进入写数据状态,即要显示的内容RW=0; //RW=0为写模式EN=0; //EN=0时不能完成写操作P2=dat; //把要显示的数据dat送给P2口delay1ms(1);EN=1; //给EN一个高脉冲,将数据送入液晶控制器,完成写操作delay1ms(1);EN=0; //EN=0时不能完成写操作}void lcd_init() //lcd初始化设置子函数,不带参数,0x38是显示模式设置,其余是显示开/关及光标设置,无顺序{delay1ms(15);wr_com(0x38); //调用写控制指令子函数,并用实参"0011 1000"代替形参com//0x38表示设置为16*2显示,每个块为5*7点阵,8位数据接口delay1ms(5);wr_com(0x08); //调用写控制指令子函数,并用实参"0000 1000"代替形参com//0x08表示设置为关显示、不显示光标、光标不闪烁delay1ms(5);wr_com(0x01); //调用写控制指令子函数,并用实参"0000 0001"代替形参com//0x01表示显示数据清屏(数据指针清0,所有显示清0)delay1ms(5);wr_com(0x06);//调用写控制指令子函数,并用实参"0000 0110"代替形参com//0x06表示当读或写一个字符后地址指针加1,且光标加1;当写一个字符时,整屏显示不移动delay1ms(5);wr_com(0x0c);//调用写控制指令子函数,并用实参"0000 1100"代替形参com//0x0c打开显示、不显示光标、光标不闪烁delay1ms(5);}void display(uchar *p)//lcd显示字符串子函数{while(*p!='\0') //测试是否等于'\0',即判断是否结尾{wr_dat(*p); //显示指针所指的字符串p++; //指针加1delay1ms(1);}}init_play()//初始化显示子函数{lcd_init(); //调用lcd初始化设置子函数,对LCD进行初始化wr_com(0x80); //调用写控制指令子函数,并用实参"1000 0000"代替形参com//并将数据指针定位到第一行第一个字符处display(str1);//从第一行第一个字符处显示字符串str1wr_com(0x80+0x40);//调用写控制指令子函数,并用实参"1000 0000"代替形参com//并将数据指针定位到第二行第一个字符处display(str2); //从第二行第一个字符处显示字符串str2}/**************************************************************************************************************//******************************ds18b20程序******************************************************************/ void delay_18b20(uint i)//延时1微秒{while(i--);}void ds18b20rst() //ds18b20初始化子函数//要求"数据线拉高-延时-数据线拉低-延时大于480微妙-数据线拉高-延时等待" {uchar x=0;DQ = 1; //信号线DQ复位delay_18b20(4); //延时DQ = 0; //DQ拉低delay_18b20(100); //精确延时大于480usDQ = 1; //拉高delay_18b20(40);}void ds18b20wr(uchar wdata)/*写数据子函数,无返回值,含参数*/{uchar i=0;for (i=8; i>0; i--)//要写完一个字节,故需要重复8次以下操作{DQ = 0; //数据线拉低DQ = wdata&0x01;//wdata是一个形参,将其与0000 0001进行按位与//按从低到高的顺序发送数据(一次发送一位)delay_18b20(10);DQ = 1; //最后将数据线拉高wdata>>=1; //将wdata右移1位}}uchar ds18b20rd() //读数据子函数,是有返回值dat{uchar i=0;uchar dat = 0;for (i=8;i>0;i--)//要读完一个字节,故需要重复8次以下操作{DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18b20(10);}return(dat); //返回dat}read_temp() //读取温度值并转换的子函数,有返回值温度值tvalue{uchar a,b;ds18b20rst(); //调用ds18b20初始化子函数ds18b20wr(0xcc);//调用写数据子函数,向ds18b20写命令0xcc//ccH表示跳过ROM读序列号,适用于单机工作,直接向18b20发送温度变换命令ds18b20wr(0x44);//调用写数据子函数,向ds18b20写命令0x44//44H表示启动ds18b20温度转换,结果自行存入9字节的RAM中ds18b20rst(); //调用ds18b20初始化子函数ds18b20wr(0xcc);//同上ds18b20wr(0xbe);//调用写数据子函数,向ds18b20写命令0xbe//beH表示读取RAM中9字节的温度数据a=ds18b20rd(); //调用读数据子函数,并将所得数据给ab=ds18b20rd(); //tvalue=b; //把b的值给tvaluetvalue<<=8; //tvalue左移8位tvalue=tvalue|a;//tvalue与a进行按位或if(tvalue<0x0fff)//tflag=0; //前五位为0时,读取的温度为正,标志位为0,此时只要//将测得数值乘以0.0625即可得到实际温度else //前五位为1时,读取的温度为负,标志位为1,此时需要{ //将测得数值取反后再加1,再乘以0.0625即可得到实际温度tvalue=~tvalue+1;tflag=1; //此时表示负温度}tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数return(tvalue); //返回温度值}/*************************************************************************************************************//************************温度值显示**************************************************************************/ void ds18b20disp()//温度值显示{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=0x2b; //正温度显示符号:+elseflagdat=0x2d; //负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20; //如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20; //如果百位为0,十位为0也不显示}}wr_com(0x80+0x46); //定位数据指针的位置:第二行第六个字符处wr_dat(flagdat); //显示符号位wr_com(0x80+0x47); //定位数据指针的位置:第二行第七个字符处wr_dat(disdata[0]); //显示百位wr_com(0x80+0x48); //定位数据指针的位置:第二行第八个字符处wr_dat(disdata[1]); //显示十位wr_com(0x80+0x49); //定位数据指针的位置:第二行第九个字符处wr_dat(disdata[2]); //显示个位wr_com(0x80+0x4a); //定位数据指针的位置:第二行第十个字符处wr_dat(0x2e); //显示小数点wr_com(0x80+0x4b); //定位数据指针的位置:第二行第十一个字符处wr_dat(disdata[3]); //显示小数位}/**************************************************************************************************************//********************主程序*********************************************************************************/ void main(){init_play(); //调用lcd初始化显示子函数while(1){read_temp(); //调用ds18b20读取温度ds18b20disp(); //调用温度显示子函数}}/************************************************************************************************************/。

DS18B20温度显示演示程序-LCD1602显示

DS18B20温度显示演示程序-LCD1602显示
}
/*******************************************************************/
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。*/
/*******************************************************************/
for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ;
DQ = dat&0x01 ;
Delay(5) ;
DQ = 1 ;
dat>>=1 ;
}
}
/*读取温度*/
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy()) ;
LCD_RS = 0 ;
LCD_RW = 0 ;
LCD_EN = 0 ;
_nop_() ;
_nop_() ;
P0 = cmd ;
delayNOP() ;
LCD_EN = 1 ;
delayNOP() ;
LCD_EN = 0 ;
Delay(4) ;
}
return (dat) ;
}
/*写一个字节*/
/*******************************************************************/
WriteOneChar(unsigned char dat)

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

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

电路原理图程序1.main.c#include<reg51.h> #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_#define __LCD_H_/********************************** 当使用的是4位数据传输的时候定义,使用8位取消这个定义**********************************/ #define LCD1602_4PINS/********************************** 包含头文件#include<reg51.h>//---重定义关键词---//#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#ifndef __TEMP_H_#define __TEMP_H_#include<reg51.h>sbit DSPORT=P3^7;void Delay1ms(unsigned int );unsigned char Ds18b20Init();void Ds18b20WriteByte(unsigned char com); unsigned char Ds18b20ReadByte();void Ds18b20ChangTemp();void Ds18b20ReadTempCom();int Ds18b20ReadTemp();#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 Ds18b20ReadTemp() //读取温度{int temp=0;unsigned char tmh,tml;Ds18b20ChangTemp();Ds18b20ReadTempCom();tml=Ds18b20ReadByte();tmh=Ds18b20ReadByte();temp=tmh;temp<<=8;temp|=tml;return temp; }。

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();//显示}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WriteOneChar(0xBE) ; //读取温度寄存器
temp_data[0] = ReadOneChar() ; //温度低8位
temp_data[1] = ReadOneChar() ; //温度高8位
}
/*数据转换与温度显示*/
/*******************************************************************/
unsigned char y ;
while(ms--)
{
for(y = 0 ; y<250 ; y++)
{
_nop_() ;
_nop_() ;
_nop_() ;
_nop_() ;
}
}
}
/******************************************************************/
/*蜂鸣器响一声*/
/*******************************************************************/
void beep()
{
unsigned char y ;
for (y=0 ;y<100 ;y++)
{
Delay(60) ;
BEEP=!BEEP ; //BEEP取反
{
display[3]=0x20 ;
if(display[2]==0x30) //次高位为0,不显示
display[2]=0x20 ;
}
lcd_pos(0x48) ;
lcd_wdat(display[3]) ; //百位数显示
lcd_pos(0x49) ;
lcd_wdat(display[2]) ; //十位数显示
lcd_pos(0) ; //设置显示位置为第一行的第1个字符
void lcd_wdat(uchar dat)
{
while(lcd_busy()) ;
LCD_S = 1 ;
LCD_RW = 0 ;
LCD_EN = 0 ;
P0 = dat ;
delayNOP() ;
LCD_EN = 1 ;
delayNOP() ;
LCD_EN = 0 ;
}
/* LCD初始化设定*/
Read_Temperature(void)
{
Init_DS18B20() ;
WriteOneChar(0xCC) ; //跳过读序号列号的操作
WriteOneChar(0x44) ; //启动温度转换
Init_DS18B20() ;
WriteOneChar(0xCC) ; //跳过读序号列号的操作
unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
void beep() ;
unsigned char code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;
/*DS18B20温度显示演示程序-LCD1602显示
开机时对DS18B20进行检测,如果DS18B20检测不正常,LCD1602显示:
DS18B20 ERROR
PLEASE CHECK
蜂鸣器报警。
DS18B20检测正常,LCD1602显示:
DS18B20 OK
TEMP: 100.8℃
如果温度值高位为0,将不显示出来。
/*******************************************************************/
void lcd_init()
{
delay1(15) ;
lcd_wcmd(0x01) ; //清除LCD的显示内容
lcd_wcmd(0x38) ; //16*2显示,5*7点阵,8位数据
}
/*******************************************************************/
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。*/
/*******************************************************************/
for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ;
DQ = dat&0x01 ;
Delay(5) ;
DQ = 1 ;
dat>>=1 ;
}
}
/*读取温度*/
/*******************************************************************/
Disp_Temperature()
{
display[4]=temp_data[0]&0x0f ;
display[0]=ditab[display[4]]+0x30 ; //查表得小数位的值
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
/*******************************************************************/
Init_DS18B20(void)
{
DQ = 1 ; //DQ复位
Delay(8) ; //稍做延时
DQ = 0 ; //单片机将DQ拉低
Delay(90) ; //精确延时大于480us
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 ;
uchar code cdis3[ ] = {" DS18B20 BUSY "} ;
uchar code cdis4[ ] = {" PLEASE WAIT "} ;
unsigned char data temp_data[2] = {0x00,0x00} ;
unsigned char data display[5] = {0x00,0x00,0x00,0x00,0x00} ;
lcd_wdat(mytab[ i ]) ;
}
/*us级延时函数*/
/*******************************************************************/
void Delay(unsigned int num)
{
while( --num ) ;
}
/*初始化ds1820 */
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的显示内容
lcd_pos(0x4a) ;
lcd_wdat(display[1]) ; //个位数显示
lcd_pos(0x4c) ;
lcd_wdat(display[0]) ; //小数位数显示
}
/*******************************************************************/
}
/*自定义字符写入CGRAM */
/*******************************************************************/
void writetab()
{
unsigned char i ;
lcd_wcmd(0x40) ; //写CGRAM
for (i = 0 ; i< 8 ; i++)
void lcd_wcmd(uchar cmd)
{
while(lcd_busy()) ;
LCD_RS = 0 ;
LCD_RW = 0 ;
LCD_EN = 0 ;
_nop_() ;
_nop_() ;
P0 = cmd ;
delayNOP() ;
LCD_EN = 1 ;
delayNOP() ;
LCD_EN = 0 ;
LCD_RS = 0 ;
LCD_RW = 1 ;
LCD_EN = 1 ;
delayNOP() ;
result = (bit)(P0&0x80) ;
LCD_EN = 0 ;
return(result) ;
}
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。*/
/*******************************************************************/
display[3]=display[4]/100+0x30 ;
相关文档
最新文档