⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.c

📁 美国DALAS公司的温度传感器ds1820芯片具有高灵敏度、易用性、编程布线简单等优点
💻 C
字号:

//DS1820 C51 子程序 
//这里以11.0592M晶振为例,不同的晶体速度可能需要调整延时的时间 
#include<reg52.h>
#include<lcd.h>
#include <absacc.h>
/////////////**********先为液晶初始化函数变量声明**********///////////
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--);
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -