18B20测温液晶显示.docx
- 文档编号:9412019
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:26
- 大小:18.89KB
18B20测温液晶显示.docx
《18B20测温液晶显示.docx》由会员分享,可在线阅读,更多相关《18B20测温液晶显示.docx(26页珍藏版)》请在冰豆网上搜索。
18B20测温液晶显示
/*******************************************************************
**
*ME850单片机开发实验仪演示程序-DS18B20-温度控制程序*
**
*LCD1602显示*
**
*MCU:
AT89S52晶振:
11.0592MHz*
**
*版本:
V1.2(2009/01/25)*
*作者:
gguoqing(Email:
gguoqing@)*
*网站:
www.sofi-(硕飞科技)*
*(伟纳单片机世界)*
*邮箱:
sofitech@*
**
*【版权】Copyright(C)深圳硕飞科技有限公司AllRightsReserved*
*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
*
**
*******************************************************************/
#include
#include"onewire.h"
#include"lcd.h"
typedefunsignedcharuchar;
typedefunsignedintuint;
sbitK1=P1^4;
sbitK2=P1^5;
sbitK3=P1^6;
sbitK4=P1^7;
sbitBEEP=P3^7;
sbitRELAY=P3^6;
uchartemp_comp,timecount,count;
ucharcrc;
uchardatatemp_data[2];//温度值存放单元
uchardatatemp_alarm[2];//报警值存放单元
uchardatadisplay[5];//温度值显存单元
uchardatadisplay1[3];//温度报警值显存单元
uchardataRomCode[8];//序列码存放单元
bitflag;
bitcompare_th,compare_tl;
bitalarm_on_off;
bittemp_th,temp_tl;
ucharcodecdis1[]={"DS18B20OK"};
ucharcodecdis2[]={""};
ucharcodecdis3[]={"DS18B20ERR0R"};
ucharcodecdis4[]={"PLEASECHECK"};
ucharcodecdis5[]={"TEMP:
"};
ucharcodecdis6[]={"TH:
TL:
"};
ucharcodemytab1[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};//°
ucharcodemytab2[8]={0x01,0x1b,0x1d,0x19,0x1d,0x1b,0x01,0x00};//小喇叭右
ucharcodemytab3[8]={0x10,0x1B,0x17,0x13,0x17,0x1B,0x10,0x00};//小喇叭左
charcodereserve[3]_at_0x3b;//保留0x3b开始的3个字节
/**********************************************************
蜂鸣器驱动子函数
**********************************************************/
voidbeep(void)
{
uchari;
for(i=0;i<150;i++)
{
Delay(80);
BEEP=!
BEEP;//BEEP取反
}
BEEP=1;//关闭蜂鸣器
delayms(150);
}
/**********************************************************
自定义字符写入CGRAM
**********************************************************/
voidwritetab(void)
{
unsignedchari;
lcd_wcmd(0x40,1);//写CGRAM
for(i=0;i<8;i++)
lcd_wdat(mytab1[i]);
for(i=0;i<8;i++)
lcd_wdat(mytab2[i]);
for(i=0;i<8;i++)
lcd_wdat(mytab3[i]);
}
/**********************************************************
DS18B20OK显示菜单
**********************************************************/
voidOk_Menu(void)
{
lcd_pos(0,1);//设置显示位置为第一行
wr_string(cdis1,0);//显示字符串1
lcd_pos(0,2);//设置显示位置为第二行
wr_string(cdis2,0);//显示字符串2
}
/**********************************************************
DS18B20ERROR显示菜单
**********************************************************/
voidError_Menu(void)
{
lcd_pos(0,1);//设置显示位置为第一行
wr_string(cdis3,0);//显示字符串3
lcd_pos(0,2);//设置显示位置为第二行
wr_string(cdis4,0);//显示字符串4
}
/*********************************************************
读取温度子函数
*********************************************************/
voidRead_Temperature(void)
{
uchari;
Init_DS18B20();
if(presence==1)//DS18B20不正常
{
Error_Menu();//显示错误菜单
}
else
{
WriteOneChar(0x55);//匹配ROM命令
for(i=0;i<8;i++)
WriteOneChar(RomCode[i]);
WriteOneChar(0xBE);//读取温度寄存器
temp_data[0]=ReadOneChar();//温度低8位
temp_data[1]=ReadOneChar();//温度高8位
temp_alarm[0]=ReadOneChar();//温度报警TH
temp_alarm[1]=ReadOneChar();//温度报警TL
temp_comp=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
//取温度整数值
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
}
}
/**********************************************************
读取64位序列码
***********************************************************/
voidRead_RomCord(void)
{
unsignedcharj;
Init_DS18B20();
WriteOneChar(0x33);//读序列码的操作
for(j=0;j<8;j++)
{
RomCode[j]=ReadOneChar();
}
}
/**********************************************************
DS18B20的CRC8校验程序
**********************************************************/
ucharCRC8(void)
{
uchari,x;
ucharcrcbuff;
crc=0;
for(x=0;x<8;x++)
{
crcbuff=RomCode[x];
for(i=0;i<8;i++)
{
if(((crc^crcbuff)&0x01)==0)
crc>>=1;
else
{
crc^=0x18;//CRC=X8+X5+X4+1
crc>>=1;
crc|=0x80;
}
crcbuff>>=1;
}
}
returncrc;
}
/**********************************************************
序列码数据转换与显示子函数
***********************************************************/
voidDisp_RomCode(void)
{
ucharj,Temp;
ucharpos=15;//从第二行末尾开始
for(j=0;j<8;j++)//序列码为8个字节
{
Temp=RomCode[j];
display[0]=(Temp&0x0f);
if(display[0]>9)
display[0]=display[0]+0x37;
else
display[0]=display[0]+0x30;
lcd_pos(pos,2);
lcd_wdat(display[0]);//低位数显示
pos--;
display[1]=((Temp&0xf0)>>4);
if(display[1]>9)
display[1]=display[1]+0x37;
else
display[1]=display[1]+0x30;
lcd_pos(pos,2);
lcd_wdat(display[1]);//高位数显示
pos--;
}
}
/**********************************************************
ROMCORD显示菜单
**********************************************************/
voidRomCode_Menu(void)
{
Ok_Menu();
Read_RomCord();//读取64位序列码
CRC8();//CRC效验
while(crc!
=0)//校验不对,继续校验
{
Read_RomCord();//读取64位序列码
CRC8();//CRC效验
}
if(crc==0)//CRC效验正确
{
Disp_RomCode();//显示64位序列码
}
}
/**********************************************************
温度数据转换与显示子函数
***********************************************************/
voidDisp_Temperature(void)
{
bits=0;
if(temp_data[1]>127)//温度为负值
{
temp_data[0]=(~temp_data[0])+1;//取反加一,将补码变成原码
if((~temp_data[0])>=0xff)
temp_data[1]=(~temp_data[1])+1;
elsetemp_data[1]=~temp_data[1];
s=1;
}
display[4]=temp_data[0]&0x0f;//小数位数据
display[0]=(display[4]*10/16)+0x30;
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//整数位数据
display[3]=display[4]/100+0x30;
display[1]=display[4]%100;
display[2]=display[1]/10+0x30;
display[1]=display[1]%10+0x30;
if(display[3]==0x30)//高位为0,不显示
{
display[3]=0x20;
if(display[2]==0x30)//次高位为0,不显示
display[2]=0x20;
}
if(s)
display[3]=0x2d;//显示负号
lcd_pos(7,1);
lcd_wdat(display[3]);//百位数显示
lcd_wdat(display[2]);//十位数显示
lcd_wdat(display[1]);//个位数显示
lcd_wdat('.');
lcd_wdat(display[0]);//小数位数显示
lcd_wdat(0x00);//显示自定义字符
lcd_wdat('C');//显示C
}
/**********************************************************
显示报警温度
num=0THnum=1TL
**********************************************************/
voidDisp_Temp_alarm(ucharaddr,ucharnum)
{
display1[2]=temp_alarm[num]/100+0x30;
display1[0]=temp_alarm[num]%100;
display1[1]=display1[0]/10+0x30;
display1[0]=display1[0]%10+0x30;
if(display1[2]==0x30)//高位为0,不显示
{
display1[2]=0x20;
if(display1[1]==0x30)//次高位为0,不显示
display1[1]=0x20;
}
lcd_pos(addr,2);
lcd_wdat(display1[2]);//百位数显示
lcd_wdat(display1[1]);//十位数显示
lcd_wdat(display1[0]);//个位数显示
}
/**********************************************************
温度报警值写入DS18B20
***********************************************************/
voidWrite_Temperature_alarm(void)
{
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x4e);//将设定的温度报警值写入DS18B20
WriteOneChar(temp_alarm[0]);//写TH
WriteOneChar(temp_alarm[1]);//写TL
WriteOneChar(0x7f);//12位精确度
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x48);//把暂存器里的温度报警值拷贝到EEROM
}
/**********************************************************
温度报警值闪动子函数
**********************************************************/
voidSet_tempalarm_Flash(ucharaddr,ucharnum)
{
if(flag)
{
temp_alarm[num]=count;
Disp_Temp_alarm(addr,num);//显示温度报警值
}
else
{
lcd_pos(addr,2);
lcd_wdat(0x20);
lcd_wdat(0x20);
lcd_wdat(0x20);
}
}
/**********************************************************
设定报警值键函数
**********************************************************/
voidkey_set(ucharnum)
{
if(K1==0)//加键
{
beep();
if(count!
=num)
count++;
else
count=0;
}
if(K2==0)//减键
{
beep();
if(count!
=0)
count--;
else
count=num;
}
}
/**********************************************************
温度报警值设定
***********************************************************/
voidset_temp_alarm(void)
{
if(K3==0)//选择键
{
delayms(20);
if(K3==0)
{
TR0=1;
beep();
temp_th=1;
count=temp_alarm[0];//取实时TH报警值
}
}
while(temp_th)
{
key_set(120);
Set_tempalarm_Flash(3,0);
if(K3==0)
{
delayms(20);
if(K3==0)
{
beep();
temp_th=0;
temp_tl=1;
flag=1;
Set_tempalarm_Flash(3,0);//显示温度报警TH值
count=temp_alarm[1];//取实时TL报警值
}
}
}
while(temp_tl)
{
key_set(120);
Set_tempalarm_Flash(11,1);
if(K3==0)
{
delayms(20);
if(K3==0)
{
beep();
temp_tl=0;
flag=1;
Set_tempalarm_Flash(11,1);//显示温度报警TL值
Write_Temperature_alarm();//报警值写入DS18B20
count=0;
TR0=0;
}
}
}
}
/**********************************************************
小喇叭闪动
**********************************************************/
voidspk(ucharaddr)
{
if(flag)
{
lcd_pos(addr,2);
lcd_wdat(0x01);//小喇叭显示
}
else
{
lcd_pos(addr,2);
lcd_wdat(0x20);//清屏
}
}
/**********************************************************
系统初始化子函数
**********************************************************/
voidsys_init(void)
{
P0=0xff;
P2=0xff;
P1=0xff;
TMOD=0x01;//Timer0工作方式1
TH0=0x4c;
TL0=0x00;//50ms定时
EA=1;
ET0=1;
TR0=0;
BEEP=1;
RELAY=1;
compare_th=0;//高温比较标志清零
compare_tl=0;//低温比较标志清零
temp_th=0;//高温设置标志清零
temp_tl=0;//低温设置标志清零
flag=0;//闪烁标志清零
alarm_on_off=0;//静音标志清零
}
/**********************************************************
温度比较函数
**********************************************************/
voidtemp_compare(void)
{
if(compare_tl==0)
{
if(temp_comp>=temp_alarm[0])//比较TH值
{
TR0=1;
compare_th=1;//高温比较标志置1
compare_tl=0;//低温比较标志清零
RELAY=1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 18 B20 测温 液晶显示
