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

📄 main.c

📁 DS18B20在数字温度计中的使用 DS18B20的单总线的温度传感器
💻 C
字号:
//------------------------------------
//DS18B20复位函数 DS18B20写字节函数 
//DS18B20读字节函数 温度计算转换函数和显示函数
//------------------------------------
# include  "reg51.h" 
# include  "intrins.h" 
//-------------------------------------
# define   disdata P1 
# define   discan P3 
# define   uchar unsigned char 
# define   uint  unsigned int 
//------------------------------------
sbit DQ = P3^7; 
sbit DIN = P1^7; 
//------------------------------------
uint h; 

uchar code ditab[16] = {0X00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; 
uchar code dis_7[12] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; 
uchar code scan_con[4] = {0xfb,0xf7,0xef,0xdf}; 
uchar data temp_data[2] = {0x00, 0x00,}; 
uchar data display[5] = {0x00,0x00,0x00,0x00,0x00}; 

//------------------------------------
//延时函数
//---------------  
void delay(uint t) 
{ 
    for(;t>0;t--); 
} 
//------------------------------------
//扫描函数
//---------------
scan() 
{ 
	char k; 
	for(k=0;k<4;k++) 
	{ 
		disdata=dis_7[display[k]]; 
		if(k==1){DIN=0;} 
		discan=scan_con[k];delay(90);discan=0xff; 
	} 
} 
//-----------------------------------
//复位函数
//-----------------
ow_reset(void) 
{ 
	char presence=1; 
	while(presence) 
	{ 
		while(presence) 
		 { 
			   DQ=1;_nop_();_nop_(); 
			   DQ=0; 
			   delay(50); 
			   DQ=1; 
			   delay(6); 
			   presence=DQ; 
	     } 
	    delay(45); 
	    presence = ~DQ; 
  	} 
	DQ=1; 
} 
//--------------------------------
// 写字节函数
//-------------------
void write_byte(uchar val) 
{ 
	uchar i; 
	for(i=8;i>0;i--) 
	{ 
	
		 DQ=1;_nop_();_nop_();
		 DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_(); 
		 DQ=val&0x01;
		 delay(6); 	
		 val=val/2; 
	 } 
	DQ=1; 
	delay(1); 	
} 
//-----------------------------
// 读字节函数
//------------------------
uchar read_byte(void) 
{ 
    uchar i;
    uchar value=0; 
    for(i=8;i>0;i--)
    { 
	    DQ=1;_nop_();_nop_(); 
	    value >>=1;  
	    DQ=0; 
	    _nop_();_nop_();_nop_();_nop_(); 
	    DQ=1;_nop_();_nop_();_nop_();_nop_(); 
	    if (DQ)value|=0x80; 
	    delay(6); 
     } 
	DQ=1;
    return(value); 
} 
//--------------------------------
// 读温度函数
//-------------------------
read_temp() 
{ 
	 ow_reset(); 
	 write_byte(0xcc); 
	 write_byte(0xbe); 
	 temp_data[0]=read_byte(); 
	 temp_data[1]=read_byte(); 
	 ow_reset(); 
	 write_byte(0xcc); 
	 write_byte(0x44); 
} 
//--------------------------------
// 温度计算 显示函数
//----------------------
work_temp() 
{ 
	 uchar n=0; 
	 if(temp_data[1]>127) 
	 {
	     temp_data[1]=(256-temp_data[1]); 
		 temp_data[0]=(256-temp_data[0]);n=1;
	  } 

	 display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]]; 
	 display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ; 
	 display[3]=display[4]/100; 
	 display[1]=display[4]%100; 
	 display[2]=display[4]/10; 
	 display[1]=display[4]%10; 
	  
	 if(!display[3])
	 {
		 display[3]=0x0a; 
		 if(!display[2])
		 {
		     display[2]=0x0a;
		 }
	 } 
	 if(n)
	 {
	     display[3]=0x0b;
	 } 
} 
//---------------------------------------
// 主函数
//----------------
main () 
{ 
	 disdata=0xff; 
	 discan=0xff; 
	 for(h=0;h<4;h++){display[h]=8;} 
	 ow_reset(); 
	 write_byte(0xcc); 
	 write_byte(0x44); 
	 for(h=0;h<500;h++) 
	   {scan();} 

	 while(1) 
	 { 
	   read_temp(); 
	   work_temp(); 

	   for(h=0;h<500;h++) 
	    {scan();} 
	 } 
 } 

⌨️ 快捷键说明

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