基于单片机的多路温度检测系统设计.docx
- 文档编号:27597047
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:18
- 大小:16.79KB
基于单片机的多路温度检测系统设计.docx
《基于单片机的多路温度检测系统设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的多路温度检测系统设计.docx(18页珍藏版)》请在冰豆网上搜索。
基于单片机的多路温度检测系统设计
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitlcdrs=P3^0;
sbitlcdrw=P3^1;
sbitlcden=P3^2;//LCD选通线
sbitDQ=P1^7;//18B20引脚
uintvalue;//温度值
sbitsound=P1^6;//蜂鸣器
sbitwarning=P3^5;//LED报警灯
sbitgreenled=P3^6;//LED报警灯
sbitk1=P1^0;//set
sbitk2=P1^1;//+
sbitk3=P1^2;//-
charmax=40;//初始温度最大值
charmin=10;//初始温度最小值
ucharchange_flag;//按键次数
ucharcodetable1[]={0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e};//rom1测得的序列号
ucharcodetable2[]={0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9};//rom2
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>0;y--);
}
voidwrite_com(ucharcom)
{
lcdrs=0;//rs=0时输入指令
P2=com;
delay(5);
lcden=1;//en=1时读取信息
delay(5);
lcden=0;//1->0执行指令
}
voidwrite_dat(uchardat)
{
lcdrs=1;//rs=1时输入数据
P2=dat;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidinit_lcd()
{
lcden=0;
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);
DQ=1;
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;
for(i=0;i<8;i++)
{
DQ=0;
readat=readat>>1;//八位全部都是0,向右移一位后,仍然全是0
DQ=1;
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<8;j++)
{
write_ds18b20(table1[j]);
}
}
if(a==2)
{
for(j=0;j<8;j++)
{
write_ds18b20(table2[j]);
}
}
if(a==3)
{
for(j=0;j<8;j++)
{
write_ds18b20(table3[j]);
}
}
if(a==4)
{
for(j=0;j<8;j++)
{
write_ds18b20(table4[j]);
}
}
}
uintchange_ds18b20(ucharz)//为DS18B20序号
{
uchartl,th;
init_ds18b20();//初始化
write_ds18b20(0xcc);//跳过
init_ds18b20();
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);
init_ds18b20();
write_ds18b20(0xcc);
init_ds18b20();
if(z==1)
{
check_rom
(1);//
}
if(z==2)
{
check_rom
(2);//
}
if(z==3)
{
check_rom(3);//
}
if(z==4)
{
check_rom(4);//
}
write_ds18b20(0xbe);//启动读暂存器。
读内部ram中9字节温度数据
tl=read_ds18b20();
th=read_ds18b20();
value=th;
value=value<<8;
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;i<6;i++)
{
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_com(0x80);
for(i=0;i<6;i++)
{
write_dat(table5[i]);
delay(3);
}
write_dat(0x2d);
write_dat(0x42);
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==3)
{
write_com(0x80);
for(i=0;i<6;i++)
{
write_dat(table5[i]);
delay(3);
}
write_dat(0x2d);
write_dat(0x43);
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==4)
{
write_com(0x80);
for(i=0;i<6;i++)
{
write_dat(table5[i]);
delay(3);
}
write_dat(0x2d);
write_dat(0x44);
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);
}
}
voidlcd_set_mun()//显示设置菜单
{
uchari;
write_com(0x80);
for(i=0;i<16;i++)
{
write_dat(table6[i]);
delay(3);
}
}
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<0)
{
flag_min=1;
min=-min;
}
else
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('-');
elsewrite_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 { sound=0; warning=1; greenled=0; } else { sound=1; warning=0; greenled=1; } } } voidmain() { ucharm=1; uchari; uchara=1,b=1; warning=0; greenled=1; init_lcd(); for(i=1;i<5;i++) { change_ds18b20(i); } while (1) { if(change_flag==0) { if(a==1) {b=1; a=0; write_com(0x01); } for(i=0;i<10;i++) { key(); temper[m]=change_ds18b20(m); display_lcd1602(m); alarm(temper[m]); } m++; if(m>4)m=1; } else { if(b==1) { a=1; b=0; write_com(0x01);//显示清屏 lcd_set_mun(); } key(); lcd_set(max,min); } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 温度 检测 系统 设计