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

📄 ds18b20温度采集的设计.c

📁 基于Proteus的51系列单片机设计与仿真
💻 C
字号:
/************************************************************************
           DS18B20测量温度
*************************************************************************/
#include "reg51.h"
#define uchar unsigned char 
#define uint unsigned int
sbit DQ=P3^0;
sbit p20=P2^0;
sbit p21=P2^1;
sbit p22=P2^2;
sbit p23=P2^3;
code uchar tab[]={ 0XC0,0XF9,0XA4,0XB0,0X99, //0~9
				   0X92,0X82,0XF8,0X80,0X90};	       
code uchar tab1[]={0X40,0X79,0X24,0X30,0X19, //0~9 
				   0X12,0X02,0X78,0X00,0X10};					        
uchar  a,b,t,h;
uchar  bai,shi,ge,xiao;
void delay(unsigned int i)
{
     while(i--);   
}
//初始化函数
bit int_DS18B20(void)
{
unsigned char x=0;
 DQ = 1;    //DQ复位
 delay(8);  //延时片刻
 DQ = 0;    //单片机将DQ拉低
 delay(80); //精确延时大于480us
 DQ = 1;    //拉高总线
 delay(14);
 x=DQ;      //延时片刻后,如果x=0则初始化成功,x=1则初始化失败
 delay(20);
return x;
}
//读一个字节
Read(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
 {
  DQ = 0; // 给脉冲信号
  dat>>=1;
  DQ = 1; // 给脉冲信号
  if(DQ)
   dat|=0x80;
  delay(4);
 }
 return(dat);
}
//写一个字节
Write(unsigned char dat)
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;
  delay(5);
  DQ = 1;
  dat>>=1;
 }
delay(4);
}
//启动转换
void int__(void)
{         
   while(int_DS18B20());//如果为一重新初始化
   Write(0xCC); // 跳过读序号列号的操作
   Write(0x44); // 启动温度转换
}
void  main(void)
{       
   uint count=0;
   P2=0X00;
   int__();//启动转换
   delay(2200);
     for(count=0;count<1000;count++)    //开机显示0
       {  p20=1;      //百位
		  P0=tab[0];    //负符号
		  delay(20);
		  p20=0;
          p21=1;         // 十位
		  P0=tab[0];
		  delay(20);
		  p21=0;			
		  p22=1;         //个位
		  P0=tab[0];
		  delay(0);
		  p22=0;
	      p23=1;         //显示温度标志C
		  P0=0xc6;
		  delay(20);
		  p23=0;
		} 
   while(1)
	 {              
       delay(120);
       while(int_DS18B20());//如果为一重新初始化
	   Write(0xCC); //跳过读序号列号的操作
       Write(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
       a=Read();   //读取温度值低位
       b=Read();   //读取温度值高位
          if(b>127)//如果b大于127 说明温度小于0
             {  a=~a;
 			    b=~b;
                a=a>>4;            //低位右移4位,舍弃小数部分
                t=b<<4;            //高位左移4位,舍弃符号位
                t=t|a; 
                t+=1;
                shi=t/10;
                ge=t-shi*10;
		     for(count=0;count<123;count++)    
                {  if(t>=10)  
					 { p20=1;      //百位
					   P0=0xBF;    //负数符号
					   delay(20);
					   p20=0;
                       p21=1;     // 十位
					   P0=tab[shi];
					   delay(20);
					   p21=0;
			           p22=1;     //个位
					   P0=tab1[ge];
					   delay(20);
					   p22=0;
                       p23=1;    //显示温度标志C
					   P0=0xc6;
					   delay(20);
					   p23=0;
					 }
					 else
					 { p20=0;
                       p21=1;   // 十位
					   P0=0xBF;    //负符号
					   delay(20);
					   p21=0;		
					   p22=1;         //个位
					   P0=tab1[ge];
					   delay(20);
					   p22=0;
					   p23=1;       //显示温度标志C
					   P0=0xc6;
					   delay(20);
					   p23=0;													   
					  }
				} 
			}
          else 
            {   count=0;
			    a=a>>4;            //低位右移4位,舍弃小数部分
                t=b<<4;            //高位左移4位,舍弃符号位
                t=t|a;             
                bai=t/100;
                shi=(t-bai*100)/10;
		        ge=t-(bai*100+shi*10); 
              for(count=0;count<123;count++)    
				  { if(bai) 
				 	   {  p20=1;      //百位
					      P0=tab[bai];
						  delay(20);
						  p20=0;
					    }
                      else 
						 p20=0;
                    if(shi)
					   {  p21=1;         // 十位
					      P0=tab[shi];
						  delay(20);
						  p21=0;
					    }
			            p21=0;
                        p22=1;         //个位
					    P0=tab1[ge];
					    delay(20);
						p22=0;
                        p23=1;         //小数点
					    P0=0xc6;
                        delay(20);
					    p23=0;
					 } 
				 } 
    int__();//启动转换
      }
}

⌨️ 快捷键说明

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