18b20温度传感器1602液晶显示C51程序

合集下载

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);}。

51单片机驱动1602液晶显示器c程序

51单片机驱动1602液晶显示器c程序

51单片机驱动1602液晶显示器c程序/*程序效果:单片机控制液晶显示器1602 显示字母数字,用户自行更改io程序原创安全:51hei*/#includereg52.h //头文件#define uchar unsigned char //宏定义#define uint unsigned intuchar code table[]=“51HEI XING XING “ ; //显示的字母uchar code table1[]=“51HEI MCUXUE YUAU” ;sbit lcdrs=P1; //寄存器选择引脚sbit lcdwr=P1;//读写引脚sbit lcde=P1 ; //片选引脚void delay(uchar x) //延时子函数{uchar i,j;for(i=x;i0;i--) for(j=110;j0;j--);}void write_com(uchar com) //写指令子函数{ //根据1602 液晶显示器协议编写P2=com; lcdrs=0;lcdwr=0;delay(5);lcde=0; delay(5);lcde=1; }void write_dat(uchar dat) //写数据子函数{P2=dat; lcdrs=1;lcdwr=0;delay(5);lcde=0;delay(5);lcde=1;}void init() //初始化子函数{write_com(0x01); //清屏write_com(0x3f); //功能设置write_com(0x0d); //显示控制write_com(0x06); //输入方式设置}void main(){ uchar i; //定义局部变量init();write_com(0x80+0x02+0x10); //指针的位置for(i=0;i15;i++) //显示{ write_dat(table[i]); delay(50); //延时,用于调节速度不匹配}write_com(0x80+0x40+0x10);for(i=0;i16;i++){ write_dat(table1[i]); delay(50);}for(i=0;i16;i++){ write_com(0x18); delay(50);} while(1);}tips:感谢大家的阅读,本文由我司收集整编。

51单片机ds18b20和lcd1602显示温度

51单片机ds18b20和lcd1602显示温度

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

DS18B20温度传感器 1602液晶显示

DS18B20温度传感器 1602液晶显示

单片机轻松入门之十DS18B20温度传感器+1602液晶显示本文旨在介绍单片机入门的基础知识,为初接触或即将接触单片的新手提供一个入门指导。

本文章会陆续推出,隔几天一个章节。

所使用单片机为ATMEL公司的AT89C52,软件为PROTEUS和KEIL;只提供原理图和KEIL环境下的注释,希望对广大即将接触单片机的人有所帮助,如果有错误欢迎回帖指出与本人交流或QQ 联系(QQ:56)。

DS18B20数字温度传感器是由美国DALLAS公司生产的,体积小,使用方便,测温范围-55℃~+125℃,测温分辨率0.5℃,工作电压DC3-5V,不需要任何外围元件,采用SPI单线接口方式,在与微处理器连接时仅需要一条口线即可实现双向通讯,广泛适用于各种温度控制领域。

原理图如下:程序如下:#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit RS=P3^0;sbit EN=P3^2;sbit RW=P3^1;sbit wela=P3^3;sbit DQ=P3^4;uchar i;uint num;uint shi,ge,xiaoshu;uchar code t0[]="The temperature ";uchar code t1[]=" is ";uchar code wendu[]="09";void delay(uint x){uint m,n;for(m=x;m>0;m--)for(n=10;n>0;n--);}void delay1(uint x){uint a,b;for(a=x;a>0;a--)for(b=110;b>0;b--);}/*****************液晶写指令***************/void write_com(uchar com){wela=1;P2=com;wela=0;RS=0;EN=0;RW=0;delay(10);EN=1;delay(10);EN=0;}/*****************液晶写数据指令***************/void write_date(uchar date){wela=1;P2=date;wela=0;RS=1;EN=0;RW=0;delay(10);EN=1;delay(10);EN=0;}/*****************液晶初始化指令***************/void init(){write_com(0x38);delay(20);write_com(0x0f);delay(20);write_com(0x06);delay(20);write_com(0x80);for(i=0;i<16;i++){write_date(t0[i]);delay(0);}write_com(0x80+0x40);for(i=0;i<16;i++){write_date(t1[i]);delay(0);}}/*************DS18B20温度读取模块*************/void tmpDelay(int u) //延时函数{while(u--) ;}void Init_DS18B20() //初始化ds1820{unsigned char x=0;DQ = 1; //DQ复位tmpDelay(8); //稍做延时DQ = 0; //单片机将DQ拉低tmpDelay(80); //精确延时大于 480usDQ = 1; //拉高总线tmpDelay(14);x=DQ; //稍做延时后,如果x=0则初始化成功 x=1则初始化失败tmpDelay(20);}unsigned char ReadOneChar() //读一个字节{unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;tmpDelay(4);}return(dat);}void WriteOneChar(unsigned char dat) //写一个字节{unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;tmpDelay(5);DQ = 1;dat>>=1;}}unsigned int Readtemp() //读取温度{unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器a=ReadOneChar(); //连续读两个字节数据b=ReadOneChar();t=b;t<<=8;t=t|a; //两字节合成一个整型变量tt=t*0.0625; //得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度t= tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。

DS18B20 PIC测温用1602显示温度C程序

DS18B20 PIC测温用1602显示温度C程序

DS18B20+PIC测温用1602显示温度C程序//熟悉使用单片机运用DS18B20温度传感器测试温度,并用1602显示屏显示温度//1、第一行显示:Temperature//2、第二行显示:实测温度值//*********************************************** ***//*********************************************** ***//硬件设置://1、SW2,SW4开关全部断开//2、插上DS18B20温度传感器//*********************************************** ***//*********************************************** ***//*****************定义头文件**********************//**************************************************#include;#include &quot;delay.h&quot;//*********************************************** ***//******************定义配置位*********************//*********************************************** ***__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单片机18B20温度传感器程序

51单片机18B20温度传感器程序

//18B20单线温度检测的应用样例程序#include<REG52.H>#include<math.h>#include<INTRINS.H>#define uchar unsigned char#define uint unsigned int;/*****************************************************************************/ sbit seg1=P2^0;sbit seg2=P2^1;sbit seg3=P2^2;sbit DQ=P1^7;//ds18b20 端口sfr dataled=0x80;//显示数据端口/**********************************************************************/uchar temp;uchar flag_get,count,num,minute,second;uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数码管段码表共阳uchar str[3];/***********************************************************************/void delay1(uchar MS);unsigned char ReadTemperature(void);void Init_DS18B20(void);unsigned char ReadOneChar(void);void WriteOneChar(unsigned char dat);void delay(unsigned int i);/************************************************************************/ main(){TMOD|=0x01;//定时器设置TH0=0xef;TL0=0xf0;IE=0x82;TR0=1;P2=0x00;count=0;while(1){str[2]=0x39;//显示C符号str[0]=tab[temp/10]; //十位温度str[1]=tab[temp%10]; //个位温度if(flag_get==1) //定时读取当前温度{temp=ReadTemperature();flag_get=0;}}}void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔{TH0=0xef;//定时器重装值TL0=0xf0;num++;if (num==50){num=0;flag_get=1;//标志位有效second++;if(second>=60){second=0;minute++;}}count++;if(count==1){P2=0;dataled=str[0];}//数码管扫描if(count==2){P2=1;dataled=str[1];}if(count==3){ P2=2;dataled=str[2];count=0;}}/****************************************************************************** *******/void delay(unsigned int i)//延时函数{while(i--);}/****************************************************************************** *********///18b20初始化函数void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay(8); //稍做延时DQ = 0; //单片机将DQ拉低delay(80); //精确延时大于480usDQ = 1; //拉高总线delay(10);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay(5);}//读一个字节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;delay(5);}return(dat);}//写一个字节void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay(5);DQ = 1;dat>>=1;}delay(5);}//读取温度unsigned char ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned char t=0;//float tt=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay(200);Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar();b=ReadOneChar();b<<=4;b+=(a&0xf0)>>4;t=b;//tt=t*0.0625;//t= tt*10+0.5; //放大10倍输出并四舍五入return(t);}。

51单片机ds18b20和lcd1602显示温度

51单片机ds18b20和lcd1602显示温度
void mainO
{ init_play();//初始化显示while(l)
{read_temp();//读取温度dsl820disp();//显示
}
{
write_com(0x38);delaylms(5);
write_com(0x08);delaylms(5);
write_com(0x01);delaylms(5);
\vrite_com(0x06) ; delaylms (5);
\vrite_com(0x0c) ; delaylms (5);
}
lcd_en=0;
void write_dat (unsigned char dat)//写数据// { delaylms(l);;
lcd_rs=l;
lcd_rw=0;
lcd_en=0;
P0=dat;
delaylms(1);
lcd_en=l;
delaylms(1);
lcd_en=0;
}
void lcd_init ()//初始化设胃7/
delay_18B20(100) ; //精确延时大于480us
DQ = 1;//拉髙
delay_18B20(40);
uchar dsl820rd()/*读数据*/
{
unsigned char i=0;
unsigned char dat = 0;
for (i二8;i>0;i—)
{ DQ二0;〃给脉冲信号dat»=l;
delay_18B20(10);
DQ = 1;
wdata>>=l;
read.temp () /*读取温度值并转换*/
{uchar a, b;
dsl820rst 0 ;

51单片机Ds18b20温度传感器程序

51单片机Ds18b20温度传感器程序

* 实验名 : 18B20温度显示试验* 实验说明 : 数码管显示温度值,并且将温度值通过串口发送到电脑上。

* 连接方式 : 见连接图temp.h#ifndef __TEMP_H_#define __TEMP_H_#include<reg51.h>//---重定义关键词---//#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endif//--定义使用的IO口--//sbit DSPORT=P3^7;//--声明全局函数--//void Delay1ms(uint );uchar Ds18b20Init();void Ds18b20WriteByte(uchar com);uchar Ds18b20ReadByte();void Ds18b20ChangTemp();void Ds18b20ReadTempCom();int Ds18b20ReadTemp();#endiftemp.c#include"temp.h"/******************************************************************************** 函数名: Delay1ms* 函数功能: 延时函数* 输入: 无* 输出: 无*******************************************************************************/void Delay1ms(uint y){uint x;for( ; y>0; y--){for(x=110; x>0; x--);}}/******************************************************************************** 函数名: Ds18b20Init* 函数功能: 初始化* 输入: 无* 输出: 初始化成功返回1,失败返回0*******************************************************************************/ uchar Ds18b20Init(){uchar i;DSPORT = 0;//将总线拉低480us~960usi = 70;while(i--);//延时642usDSPORT = 1;//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低i = 0;while(DSPORT)//等待DS18B20拉低总线{Delay1ms(1);i++;if(i>5)//等待>5MS{return 0;//初始化失败}}return 1;//初始化成功}/******************************************************************************** 函数名: Ds18b20WriteByte* 函数功能: 向18B20写入一个字节* 输入: com* 输出: 无*******************************************************************************/void Ds18b20WriteByte(uchar dat){uint i, j;for(j=0; j<8; j++){DSPORT = 0;//每写入一位数据之前先把总线拉低1usi++;DSPORT = dat & 0x01; //然后写入一个数据,从最低位开始i=6;while(i--); //延时68us,持续时间最少60usDSPORT = 1;//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值dat >>= 1;}}/******************************************************************************** 函数名: Ds18b20ReadByte* 函数功能: 读取一个字节* 输入: com* 输出: 无*******************************************************************************/ uchar Ds18b20ReadByte(){uchar byte, bi;uint i, j;for(j=8; j>0; j--){DSPORT = 0;//先将总线拉低1usi++;DSPORT = 1;//然后释放总线i++;i++;//延时6us等待数据稳定bi = DSPORT;//读取数据,从最低位开始读取/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。

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

18b20温度传感器1602液晶显示
中南民族大学电信五班陈福林传
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit BLK=P1^0;
sbit DQ=P1^4;
sbit RS=P1^3;
sbit RW=P1^2;
sbit EN=P1^1;
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;
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()//初始化设置//
{
BLK=0;
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); //精确延时大于480us
DQ = 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;//正温度不显示符号
else
flagdat=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();//显示
}
}。

相关文档
最新文档