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

📄 ds18b20.c

📁 用于温度测量
💻 C
字号:
//温度测量实验
#include<reg51.h>
#include<intrins.h>
sbit data1=P1^0;
sbit clk=P1^1;
sbit DQ=P3^3;
//延时子程序,延时时间以12M晶振为准,延时时间为30us×time
void delay(unsigned char time)
  {
   unsigned char m,n;
     for(n=0;n<time;n++)
       for(m=0;m<2;m++){}
 }
/***********************************************************
写一位数据子程序
***********************************************************/
void write_bit(unsigned char bitval)
  {
    EA=0;
      DQ=0;				//拉低DQ以开始一个写时序
    if(bitval==1)
       {
        _nop_();
        DQ=1; 			//如要写1,则将总线置高
        }
      delay(5);  		//延时90us供DA18B20采样
    DQ=1;				//释放DQ总线
    _nop_();
    _nop_();
   EA=0;
   }
/***********************************************************
写一字节数据子程序
***********************************************************/
void write_byte(unsigned char val)
 {
  unsigned char i;
  unsigned char temp;
  EA=0; 
  for(i=0;i<8;i++)			//写一字节数据,一次写一位
      {
       temp=val>>i;			//移位操作,将本次要写的位移到最低位
       temp=temp&1;
       write_bit(temp);		//向总线写该位      
       }
   delay(7);				//延时120us后
  EA=1;
  }
/***********************************************************
读一位数据子程序
***********************************************************/
unsigned char read_bit()
 {
  unsigned char i,value_bit;
  EA=0;
  DQ=0;						//拉低DQ,开始读时序
  _nop_();
  _nop_();
  DQ=1;						//释放总线
  for(i=0;i<2;i++){}		//8us delay
  value_bit=DQ;
  EA=1;
  return(value_bit);
  }
/***********************************************************
读一字节数据子程序
***********************************************************/
unsigned char read_byte()
  {
   unsigned char i,value=0;
   EA=0;
   for(i=0;i<8;i++)
      {
       if(read_bit())	//读一字节数据,一个时序中读一次,并作移位处理
         value|=0x01<<i;
       delay(4);		//延时80us以完成此次都时序,之后再读下一数据
       }
   EA=1;
   return(value);
  }
/***********************************************************
复位子程序
***********************************************************/
unsigned char reset()
  {
   unsigned char presence;
   EA=0;
   DQ=0;				//拉低DQ总线开始复位
   delay(30);			//保持低电平480us
   DQ=1;				//释放总线
   delay(3);			//等待芯片应答信号 75us
   presence=DQ;			//获取应答信号
   delay(28);			//延时以完成整个时序
   EA=1; 
   return(presence);	//返回应答信号,有芯片应答返回0,无芯片则返回1
  }
//获取温度子程序
void get_temper()
 {
  unsigned char i,j;
  do
  {
    i=reset();			//复位
  }while(i!=0);			//1为无反馈信号
  i=0xcc;				//发送设备定位命令
  write_byte(i);
  i=0x44;				//发送开始转换命令
  write_byte(i);
  delay(180);			//延时
  do
  {
  i=reset();			//复位
  }while(i!=0);			//0为无反馈信号C,再次复位
  i=0xcc;		    	//设备定位
  write_byte(i);
  i=0xbe;		    	//读出缓冲区内容
  write_byte(i);
  j=read_byte();		//先读出低位
  i=read_byte();  		//后读出高位
  i=(i<<4)&0x7f;		//屏蔽最高位(一位符号位)
  j=j>>4;
  temper=i|j;  
  }
void disp_1(unsigned char disp_num1[6])
{
     unsigned char n,a,k,m;
     for(n=0;n<6;n++)
      {
       k=disp_num1[n];
       for(a=0;a<8;a++)
         {
          clk=0;          
           m=(disp_num1[n]&1);
            disp_num1[n]>>=1;
          if(m==1)
             data1=1;
          else
             data1=0;
          _nop_();
          clk=1;
          _nop_();
          }
       } 
 }
//显示子程序   功能:将占空比温度转化为单个字符,显示占空比和测得到的温度
void display()
{
unsigned char code number[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xe6};
 unsigned char disp_num[6];
 unsigned int k,k1;
 k=high_time;
 k=k%1000;
 k1=k/100;
 if(k1==0)
    disp_num[0]=0;
 else
    disp_num[0]=0x60;
 k=k%100;
 disp_num[1]=number[k/10]; 	
 disp_num[2]=number[k%10];
 disp_num[3]=0;
 k=temper;	
 k=k%100;
 disp_num[4]=number[k/10];
 disp_num[5]=number[k%10]; 
 disp_1(disp_num);
 }
/***********************************************************
主程序
***********************************************************/
 main()
 {
  EX1=0;					//关外部中断		
  high_time=50;             //初始化为占空比50%,周期为200ms
  low_time=50; 
  get_temper();
  display();
  } 

⌨️ 快捷键说明

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