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

📄 stc12c5a60s2-pdip40+ds18b20+lcd1602ʦ

📁 基于8051仿真 STC12C5A60S2-PDIP40+DS18B20+LCD1602
💻
字号:
/*--------------------------------------------*/
//File: DS18B20_A.H  
//Note:	DS18B20的驱动程序 12Bits数据


/*--------------------------------------------*/
#ifndef __DS18B20_A_H__
#define __DS18B20_A_H__

sbit DQ = P2^3; 				//数据接口定义
unsigned char TempBuffer[6];	//温度数据字符
bit symbol = 0;					//温度数据正负号 1-温度为负值,0-温度为正值



/*--------------------------------------------*/
//函数声明
bit Init_DS18B20(void);              //DS18B20初始化函数,如果bit=0则初始化成功,bit=1则初始化失败
unsigned char ReadOneChar(void);     //DS18B20读出一个字节
void WriteOneChar(unsigned char dat);//DS18B20写入一个字节
unsigned char ReadTemp(void);		 //读出DS18B20当前的温度
void Temp_To_String(void);			 //温度数据转化成液晶字符显示//函数返回值为TempBuffer



/*--------------------------------------------*/
////延迟时间函数
//void delay(unsigned char x, unsigned char y, unsigned char z)
//{
//    unsigned char tempx,tempy,tempz=z;
//    do
//	{
//		tempy=y;
//		do
//		{
//		    tempx=x;
//			while(--tempx);
//		}while(--tempy);
//	}while(--tempz);
//}
/*******延时函数**********/
//因外接电路外部晶振为11.0592MHz且STC12C5A60S2为1T单时钟/机器周期的单片机
//则STC12C5A60S2时钟周期Tosc=1/11.0592us=0.0904us,则机器周期Tm=Tosc=0.0904us
void delay(ms)//延时总时间:delaytime=(ms*560*0.0904)us
{  
    uint i,j;//取值范围0~65535 
    for(i=ms;i>0;i--)    
        for(j=560;j>0;j--);    //如用89C51系芯片改J=110
}


/*--------------------------------------------*/
//DS18B20初始化函数
bit Init_DS18B20(void)
{
	bit Status=0;
	DQ=1;			//DS18B20复位
	//delay(1,1,1);	//17us
	DQ=0;			//低电平复位
    //delay(9,1,19);	//500us		//保持低电平大于480us
	delay(10);//506.24us
	DQ=1;			//释放总线
	//delay(2,1,2);	//30us		//延时15us~60us  准备接收数据
	delay(1);//50.624us
	Status=DQ;		//如果Status=0则初始化成功,Status=1则初始化失败
	//delay(10,5,1);	//130us		//必要延迟时间
	delay(3);//151.9us
	return (Status);
}



/*--------------------------------------------*/
//DS18B20读出一个字节
unsigned char ReadOneChar(void)
{
	unsigned char i=0;
	unsigned char dat=0;
	for(i=8;i>0;i--)
	{
		DQ=0;			//读出数据开始//_nop_();
		dat>>=1;		//由低到高位依次读出
		DQ=1;			//释放总线
		if(DQ)
			dat|=0x80;	//15us内必须完成读数据
		//delay(4,5,1);	//70us 	//60us~120us释放总线
		delay(2);//101.248us
	}
	return (dat);
}



/*--------------------------------------------*/
//DS18B20写入一个字节
void WriteOneChar(unsigned char dat)
{	
	unsigned char i=0;
	for(i=8;i>0;i--)
	{
		DQ=0;			//写开始
		DQ=dat&0x01;	//由低到高依次写入
		//delay(3,5,1);	//60us	//写入数据时间间隙为:至少60us连续写2位间的间隙应大于1us
		delay(2);//101.248us
		DQ=1;			//释放总线	
		dat>>=1;
	}
}



/*--------------------------------------------*/
//读出DS18B20当前的温度
unsigned char ReadTemp(void)
{
	unsigned char TempL=0;
	unsigned char TempH=0;
	unsigned char Temp_Value; 


	Init_DS18B20();			//先复位,再写ROM,最后写RAM
	WriteOneChar(0xcc);		//跳过读出序列号的操作
	WriteOneChar(0x44);		//启动温度转换,默认的【12Bits】转化
	//delay(217,94,17);		//700ms	//12Bits转换时间750ms
	delay(15);//759.36us

	Init_DS18B20();			//先复位,再写ROM,最后写RAM
	WriteOneChar(0xcc);		//跳过读出序列号的操作
	WriteOneChar(0xbe);		//读出温度寄存器
	//delay(1,1,1);			//17us	

	TempL=ReadOneChar();	//读出温度值低8位/低四位为小数位
	TempH=ReadOneChar();	//读出温度值高8位/高四位和第四位为符号位
	
	if((TempH>>4)==0x0f)	//取高4位:1111=负数 0000=正数
		 symbol = 1;
	else
		 symbol = 0;

	Temp_Value=TempH<<4 | TempL>>4;
	return (Temp_Value);			
}



/*--------------------------------------------*/
//温度数据转化成液晶字符显示
void Temp_To_String(void)
{
	//symbol初值为0
	//DS18B20测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C
	unsigned char  Temp_Value= ReadTemp(); //关键:从DB18B20读取其当前温度
	if(symbol==1)
	{
		Temp_Value = 256 - Temp_Value;//取反将结果左移8位
		TempBuffer[0]=Temp_Value/100+0x2d;//'-';	//如果温度为负值,则百位充当符号位
		TempBuffer[1]=Temp_Value/10%10+'0';	//十位
		TempBuffer[2]=Temp_Value%10+'0';	//个位
		TempBuffer[3]=0xdf;					//温度符号
		TempBuffer[4]=0x43;//'C';
		TempBuffer[5]='\0';					//字符串结束标志符
		if(TempBuffer[1]=='0')//0x30)        //高位为0,不显示
	    { 
	        TempBuffer[1]=0x20;//''编码为0x20              
	        if(TempBuffer[2]=='0')//0x30)       //次高位为0,不显示
	            TempBuffer[2]=0x20;
	    }
	}		
	else
	{
	    TempBuffer[0]=Temp_Value/100+0x20;//'0';     //如果温度为正值,则讲百位数据转换位对应ASCII码
		TempBuffer[1]=Temp_Value/10%10+'0';	//十位
		TempBuffer[2]=Temp_Value%10+'0';	//个位
		TempBuffer[3]=0xdf;					//温度符号
		TempBuffer[4]=0x43;//'C';
		TempBuffer[5]='\0';					//字符串结束标志符
		if(TempBuffer[0]=='0')//0x30)        //高位为0,不显示
	    { 
	        TempBuffer[0]=0x20;//''编码为0x20              
	        if(TempBuffer[1]=='0')//0x30)       //次高位为0,不显示
	            TempBuffer[1]=0x20;
	    }
	}	
}

/*--------------------------------------------*/
#endif 




⌨️ 快捷键说明

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