ds18b20-1602测温

作者在 2020-03-30 21:47:39 发布以下内容
#include<reg51.h>
   #define uchar unsigned char
   #define uint unsigned int
   sbit DQ=P2^4;//temp
   sbit RS=P2^6;
   sbit RW=P2^5;
   sbit EN=P2^7;
   uchar code str1[]={" temperature: "};
   uchar code str2[]={""};	 
   uchar data disdata[5];
   uint tvalue;
   uchar tflag;
   
   void delay1ms (uint ms)
   {
   uint i,j;
   for (i=0; i<ms; i++)
   for(j=0; j<100;j++);
   }
   
   void wr_com(uchar com)		//写命令
   {
   delay1ms(1);
   RS=0;
   RW=0;
   EN=0;
   P0=com;
   delay1ms(1);
   EN=1;
   delay1ms(1);
   EN=0;
   }

	void wr_dat(uchar 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(uchar*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);

}

 void delay_18B20(uint i)
 {
 while(i--);
 }

	void ds1820rst()	
	{
	  uchar x=0;	  //?
	  DQ=1;
	  delay_18B20(4); 
	  DQ=0;
	  delay_18B20(100);
	   DQ=1;
	  // x=DQ;
	  delay_18B20(40);
	}


	uchar ds1820rd()		  //read data	   ok
	{
	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)	   //write data
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ=0;
DQ=wdata&0x01;
delay_18B20(10);
DQ=1;
wdata>>=1;
}
}

  uint read_temp(){
   uchar a,b;
   ds1820rst();
   ds1820wr(0xcc);
   ds1820wr(0x44);			//start 转换
    ds1820rst();
   ds1820wr(0xcc);
   ds1820wr(0xbe);		//read temp
   a=ds1820rd();		//l
   b=ds1820rd();	   //h
  tvalue=b;
   tvalue<<=8;
   tvalue=tvalue|a;
	
	if(tvalue<0x0fff)
	tflag=0;	//+ temp			  
	else{
	tvalue=~tvalue+1;
	tflag=1;  //- temp
	}	
   	  tvalue=(tvalue*(0.625)+0.5);	//	 0.0625*10=0.625
	  return(tvalue);
   }


   void ds1820disp(){
   uchar flagdat;
   disdata[0]=tvalue/1000+'0';	  //100
   disdata[1]=tvalue%1000/100+'0';	  //10
   disdata[2]=tvalue%100/10+'0'; //1
   disdata[3]=tvalue%10+0x30; //0.1
   if(tflag==0)
   {	 //+
  	 flagdat=0x20;//+ no disp
   
  		 }

   else
    { flagdat=0x2d; } //-

   if(disdata[0]==0x30)
   	{
   	disdata[0]=0x20;// 0 no disp
     	  if(disdata[1]==0x30)
   		{
   		disdata[1]=0x20;// 0 no disp
     
		 }
	 }
   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();
		}
	}
单片机 | 阅读 2066 次
文章评论,共2条
qunxingw(作者)
2020-03-30 21:54
1
普中,51 A6正常测试
yu1776151787
2020-04-01 21:36
2
电子电路程序,强啊
游客请输入验证码
浏览232759次
最新评论