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

📄 stc12c5a60s2-pdip40+ds18b20+lcd1602ʦ

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

#include "STC12C56.h"
#include <intrins.h>

#define  BYTE   unsigned char
#define  WORD unsigned int

sbit DQ = P2^3; 				//数据接口定义
BYTE TempBuffer[6];	      //温度数据字符
bit symbol = 0;					//温度数据正负号 1-温度为负值,0-温度为正值
//bit delaytestflag=0;   //延时断点测试标志



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



/*--------------------------------------------*/
//us级别延时函数
void DelayXus(BYTE x, BYTE y)
{
		BYTE tempx,tempy=y;
		do
		{
				tempx=x;
				while(--tempx);	
		}while(--tempy);
}



/*--------------------------------------------*/
//ms级别延时函数
void DelayXms(BYTE x,BYTE y,BYTE z)
{
	    BYTE tempx,tempy,tempz=z;
        do
        {
               tempy=y;
               do
               {
                       tempx=x;
                       while(--tempx);
               }
               while (--tempy);
        }
        while (--tempz);
}



/*--------------------------------------------*/
//DS18B20初始化函数
bit Init_DS18B20(void)
{
		bit Status=0;
		DQ=1;			//DS18B20复位
		_nop_();         //连续两个空操作指令等待引脚电平变高
		_nop_();     
		DQ=0;			//低电平复位
		_nop_();         //连续两个空操作指令等待引脚电平变低
		_nop_();
		DelayXus(6,175);	   //508us
		DQ=1;			//释放总线
		_nop_();
		_nop_();
		DelayXus(1,27);   //31us		//延时15us~60us  准备接收数据
		Status=DQ;		//如果Status=0则初始化成功,Status=1则初始化失败
		DelayXus(2,90);	   //131us    //60~240us低电平存在脉冲,以此向CPU表示复位成功
		return (Status);
}



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



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



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

		Init_DS18B20();			//先复位,再写ROM,最后写RAM
		WriteOneByte(0xcc);		//跳过读出序列号的操作
		WriteOneByte(0x44);		//启动温度转换,默认的【12Bits】转化
		DelayXms(150,171,80);   //752ms	//12Bits转换时间750ms
//		while(!DQ);查询方式

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

		TempL=ReadOneByte();	//读出温度值低8位/低四位为小数位
		TempH=ReadOneByte();	//读出温度值高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
	BYTE  Temp_Value= ReadTempature(); //关键:从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;
	    }
	}	
}

/*--------------------------------------------*/





⌨️ 快捷键说明

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