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