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

📄 dingao.c

📁 DS18B20 (可以读取ROM进行显示)多个一起使用
💻 C
字号:
/**********************************************8
此程序在单片机开发板上调试通过
晶振:11.0592M
**********************************************/
#include "reg51.h"
#include "absacc.h"
#include "intrins.h"
#define uchar unsigned char
#define Uint unsigned int
uchar code duanma[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0,0x60,0x25,0x3c,0x23,0x34,0x74,0xff,0xd7,0x61,0x70,0xdf,0x27};
uchar code key_code[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b};
uchar code ksp[4]={0xef,0xdf,0xbf,0x7f};		

sbit DQ=P1^0;   //数据线
bit  S;         //符号位 
uchar buff[4]={0,0,0,0};
unsigned char tempL=0;//底8位暂存器读取
unsigned char tempH=0;//高8位暂存器读取
/***************************************************************************************************************/

/********************************************Ds18b20延时函数****************************************************/

void delay(unsigned int k)
{ 
 unsigned int i=0; 
 for(i=0;i<k;i++);
 return; 
} 

/***************************************************************************************************************/

/*********************************************Ds18b20初始化*****************************************************/

void Start()
{
 DQ=1; 
 delay(5);
 DQ=0; 
 delay(70); 
 DQ=1; 
 while(DQ);
 delay(14); 
}

/***************************************************************************************************************/

/**********************************************Ds18b20写函数****************************************************/

WriteOne(unsigned char dat)
{ 
 unsigned char i=0; 
 for(i=8;i>0;i--) 
  {
   DQ=0; 
   DQ=dat&0x01;
   delay(6);
   DQ=1;
   dat>>=1;
   delay(4);
  }
 delay(4);
}

/***************************************************************************************************************/

/**********************************************Ds18b20读函数****************************************************/

ReadOne() 
{
 unsigned char i=0; 
 unsigned char dat=0;
 for(i=8;i>0;i--) 
  {
   DQ=1;
   delay(1);
   DQ=0; 
   dat>>=1;
   DQ=1;
   if(DQ)
   dat|=0x80;
   delay(4);
  }
 return(dat);
}

/************************************************点阵显示*******************************************************/

Display( )
{		uchar i;
		
	   for(i=0;i<4;i++)
	   {
	     //if(i==0)
		 if(i==2)
		   {P0=(duanma[buff[i]]%0xdf);}
		  else
		   {P0=duanma[buff[i]];}

	 	 P2=ksp[i];
		
		 delay(500);
		  P2=0xff;
		}

}


/*************************************************主函数********************************************************/
void readtemperature()
{
unsigned int tmp;     //测量温度
 unsigned char Signed;  //判断符号
  Start();              //初始化
  //Display(tmp);
  WriteOne(0xcc);       //跳过读序列号的操作
  WriteOne(0x44);       //启动温度转换
  //Display(tmp);
  delay(125);           //延时   
  Start();              //初始化
  //Display(tmp);
  WriteOne(0xcc);       //跳过读序列
  WriteOne(0xbe);       //读暂存存储器
  //Display(tmp);
  tempL=ReadOne();      //读出温度的低
  tempH=ReadOne();      //读出温度的高

  Signed=tempH&0xf8;    //判断温度正负
  if(Signed==0x00)      //判断为正
   {
    S=0;
    tmp=((tempH*256)+tempL)*0.0625;
	    
	
    Display();
   }
  else                  //判断为负
   {
    S=1;
    tmp=~((tempH<<4)|(tempL>>4))+1;
	}
	buff[0]=tmp/100;
	buff[1]=tmp%100/10;
	buff[2]=tmp%10;
	buff[3]=tmp/10;;
   }
   display();
  
void main()
{
 
 while(1)
 {
 readtemperature();
}
}

   

⌨️ 快捷键说明

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