基于单片机的多路温度检测系统设计Word格式.docx
- 文档编号:8455529
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:13
- 大小:48.37KB
基于单片机的多路温度检测系统设计Word格式.docx
《基于单片机的多路温度检测系统设计Word格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的多路温度检测系统设计Word格式.docx(13页珍藏版)》请在冰点文库上搜索。
ucharcodetable3[]={0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0};
//rom3
ucharcodetable4[]={0x28,0x33,0xc5,0xb8,0x00,0x00,0x00,0xd7};
//rom4
ucharcodetable5[]="
Temple"
;
ucharcodetable6[]="
max:
min:
"
uinttemper[5];
//温度值缓存
bitfg=0;
//温度正负标志
voiddelay(uintn)
{uintx,y;
for(x=n;
x>
0;
x--)
for(y=110;
y>
y--);
}
voidwrite_com(ucharcom)
{
lcdrs=0;
//rs=0时输入指令
P2=com;
delay(5);
lcden=1;
//en=1时读取信息
lcden=0;
//1->
0执行指令
}
voidwrite_dat(uchardat)
lcdrs=1;
//rs=1时输入数据
P2=dat;
voidinit_lcd()
lcdrw=0;
write_com(0x38);
//8位数据,双列,5*7字形
write_com(0x0c);
//开启显示屏,关光标,光标不闪烁
write_com(0x06);
//显示地址递增,即写一个数据后,显示位置右移一位
write_com(0x01);
voiddelay_us(uchart)//微妙延时
while(t--);
voidinit_ds18b20() //数据初始化
DQ=1;
delay_us(4);
DQ=0;
delay_us(80);
delay_us(200);
voidwrite_ds18b20(uchardat)//写数据
uchari;
for(i=0;
i<
8;
i++)
{
DQ=0;
DQ=dat&
0x01;
delay_us(15);
DQ=1;
dat=dat>
>
1;
}
delay_us(10);
ucharread_ds18b20()//读数据
uchari=0,readat=0;
readat=readat>
//八位全部都是0,向右移一位后,仍然全是0
if(DQ)//如果DQ为1,readat进行或运算,如果为0,则子语句不执行,直接for循环此时采集的数据是0
readat=readat|0x80;
//此时最高位为1 ,然后再进行for循环最高位成为第七位,依次往复
delay_us(10);
returnreadat;
voidcheck_rom(uchara) //匹配序列号
ucharj;
write_ds18b20(0x55);
if(a==1)
for(j=0;
j<
j++)
{
write_ds18b20(table1[j]);
}
if(a==2)
write_ds18b20(table2[j]);
if(a==3)
write_ds18b20(table3[j]);
if(a==4)
write_ds18b20(table4[j]);
uintchange_ds18b20(ucharz)//为DS18B20序号
uchartl,th;
init_ds18b20();
//初始化
write_ds18b20(0xcc);
//跳过
if(z==1)
check_rom
(1);
// 匹配rom1
if(z==2)
check_rom
(2);
// 匹配rom2
if(z==3)
check_rom(3);
// 匹配rom3
if(z==4)
check_rom(4);
// 匹配rom4
write_ds18b20(0x44);
//
write_ds18b20(0xbe);
//启动读暂存器。
读内部ram中9字节温度数据
tl=read_ds18b20();
th=read_ds18b20();
value=th;
value=value<
<
value=value|tl;
if(th<
0x80)
{ fg=0;
}
if(th>
=0x80)
{ fg=1;
value=~value+1;
value=value*(0.0625*10);
returnvalue;
voiddisplay_lcd1602(ucharz)//显示各个温度
{
uchari;
if(z==1)
{
write_com(0x80);
for(i=0;
6;
{
write_dat(table5[i]);
delay(3);
}
write_dat(0x2d);
write_dat(0x41);
write_dat(0x3a);
if(fg==1)
write_dat(0xb0);
if(fg==0)
write_dat(0x20);
write_dat(value/100+0x30);
write_dat(value%100/10+0x30);
write_dat(0x2e);
write_dat(value%10+0x30);
write_dat(0xdf);
write_dat(0x43);
}
if(z==2)
write_dat(0x42);
write_dat(0xb0);
write_dat(0x20);
}
if(z==3)
if(z==4)
write_dat(0x44);
voidlcd_set_mun()//显示设置菜单
16;
write_dat(table6[i]);
voidlcd_set(charmax,charmin)//显示最大最小值
ucharx1,x2,x3,x4;
ucharflag_max,flag_min;
if(max<
0)
flag_max=1;
max=-max;
else
flag_max=0;
if(min<
flag_min=1;
min=-min;
flag_min=0;
x1=max/10;
x2=max%10;
x3=min/10;
x4=min%10;
write_com(0x80+0x40+0x03);
if(flag_max==1)write_dat('
-'
);
elsewrite_dat('
'
write_dat(x1+0x30);
write_dat(x2+0x30);
write_com(0x80+0x40+0x0b);
if(flag_min==1)write_dat('
write_dat(x3+0x30);
write_dat(x4+0x30);
voidkey1()
if(k1==0)
{
change_flag++;
if(change_flag>
2)
change_flag=0;
}
while(k1==0);
voidkey2()
if(k2==0)
if(change_flag==1)
max++;
if(change_flag==2)
min++;
while(k2==0);
voidkey3()
if(k3==0)
if(change_flag==1)
max--;
if(change_flag==2)
min--;
while(k3==0);
voidkey()//按钮
key2();
key1();
key3();
voidalarm(uintt)
inttt;
//t是温度绝对值,tt是有符号数,需要转换
t=t*0.1;
if(fg==0)//正温度
tt=t;
if(fg==1) //负温度
tt=~t+1;
if(tt>
max)
sound=0;
warning=1;
greenled=0;
else
if(tt<
min)
{
sound=0;
warning=1;
greenled=0;
}
sound=1;
warning=0;
greenled=1;
voidmain()
ucharm=1;
uchari;
uchara=1,b=1;
warning=0;
greenled=1;
init_lcd();
for(i=1;
5;
{
change_ds18b20(i);
}
while
(1)
if(change_flag==0)
if(a==1)
{b=1;
a=0;
write_com(0x01);
for(i=0;
10;
{
key();
temper[m]=change_ds18b20(m);
display_lcd1602(m);
alarm(temper[m]);
m++;
if(m>
4)m=1;
if(b==1)
a=1;
b=0;
//显示清屏
lcd_set_mun();
key();
lcd_set(max,min);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 温度 检测 系统 设计