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

📄 temp.c

📁 C51控制DS18B20
💻 C
📖 第 1 页 / 共 2 页
字号:
			nop	;
			}
		}
	}

	/*====================================================
	实现功能:写18B20子程序
	实现方法:一个写周期初始化信号为MCU把数据线拉低,18B20会
	在数据线变低后的15个US之后采样数据,一个写"0"周期为120
	个US,一个写"1"周期为60个US,在完成写周期之后MCU要释放总
	线,并保持至秒1个US的写周期恢复时间,接接着开始另外一个写
	周期,在完成写18B20之后要把数据线拉高度,因为18B20在处理
	温度时需这个外部条件.
	====================================================*/
	void     WByte_18b20(uchar Wrt_Data )
	{
	    uchar i;

//	    P_18B20 = High	;
	    for	( i = 0 ; i < 8 ; i++ )
	    {
		    P_18B20 = Low	;
	     	if	( Wrt_Data & 0x01 )
	     	{
			    P_18B20 = High	;
		 	}
			Delay_100us(1)		;	//	15us<"0"<120us
		    P_18B20 = High		;
     		Wrt_Data = Wrt_Data >> 1;
     	}
	}

	/*===================================================
	实现功能:读取18B20温度子程序.
	实现方法:一个读周期初始化信号为MCU把数据总线拉低并
	         保持至少1个US,接着18B20会将数据送到出并保持
	         15个US之内有效,一个读周期为60US,在读周期完
	         成后MCU要释放总线并保持至少1个US的恢复时间,
	         接着开始另一个读周期.
	====================================================*/
	uchar    RByte_18b20( void )
	{
	    uchar	i;
	    uchar 	Tmp;
//	    P_18B20 = High	;
		for	( i = 0 ; i < 8 ; i++ )
		{
			Tmp=Tmp>>1;
		    P_18B20 = Low	;
			Delay_10us()	;	//	1us<t<15us
		    P_18B20 = High	;
		    if	( P_18B20 )
		    {
		     	Tmp = Tmp | 0x80;
		    }
			Delay_100us(1)	;	//	must>45us
		}
		return( Tmp );
	}

	/*====================================================
	实现功能:读18B20的采样温度
	实现方法:先读温度的低字节,再读温度的高字节,并舍去低字
	节的低四位及高字节的高四位,将高字节的低四位与低字节的
	高四位合并成一个字节,并将高两位屏蔽.
	====================================================*/
	void    Read_Temp( void )
	{
		    uchar Temp_Low , Temp_High ;
	        Temp_Low      =	RByte_18b20( );//读低8位
	        Temp_High     =	RByte_18b20( );//读高8位
	        Temp_High	 &= 0x0f;
	        Temp_High	<<=	4;
	        Temp_Result[0]	 =	Temp_Low>>4;
	        Temp_Result[0]	 |=	Temp_High;
	        Temp_Low	&= 0x0f;
			Temp_Result[1]	=	Temp_Table[Temp_Low]	;
	}

	/*====================================================
	实现功能:对18B20初始化
	实现方法:MCU把数据线拉低并且保持最少480个US最多960个US
	接着MCU释放数据线,并在等待15个至60个US之后,18B20会将数
	据线拉低并且保持60个至240个US,之后18B20释放数据线,为了
	让18B20部分地释放数据线,可以做比较长的廷时.一个初始化周
	至少为960个US.
	====================================================*/
	void    Ds18b20_Initial( void )
	{
		BYTE	i	;
	    P_18B20 = High	;
		nop;nop;nop;
	    P_18B20 = Low		;
		Delay_100us(5)		;	//	must>480us
		P_18B20 = High		;
		i	= 	0	;
		do
		{
			i++	;
		}	while(P_18B20&&i<50)	;	//	wait 18b20->Low
		Delay_100us(3)		;	//	must>240us
	}

	void	Temp_Pro( void )
	{
		Ds18b20_Initial()	;	//复位DS18B20

		WByte_18b20(0xcc)	;	//跳过ROM匹配
       	WByte_18b20(0x44)	;	//发出温度转换命令

		Delay_100us(7)	;

		Ds18b20_Initial();

		WByte_18b20(0xcc)		;//跳过ROM匹配
      	WByte_18b20(0xbe)		;//读存储器命令

	    Read_Temp()	;
	}

	/************************************************
			Ht1621驱动程序(24C128/PTC2323/Pt2314)
	************************************************/
	void	Lcd_Command( uint	Command )
	{
		uchar	i;

		P_Cs1621 = Low	;
		for	( i=0; i<12; i++ )
		{
			P_Clk1621 = Low	;
			if	(Command&0x8000)
			{
				P_Dat1621 = High	;
			}
			else
			{
				P_Dat1621 = Low	;
			}
			P_Clk1621 = High	;
			Command		<<=	1;
		}
		P_Cs1621 = High	;
	}

	/************************************************/
	void	Lcd_Write_Head(void)
	{
		P_Dat1621 = High	;
		nop	;
		P_Clk1621 = Low		;
		nop	;
		P_Clk1621 = High	;
		nop	;
		P_Dat1621 = Low		;
		nop	;
		P_Clk1621 = Low		;
		nop	;
		P_Clk1621 = High	;
		nop	;
		P_Dat1621 = High	;
		nop	;
		P_Clk1621 = Low		;
		nop	;
		P_Clk1621 = High	;
	}

	/************************************************/
	void	WriteHt1621( uchar	Addr_Tmp,uchar Data_Tmp )
	{
		uchar	i	;
		P_Cs1621 = Low	;
		Lcd_Write_Head()	;
		for (i=0;i<6;i++)
		{	//	set offset address
		    P_Clk1621 = Low	;
		    if (Addr_Tmp&0x20)
		    {
		    	P_Dat1621 = High	;
		    }
		    else
		    {
		    	P_Dat1621 = Low;
		    }
		    P_Clk1621 = High;
		    Addr_Tmp	<<= 1	;
		}

		for (i=0;i<8;i++)
		{	//	data output
		    P_Clk1621 = Low	;
		    if ( Data_Tmp&0x01 )
		    {
		    	P_Dat1621 = High	;
		    }
		    else
		    {
		    	P_Dat1621 = Low	;
		    }
		    P_Clk1621 = High	;
		    Data_Tmp	>>= 1	;
		}
		P_Cs1621 = High	;
	}

	/************************************************/
	void	Update_Disp( void )
	{
		uchar	i;
		for	( i=0;i<8;i++ )
		{
			WriteHt1621( (15+i*2),Disp_Buf0[i] );
			Disp_Buf0[i] = 0	;
		}
	}

	/************************************************/
	void	Lcd_Initial( void)
	{
		Lcd_Command( Lcd_On )	;
		Lcd_Command( Sys_En )	;
		Lcd_Command( Bais_4 )	;
		Update_Disp()			;
	}

	/************************************************/
	void	Make_Flag_Data( uchar LCD_Flag )
	{
		Disp_Buf0[ Lcd_Flag_Tab[(LCD_Flag)][0] ]	|=	Lcd_Flag_Tab[(LCD_Flag)][1]	;
	}

	/************************************************/
	void	Make_Char_Data( void )
	{
		uchar	i,Tmp;
		for	( i = 0; i < 4; i++ )
		{
			Tmp	=	Disp_Char_Buf[i];
			if	( i )
			{
				Disp_Buf0[i+1]	=	Char_Byte_Tab[Tmp]	;
			}
			else
			{
				Tmp	<<=	1;
				Disp_Buf0[0]	=	Char_Word_Tab[Tmp]	;
				Disp_Buf0[1]	=	Char_Word_Tab[Tmp+1];
			}
		}
	}

	/************************************************/
	void	CharDisplay( void )
	{
		Disp_Char_Buf[0]	=	Temp_Result[0]/10	;
		Disp_Char_Buf[1]	=	Temp_Result[0]%10	;
		Disp_Char_Buf[2]	=	Temp_Result[1]/10	;
		Disp_Char_Buf[3]	=	Temp_Result[1]%10	;
		F_Temp_100	=	OFF	;
		if	(Temp_Result[0]>=200)
		{
			Disp_Char_Buf[0]	=	Dot_G	;
			Disp_Char_Buf[1]	=	Dot_G	;
			Disp_Char_Buf[2]	=	Dot_G	;
			Disp_Char_Buf[3]	=	Dot_G	;
		}
		else if	(Temp_Result[0]>=100)
		{
			Disp_Char_Buf[1]	=	Temp_Result[0]/100	;
			Disp_Char_Buf[2]	=	Temp_Result[0]%100	;
			F_Temp_100	=	ON	;
		}
		Make_Char_Data()	;
		Make_Flag_Data( F_Lcd_X4 )	;
		Make_Flag_Data( F_Lcd_P1 )	;
		if	(F_Temp_100)
		{
			Make_Flag_Data(F_Lcd_A)	;
		}
	}

	/************************************************/
	void	main( void )
	{
		Lcd_Initial();

		P_RedLed	=	Low	;
		P_GreenLed	=	Low	;
		P_BlueLed	=	Low	;
		while( 1 )
		{
			Temp_Pro()		;
			CharDisplay()	;
			Update_Disp()	;
		}
	}

⌨️ 快捷键说明

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