基于单片机的多路温度检测系统设计.docx

上传人:b****5 文档编号:27597047 上传时间:2023-07-03 格式:DOCX 页数:18 大小:16.79KB
下载 相关 举报
基于单片机的多路温度检测系统设计.docx_第1页
第1页 / 共18页
基于单片机的多路温度检测系统设计.docx_第2页
第2页 / 共18页
基于单片机的多路温度检测系统设计.docx_第3页
第3页 / 共18页
基于单片机的多路温度检测系统设计.docx_第4页
第4页 / 共18页
基于单片机的多路温度检测系统设计.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

基于单片机的多路温度检测系统设计.docx

《基于单片机的多路温度检测系统设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的多路温度检测系统设计.docx(18页珍藏版)》请在冰豆网上搜索。

基于单片机的多路温度检测系统设计.docx

基于单片机的多路温度检测系统设计

#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);

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1