18B20测温液晶显示文档格式.docx
- 文档编号:22548072
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:26
- 大小:18.89KB
18B20测温液晶显示文档格式.docx
《18B20测温液晶显示文档格式.docx》由会员分享,可在线阅读,更多相关《18B20测温液晶显示文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
//温度值存放单元
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]);
lcd_wdat(mytab2[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)
wr_string(cdis3,0);
//显示字符串3
wr_string(cdis4,0);
//显示字符串4
/*********************************************************
读取温度子函数
*********************************************************/
voidRead_Temperature(void)
Init_DS18B20();
if(presence==1)//DS18B20不正常
{
Error_Menu();
//显示错误菜单
else
WriteOneChar(0x55);
//匹配ROM命令
for(i=0;
8;
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);
//取温度整数值
WriteOneChar(0xCC);
//跳过读序号列号的操作
WriteOneChar(0x44);
//启动温度转换
}
读取64位序列码
***********************************************************/
voidRead_RomCord(void)
unsignedcharj;
WriteOneChar(0x33);
//读序列码的操作
for(j=0;
j<
j++)
RomCode[j]=ReadOneChar();
DS18B20的CRC8校验程序
ucharCRC8(void)
uchari,x;
ucharcrcbuff;
crc=0;
for(x=0;
x<
x++)
crcbuff=RomCode[x];
for(i=0;
i<
i++)
if(((crc^crcbuff)&
0x01)==0)
crc>
=1;
crc^=0x18;
//CRC=X8+X5+X4+1
crc|=0x80;
crcbuff>
returncrc;
序列码数据转换与显示子函数
voidDisp_RomCode(void)
ucharj,Temp;
ucharpos=15;
//从第二行末尾开始
for(j=0;
j<
j++)//序列码为8个字节
Temp=RomCode[j];
display[0]=(Temp&
0x0f);
if(display[0]>
9)
display[0]=display[0]+0x37;
display[0]=display[0]+0x30;
lcd_pos(pos,2);
lcd_wdat(display[0]);
//低位数显示
pos--;
display[1]=((Temp&
if(display[1]>
display[1]=display[1]+0x37;
else
display[1]=display[1]+0x30;
lcd_wdat(display[1]);
//高位数显示
}
ROMCORD显示菜单
voidRomCode_Menu(void)
Ok_Menu();
Read_RomCord();
//读取64位序列码
CRC8();
//CRC效验
while(crc!
=0)//校验不对,继续校验
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]&
//整数位数据
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('
.'
);
//小数位数显示
lcd_wdat(0x00);
//显示自定义字符
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)
//跳过读序号列号的操作
WriteOneChar(0x4e);
//将设定的温度报警值写入DS18B20
WriteOneChar(temp_alarm[0]);
//写TH
WriteOneChar(temp_alarm[1]);
//写TL
WriteOneChar(0x7f);
//12位精确度
WriteOneChar(0x48);
//把暂存器里的温度报警值拷贝到EEROM
温度报警值闪动子函数
voidSet_tempalarm_Flash(ucharaddr,ucharnum)
if(flag)
temp_alarm[num]=count;
Disp_Temp_alarm(addr,num);
//显示温度报警值
lcd_wdat(0x20);
设定报警值键函数
voidkey_set(ucharnum)
if(K1==0)//加键
beep();
if(count!
=num)
count++;
count=0;
if(K2==0)//减键
=0)
count--;
count=num;
温度报警值设定
voidset_temp_alarm(void)
if(K3==0)//选择键
delayms(20);
if(K3==0)
{
TR0=1;
temp_th=1;
count=temp_alarm[0];
//取实时TH报警值
while(temp_th)
key_set(120);
Set_tempalarm_Flash(3,0);
if(K3==0)
delayms(20);
temp_th=0;
temp_tl=1;
flag=1;
//显示温度报警TH值
count=temp_alarm[1];
//取实时TL报警值
while(temp_tl)
Set_tempalarm_Flash(11,1);
temp_tl=0;
flag=1;
//显示温度报警TL值
Write_Temperature_alarm();
//报警值写入DS18B20
TR0=0;
小喇叭闪动
voidspk(ucharaddr)
lcd_wdat(0x01);
//小喇叭显示
//清屏
系统初始化子函数
voidsys_init(void)
P0=0xff;
P2=0xff;
P1=0xff;
TMOD=0x01;
//Timer0工作方式1
TH0=0x4c;
TL0=0x00;
//50ms定时
EA=1;
ET0=1;
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 18 B20 测温 液晶显示