修改程序指导修改程序,原功能: 2、采用LCD1602液晶显示温度信息,测温防水DS18B还具有蜂鸣器提示功能; 3、定时功能:可设置系统工作开启时间。在开启时间达到之前,系统只测量温度,不控制。当开启时间到达时,系统将测量温度,并根据测量温度进行控制。实现更智能、更节能的效果; 4.同时,水温的上下限值可以通过按钮设置,并显示在液晶上。当测量温度低于下限值时,继电器吸合开启加热,当实测温度高于上限值时,继电器断开关闭加热,蜂鸣器鸣叫提示加热完成(继电器工作有指示灯) 5.红外遥控器无线或按键可设置整个系统参数;
设置键:按下后进入设置模式,定期开放 限值,下限值; 设置模式下,按相应的设置参数加1;
减值键下,按相应的设置参数减1;
确定键:按下退出并保存设置的参数。
修改后:在原功能上添加功能不在设置模式下,按加值健切换上限为40、50、60,按减值健切换下限为20、25、30,可通过红外切换
#include<reg52.h> //头文件 #include<DS18B20.h> #include<HW.h> #include<LCD1602.h> #include<INTERRUPT.h> #include<EEPROM.h> /***********************引脚定义*************************/ 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_down) ///实测温度低于下限值 { relay=0; ///打开继电器加热 buzz=1; //关闭蜂鸣器提示 } else 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+1<Temperature_up)//最大值可设置125℃,并且下限不可超过上限
Temperature_down++;//温度下限值+1℃
}
}
}
//减值键,支持连按
if((key_jian==0||hw_data=='-')&&set_f!=0)
{
delayms(3);
if(key_jian==0||hw_data=='-')
{
didi(); //滴一声,提示按键按下
if(set_f==1) //设置定时时间
{
if(fen==0)
fen=999;
else
fen--; //定时时间-1min
}
if(set_f==2) //设置 温度上限值
{
if(Temperature_up!=0&&Temperature_up>Temperature_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<reg52.h>
#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 <reg52.h>
#include<intrins.h> //包含_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<reg52.h>
#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<reg52.h>
#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