#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(); } }
原创文章,作者:曾确令,如若转载,请注明出处:https://www.zengqueling.com/ds18b20-1602%e6%b5%8b%e6%b8%a9/