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

📄 18b20.c

📁 18B20 程序 简单实用 18B20 程序 简单实用
💻 C
字号:
#include <AT89x051.H>

sfr  WDT_CONTR  = 0xe1;
sbit DQ      	= P1^0;	//* 18B20 I/O Line
sbit LED_WRK 	= P1^7;	//* Working Led
sbit PLC_signal = P1^6;	//*24V signal

void Delay(unsigned int i)
{
	i=i*12;
	while(i--);    
}
/***************************************************************************************
** 函数组标号  :5-2
** 
** 函数名称    :Init_DS18B20
** 描述        :18B20初始化
**
** 创建人      :King.Chen
** 创建日期    :2006-11-26
**--------------------------------------------------------------------------------------
** 修改人      : 
** 修改日期    :
** 描述        : 
**--------------------------------------------------------------------------------------
***************************************************************************************/
void Init_DS18B20(void)
{
	unsigned char x;

	DQ = 1;    //* DQ复位
 	Delay(8);  //* 稍做延时

 	DQ = 0;    //* DQ拉低
 	Delay(80); //* 精确延时,大于480us

 	DQ = 1;    //* 拉高总线

 	Delay(14);
 	x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

 	Delay(20);
}
/***************************************************************************************
** 函数组标号  :5-3
** 
** 函数名称    :ReadOneChar  
** 描述        :读一个字节  
**
** 返回值      :unsigned char  
**
** 创建人      :King.Chen
** 创建日期    :2006-11-26 
**--------------------------------------------------------------------------------------
** 修改人      : 
** 修改日期    :
** 描述        : 
**--------------------------------------------------------------------------------------
***************************************************************************************/
unsigned char ReadOneChar(void)
{
	unsigned char i=0;
	unsigned char dat = 0;

	for (i=8;i>0;i--)
 	{
		DQ = 0; // 给脉冲信号
	  dat>>=1;
	  DQ = 1; // 给脉冲信号

	  if(DQ)
 			dat|=0x80;
	  Delay(4);
	}

	return(dat);
}
/***************************************************************************************
** 函数组标号  :5-4  
** 
** 函数名称    :WriteOneChar  
** 描述        :写一个字节  
**
** 参数        :unsigned char dat       
**         
** 创建人      :King.Chen
** 创建日期    :2006-11-26 
**--------------------------------------------------------------------------------------
** 修改人      : 
** 修改日期    :
** 描述        : 
**--------------------------------------------------------------------------------------
***************************************************************************************/
void WriteOneChar(unsigned char dat)
{
	unsigned char i=0;

 	for (i=8; i>0; i--)
 	{
  	DQ = 0;
  	DQ = dat&0x01;
  	Delay(5);
  	DQ = 1;
  	dat>>=1;
 	}

	Delay(4);
}
/***************************************************************************************
** 函数组标号  :5-5
** 
** 函数名称    :ReadTemperature  
** 描述        :读取温度  
**
** 返回值      :unsigned int  
**
** 创建人      :King.Chen
** 创建日期    :2006-11-26 
**--------------------------------------------------------------------------------------
** 修改人      : 
** 修改日期    :
** 描述        : 
**--------------------------------------------------------------------------------------
***************************************************************************************/
unsigned int ReadTemperature(void)
{
	unsigned char a=0;
	unsigned char b=0;
	unsigned char t=0;

	Init_DS18B20();

	WriteOneChar(0xCC); //* 跳过读序号列号的操作

	WriteOneChar(0x44); //* 启动温度转换

	Init_DS18B20();

	WriteOneChar(0xCC); //* 跳过读序号列号的操作

	WriteOneChar(0xBE); //* 读取温度寄存器等(共可读9个寄存器) 前两个就是温度

	a=ReadOneChar();   //* 读取温度值低位
	b=ReadOneChar();   //* 读取温度值高位

	a=a>>4;            //* 低位右移4位,舍弃小数部分
	t=b<<4;            //* 高位左移4位,舍弃符号位
	t=t|a;    

	return(t);
}
void delay1s(void)//200ms延时子程序
{
 	unsigned char i,j,k;
	WDT_CONTR=0x3c;//喂狗
    for(i=5;i>0;i--)
    for(j=132;j>0;j--)
    for(k=150;k>0;k--);
}
main()
{
	unsigned char Temperature;
	unsigned char k;
//	unsigned int sum;
/*	TMOD=0x01;//设T/C1为定时方1
	TH0=0x3C;//50MS
	TL0=0xb0;
	EA=1; //系统中断允许
	ET0=1;
	TR0=1;*/
	PLC_signal=1;
	LED_WRK=1;
	
	while(1)
	{
		WDT_CONTR=0x3c;//喂狗			
		Temperature=0;	
		Temperature=ReadTemperature();
		if(Temperature>=45)
		{
			for(k=0;k<10;k++)delay1s();
			WDT_CONTR=0x3c;//喂狗
			Temperature=ReadTemperature();
			if(Temperature>=45)
			{
				PLC_signal=0;
				LED_WRK=0;			
			}

		}															
		else
		{
		 	PLC_signal=1;
		  	LED_WRK=1;
		}	
		for(k=0;k<10;k++)delay1s();
	}

}
/*timer0() interrupt 1 using 1	//中断定时处理程序
{	
	TR0=0;			//关定时器
	WDT_CONTR=0x3c;//喂狗	
	TH0=0x3C;//50MS
	TL0=0xb0;
	TR0=1;			//开定时器
}*/
    
/***************************************************************************************
**                                   End of File
***************************************************************************************/

⌨️ 快捷键说明

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