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

📄 ds1820.c

📁 使用51系列单片机(AT89S52)控制LCD(12864),全菜单化操作控制初始时间输入
💻 C
字号:
/*********************************************************************************************************                  
*                                     		ds1820 drivers
*                                       	QZhao,2007
*                                       	All Rights Reserved  
* File : ds1820.c
* By   : QZhao
* Contact : zq1987731@163.com
*********************************************************************************************************/

/*★★★可调用函数:TempConvert()->温度转换开始,结果存入全局变量tph,tpl	 DIS_T_Z()->温度转为数字存入缓冲区*/

/*********************************************************************************************************     
*             
*                                     		产生复位脉冲初始化DS18B20
*
*********************************************************************************************************/

	static bool TxReset(void)
	{
		uint i;
		DQ=0;
	
		/* 拉低约900us */
		i=100;
		while(i>0)	
			i--;	
		DQ=1;				// 产生上升沿
		i=4;
		while(i>0)	
			i--;
		return TRUE;
	}

/*********************************************************************************************************     
*             
*                                     		等待应答脉冲
*
*********************************************************************************************************/

/*	static bool RxWait(void)
	{
		uint i;
		while(DQ);
		while(~DQ);			// 检测到应答脉冲 
		i = 4;
		while(i>0)	
			i--;
		return TRUE;
	}
*/

/*********************************************************************************************************     
*             
*                                     		读取数据的一位,满足读时隙要求
*
*********************************************************************************************************/

	static bit RdBit(void)
	{
		uint i;
		bit b;
		DQ=0;
		i++;
		DQ=1;
		i++;i++;			// 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
		b=DQ;
		i=8;
		while(i>0) 
			i--;
		return b;
	}

/*********************************************************************************************************     
*             
*                                     		读取数据的一个字节
*
*********************************************************************************************************/

	static uchar RdByte(void)
	{
		uchar i,j,b;
		b=0;
		for(i=1;i<=8;i++)
		{
			j=RdBit();
			b=(j<<7)|(b>>1);
		}
		return b;
	}

/*********************************************************************************************************     
*             
*								写数据的一个字节,满足写1和写0的时隙要求
*
*********************************************************************************************************/

	static bool WrByte(uchar b)
	{
		uint i;
		uchar j;
		bit btmp;
		for(j=1;j<=8;j++)
		{
			btmp=b&0x01;
			b>>=1;		// 取下一位(由低位向高位)
			if(btmp)
			{
				/* 写1 */
				DQ=0;
				i++;i++;	// 延时,使得15us以内拉高
				DQ=1;
				i=8;
				while(i>0) 
					i--;	// 整个写1时隙不低于60us 
		   	}
			else
			{
				/* 写0 */
				DQ = 0;			
				i = 8;
				while(i>0) 
					i--;	// 保持低在60us到120us之间
				DQ = 1;
				i++;i++;
			}
		}
		return TRUE;
	}

/*********************************************************************************************************     
*             
*                                     		启动温度转换
*
*********************************************************************************************************/

	static bool convert(void)
	{
		TxReset();			// 产生复位脉冲,初始化DS18B20
//		RxWait();			// 等待应答(由↓延时代替)
		delayms(10);
		delayms(1);			// 延时
		WrByte(0xcc);		// skip rom 命令
		WrByte(0x44);		// convert T 命令
		return TRUE;
	}

/*********************************************************************************************************     
*             
*                                     		读取温度值
*
*********************************************************************************************************/

	bool RdTemp(void)
	{
		TxReset();			// 产生复位脉冲,初始化DS18B20 
//		RxWait();			// 等待应答(由↓延时代替)
		delayms(10);
		delayms(1);			// 延时
		WrByte(0xcc);		// skip rom 命令
		WrByte(0xbe);		// read scratchpad 命令
		tpl=RdByte();		// 温度值低位字节(其中低4位为二进制的“小数”部分)
		tph=RdByte();		// 高位值高位字节(其中高5位为符号位)
		return TRUE;		
	}

/*********************************************************************************************************     
*             
*                                     		温度转换开始
*
*********************************************************************************************************/   
        
	bool TempConvert(void)
	{	
		delayms(1);		// 延时1ms
		convert();		// 启动温度转换,需要750ms
		return TRUE;
	}

/*********************************************************************************************************     
*             
*                                     		温度-数值转换
*
*********************************************************************************************************/   

	bool DIS_T_Z(void)
	{
		int a;
		uchar a0,a1,a2,a3,af;

		a=(int)tph<<8|(int)tpl;

		if(tph&0x80)				//符号部分转换
		{	
			DIS_BUF_T[0]='-';
			a=a^0xFFFF+1;
		}
		else 	
			DIS_BUF_T[0]='+';

		a0=(uchar)(a>>4);			//温度整数部分转换
		a1=a0%10;
		a2=(a0%100-a0)/10;
		a3=(a0-a0%100)/100;		
		DIS_BUF_T[1]=a3+0x30;
		DIS_BUF_T[2]=a2+0x30;
		DIS_BUF_T[3]=a1+0x30;
		
		DIS_BUF_T[4]='.';

		af=(uchar)(a&0x000F);		//小数部分处理
		switch(af)
		{
			case 0x00:
				DIS_BUF_T[5]='0';	DIS_BUF_T[6]='0';	DIS_BUF_T[7]='0';	DIS_BUF_T[8]='0';	break;
			case 0x01:
				DIS_BUF_T[5]='0';	DIS_BUF_T[6]='6';	DIS_BUF_T[7]='2';	DIS_BUF_T[8]='5';	break;
			case 0x02:
				DIS_BUF_T[5]='1';	DIS_BUF_T[6]='2';	DIS_BUF_T[7]='5';	DIS_BUF_T[8]='0';	break;
			case 0x03:
				DIS_BUF_T[5]='1';	DIS_BUF_T[6]='8';	DIS_BUF_T[7]='7';	DIS_BUF_T[8]='5';	break;
			case 0x04:
				DIS_BUF_T[5]='2';	DIS_BUF_T[6]='5';	DIS_BUF_T[7]='0';	DIS_BUF_T[8]='0';	break;
			case 0x05:
				DIS_BUF_T[5]='3';	DIS_BUF_T[6]='1';	DIS_BUF_T[7]='2';	DIS_BUF_T[8]='5';	break;
			case 0x06:
				DIS_BUF_T[5]='3';	DIS_BUF_T[6]='7';	DIS_BUF_T[7]='5';	DIS_BUF_T[8]='0';	break;
			case 0x07:
				DIS_BUF_T[5]='4';	DIS_BUF_T[6]='3';	DIS_BUF_T[7]='7';	DIS_BUF_T[8]='5';	break;
			case 0x08:
				DIS_BUF_T[5]='5';	DIS_BUF_T[6]='0';	DIS_BUF_T[7]='0';	DIS_BUF_T[8]='0';	break;
			case 0x09:
				DIS_BUF_T[5]='5';	DIS_BUF_T[6]='6';	DIS_BUF_T[7]='2';	DIS_BUF_T[8]='5';	break;
			case 0x0A:
				DIS_BUF_T[5]='6';	DIS_BUF_T[6]='2';	DIS_BUF_T[7]='5';	DIS_BUF_T[8]='0';	break;
			case 0x0B:
				DIS_BUF_T[5]='6';	DIS_BUF_T[6]='8';	DIS_BUF_T[7]='7';	DIS_BUF_T[8]='5';	break;
			case 0x0C:
				DIS_BUF_T[5]='7';	DIS_BUF_T[6]='5';	DIS_BUF_T[7]='0';	DIS_BUF_T[8]='0';	break;
			case 0x0D:
				DIS_BUF_T[5]='8';	DIS_BUF_T[6]='1';	DIS_BUF_T[7]='2';	DIS_BUF_T[8]='5';	break;
			case 0x0E:
				DIS_BUF_T[5]='8';	DIS_BUF_T[6]='7';	DIS_BUF_T[7]='5';	DIS_BUF_T[8]='0';	break;
			case 0x0F:
				DIS_BUF_T[5]='9';	DIS_BUF_T[6]='3';	DIS_BUF_T[7]='7';	DIS_BUF_T[8]='5';	break;
			default: break;
		}
		return TRUE;
	}




⌨️ 快捷键说明

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