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

📄 cewen.c

📁 基于C51单片机使用DS18B20的测温原理
💻 C
字号:

#include    <reg52.h>                   //52系列单片机定义文件
#include    <absacc.h> 
#include    <string.h>
#include    <intrins.h>

#define     uchar   unsigned char       //定义无符号字符
#define     uint    unsigned int        //定义无符号整数
sbit    DQ =P3^2;   //18B20的数据口
code char  jtled[18]=
{ 
        0x09,/*0*/
        0x7D,/*1*/
        0x07,/*2*/
        0x15,/*3*/
        0x71,/*4*/
        0x91,/*5*/
        0x81,/*6*/
        0x3D,/*7*/
        0x01,/*8*/
        0x11,/*9*/
        0x21,/*A*/
        0xC1,/*b*/
        0x8B,/*C*/
        0x45,/*d*/
        0x83,/*E*/
        0xA3,/*F*/


//  0x0A,0x7E,0x92,0x16,0x66,0x07,0x03,0x3E,0x02,0x26,0x22,0x43,0x8B,0x52,0x83,0xA3
//   0    1     2    3    4    5    6    7    8    9    A    b    C    d   E    F
};
                 


/********************************************************************
                    
函 数 名:Delay_Ms()
功    能:延时函数  
说    明:延时几个Ms
入口参数:del:  延时量
返 回 值:无        
设    计:zhouhong            日    期:2005-08-25
修    改:                    日    期:
***********************************************************************/
void Delay_Ms(unsigned int del)
{	                
	unsigned int i,j;
	for(i=0;i<del;i++)
	{               
		for(j=0;j<620;j++)
		;           
	}               
}  

//模拟串口工作方式0工作

void	 MN_Send_Byte(uchar d)
{
	SCON = 0x00;
	SBUF = d;
	while(TI == 0);
	TI = 0;
}

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

函 数 名:ReadOneChar
功    能:从DS18B20读一个字节数据
说    明:主要用于读温度的值(内部函数)
入口参数:无	
返 回 值:所读的数据值
设	  计:鞠春       		   日	 期:2004年11月8号
修	  改:ZHOUHONG 			   日	 期:2005-8-27 20:16  
***********************************************************************/
unsigned char  ReadOneChar(void)
{
   	unsigned char i,j,temp;
    temp=0;
    for(i=0;i<8;i++)
    {
    temp >>= 1;	//右移一位
    DQ=0;
    _nop_();		//1~15us
    _nop_();
    DQ=1;
    for(j=2;j>0;j--);
    if(DQ==1)		//读1或读0
    {
    temp=temp | 0x80;
    }
    else
    {
    temp=temp | 0x00;
    }
    for(j=2;j>0;j--);
    }
    return(temp);
}
/********************************************************************


void WriteOneChar(unsigned char dat)
/********************************************************************

函 数 名:ReadTemperature()
功    能:读取温度
说    明: 完成温度值的输出
入口参数:无	
返 回 值:(int) t为温度值*10倍
设	  计:鞠春       		   日	 期:2004年11月8号
修	  改:ZHOUHONG 			   日	 期:2005-8-27 20:50  
***********************************************************************/



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

函 数 名:Init_DS18B20()
功    能:初始化DS18B20函数
说    明:完成DS18B20的复位
入口参数:无	
返 回 值:无
设	  计:鞠春       		   日	 期:2004年11月8号
修	  改:ZHOUHONG 			   日	 期:2005-8-27 19:54  
***********************************************************************/
Init_DS18B20(void)
{
         uchar i;
         DQ=1;
         ;   
         DQ=0;
         for(i=255;i>0;i--);		//480~960us
         DQ=1;
         ;              	//15~60us
         while(DQ);			//应答脉冲为将DQ接低
         for(i=200;i>0;i--);
}

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

函 数 名:WriteOneChar()
功    能:写一个字节到DS18B20
说    明:写一个字节到DS18B20(内部函数)
入口参数:写入的数据值	
返 回 值:无
设	  计:鞠春       		   日	 期:2004年11月8号
修	  改:ZHOUHONG 			   日	 期:2005-8-27 20:22  
***********************************************************************/
void WriteOneChar(uchar command)
{
    uchar i,j;
   for(i=0;i<8;i++)
    {
    if((command & 0x01)==0)
    {
    DQ=0;
    for(j=35;j>0;j--);		//60~120us
    DQ=1;			
    }
    else
    {
    DQ=0;
    for(j=2;j>0;j--);		//<15uS
    DQ=1;
    for(j=33;j>0;j--);		//60~120us
    }
    command=command>>1;	//右移	
    }
}
    	       


int ReadTemperature(void)
{
	unsigned char a=0;
	unsigned char b=0;
	int t=0;
	float tt=0;
	Init_DS18B20();
	WriteOneChar(0xCC); // 跳过读序号列号的操作
	WriteOneChar(0x44); // 启动温度转换
	Delay_Ms(25);      //延时大于750ms
	Init_DS18B20();
	WriteOneChar(0xCC); //跳过读序号列号的操作
	WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
	a=ReadOneChar();       //低位输出
	b=ReadOneChar();       //高位输出
	t=b;
	t<<=8;
	t=t|a;
	tt=t*0.0625;
	t=(int) (tt*10+0.5); //放大10倍输出并四舍五入---此行没用
	return(t);
}
//18B20温度测量

/**************************************************************
//key5---按键5执行子程序
//18B20程序,调用一次,然后静态显示的方法在数码管上显示
**************************************************************/
void main(void)
{
    int i,te[8];
    i=ReadTemperature();
    te[2]=i%10;
	i=i/10;
	te[1]=(i%10);
	i=i/10;
	te[0]=i%10;
	MN_Send_Byte(jtled[0]);
    MN_Send_Byte(jtled[te[0]]);
    MN_Send_Byte(jtled[te[1]]-1);
    MN_Send_Byte(jtled[te[2]]);
}
       

⌨️ 快捷键说明

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