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

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

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

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

基于单片机的多路温度检测系统设计.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);

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

当前位置:首页 > 解决方案 > 工作计划

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

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