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

📄 ds18b20.h

📁 此程序是基于89s52单片机的c程序
💻 H
字号:
#include<Keyscan.h>
#define uchar unsigned char
#define uint unsigned int

/*DS18B20功能命令*/
#define SEARCH_ROM 			0xf0	//搜索ROM
#define READ_ROM 			0x33	//读DS18B20序列号
#define MATCH_ROM 			0x55	// 匹配ROM
#define SKIP_ROM 			0xcc	//跳过读序列号的操作
#define ALARM_SEARCH 		0xec	// 报警搜索
#define CONVERT_T 			0x44	//启动温度转换
#define WRITE_SCRATCHPAD	0x4e	// 可写3个字节到暂存器,即高温,低温触发器和配置寄存器
#define READ_SCRATCHPAD	    0xbe	//读取温度寄存器
#define READ_POWER_SUPPLY	0xb4	//读供电方式,0为寄生方式,1为外部电源
#define COPY_SCRATCHPAD		0x48	//拷贝存储器

sbit DQ  =P0^0;   				//模拟1_Wire总线DQ

uchar Highlimit=30;			//代表初始上限30
uchar Lowlimit =27;			//代表初始下限27
uint  temp;

extern uint  Set_limit( );
extern void Lcd1602_Write_Data(uchar row,uchar column,uchar Data);

void Wire_delay(uint i)			 //延时(15+10i)us

{
    while(i--);					                                                                                                                                                                              
    
}


void Reset_DS18B20( )			 //初始化函数
{
    uchar Reset_flag=0;

    DQ = 1;    			//主机拉低DQ至少480us开始时序
    Wire_delay(8); 
    DQ = 0;    			//上拉电阻拉高总线
    Wire_delay(80);		//等待DS18B20响应
	DQ = 1; 
    Wire_delay(14);
	Reset_flag=DQ;      //采样应答信号
	Wire_delay(20);
}



uchar Read_byte( )			//读一个字节
{
	uchar i,receive_data;

    for(i=8;i>0;i--)
     {
	  	DQ = 0; 			// 给脉冲信号
		receive_data>>=1;
		DQ = 1;				 // 给脉冲信号
		if(DQ)
		receive_data|=0x80;
		Wire_delay(4);
     }

     return(receive_data);

}


Write_byte(uchar write_data)	 	//写一个字节
{
    uchar i;

    for(i=8;i>0;i--)
    {
		DQ = 0;
		DQ = write_data&0x01;		 //1_wire低位在前传输
		Wire_delay(5);
		DQ = 1;
		write_data>>=1;
			
    }

	Wire_delay(4);
}


DS18B20_Initial( )				  //18b20寄存器初始化
{
	Reset_DS18B20( );
	Write_byte(SKIP_ROM );			//跳过读序列号
	Write_byte(WRITE_SCRATCHPAD);	// 可连续写3个字节到暂存器,即高温,低温触发器和配置寄存器
	Write_byte(Highlimit);			//设置上限温度值
	Write_byte(Lowlimit);		    //设置下限温度值
	Write_byte(0x7f);   	        //设置为12位分辨率
	Reset_DS18B20( );
	Write_byte(SKIP_ROM );			//跳过读序列号
	Write_byte(COPY_SCRATCHPAD);    //拷贝存储器命令	 		
}


uint Read_temperature( )		 //读取温度
{
	uint  temp=0;
	uchar tempL=0;			 	//温度值低8位
	uchar tempH=0;				//温度值高8位

    Reset_DS18B20( );
    Write_byte(0xCC );       	// 跳过读序号列号的操作
    Write_byte(0x44 );      	// 启动温度转换
    Reset_DS18B20( );
    Write_byte(0xCC );         //跳过读序号列号的操作
    Write_byte(0xBE);   		//读取温度寄存器(共可读9个寄存器),前两个就是温度值
    
    tempL=Read_byte( );         	//读取温度值低8位
    tempH=Read_byte( );        		//读取温度值高8位
	
/*	tempL=tempL>>4;            //低位右移4位,舍弃小数部分
	temp=tempH<<4;            //高位左移4位,舍弃符号位
	temp=temp|tempL;  
	return(temp);			  	 */

	temp =  tempH ;	   
	temp<<=8;
	temp |= tempL;
	return(temp);

}



⌨️ 快捷键说明

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