基于DS18B20的温度监控系统程序.docx

上传人:b****6 文档编号:6525889 上传时间:2023-01-07 格式:DOCX 页数:21 大小:18.12KB
下载 相关 举报
基于DS18B20的温度监控系统程序.docx_第1页
第1页 / 共21页
基于DS18B20的温度监控系统程序.docx_第2页
第2页 / 共21页
基于DS18B20的温度监控系统程序.docx_第3页
第3页 / 共21页
基于DS18B20的温度监控系统程序.docx_第4页
第4页 / 共21页
基于DS18B20的温度监控系统程序.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

基于DS18B20的温度监控系统程序.docx

《基于DS18B20的温度监控系统程序.docx》由会员分享,可在线阅读,更多相关《基于DS18B20的温度监控系统程序.docx(21页珍藏版)》请在冰豆网上搜索。

基于DS18B20的温度监控系统程序.docx

基于DS18B20的温度监控系统程序

附录:

系统程序

//*******************************************************************

//********************************************************************

/*温度多功能测定报警程序07082324刘杰*/

#include

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineledP0//数码管断码控制口

#definekeyP2//按键

ucharTHH;//温度上限值

ucharTLL;//温度下限值

bitflagw;//温度显示标志位

bitflags;//上限标志位温度设置

bitflagx;//下限设置温度标志位

bitflagckf;//串口发送标志

bitflagcj;//串口接收标志位

bitflagbjg;

bitflagbjk;

bitflagsz;//时钟标志位

bitflagsm;

sbitkey24=P2^4;

sbitkey25=P2^5;

sbitkey26=P2^6;

sbitkey27=P2^7;

sbitkey20=P2^0;

sbitkey21=P2^1;

sbitkey22=P2^2;

sbitkey23=P2^3;//各个按键

sbitg=P3^5;//二极管总控制口

sbitfmq=P3^2;//蜂鸣器

sbitjdq=P3^6;//继电器

sbits1=P1^7;//数码管

sbits2=P1^6;

sbits3=P1^5;

sbits4=P1^4;

sbitwd=P2^2;//18b20

ucharcodesmg12[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义段码

ucharcodesmg34[]={0xC0,0xCF,0xa4,0x86,0x8B,0x92,0x90,0xC7,0x80,0x82};

ucharcodedian[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

ucharcodedian34[]={0x40,0x4f,0x24,0x06,0x0b,0x12,0x10,0x47,0x00,0x02};//含有点的34数码管

ucharcodedian12[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//含有点的12数码管

ucharcodetab[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//串口发送代码

ucharTH,TL,TZ,TX;//定义温度的高八位低八位转换后的整数位小数位

delayms(uinta)//1毫秒延时

{

uintb,c;

for(b=0;b<110;b++)

for(c=0;c

}

/*以上为一些常规设定*/

//*******************************************************************

/****************时钟*******************************************/

voidinit()

{

TMOD=0x21;//工作在方式1定时器T0

TH0=0x3c;//设定初值3cb0为50ms延时

TL0=0xb0;

ET0=1;

EA=1;

TR0=1;

}

uintaa1,db,bb,cc,dd,c1,c2,d1,d2;

voidt0()interrupt1//时钟中断入口

{

if(TZTLL)

{fmq=1;g=1;}

TH0=0x3c;//重新装初值

TL0=0xb0;

aa1++;

if(aa1==10)

{db=1;}

if(aa1==20)

{db=0;

bb++;//秒位

aa1=0;

if(bb==60)

{

cc++;//分位

bb=0;aa1=0;

if(cc==60)

{

dd++;//小时位

aa1=0;bb=0;cc=0;

if(dd==24)

{

aa1=0;bb=0;cc=0;dd=0;

}

}}}}

ucharb1,b2;

szm()

{

b1=bb/10;

b2=bb%10;

led=smg34[b1];

s3=0;

delayms

(1);

s3=1;

led=smg34[b2];

s4=0;

delayms

(1);

s4=1;

}

szxs()

{

c1=cc/10;

c2=cc%10;

d1=dd/10;

d2=dd%10;

if(db)

{

led=smg34[c1];

}

else

led=dian34[c1];

s3=0;

delayms

(1);

s3=1;

led=smg34[c2];

s4=0;

delayms

(1);

s4=1;

led=smg12[d1];

s1=0;

delayms

(1);

s1=1;

if(db)

{

led=smg12[d2];

}

else

led=dian12[d2];

s2=0;

delayms

(1);

s2=1;

}

//********************************************************************

/*一下为温度18b20程序*/

uchartime;

bitinit18b20(void)//初始化

{

bitflag;

wd=0;

for(time=0;time<200;time++);//拉低480us到960us

wd=1;

for(time=0;time<10;time++);//拉高15到60us

flag=wd;

for(time=0;time<200;time++);//主机接收480us左右

return(flag);

}

ucharreadonechar(void)//读取18b20的一个字节

{

uchari;

uchardat;

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

{

wd=1;

_nop_();

wd=0;

dat>>=1;

_nop_();

wd=1;

for(time=0;time<2;time++);//延时6us让主机采样

if(wd==1)

dat|=0x80;//如果读到的是,则将1存入dat

else

dat|=0x00;

for(time=0;time<5;time++);//延时3us,两个读时序之间必须有大于1us的恢复期

}

return(dat);

}

writeonechar(uchardat)//向18b20写一个字节

{

uchari=0;

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

{

wd=1;

_nop_();

wd=0;

wd=dat&0x01;//利用与运算取出要写的某位二进制数据,并将其送到数据线上等待DS18B20采样

for(time=0;time<10;time++);//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样

wd=1;

for(time=0;time<1;time++);//延时3us,两个写时序间至少需要1us的恢复期

dat>>=1;//将dat中的各二进制位数据右移1位

}

for(time=0;time<4;time++);//稍作延时,给硬件一点反应时间

}

voidreadtmp()//准备读温度

{

init18b20();

writeonechar(0xcc);//跳过读序号列号的操作

writeonechar(0x44);//启动温度转换

for(time=0;time<100;time++);//300us左右转化

init18b20();

writeonechar(0xcc);

writeonechar(0xbe);//存储温度的高低位

}

/*以上为18b20程序*/

//*******************************************************************

//********************************************************************

/*以下为键盘识别程序*/

//键盘选择程序

voidkeyz()

{

uchara;

key=0xf0;

a=key;

a&=0xf0;

a|=0xf0;

if(a!

=0)

{

//按键24

if(key24==0)

{

delayms(20);

if(key24==0)

{

key=0xef;

_nop_();

//按键2420温度加按键

if(key20==0)

{

delayms(20);

if(key20==0)

{

while(key20!

=0);

delayms

(1);

while(key20!

=0);

if(flagw==0)//设定温度上下限值

{

if(flags)

{

if(THH<125&&THH>=TLL)

{

THH++;

}

}

if(flagx)

{

if(TLL>=0&&TLL

{

TLL++;

}

}

}

flagbjg=0;//报警开

flagbjk=1;

if(flagsz)//时钟小时加

{dd++;

if(dd==24)

{dd=0;

}

}

}

}

//按键2421//功能切换键

if(key21==0)

{

delayms(20);

if(key21==0)

{

while(key21!

=0);

delayms

(1);

while(key21!

=0);

if(flagw)

{flagw=0;flags=1;flagx=0;flagsz=0;}

elseif(flags)

{flags=0;flagx=1;flagw=0;flagsz=0;}

elseif(flagx)

{flags=0;flagw=0;flagx=0;flagsz=1;}

else

{flags=0;flagw=1;flagx=0;flagsz=0;}

}

}

//按键2422温度减按键

if(key22==0)

{

delayms(20);

if(key22==0)

{

while(key22!

=0);

delayms

(1);

while(key22!

=0);

if(flagw==0)//设定温度上下限减

{

if(flags)

{

if(THH<=125&&THH>TLL)

{

THH--;

}}

if(flagx)

{

if(TLL>0&&TLL<=THH)

{

TLL--;}}

}

flagcj=0;

flagbjg=1;//报警关

flagbjk=0;

if(flagsz)//时钟分钟加

{cc++;

if(cc==60)

{cc=0;

}

}

}

}

//按键2423

if(key23==0)

{

delayms(20);

if(key23==0)

{

while(key23!

=0);

delayms

(1);

while(key23!

=0);

//处理程序

}

}

}

}//到此为设置24按键

//按键25

if(key25==0)

{

delayms(20);

if(key25==0)

{

key=0xdf;

_nop_();

//按键2520

if(key20==0)

{

delayms(20);

if(key20==0)

{

while(key20!

=0);

delayms

(1);

while(key20!

=0);

}

}

//按键2521

if(key21==0)

{

delayms(20);

if(key21==0)

{

while(key21!

=0);

delayms

(1);

while(key21!

=0);

flagckf=1;

if(flagsz)

{

if(flagsm==0)

flagsm=1;

else

flagsm=0;

}

if(flags)

{

flagcj=1;

}

if(flagx)

{

flagcj=1;

}

}

}

//按键2522

if(key22==0)

{

delayms(20);

if(key22==0)

{

while(key22!

=0);

delayms

(1);

while(key22!

=0);

}

}

//按键2523

if(key23==0)

{

delayms(20);

if(key23==0)

{

while(key23!

=0);

delayms

(1);

while(key23!

=0);

//处理程序

}

}

}

}//到此为设置25按键

}

}

/*以上为按键识别程序*/

//*******************************************************************

//*******************************************************************

/*以下为串口发送程序*/

ckinit()

{

TMOD=0x21;

SCON=0x50;

TH1=0xf3;

TL1=0xf3;

PCON=0x80;

ES=1;

EA=1;

TR1=1;

}

ucharaa;ucharckjs;

voidserial()interrupt4

{

if(TZTLL)

{fmq=1;g=1;}

if(flags)

{

if(flagcj)

{

if(RI)

{

RI=0;

ckjs=SBUF;

THH=ckjs;

}

}

}

if(flagx)

{

if(flagcj)

{

if(RI)

{

RI=0;

ckjs=SBUF;

TLL=ckjs;

}

}

}

}

//*********************以上为串口发送程序*****************************

//********************************************************************

/*以下为温度上下限显设定示*/

wds()//设置上限

{

uchara,b,c;

ckinit();

a=THH/100;//上限百位温度

b=(THH%100)/10;//上限十位温度

c=THH%10;

//上限个位温度

if(a>0)

{

led=smg12[a];

s1=0;

delayms

(1);

s1=1;

}

if(b>0||a>0)

{

led=smg12[b];

s2=0;

delayms

(1);

s2=1;

}

led=smg34[c];

s3=0;

delayms

(1);

s3=1;

led=0x7f;

s4=0;

delayms

(1);

s4=1;

}

 

ucharckjsx;

wdx()//设置下限

{

uchara1,b1,c1;

ckinit();

a1=TLL/100;//下限百位温度

b1=(TLL%100)/10;//下限十位温度

c1=TLL%10;//下限个位温度

if(a1>0)

{

led=smg12[a1];

s1=0;

delayms

(1);

s1=1;

}

if(b1>0||a1>0)

{

led=smg12[b1];

s2=0;

delayms

(1);

s2=1;

}

led=smg34[c1];

s3=0;

delayms

(1);

s3=1;

led=0x7f;

s1=0;

delayms

(1);

s1=1;

}

/*以上为温度上下限显示设定*/

//*******************************************************************

//********************************************************************

/*以下为温度显示程序*/

xianshiwendu()//显示温度程序

{

ucharj,k,l,m;//定义个十百小数

readtmp();

TL=readonechar();

TH=readonechar();

TZ=TH*16+TL/16;

TX=(TL%16)*10/16;

j=TZ/100;//温度百位

k=(TZ%100)/10;//温度十位

l=TZ%10;//温度个位

m=TX;//温度小数位

if(flagbjg==0)

{

if(TZ>=THH||TZ<=TLL)//上下限报警

{

fmq=0;

g=0;

led=0x5a;

delayms

(1);

}

else

{fmq=1;

g=1;

}

}

g=1;

if(flagbjk==0)

{fmq=1;}

led=smg12[k];

s1=0;

delayms

(1);

s1=1;

led=dian[l];

s2=0;

delayms

(1);

s2=1;

led=smg34[m];

s3=0;

delayms

(1);

s3=1;

led=0x70;

s4=0;

delayms

(1);

s4=1;

//发送温度

ckinit();

while(flagckf)

{

ES=0;

SBUF=tab[k];

while(!

TI);

TI=0;

SBUF=tab[l];

while(!

TI);

TI=0;

SBUF=46;

while(!

TI);

TI=0;

SBUF=tab[m];

while(!

TI);

TI=0;

SBUF=32;

while(!

TI);

TI=0;

ES=1;

flagckf=0;

}

}

/*以上为温度显示程序*/

//*******************************************************************

//********************************************************************

/*以下为主函数*/

voidmain()

{

THH=30;

TLL=10;

flagw=1;

flags=0;

flagx=0;

flagbjg=0;

flagbjk=1;

flagsz=0;

g=1;

flagsm=0;

init();

while

(1)

{

keyz();

if(flagw==1)

{

xianshiwendu();

}

if(flags==1)

{

wds();

}

if(flagx==1)

{

wdx();

}

if(flagsz)

{

TR1=0;ES=0;

if(flagsm==0)

{

szxs();

}

if(flagsm==1)

szm();

}

}

}

//*****程序结束***********************/

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

当前位置:首页 > 表格模板 > 合同协议

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

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