锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

温控器程序修改

时间:2022-08-11 21:00:00 继电器能用来加热吗继电器jqx一62f4继电器温控器

修改程序指导修改程序,原功能:
2、采用LCD1602液晶显示温度信息,测温防水DS18B还具有蜂鸣器提示功能;
3、定时功能:可设置系统工作开启时间。在开启时间达到之前,系统只测量温度,不控制。当开启时间到达时,系统将测量温度,并根据测量温度进行控制。实现更智能、更节能的效果;
4.同时,水温的上下限值可以通过按钮设置,并显示在液晶上。当测量温度低于下限值时,继电器吸合开启加热,当实测温度高于上限值时,继电器断开关闭加热,蜂鸣器鸣叫提示加热完成(继电器工作有指示灯)
5.红外遥控器无线或按键可设置整个系统参数;

设置键:按下后进入设置模式,定期开放
限值,下限值;
设置模式下,按相应的设置参数加1;

减值键下,按相应的设置参数减1;

确定键:按下退出并保存设置的参数。

修改后:在原功能上添加功能不在设置模式下,按加值健切换上限为40、50、60,按减值健切换下限为20、25、30,可通过红外切换

#include    //头文件 #include #include #include #include #include  /***********************引脚定义*************************/ sbit key_set   = P1^0; //设置键定义 sbit key_jia   = P1^1; //加值键 sbit key_jian  = P1^2; //减值键 sbit key_ok    = P1^3; //退出键 sbit buzz      = P2^4; //蜂鸣器 sbit relay     = P3^6; //继电器  /*********************变量定义***************************/ uchar Temperature_up,Temperature_down;///存储温度上下限值 uchar set_f=0;                        //设置选择标记,=0非设置,=设定时间,=设置温度上限,=设置温度下限 uint num=99;        //计数变量  /******************************************************** 函数名称:void didi() 功能:蜂鸣器滴滴声 参数说明: ********************************************************/ void didi() {  buzz=0;  ///打开蜂鸣器  delayms(5); //延时  buzz=1;  ///关闭蜂鸣器 } /******************************************************** 函数名称:void display() 函数功能:正常显示 参数说明: ********************************************************/ void display() {  if(presence==0)       ///判断温度是否正确收集  {   lcd1602_write_character(0,1,temp_t);//显示温度值   LCD_disp_char(8,1,0);          ///显示自定义字符°’   LCD_disp_char(9,1,'C');    //显示‘C’    if(fen==0)          ///定时到,加热进入控制   {    if(wendu=Temperature_up)///实测温度高于上限值     {      relay=1;    //断开继电器关闭加热      buzz=0;     //蜂鸣器鸣叫提示     }     else      //在限值之间      buzz=1;     //关闭蜂鸣器鸣叫   }  }  else         ///温度采集失败  {   buzz=1;         //关闭蜂鸣器鸣叫   relay=1;       //断开继电器关闭加热   lcd1602_write_character(0,1,"   NOT    ");   }  lcd1602_write_character(11,1,"T:");  //显示固定时间  LCD_disp_char(13,1,ASCII[fen/100]);    LCD_disp_char(14,1,ASCII[fen0/10]);  LCD_disp_char(15,1,ASCII[fen]);   lcd1602_write_character(0,2,"Up:");  //显示温度上限  LCD_disp_char(3,2,ASCII[Temperature_up/100]);  LCD_disp_char(4,2,ASCII[Temperature_up0/10]);  LCD_disp_char(5,2,ASCII[Temperature_up]);   lcd1602_write_character(8,2,"Down:");//显示温度下限值  LCD_disp_char(13,2,ASCII[Temperature_down/100]);  LCD_disp_char(14,2,ASCII[Temperature_down0/10]);  LCD_disp_char(15,2,ASCII[Temperature_down]); } /******************************************************** 函数名称:void display2() 函数功能:显示设置参数 参数说明: ********************************************************/ void display2() {  num  ;   EX0=0;        ///关闭红外遥控检测  DS18B20_Read_Temperature();      //DS18B20读取温度数据  DS18B20_Temperature();              //DS18B20温度转换  EX0=1;        ///开启红外遥控检测  if(presence==0)  {   lcd1602_write_character(0,1,temp_t);//显示温度值   LCD_disp_char(8,1,0);          ///显示自定义字符°’   LCD_disp_char(9,1,'C');    //显示’C‘  }  else   lcd1602_write_character(0,1,"   NOT    ");    lcd1602_write_character(11,1,"T:"); //固定显示内容  lcd1602_write_character(0,2,"Up:");  lcd1602_write_character(8,2,"Down:");   if(num%2==0) //偶数显示,奇数不显示。这样,就会有闪烁效果,你可以清楚地看到当前设置的值是什么  {     LCD_disp_char(13,1,ASCII[fen/100]);                //显示固定时间-百位   LCD_disp_char(14,1,ASCII[fen0/10]);      //显示固定时间-十位   LCD_disp_char(15,1,ASCII[fen]);       //显示固定时间-个位     LCD_disp_char(3,2,ASCII[Temperature_up/100]);    //显示温度上限-百位   LCD_disp_char(4,2,ASCII[Temperature_up0/10]);   //显示温度上限-十位   LCD_disp_char(5,2,ASCII[Temperature_up]);    //显示温度上限-个位     LCD_disp_char(13,2,ASCII[Temperature_down/100]);   //显示温度下限-百位   LCD_disp_char(14,2,ASCII[Temperature_down0/10)   LCD_disp_char(15,2,ASCII[Temperature_down]);    //显示温度下限-个位  }  else    //奇数次不显示  {   switch(set_f)///根据当前设置的内容,相应位置闪烁   {    case 1: lcd1602_write_character(13,1,"   "); break;    case 2: lcd1602_write_character(3,2,"   "); break;    case 3: lcd1602_write_character(13,2,"   "); break;    default: break;   }  } } /******************************************************** 函数名称:void scan(void) 函数功能:按键检测处理 参数说明: ********************************************************/ void scan(void) {   //设置键,不支持连按  if(key_set==0||hw_data=='B')   按下//按钮  {   delayms(7);     ///延迟消抖   if(key_set==0||hw_data=='B再次确认按钮   {    didi();        ///滴一声,按下提示按钮    buzz=1;         ///关闭蜂鸣器    relay=1;       ///关闭继电器    EX0=0;    set_f  ;    //设置变量 1    if(set_f==4)      //全部设置完成,退出设置    {     set_f=0;   ///重置设置变量     EX0=1;     EEPROM_delete(0x2000);      ///擦除扇区     EEPROM_write(0x2000,Temperature_up);  ///写入温度上限数据保存     EEPROM_write0x2010,Temperature_down);//写入【温度下限值】数据保存存

				if(fen!=0)							  //如果有开启定时,则打开定时器定时
					TR0=1;
			}
		}
		while(!key_set);                          //等待按键松开
	}
	//退出键,不支持连按
	if((key_ok==0||hw_data=='Q')&&set_f!=0)		  //按键按下
	{
		delayms(7);								  //延时消抖
		if(key_ok==0||hw_data=='Q')               //再次确认按键按下
		{
			didi();			                      //滴一声,提示按键按下
			set_f=0;							  //重置设置变量
			EX0=1;
			EEPROM_delete(0x2000);				  //擦除扇区
			EEPROM_write(0x2000,Temperature_up);  //写入【温度上限值】数据保存
			EEPROM_write(0x2010,Temperature_down);//写入【温度下限值】数据保存存
			if(fen!=0)							  //如果有开启定时,则打开定时器定时
				TR0=1;
		}
		while(!key_ok);                           //等待按键松开
	}
	//加值键,支持连按
	if((key_jia==0||hw_data=='+')&&set_f!=0)
	{
		delayms(3);
		if(key_jia==0||hw_data=='+')
		{	
			didi();		               //滴一声,提示按键按下
			if(set_f==1)               //设置定时时间
			{
				fen++;	               //定时时间+1min
				if(fen>999)			   //超过999min
					fen=0;
			}
	
			if(set_f==2)               //设置 温度上限值
			{
				if(Temperature_up<125) //最大值可设置125℃
					Temperature_up++;  //温度上限值+1℃			
			}
	
			if(set_f==3)               //设置 温度下限值
			{
				if(Temperature_down<125&&Temperature_down+1Temperature_down+1)//最小值可设置0℃,并且上限得比下限大
					Temperature_up--;  //温度上限值-1℃
			}
	
			if(set_f==3)               //设置 温度下限值
			{
				if(Temperature_down!=0)//最小值可设置0℃
					Temperature_down--;//温度下限值-1℃
			}
		}
	}
	if(hw_data=='<'&&set_f!=0)//红外遥控切换设置上一项
	{
		didi();
		if(set_f==1)
			set_f=3;
		else
			set_f--;
	}

	if(hw_data=='>'&&set_f!=0)//红外遥控切换设置下一项
	{
		didi(); 
		if(set_f==3)
			set_f=1;
		else
			set_f++;
	}
	hw_data=0Xff;			  //重置红外接收数据
}
/********************************************************
函数名称:void main()
函数作用:主函数
参数说明:
********************************************************/
void main()
{	
	Temperature_up=EEPROM_read(0x2000);	 //读取存储的【温度上限值】数据
	Temperature_down=EEPROM_read(0x2010);//读取存储的【温度下限值】数据

	LCD_init();				 //LCD1602初始化	
	lcd1602_write_pic(0,pic);//将自定义字符’°‘写入LCD1602液晶
	display();               //正常显示界面
	DS18B20_init();			 //DS18B20初始化	
	for(num=0;num<250;num++) //上电先等待DS18B20温度传感器进入正常工作。
		DS18B20_Read_Temperature();//读取温度
	HW_init();				 //红外遥控初始化
	T0_init();				 //定时器初始化

	while(1)			   //死循环
	{	
		scan();			   //按键检测处理
		if(set_f==0)	   //正常模式
		{
			num++;		   //循序次数+1
			if(num>=20000)  //循环>=20000次,采集一次温度
			{
				EA=0;	   //关闭红外遥控中断
				num=0;	   //重置循环变量	
				DS18B20_Read_Temperature();//读取温度数据
				EA=1; 	   //开启红外遥控中断
				DS18B20_Temperature();	   //将温度数据转换成实际温度				
				display(); //正常显示界面
			}
		}
		else			   //设置模式
			display2();	   //显示设置界面 
	}
}
/*************************************************************
                      单片机中断头文件

实现功能:单片机中断的控制控制

补充说明:
***************************************************************/
#ifndef _INTERRUPT_H_
#define _INTERRUPT_H_
#include

#define uchar unsigned char
#define uint unsigned int

/**********************变量定义************************/
uchar T0_num;	//定时中断次数
uint fen=0;		//定时分钟数
uchar miao=0;	//定时秒钟数
/*********************************************************
函数名称:void delayms(uint ms)
函数作用:毫秒延时
参数说明:
*********************************************************/
void delayms(uint ms)
{
	unsigned char i=100,j;
	for(;ms;ms--)
	{
		while(--i)
		{
			j=10;
			while(--j);
		}
	}
}
/*********************************************************
函数名称:void T0_init()
函数作用:定时器0初始化函数
参数说明:
*********************************************************/
void T0_init()
{
	EA=1;                  //开总中断
	ET0=1;                 //定时器T0中断允许         
	TMOD=0x01;             //使用定时器T0的模式1
	TH0=(65536-50000)/256; //定时器T0的高8位赋初值
	TL0=(65536-50000)%256; //定时器T0的低8位赋初值
	TR0=0;				   //关闭定时器
}

/*********************************************************
函数名称:void T0_interrupt(void) interrupt 1 using 0
函数作用:定时器0中断处理函数
参数说明:定时50MS中断一次
*********************************************************/
void T0_interrupt(void) interrupt 1 using 0
{	  	
	TH0=(65536-50000)/256; //定时器T0的高8位重新赋初值
	TL0=(65536-50000)%256; //定时器T0的低8位重新赋初值

	T0_num++;			   //中断次数+1
	if(T0_num==20)		   //定时1S完成,50ms*20=1S
	{
		T0_num=0;		   //重置定时中断次数
		miao++;			   //定时秒钟+1S
		if(miao==60)	   //如果达到60S
		{
			miao=0;		   //重置秒钟
			fen--;		   //分钟-1min
			if(fen==0)	   //如果分钟数减到0min
				TR0=0;	   //定时完成,关闭定时
		}
	}			                
}
#endif
/****************************************************************
                      红外遥控头文件

实现功能:红外遥控的控制显示

补充说明:
*****************************************************************/
#ifndef _HW_H_
#define _HW_H_
#include 
#include  //包含_nop_()函数定义的头文件 

#define uchar unsigned char
#define uint  unsigned int

/************************红外接收引脚定义************************/
sbit prem=P3^2;           //将IR位定义为P3.2引脚

/************************红外接收函数定义************************/
void HW_init();								//红外遥控初始化函数

/************************红外接收示变量定义**********************/												
uchar ram[4]={0,0,0,0};//存放接受到的4个数据,地址码16位+按键码8位+按键码取反的8位;
uchar hw_data=0xff;
/********************************************************
函数名称:void init()
函数作用:红外遥控初始化
参数说明:
********************************************************/
void HW_init()
{
	EA=1;
   EX0=1;
   IT0=1;

}
/********************************************************
函数名称:void delays(uint time)
函数作用:延时函数
参数说明:延时time*90us
********************************************************/
void delays(uint time)
{ 
   uchar a,b; 
   for(a=time;a>0;a--) 
   { 
     for(b=44;b>0;b--); 
   } 
}
/********************************************************
函数名称:void jiema(uchar dat)
函数作用:获取按键
参数说明:
********************************************************/ 
void jiema(uchar dat)
{
	switch (dat)//根据解码的数据确定按下的是哪个按键
	{
		case 0x46:hw_data='B';
			break;
		case 0x44:hw_data='<';
			break;
		case 0x40:hw_data='>';
			break;
		case 0x07:hw_data='-';
			break;
		case 0x15:hw_data='+';
			break;
		case 0x09:hw_data='Q';
			break;
		default:hw_data=0xff;
			break;
	}	
}
/********************************************************
函数名称:void Int0(void) interrupt 0
函数作用:红外数据接收中断处理
参数说明:
********************************************************/
void Int0(void) interrupt 0
{
	uchar temp=0;
	uchar ramc=0;       //定义接收了4个字节的变量 
	uchar count=0;      //定义现在接收第几位变量 
	uint  i=0;          //此处变量用来在下面配合连续监测9MS 内是否有高电平 
	prem=1; 
	for(i=0;i<1100;i++) //以下FOR语句执行时间为8MS左右 
	{ 
		if(prem)   //进入遥控接收程序首先进入引导码的前半部判断,即:是否有9MS左右的低电平 
		return;       //引导码错误则退出 
	} 
	
	while(prem!=1);   //等待引导码的后半部 4.5 MS 高电平开始的到来。 
	delays(50);  //延时大于4.5MS时间,跨过引导码的后半部分,来到真正遥控数据32位中//第一位数据的0.56MS开始脉冲 

	for(ramc=0;ramc<4;ramc++)//循环4次接收4个字节 
	{    
		for(count=0;count<8;count++)  //循环8次接收8位(一个字节) 
		{ 
			while(prem!=1);   //开始判断现在接收到的数据是0或者1 ,首先在这行本句话时,//保已经进入数据的0.56MS 低电平阶段 ,等待本次接受数据的高电平的到来。 
			delays(9);//高电平到来后,数据0 高电平最多延续0.56MS,而数据1,高电平可   //延续1.66MS大于0.8MS 后我们可以再判断遥控接收脚的电平,                    
			
			if(prem)     //如果这时高电平仍然在继续那么接收到的数据是1的编码 
			{ 
				ram[ramc]=(ram[ramc]>>1)+0x80;//将目前接收到的数据位1放到对应的字节中 
				delays(11); //如果本次接受到的数据是1,那么要继续延迟1MS,这样才能跨入 //下个位编码的低电平中(即是开始的0.56MS中) 
			} 
			else             //否则目前接收到的是数据0的编码 
			    ram[ramc]=ram[ramc]>>1;   //将目前接收到的数据位0放到对应的字节中      
		} //本次接收结束,进行下次位接收,此接收动作进行32次,正好完成4个字节的接收   
	} 
	
	if(ram[2]!=~ram[3])    //本次接收码的判断 
	{ 
		for(i=0;i<4;i++)   //没有此对应关系则表明接收失败,清除接受到的数据 
		ram[i]=0; 
		return ; 
	}  
	else //解码还原	
	{
		jiema(ram[2]);		
	}
}
#endif
/*************************************************************
                      LCD1602头文件

实现功能:LCD1602的控制

补充说明:
***************************************************************/
#ifndef _LCD1602_H_
#define _LCD1602_H_
#include

#define uchar unsigned char
#define uint unsigned int

/*****************LCD1602引脚定义*******************/
#define LCD_DB P0  //数据口D0~D7
sbit LCD_RS = P1^4;//数据/命令选择 引脚
sbit LCD_RW = P1^5;//读/写选择 引脚
sbit LCD_E  = P1^6;//使能信号 引脚

/*****************LCD1602函数声明*******************/
void LCD_init(void);								   //初始化函数
void LCD_write_command(uchar command);				   //写指令函数
void LCD_write_data(uchar dat);						   //写数据函数
void LCD_disp_char(uchar  x,uchar  y,uchar  dat);	   //显示一个字符,  X(0-16),y(1-2)。
void lcd1602_write_character(uchar x,uchar y,uchar *s);//显示一个字符串,X(0-16),y(1-2)。
void lcd1602_write_pic(uchar add,uchar *pic_num);      //写入自定义字符
void delay_n40us(uint n);							   //延时函数

/*****************LCD1602自定义字符“℃”*******************/
uchar code pic[8]={0x00,0x0e,0x0a,0x0e,0x00,0x00,0x00,0x00};

uchar code ASCII[] =  {'0','1','2','3','4','5','6','7','8','9'}; //LCD1602显示的字符数组

/********************************************************
函数名称:void LCD_init(void)
函数作用:LCD1602初始化函数
参数说明:
********************************************************/ 
void LCD_init(void) 
{ 
	LCD_write_command(0x38);//设置 8 位格式,2 行,5x7 
	LCD_write_command(0x38);//设置 8 位格式,2 行,5x7
	LCD_write_command(0x38);//设置 8 位格式,2 行,5x7
	LCD_write_command(0x0c);//整体显示,关光标,不闪烁
	LCD_write_command(0x06);//设定输入方式,增量不移位
	LCD_write_command(0x01);//清除屏幕显示
	delay_n40us(100);//实践证明,我的 LCD1602 上,用 for 循环 200 次就能可靠完成清屏指令。
}

/********************************************************
函数名称:void LCD_write_command(uchar dat)
函数作用:LCD1602写命令
参数说明:dat为指令,参考数据手册
********************************************************/
void LCD_write_command(uchar dat) 
{ 
	LCD_RS=0;//指令
	LCD_RW=0;//写入
	LCD_DB=dat; 
	delay_n40us(3);
	LCD_E=1;//允许
	delay_n40us(13);
	LCD_E=0; 
} 

/********************************************************
函数名称:void LCD_write_data(uchar dat)
函数作用:LCD1602写数据
参数说明:
********************************************************/
void LCD_write_data(uchar dat) 
{ 
	LCD_RS=1;//数据
	LCD_RW=0;//写入
	LCD_DB=dat;
	delay_n40us(3);
	LCD_E=1;//允许
	delay_n40us(13);
	LCD_E=0; 
} 
/********************************************************
函数名称:void LCD_disp_char(uchar x,uchar y,uchar dat)
函数作用:LCD1602显示一个字符
参数说明:在横坐标x(0~15),纵坐标y(1~2)显示一个字符dat
********************************************************/
void LCD_disp_char(uchar x,uchar y,uchar dat) 
{ 
	uchar add;
	//根据显示位置(x,y)确定显示地址 
	if(y==1) 			   //在第1行显示
		add=0x80+x; 
	else 				   //在第2行显示
		add=0xc0+x; 
	LCD_write_command(add);//写入需要显示的地址 
	LCD_write_data(dat);   //写入需要显示的内容
} 

/********************************************************
函数名称:lcd1602_write_character(uchar x,uchar y,uchar *s)
函数作用:LCD1602显示一个字符
参数说明:在横坐标x(0~15),纵坐标y(1~2)开始显示字符串*s
********************************************************/
void lcd1602_write_character(uchar x,uchar y,uchar *s) 
{ 
	uchar add; 
	//根据显示位置(x,y)确定显示地址 
	if(y==1) 			   //在第1行显示
		add=0x80+x; 
	else 				   //在第2行显示
		add=0xc0+x; 
	LCD_write_command(add);  //写入需要显示的地址 
	while (*s!='\0') 	     //写入需要显示的内容,直到字符串全部显示完成
	{ 
		LCD_write_data(*s++);
	} 
}
/********************************************************
函数名称:void lcd1602_write_pic(uchar add,uchar *pic_num)
函数作用:LCD1602写入自定义字符
参数说明:在add地址写入自定义字符代码
********************************************************/
void lcd1602_write_pic(uchar add,uchar *pic_num) 
{ 
	unsigned char i; 
	add=add<<3; 
	for(i=0;i<8;i++) 
	{
		LCD_write_command(0x40|add+i); 
		LCD_write_data(*pic_num++);
	} 
} 

/********************************************************
函数名称:void delay_n40us(uint n)
函数作用:LCD1602延时函数
参数说明:
********************************************************/
void delay_n40us(uint n) 
{ 
	uint i; 
	uchar j;
	for(i=n;i>0;i--) 
	for(j=0;j<2;j++);   
}
#endif
/*************************************************************
                      DS18B20头文件

实现功能:DS18B20的控制

补充说明:
***************************************************************/
#ifndef _DS18B20_H_
#define _DS18B20_H_
#include

#define uchar unsigned char
#define uint unsigned int

/*****************DS18B20引脚定义*******************/
sbit DQ = P3^5 ;  //定义DS18B20端口DQ 

/*****************DS18B20变量定义*******************/
uchar temp_data[2]; //存储读回的数字温度
uchar temp_t[9]="        \0";//存储转换完后的温度
bit presence=1;	    //检测18b20是否插好
uchar wendu;

uchar code ASCII2[] =  {'0','1','2','3','4','5','6','7','8','9','.'};
/*****************DS18B20函数定义*********************/
void  Delay(unsigned int num);			      //us延时
void  DS18B20_init(void);				      //DS18B20初始化
bit   DS18B20_res(void);			 		  //DS18B20复位
uchar DS18B20_ReadOneChar(void);			  //DS18B20读一个字节
void  DS18B20_WriteOneChar(unsigned char dat);//DS18B20写一个字节
void  DS18B20_Read_Temperature(void); 	      //DS18B20读取温度
void  DS18B20_Temperature(void);              //DS18B20温度转换

/********************************************************
函数名称:void Delay(unsigned int num)
函数作用:US延时函数
参数说明:
********************************************************/
void Delay(unsigned int num)
{
   while( --num ) ;
}

/********************************************************
函数名称:bit DS18B20_res(void)
函数作用:DS18B20复位函数
参数说明:返回0=复位成功,1=复位不成功
********************************************************/
bit DS18B20_res(void)
{  
     DQ = 1 ;      //DQ复位
     Delay(8) ;    //稍做延时

     DQ = 0 ;      //单片机将DQ拉低
     Delay(90) ;   //精确延时 大于 480us

     DQ = 1 ;      //拉高总线
     Delay(5) ;

     presence = DQ ;    //如果=0则初始化成功 =1则初始化失败
     Delay(100) ;
     DQ = 1 ; 
     
     return(presence) ; //返回信号,0=presence,1= no presence
}

/********************************************************
函数名称:void DS18B20_init(void)
函数作用:DS18B20初始化函数
参数说明:
********************************************************/
void DS18B20_init(void)
{  
    DS18B20_res();	   //复位 
    DS18B20_WriteOneChar(0xCC) ;  //跳过读序号列号的操作
    DS18B20_WriteOneChar(0x4e) ;  //写暂存
	DS18B20_WriteOneChar(0x7f) ;  //配置转换精度为12位 
}

/********************************************************
函数名称:uchar DS18B20_ReadOneChar(void)
函数作用:DS18B20读一个字节数据
参数说明:
********************************************************/
uchar DS18B20_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(15) ;
  	}

    return (dat) ;
}

/********************************************************
函数名称:void DS18B20_WriteOneChar(unsigned char dat)
函数作用:DS18B20写一个字节数据
参数说明:
********************************************************/
void DS18B20_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 ;
	}
}

/********************************************************
函数名称:void DS18B20_Read_Temperature(void)
函数作用:DS18B20读取温度
参数说明:
********************************************************/
void DS18B20_Read_Temperature(void)
{
     DS18B20_res();	   //复位 
     DS18B20_WriteOneChar(0xCC) ;  //跳过读序号列号的操作
     DS18B20_WriteOneChar(0x44) ;  //启动温度转换

     DS18B20_res();
     DS18B20_WriteOneChar(0xCC) ;  //跳过读序号列号的操作
     DS18B20_WriteOneChar(0xBE) ;  //读取温度寄存器

     temp_data[0] = DS18B20_ReadOneChar() ;   //温度低8位
     temp_data[1] = DS18B20_ReadOneChar() ;   //温度高8位 
}

/********************************************************
函数名称:void DS18B20_Temperature(void)
函数作用:DS18B20温度转换
参数说明:
********************************************************/
void DS18B20_Temperature(void)
{
	uchar temp;
	int temp_i;

	temp=temp_data[1]&0xf0;
	if(temp==0xf0)      //判断是否为负温度,满足为负温度,进行取反加一
	{
		temp_t[0]='-';
		if(temp_data[0]==0)	//判断是否低位取反后有进位
		{
			temp_data[0]=~temp_data[0]+1;
			temp_data[1]=~temp_data[1]+1;
		}
		else
		{
			temp_data[0]=~temp_data[0]+1;
			temp_data[1]=~temp_data[1];
		}
	}
	else
		temp_t[0]='+';
	//整数部分
	temp=(temp_data[1]<<4)|(temp_data[0]>>4); //取高字节低4位,低字节高4位
	wendu=temp;

	temp_t[1]=temp/100+0x30;	//取百位转换为ASCII码
	temp_t[2]=temp%100/10+0x30;	//取十位转换为ASCII码
	temp_t[3]=temp%10+0x30;		//取个位转换为ASCII码
	
	//小数部分
	temp=temp_data[0]&0x0f;//取低字节的低4位
	temp_i=temp*625;//625=0.0625*10000,先将小数放大10000倍进行处理

	temp_t[4]='.';				   //小数点的ASCII码
	temp_t[5]=temp_i/1000+0x30;	   //取小数点十分位转换为ASCII码
	temp_t[6]=temp_i%1000/100+0x30;//取小数点百分位转换为ASCII码
	temp_t[7]=temp_i%100/10+0x30;  //取小数点千分位转换为ASCII码
}
#endif


 

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章