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

📄 44.c

📁 ds18b20.rar
💻 C
字号:
# include "reg51.h" 
# include "intrins.h" 

# define   disdata  P0
# define   discan   P2

# define uchar unsigned char 
# define uint unsigned int 

sbit DQ = P3^7; //温度输入口
sbit DIN = P0^7;//led小数点控制
/*sbit P3_4 = P3^4; //温度输入口
sbit P3_5 = P3^5; //温度输入口
sbit P3_6 = P3^6; //温度输入口
sbit P3_7 = P3^7; //温度输入口
 
 
uchar  DQ;	*/
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]={0xf7,0xfB,0xFD,0xFE};//列扫描控制字 
uchar data temp_data[2]={0x00, 0x00,}; 		//读出温度暂存
uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据,1个运算暂存用
  
void delay(uint t) 
{ 
for(;t>0;t--); 
}

/******************************显示扫描函数******************************/ 
scan() 
{ 
  char k; 
  for(k=0;k<4;k++) 		//4位LED扫描控制
  { 
   disdata=dis_7[display[k]]; 
   if(k==1){DIN=0;} 		 //当K=1时,P0^7为低电平显示小数点
   discan=scan_con[k];	 //列扫描
   delay(30);
   discan=0xFF; 
  } 
}

/*******************************DS复位函数******************************/ 
ow_reset(void) 
{ 
  char presence=1; 

  while(presence) 
  { 
   while(presence) 
   { 
    DQ=1;_nop_();_nop_(); 
    DQ=0; 
    delay(50);  //延时550毫秒
    DQ=1; 
    delay(6); 
    presence=DQ; 
   } 
    delay(45); 
    presence=~DQ; 
  } 
    DQ=1; 
 }  
    
 /*****************************DS写命令函数*********************************/ 
 void write_byte(uchar val)  //向1-WIRE总线上写一字节
 { 
  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; 	//右移1位
  } 
   DQ=1; 
   delay(1); 
 }
  
/*******************************DS读一字节函数****************************************************/  
 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]=(255-temp_data[1]);temp_data[0]=(255-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[1]/10; 
  display[1]=display[1]%10; 
  
  if(!display[3]){display[3]=0x0a; 
  if(!display[2]){display[2]=0x0a;}} //最高位为0时不显示
  if(n){display[3]=0x0b;} 			 //负温度是最高为显示“-”
 }
  
 /*******************************主函数**********************************************************/ 
 main () 
 { 
  disdata=0xff;// 初始化端口
  discan=0xff;
						 
  for(h=0;h<4;h++)		  //开机显示“8888”scan();
  {display[h]=8;}
  
  ow_reset(); 		//开机先转换一次
  write_byte(0xcc);//skip ROM 
  write_byte(0x44);//发转换命令
   
  for(h=0;h<500;h++)//开机显示“8888”两秒 
   {scan();} 

  while(1) 
   { 
    read_temp();  //读出温度数据
    work_temp();  //处理温度数据
    for(h=0;h<500;h++) //显示温度两秒
     {scan();} 
    } 
}

⌨️ 快捷键说明

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