www.pudn.com > DS18B20_LCD_C51.rar > DS18B20.c
//DS1820 C51 子程序 //这里以11.0592M晶振为例,不同的晶体速度可能需要调整延时的时间 #include#include #include /////////////**********先为液晶初始化函数变量声明**********/////////// void WRD(uchar DATA); //写lcd数据子函数声明 void WRI(uchar com) ; //写lcd指令子函数声明 void RD(uchar INDATA) ; //读lcd数据子函数声明 void CHEBF(); //读lcdBF子函数声明 void lcdinitialdat() ; //写lcd数据初始化声明 void delaylong(int n) ; //延迟声明 void delay(void); void locatecursor(uchar H,uchar L); //定位游标,行H,列L (最大可到四行八列) uchar bdata state; sbit BF=state^7; uchar idata DDRAM; //设定DDRAM地址第一行80~87,第二行90~97, //第三行为88-8F,第四行为98-9F uchar idata basfuncset ; /*0X30基本指令,8位数据 0X34 扩充指令,8位数据*/ uchar idata shiftcursorr=0X14;//游标移位:为14H时,游标右移 uchar idata shiftcursorl=0X10; //游标移位:为10H时,游标左移 //18H时为显示左移(在一三行之间或二四行之间),游标跟移; //1CH时为显示右移,游标跟移 uchar idata page; //页号 //////////////////////////////////////////////////////////////////////////////////////////// sbit DQ =P1^1;//根据实际情况定义端口 typedef unsigned int uint; void tmdelay(uchar useconds) ; uchar tm_initial(void) ; void read_char(void) ; void write_char(char val) ; void Read_Temperature(uchar no) ; uchar temdate[2][2]= {0,0, //NO1温度值的低字节和高字节 0,0}; //NO2温度值的低字节和高字节 uchar tempkey[2][8]= {0X28,0X8F,0XF3,0X85,0,0,0,0X60, //NO1 0X28,0X52,0XA4,0X85,0,0,0,0X2A}; //NO2 uchar dy=0; uchar value = 0; uchar temint=0; uint temdot=0; //////////////////////////////////////////////main staet//////////////////////////////////////////////// main() { uchar k=0; delaylong(500) ; /////此处必须延时300ms以上,500时为约大于1秒 //delaylong(350) ; //779ms lcdinitialdat() ;//写lcd数据初始化 delay() ; while(1) {k=0; while(k<2) {temint=0;temdot=0; Read_Temperature(k); locatecursor(k+1,1); //从第2行首列显示 WRD('T');WRD('E'); WRD('M');WRD(0X30+k);WRD(':'); temint=((temdate[k][1]<<4)|(temdate[k][0]>>4)); temdot=temdate[k][0]&0X0F; temdot=temdot*625; temint+=temdot/10000; WRD(0X30+temint/100);WRD(0X30+temint%100/10);WRD(0X30+temint%10); WRD('.'); WRD(0X30+(temdot%10000/1000));WRD(0X30+temdot%1000/100); WRD(0X30+(temdot%100/10));WRD(0X30+temdot%10); k++; } } }//end main ///////////////////////////////////////////////end main///////////////////////////////////////////// //延时 void tmdelay(uchar useconds) { while(useconds>0)useconds--; } /*tmdelay(1) ;//16.28us//增加一个就加6.5us tmdelay(2) ;//22.78us tmdelay(3) ;//29.30us tmdelay(4) ;//35.81us tmdelay(70) ;//465.49 tmdelay(74) ;//491.54 tmdelay(80) ;//530.60 tmdelay(115) ;//150us */ //复位 uchar tm_initial(void) ///对的 { uchar answer=1; NOANSWE: DQ = 0; //pull DQ line low tmdelay(74); // leave it low for 490us DQ = 1; // allow line to return high tmdelay(12); // wait >60us for answer pulse if(DQ==1) {answer=1;goto NOANSWE;} else if(DQ==0)answer=0; //locatecursor(1,5); //WRD(0X30+answer); tmdelay(40) ;//>250us DQ=1; return(answer); //0表示有DS18B20应答,1表示没有应答 } //从 1-wire 总线上读取一个字节 void read_char(void) { uchar i; value=0; for (i=8;i>0;i--) { value>>=1; DQ = 1; dy++;dy++; DQ = 0; // pull DQ low dy++;dy++;dy++;dy++;dy++; // wait 1-15us for data in bus DQ=1; dy++; //pull high //tmdelay(1); if(DQ==1) {value|=0x80; }else{;} tmdelay(18) ;//>120us } //return(value); } //向 1-WIRE 总线上写一个字节 void write_char(uchar val) { uchar i; locatecursor(3,1); for (i=8; i>0; i--) // writes uchar, one bit at a time { //DQ = 1; //tmdelay(1); DQ = 0; // pull DQ low to start timeslot tmdelay(1); if(val&0X01==1) {DQ = 1;tmdelay(12); } else {DQ=0;tmdelay(12); DQ=1;tmdelay(1); } //tmdelay(10); // hold value for remainder of timeslot val=val>>1; } DQ = 1; tmdelay(1); } ///////读DS18B20的64bit的KEY //读取温度 void Read_Temperature(uchar no) { uchar j=0; value=0; if(tm_initial()==1) goto noanswer; write_char(0X55); // 匹配 ROM //写暂存存储器(4EH)、读暂存存储器(BEH)、复制暂存存储器(48H)、温度变换(44H)、重 //新调出EERAM(B8H)和读电源供电方式(B4H)命令 while(j<8) { write_char(tempkey[no][j]); j++; } write_char(0x44); // Start Conversion delaylong(355) ; //>780ms// 延时一段时间,等待AD转换结束,默认12位则>750ms if(tm_initial()==1) goto noanswer; write_char(0X55); // 匹配 ROM j=0; while(j<8) { write_char(tempkey[no][j]); j++; } write_char(0xBE); // Read Scratch Pad read_char(); //first temperatue low temdate[no][0]=value; read_char(); //then temperatue high temdate[no][1]=value; //tm_initial(); //write_char(0xCC); //Skip ROM //return temp.x/2; noanswer:; } //////////////////////////end Read_Temperature(void) //////////////////// /////////////////////////// /***************************现为各液晶子函数体******************///// void WRD(uchar DATA) //写lcd数据子函数 { CHEBF(); ADWRD=DATA; ADWRD=DATA; } void WRI(uchar com) //写lcd指令子函数 { CHEBF(); ADWRI=com; ADWRI=com; } void CHEBF() //读lcdBF子函数 { state=ADRI; while(BF) { state=ADRI; } } void lcdinitialdat() //写lcd数据初始化 { WRI(0X30) ; //RE=0基本指令设定 delay(); WRI(0X30) ; //延迟39us delay(); WRI(stadis2); //游标开,反白允许 //WRI(0X0E); //游标开,反白不允许 //WRI(stadis1); //游标关,反白不允许 delay(); //延迟39us WRI(clrdis) ; //清除显示 delay(); //延迟39us WRI(inpointcursorup); //AC+1 delay(); //延迟39us }//END initialdat() void locatecursor(uchar H,uchar L)//定位游标(cursor),行H,列L (最大可到四行八列) { L--; switch(H) { case 1:WRI(0X80+L);break; //第一行 case 2:WRI(0X90+L);break; //第二行 case 3:WRI(0X88+L);break; //第三行 case 4:WRI(0X98+L);break; //第四行 } } void delay(void) {uchar i=100; while(i--); } void delaylong(int n) { uchar j=100; while(n--) { while(j--); } }