DS18B20温度测量报警 设定温度上下限.docx

上传人:b****4 文档编号:24598632 上传时间:2023-05-29 格式:DOCX 页数:19 大小:16.34KB
下载 相关 举报
DS18B20温度测量报警 设定温度上下限.docx_第1页
第1页 / 共19页
DS18B20温度测量报警 设定温度上下限.docx_第2页
第2页 / 共19页
DS18B20温度测量报警 设定温度上下限.docx_第3页
第3页 / 共19页
DS18B20温度测量报警 设定温度上下限.docx_第4页
第4页 / 共19页
DS18B20温度测量报警 设定温度上下限.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

DS18B20温度测量报警 设定温度上下限.docx

《DS18B20温度测量报警 设定温度上下限.docx》由会员分享,可在线阅读,更多相关《DS18B20温度测量报警 设定温度上下限.docx(19页珍藏版)》请在冰豆网上搜索。

DS18B20温度测量报警 设定温度上下限.docx

DS18B20温度测量报警设定温度上下限

DS18B20温度测量报警设定温度上下限

分类:

单片机2011-10-0719:

42719人阅读评论

(1)收藏举报

#include

#include

 

ucharDQ;

uchark;

sbitds=P2^4;//温度传感器引脚;

sbitbeep=P2^0;//蜂鸣器

uinttemp;

floatftemp;

 

ucharg1=22,g2=24,d1=20,d2=18;

 

sbitb=P2^3;//定义按键;

sbita=P2^2;//定义按键;

 

sbitE=P2^7;//使能信号;

sbitRW=P2^6;//读写选择写指令RS=0;RW=0;D0~D7指令码;E高脉冲;

sbitRS=P2^5;//数据/命令选择写数据RS=1;RW=0;D0~D7数据;E高脉冲

 

ucharcodetable1[]="DS18B20OK!

";

ucharcodetable2[]="TEMPIS:

.";

 

//自定义字符显示'C;

ucharcodetable[8]={0x16,0x09,0x08,0x08,0x08,0x09,0x06,0x00};

 

ucharcodetable3[]="DS18B20ERR0R!

";

ucharcodetable4[]="PLEASECHECK!

";

 

ucharcodetable7[]="setstandard";

ucharcodetable8[]="tempreture!

";

ucharcodetable5[]="G1=,G2=.";

ucharcodetable6[]="D1=,D2=.";

 

voiddelay(uintz)//延时函数

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

 

}

 

voidwrite_com(ucharcom)//液晶写指令;

{

P1=com;

RS=0;

RW=0;

E=1;

delay(5);

E=0;

delay(5);

 

}

 

voidwrite_date(uchardate)//液晶写数据;

{

P1=date;

RS=1;

RW=0;

E=1;

delay(5);

E=0;

delay(5);

}

 

voidchushi()

{

ucharf;

write_com(0x80);

f=0;

while(table7[f]!

=0)

{

write_date(table7[f]);

f++;

}

 

write_com(0x80+0x40);

f=0;

while(table8[f]!

=0)

{

write_date(table8[f]);

f++;

}

}

 

voidinit()//液晶初始化状态;

{

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x01);

chushi();

}

 

dsreset(void)//DS18B20复位初始化函数

{

uinti;

ds=0;

i=103;

while(i>0)i--;

ds=1;

i=4;

while(i>0)i--;

DQ=ds;

i=4;

while(i>0)i--;

returnDQ;

 

}

 

bittempreadbit(void)//读一位数据函数

{

uinti;

bitdat;

ds=0;i++;

ds=1;i++;i++;

dat=ds;

i=8;while(i>0)i--;

return(dat);

 

}

 

uchartempread(void)//读一个字节数据函数

{

uchari,j,dat;

dat=0;

for(i=1;i<=8;i++)

{

j=tempreadbit();

dat=(j<<7)|(dat>>1);

 

}

return(dat);

 

}

 

voidtempwritebyte(uchardat)//写一个字节数据函数

{

uinti;

ucharj;

bittestb;

for(j=1;j<=8;j++)

{

testb=dat&0x01;

dat=dat>>1;

if(testb)//写1

{

ds=0;

i++;i++;

ds=1;

i=8;while(i>0)i--;

 

}

else//写0

{

ds=0;

i=8;while(i>0)i--;

ds=1;

i++;i++;

 

}

 

}

 

}

 

voidtempchange(void)//DS18B20开始获取温度并转换

{

dsreset();

delay

(1);

tempwritebyte(0xcc);

tempwritebyte(0x44);

 

}

 

uintget_temp()//读取寄存器中存储的温度数据

{

uchara,b;

dsreset();

delay

(1);

tempwritebyte(0xcc);

tempwritebyte(0xbe);

a=tempread();

b=tempread();

temp=b;

temp<<=8;

temp=temp|a;

ftemp=temp*0.0625;

temp=ftemp*10+0.5;

ftemp=ftemp+0.05;

returntemp;

 

}

 

voidinit_com(void)//串口初始化;

{

PCON=0x00;

SCON=0x50;

TMOD=0x20;

TH1=0xfd;

TL1=0xfd;

TR1=1;

 

}

 

voidcomm(char*parr)//串口发送;

{

do

{

SBUF=*parr++;

while(!

TI);

TI=0;

}while(*parr!

='\0');

 

}

 

voidzdy()//自定义字符显示’C;

{uchari;

write_com(0x40);

for(i=0;i<9;i++)

write_date(table[i]);

write_com(0x80+0x40+14);

write_date(0x00);

}

 

voidok()//温度传感器存在显示温度;

{

uchari;

write_com(0x80);

for(i=0;i<16;i++)

write_date(table1[i]);

write_com(0x80+0x40);

for(i=0;i<16;i++)

write_date(table2[i]);

}

 

voiderror()//温度传感器不存在显示错误;

{

uchari;

write_com(0x80);

for(i=0;i<16;i++)

write_date(table3[i]);

write_com(0x80+0x40);

for(i=0;i<16;i++)

write_date(table4[i]);

}

 

voiddisplay()//液晶显示温度;

{

write_com(0x80+0x40+10);

write_date(temp/100+0x30);

write_com(0x80+0x40+11);

write_date(temp%100/10+0x30);

write_com(0x80+0x40+13);

write_date(temp%100%10+0x30);

}

 

voidfmq(uinti)//蜂鸣器滴答;

{

beep=0;

delay(i);

beep=1;

}

 

voiddywd(ucharadd,uchardate)//定义温度液晶显示;

{

ucharshi,ge;

shi=date/10;

ge=date%10;

write_com(0x80+add);

write_date(0x30+shi);

write_date(0x30+ge);

}

 

voiddi()//蜂鸣器滴答;

{

beep=0;

delay(100);

beep=1;

}

 

uintkeyscan()//按键扫描,调标准温度;

{

ucharf;

if(a==0)

{

delay(10);

if(a==0)

{

k++;

while(!

a);

di();

write_com(0x80);

f=0;

while(table5[f]!

=0)

{

write_date(table5[f]);

f++;

}

 

write_com(0x80+0x40);

f=0;

while(table6[f]!

=0)

{

write_date(table6[f]);

f++;

}

dywd(4,g1);

dywd(12,g2);

dywd(4+0x40,d1);

dywd(12+0x40,d2);

 

if(k==1)

{

write_com(0x80+5);

write_com(0x0f);

}

 

if(k==2)

{

write_com(0x80+13);

write_com(0x0f);

}

 

if(k==3)

{

write_com(0x80+0x40+5);

write_com(0x0f);

}

 

if(k==4)

{

write_com(0x80+0x40+13);

write_com(0x0f);

}

 

if(k==5)

{

write_com(0x0c);

}

 

}

}

if(k!

=0)

{

if(b==0)

{

delay(10);

if(b==0)

{

while(!

b);

di();

if(k==1)

{

g1--;

if(g1==0)

g1=60;

dywd(4,g1);

write_com(0x80+5);

}

 

if(k==2)

{

g2--;

if(g1==0)

g2=60;

dywd(12,g2);

write_com(0x80+13);

}

 

if(k==3)

{

d1--;

if(g1==0)

d1=60;

dywd(4+0x40,d1);

write_com(0x80+0x40+5);

}

 

if(k==4)

{

d2--;

if(g1==0)

d2=60;

dywd(12+0x40,d2);

write_com(0x80+0x40+13);

}

 

}

}

}

 

returng1;

returng2;

returnd1;

returnd2;

 

}

 

voidwarn(uinttemp)//温度报警;

{

uchara=d2,b=d1,c=g1,d=g2;

 

if(temp<=a*10)//灯1,2亮;

{

P0=0xfc;

fmq(250);

display();

}

 

elseif((temp=a*10))//灯3亮;

{

P0=0xfb;

fmq(20);

display();

}

 

elseif((temp=a*10))//灯4,5亮;

{

P0=0xe7;

display();

beep=1;

}

 

if((temp>c*10)&&(temp

{

P0=0xdf;

fmq(20);

display();

}

elseif(temp>=d*10)//灯7,8亮;

{

P0=0x3f;

fmq(250);

display();

}

 

}

 

voidmain()//主函数

{

ucharbuff[4];

init_com();//串口初始化;

init();//液晶初始化状态;

dsreset();//DS18B20复位初始化函数;

tempchange();//DS18B20开始获取温度并转;

get_temp();//读取寄存器中存储的温度数据

while

(1)

{

keyscan();

if(k==5)

{

ok();//温度传感器存在程序;

do

{

tempchange();

sprintf(buff,"%f",ftemp);

comm(buff);//串口发送;

zdy();

warn(get_temp());

}

while(!

DQ);

 

error();//温度传感器不存在程序;

do

{

fmq

(1);

dsreset();

P0=0x00;

}

 

while(DQ);

}

}

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

当前位置:首页 > 工作范文 > 行政公文

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

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