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

📄 18b20.c

📁 万年历
💻 C
字号:
#include<reg52.h>
#include<all.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  =P2^7;   				//模拟1_Wire总线DQ

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


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位
	
	temp =  tempH ;	   
	temp<<=8;
	temp |= tempL;
	return(temp);

}


/********************************/
/**********温度显示**************/
/********************************/

 void temperature_display(uint display_data)      //显示函数
{
    uint Temp,Temp2;
    uchar t[5];                 //存放温度值数组
	Temp=display_data*6.25;     //最小分辨率0.0625,在此先放大100倍
	t[0]=Temp/1000;             //温度十位
    t[1]=Temp%1000/100;         //温度个位
    t[2]=11;					 //小数点
    t[3]=Temp%1000%100/10;      //温度十分位
    t[4]=Temp%1000%100%10;      //温度百位
	Temp2=Temp/100;

	LCD_write_shu(5,4,t[0]);
  	LCD_write_shu(6,4,t[1]);
	LCD_write_shu(7,4,t[2]);
	LCD_write_shu(8,4,t[3]);
	LCD_write_hanzi(6,4,22);  //℃
}


⌨️ 快捷键说明

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