单片机设计温度计流程图源码实物图片要点简介_第1页
单片机设计温度计流程图源码实物图片要点简介_第2页
单片机设计温度计流程图源码实物图片要点简介_第3页
单片机设计温度计流程图源码实物图片要点简介_第4页
单片机设计温度计流程图源码实物图片要点简介_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DS18B20获取温度程序流程图

DS18B20的读字节,写字节,获取温度的程序流程图如图所示。

DS18B20初始化

程序流程图

l)SIXB2()gr

I_—।

与0x1跳过

DS1XB20写字节

读RCM程中减程图

写0x44启司

DSI8B20

延时500Ms

DS1XB20W

_t&dt-

一—一

与Oxcc跳短

读ROM

▼DS18B2O读字节

”Oxbe读程序流程图

I】、」^KU1

(结束

DSI8B2O获取温度

程序流程图

图3-4DS18B20程序流程图

显示程序设计

显示电路是由四位一体的数码管来实现的。由于单片机的J1/0口有限,因此

数码管采用动态扫描H勺方式来进行显示。程序流程图如图所示。

(开始)

按键程序设计

按键是用来设定上下限报警温度的。详细H勺程序沆程图如图所示。

SO'.-:I限

S=l调卜取

Tempi

附1源程序代码

*程序名;基于DS18B20的测温系统

*功能:实时测量温度,超过上下限报警,报警温度可手动调整。KI是用来

*进入上下限调整模式的,当按一下K1进入上限调整模式,再按一下进入下限

*调整模式。在正常模式下,按一下K2进入查行上限温度模式,显示1s左右自动

*退出:按一下K3进入查看下限温度模式,显示1s左右自动退出:按一下K4消除

*按犍音,再按一下启动按键音。在调整上下限温度模式下,K2是实现加I功能,

*KI是实现减1功能,K3是用来设定上下限温度正负口勺。

*编程者:ZPZ

*编程时间:2009/10/2

*****在************************************************X**************/

#includc<AT89X52.h>〃将AT89X52.h头文献包括到主程序

#include<intrins.h>〃将inirins.h头文献包括到主程序(调用其中『Lnop_()空操作

函数延时)

#defineuintunsignedint弁变量类型宏定义,用uint表达无符号整形(16位)

#dcfincucharunsignedchar弁变量类型宏定义,用uchar表达无符号字符型(8位)

ucharmax=0x00,min=0x00;//max是上限报警温度,min是下限报警温度

bits=0;//s是调整上下限温度时温度闪烁的标志位,s=0不显示

200ms,s=l显示Is左右

bitsl=O;//si标志位用于上下限查看时口勺显示

voiddisplay1(uintz);//申明display、()函数

#include"dsl8b20.h"〃将ds!8b20.h头文献包括到主程序

#include"keyscan.h"〃将keyscan.h头文献包括到主程序

#include"display.h"弁将display.h头文献包括到主程序

/***********************主函数************************/

voidmain()

beer=1;〃关闭蜂鸣器

lcd=l;〃关闭LED灯

timerl_init(O);〃初始化定期器1(未启动定期器1)

get_temperature(1);〃初次启动DS18R20获取温度(DS18R20卜点后自动将

EEPROM中的上下限温度复制到TH和TL寄存器)

while(l)〃主循环

keyscan();〃按键扫描函数

get_temperature(O);〃获取温度函数

keyscan();〃按键扫描函数

display(temp,temp_d*0.625);〃显示函数

alarm();〃报警函数

keyscan();〃按键扫描函数

)

}

/***********************************************左******************东*

*程序名;_dsl8b20_h_

*功能:DSI8B20H'、Jc51编程头文献

*编程者:ZPZ

*编程时间:2009/10/2

*说明:用到的全局变量是:无符号字符型变量temp(测得的温度整数部分),temp_d

*(测得的温度小数部分),标忑位f(测量温度的标志位'0'表达"正温度"'1'表

*示“负温度”),标志位f_max(上限温度的标志位’0'表达“正温度“、表

*示“负温度”),标志位f_min(下限温度的标志位,0'表达“正温度"、'1'表

*示“负温度”).标志何M报警标志传'1'启动报警'0'关闭报警).

***********京******************************************x**************/

#ifndef_ds18b20_h_〃定义头文献

#define_dsl8b20h.

#deflneuintunsignedint〃变量类型宏定义,用uint表达无符号整形(16位)

#defineucharunsignedchar〃变量类型宏定义,用uchar表达无符号字符型(8位)

sbitDQ=P2A3:〃可位寻址变量定义,用DQ表达P2.3口

sbitbeer=PlA0;〃用beer表达P1.0

sbitled=PlAl;〃用led表达Pl.l

uchartemp=0:〃测量温度的整数部分

uchartenip_d=0;〃测量温度的小数部

bitf=0;〃测量温度的标志位,0'表达“正温度"T表达'‘负温度")

bitf_max=O;〃上限温度的标志位'0'表达"正温度"'1'表达"负温度”)

bitLmin=0;〃下限温度的标志位'0'表达“正温度"、'1'表达"负温度”)

bitw=0;〃报警标志位’1'启动报警’0'关闭报警)

/本车****木本****米京:$:*****本车*****京木延时子函数**本***小********奈***木*卒*木去**东木*/

voiddsl8b20_dclayus(uint()〃延时几P

{while(t-);}

voiddsl8b2O_delayms(uintI)〃延时1ms左右

uinti.j;for(i=t;i>0;i-)for(j=120;j>0;j-);}

/***********木木木木*****泰本18b20初始彳匕函数****木木******木****5木**木木木/

voidds18b20_init()//DSI8R201J)^{^

DQ=1;〃拉高数据线

DQ=();〃控制器向DS18B20发低电平脉冲

dsl8b20_delayus(30);〃延时480口s左右

DQ=1;〃控制器拉高总线,

whilc(DQ);〃等待DS18B20拉低总线

dsl8b20_delayus(20);〃延时,等待上拉电阻拉奇总线

DQ=1;//拉高数据线,准备数据传播:

uchardsl8b20_read()//DSI8B20字节读取

uchari;〃定义一种局部变量i(局部变量只在本函数中有效)

uchard=0;〃定义•种局部变量d

DQ=1;〃准备读;

for(i=8;i>0;i-)〃一位一位的读,循环8次

i

d»=1;〃d右移一位,低位先发:

DQ=O;

_nop_();_nop_();_nop_();

DQ=1;〃必须写1,否则读出来H勺将是不预期的数据:

if(DQ)〃在12us处读取数据,送给d的最高位

d|=0x80;

dsl8b20_delayus(10);

}returnd;〃返回读取的值

/*************************dsl8b20字节写函数**************************/

voidds1Xb20_write(uchard)〃ds18b20字节写

uchari;

for(i=8;i>0;i—)〃一位一位的写

DQ=0;

_nop_();_nop_();_nop_();DQ=d&0x0i;〃写数据

ds!8b20_delayus(5);

DQ=I;

d»=1;〃d右移一位,低位先发:

/*******弥*******************获取温度函数*左**************************/

voidgct_tcmpcra(urc(bitf)

uchara=0,h=0,c=0,d=0:

uinti;

ds!8b20_init();/DS18B2O初始化

dsl8b20_write(0xcc)y/|»JDSI8B20发跳过读ROM命令

ds18b20_write(0x44);//^DSI8B20进行温度转换命令,转换成果存入内部RAM

if(f==l)

〃初次启动DS18B2O进行温度转换需要500ms,若转换时间不够就出错,读出的

是85度口勺错误值。

display1(1);〃用开机动画耗时

else

ds18b20_delayins(l);

dsl8b20_init();//DS18B20初始化

ds18b20_write(0xcc);〃向DS18B20发跳过读ROM命令

ds18b20_write(0xbe);〃写读内部RAM中9字节的内容命令

a=ds18b20_read();〃读内部RAM(LSB)

b=ds18b20_rcad();〃读内部RAM(MSB)

if(f==l)〃局部位变量f=l时读上下限报警温度

f

I

max=ds18b20_read();〃读内部RAM(TH)

min=ds18b20_read();〃读内部RAM(T1)

}

if((max&0x80)==0x80)〃若读取的上限温度的最高位(符号位)为‘1'表明是负温度

{匚max=l;max=(max-0x80);}〃将上限温度符号标志位置'1'表达负温度,将上限温度

转换成无符号数。

if((min&0x80)=0x80)〃若读取的下限温度的最高位(符号位)为T表明是负温度

{f_n】in=l:min=(min-0x80);}〃将下限温度符号标志位置'1'表达负温度,将下限温度装

换成无符号数。

i=b;i»=4;

if(i==O)

(

f=0;小为0,表达读取的温度是正温度,设置正温度标识

temp=((a»4)|(b«4));〃整数部分

a=(a&OxOf);

temp_d=a;〃小数部分

)

else

(

f=l;/八为1,表达读取的温度是负温度,设置负温度标识

a=~a+l;〃负数的小数部分取反加1

b=~b;〃负数的整数部分取反

temp=((a»4)|(h«4));〃整数部分

a=(a&OxOf);〃小数部分,低四位为小数位

temp_d=a;

产*******:$:****今******赤****存储极限温度函数*****宰******:$:****未室********/

voidstore」。

if(f_max==l)〃若上限温度为负,将上限温度转换成有符号数(最高1是负,0是正)

niax=max+0x80:

if(fLmin==l)〃若卜.限温度为负,将卜限温度转换成有符号数

min=min+0x80;

dsl8b20_init();“DSI8B20初始化

dsl8b20_write(0xcc);〃向DS18B20发跳过读ROM命令

ds18b20_writc(0x4c);〃向DSI8B20发写字节至暂存器2和3(TH和TL)命令

dsl8b20_write(max);〃向暂存器TH(上限温度暂存器)写温度

dsl8b20_write(min);〃向暂存器TL(下限温度暂存器)写温度

dsl8b20_write(0xft);〃向配置寄存器写命令,进行温度值辨别率设置

dsl8b20_init();//DS18B20初始化

ds18b20_write(0xcc);〃向DS18B20发跳过读ROM命令

dsl8b20_write(0x48);〃向DSI8B20发将RAM中2、3字节的内容写入EEPROM

)//DS18R20卜电后会自动将FEPRCM中的卜下限温度拷贝到TH、TL暂

存器

/*************中***********♦:温度超限艮警函数****************:):********/

voidalarmO

if(f_max==0)〃若上限值是正值

if(f_min==0)〃若下限值是止值

if(f==O)〃若测量值是正值

if((tcmp+temp_d*0.0625)<=min||(tcmp+tcmp_d*0.0625)>=max)

{w=l;TRl=l;}〃当测量值不不小于•最小值或不小于最大值时报

if((tcmp+tcmp_d*0.0625)<max&&(tcmp+tcmp_d*0.0625)>min)

{w=0;}〃当测量值不小于最小值且不不小于最大值时不

报警

if(f==1){w=I:TR1=1:}〃若测量值是负值时报警

if(f_min==l)〃若下限值是负值

if(f==O)〃若测量值是止值

if((temp+tcmp_d*0.0625)>=max)〃当测量值不小于最大值时报警

(w=l:TRl=l;)

if((temp+temp_d*0.0625)<max)〃当测量值不不小「最大值时不报警

{w=0;}

if(f==l)〃若测量值是负值

{if((temp+temp_d*0.0625)>=min)〃当测量值不小于最小值时报警

{w=l;TRl=l;}

if((temp+temp_d*0.0625)<min)//当测量值不不小于最小值时不报警

{w=0;}

if(f_max==l)〃若上限值是负值

if(Cniin==l)〃若下限值是负值

if(f==l)〃若测量值是负值

if((temp+temp_d*0.0625)<=max||(temp+temp_d*0.0625)>=min)

(w=i;TRl=l;}〃当测量值不不小于最大值或不小于最小值时报

警,比较的是其绝空值

if((lemp+temp_d*0.0625)<min<^^(temp+tenip_d*0.06?5)>max)

{w=0;}〃当测量值不不小于最小值且不小于最大值时不

报警

if(f==O){w=I;TR1=I;}〃若测量值是正值时报警

)

#endif

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

*程序名;―keyscan_H—

*功能:dsl8b20键盘头文献,通过键盘设定设定上下限报警温度

*编程者:ZPZ

*编程时间:2009/10/2

#ifndef—keyscan_H—〃定义头文献

#define_keyscan_H—

sbitkeyl=P2A2;〃可位寻址变量定义,用keyl表达P2.2口

sbitkey2=P2A1;〃用key2表达P2.1口

sbitkcy3=P2A0;〃用key3表达P2.0口

sbitkey4=P3A3;〃用key4表达P3.3U

nchnri=0;〃定义全局变量i用干不一样功能模式的选择,'0'

正常模式,'I'上限调整模式,’2'下限调整模式

uchara=0;//定义全局变量a用于不一样模式下数码管显示的选择

bitk4=0;〃K4按键双功能选择位,k4=0时K4按键选择消按键音的功能,k4=l时

K4按键选择正负温度设定功转

bitv=0;〃K2、K3按键双功能选择位,v=0时选择上下限查看功能,v=l时选择上

下限温度加减功能

bitvl=O;//vl=l时定期1250ms时间到自动关闭报警上下限查看功能

bitv2=0;〃消按键音功能调整位,为'0'时开按键音,为'1'时关按键音

voidkeyscan_delay(uintz)〃延时1ms左右

uinti,j;

fbr(i=z;i>O;i-)

for(j=l20;j>0;j-);

inttemp_change(intcount,bitf)〃上下限温度调整

if(kcy2==0)〃判断K2与否按下

{if(v2==0)beer=0;〃v2=0开按键音,否则消按键音

keyscan_delay(10);〃延时10ms

if(key2==0)〃再次判断K2与否按下(实现按按键时消抖)

bccr=l;〃K2按下关按键音

if(f==O)〃若温度为正

count++;〃每按一下K2温度上调1

if(a==l){if(count>125)count=l25;}〃当温度值不小于125时不上调

if(a==2){if(count>125)couni=125;}

if(f!=O)〃若温度为负

count++;〃每按一下K2温度下调1

if(a==l){if(count>55)counl=55;)〃当温度值不不小于-55时不再下调

if(a==2){if(count>55)count=55;}

)

)

while(key2==0);keyscan_delay(10);〃K2松开按键时消抖

if(key3==0)

if(v2==0)heer=0:key*can_delay(10);

if(key3==0)//K3按按键时消抖

becr=1;

count-;〃每按一下K3温度为正时下调1,为负时上调1

if(a==1)(if(count<0)count=0;}〃当温度值到达0时不再调

if(a==2){if(couni<0)coun(=0;}

)

while(key3==0);keyscan_delay(10);//K3松开按键时消抖

returncount;

/*********************黎***:«***1实键盘函数*******京*******冬****京*******秦*/

voidkeyscan()

if(kcyl==O)

if(v2==O)beer=0;keyscan_delay(10);

if(keyl==O)//KI按按键时消抖

bccr=l;

TR1=1;〃开定期器1,通过s标志位的变化,实目前上下限温度调整时温度显示

时闪烁H勺功能

k4=l;〃在上下温度调整功能模式下选择K4的调整上下限温度正负的功能

v=l;〃在上下温度调整功能模式下选择K2、K3日勺温度加减功能

i++;〃K1按一下ilJIIl,i='O'进入正常模式,i=T'进入调上限模式,i二

’2'进入调下限模式

if(i>2)//K1按下三次后退出调整模式

i=O;〃进入正常模式

TR1=O;〃关定期器1

k4=0;〃在正常模式下选择K4的消按键音功能

v=O;〃在正常模式卜选择K2、K3的查看上下限报警温度功能

storc_t();〃存储调整后的上下限报警温度

switch(i)〃显示选择

{

caseO:a=O;break;//a=O选择显示测得的温度

casel:a=l;break;//a=l选择显示上限温度

case2:a=2;break;//a=2选择显示下限温度

default:break,

}

}

while(key1==O);〃K1松按键时消抖

keyscan_delay(10);

if(a==l&&v==l)//a=l选择显示上限温度且v=l时选择上下限温度加功能

{led=O;max=temp_change(max,ILmax);}〃显示上限温度

elseif(a==2&&v==l)//a=2选择显示下限温度且v=l时选择上下限温度减功能

{lcd=l;min=tcmp_change(min,L^in)^}

else;

if(k4==l)//k4=l时K4按键选择正负温度设定功能

{

if(key4==0)

{

if(v2==0)beer=0;keyscan_delay(5);

if(key4==0)

{bcer=1;

if(a==l)

(if(max>55)f_max=O;elsef_max=~f_max;)〃当温度不小于55度时,只能设

定为正温度

if(a==2)

{if(min>55)f_max=O;elsef_min=~f_min;}〃当温度不小「55度时,只能设定

为止温度

while(key4==0);keyscan_delay(10);

if(v==O)〃v=0时选择上下限查看功能

if(key2==0)

if(v2==0)beer=0;keyscan_delay(IO);

if(key2==0)

beer=1;

a=l;〃选择上限显示

TR1=1;〃开定期器I开始定期一分钟左右

sl=l;〃上限显示不闪烁,显示一分钟左右自动退出

while(key2==0);keyscan_delay(IO);

if(kcy3==0)

if(v2==0)heer=0:keyscan_delay(10);

if(key3==0)

bcer=1;

a=2;〃选择下限显示

TR1=1;〃开定期器1开始定期1s

sl=l:〃下限显示不闪烁,显示1s自动退出

while(key3==0);keyscan_delay(10);

if(vl==l)//vl=l时定期Is时间到自动美闭报警上下限查看功能

{a=O;vl=O;TRl=O;)〃a=0显示实测温度,清零,关定期器1

if(k4==0)//k4=0时K4按键选择消按灌音的功能

if(kcy4==0)

if(v2==0)beer=0;keyscan_delay(10);

if(key4==0)

becr=l;v2=~v2;〃为‘O'时开按键音,为‘1'时关按键音

while(key4==0);

keyscan_dclay(IO);

)

#endif

/*************木******木*******本***********************木****灰*******木****

*程序名;_ds18b20_display_H_

*功能:dsl8b20数码管动态显示头文献,通过定期器。延时实现数码管动态显示

*编程者:ZPZ

*编程时间:2009/10/2

******************京秦************秦******************9fC**X***************/

#ifndef—ds18b20_display_H_〃定义头文献

#dcfinc__ds!8b20_display_H_

#defineuintunsignedint〃变量类型宏定义,用uint表达无符号整形(16位)

#defineucharunsignedchar〃变量类型宏定义,用uchar表达无符号字符型(8位)

sbitweiI=P2A4:〃可位寻址变量定义,用weil表达P2.4口

sbitwei2=P2A5;//fflwei2表达P2.5□

sbitwei3=P2A6;〃用wei3表达P2.6口

sbitwei4=P2A7;〃用wei4表达P2.7U

nchnrnuni=O;//定义num为全局无符号字符型变量.赋初值为'0'

ucharcodetemperatureI[]={0x3f,0x06,0x5b,0x4f.0x66,

0x6d.0x7d,0x07,0x7L0x6f);〃定义显示码表0~9

ucharcodetemperaturc2[l={0xbf,0x86.0xdb,0xcf,0xe6.

0xed,0xfd,0x87,0xff,0xef};〃带小数点的O.~9.

ucharcodetemperalure3[]={0xD0.0x80,0x40,0x76.0x38};〃依次是'不显示‘*H

'L'

voiddisplay_delay(uintt)〃延时1ms左右

uinti.j;

for(i=t;i>0;i-)

for(j=120;j>0;j--);

/**************************定期器]初始化函数***************************/

voidtimerl_init(bitt)

TMOD=OxlO;〃设定定期器1工作在方式1,最大定期65.53ms

TH0=0x3c;〃定期器赋初值,定期50ms

TL0=0xb0;

EA=1;〃开总中断

ET1=1;〃开定期器1中断

TRl=t;//局部变量t为1启动定期器1,为0关闭定期器I

/**************************定期器1

voidtimer!()interrupt3

TH0=0x3c;〃重新赋初值,定期50nls

TL0=0xb0;

num++;〃每进入一次定期器中断num加11每50ms加1一次)

if(num<5)

{s=1;if(w==1){beer=1;led=1;}else{beer=l;led=1;}}

Else〃进入4次中断,定期200ms时若报警标志位w为则启动报警,不为‘1'不

启动

〃实现间歇性报警功能

{s=0;if(w==1){beer=0;led=0;}else{bccr=l;lcd=1:}}

if(num>20)〃进入20次中断,定期Is

num=0;“num归0,重新定开始定期Is

sl=0;〃定期Is时间届时自动关闭报警上下限显示功能

vl=l;〃定期1s时间届时自动关闭报警上下限查看功能

voidselsct_l(ucharf,uchark)〃消除百位的0显示,及正负温度的显示选择

if(f==O)〃若为正温度,百位为0则不显示百位,不为0则显示

if(k/100==0)P0=:cnipcraturc3[0];elsePO=tcmperaturc1[k/100];

}

if(f==l)〃若为负温度,若十位为0,百位不显示,否则百位显示

{

if(k%l(X)/IO==O)P0=temperature3l0J;elseP0=teniperature3[2J;

)

)

voidselsct_2(bitCuchark)〃消除十位的0显示,及正负温度日勺显示选择

{

if(f==O)弁若为正温度,百位十位均为0则不显示十位,否则显示十位

{if((k/100==0)&&(k%100/10==0))P0=temperature3[0];

elsePO=temperatureI[k%100/10J;

)

if(f==l)〃若为负温度,若十位为0,十位不显示,否则十位显示

{if(k%100/10==0)P0=teniperature3|2];

ekePO=teinpfirnlurel[k%100/10];

/****************************主显示函数********************************/

voiddisplay(uchart,uchart_d)〃用于实测温度、上限温度I肉显示

uchari;

for(i=0;i<4;i++)〃依次从左至右选通数码管显示,实现动态显示

switch(i)

case0:〃选通第一种数码管

if(a==O){selsct_1(f,t);}〃若a=0则在第•种数码管上显示测量温度f、J百位或

if(a=l)

PO=teniperature3l3J;〃若a=l则在第一种数码管上显示4H,

)

if(a==2)

P0=(empcraturc3[4];〃若a=2则在第一种数码管上显示'L'

wei2=0:〃关第二个数码管

wci3=0;〃关第三个数码管

wei4=0;〃关第四个数码管

wcil=l;〃开第一种数码管

break;

case1:〃选通第二个数码管

if(a==0){selsct_2(f,t);}〃若a=0则在第二个数码管上显示测量温度的十位或

if(a==l)/偌a=l则在第二个数码管上显示上限报警温度口勺百位或

(

if(s==O)selsct」(f_max,max);〃若s=0则显示第二个数码管,否则不显示

elseP0=temperature3[0J;〃通过s标志位I向变化实现调整上下限报警

温度时数码管H勺闪烁

if(sl==l)selsct_l(f_max,max);/^sl=l则显示第二个数码管(si标志位用于

上下限查看时日勺显示)

)

if(a==2)〃若a=2则在第二个数码管上显示下限报警温度口勺百位或

(

if(s==O)selsct_l(f_niin,min);

elseP0=temperature3(0);

if(sl==l)selsct」((_min,min);

}

wei1=0;wei3=0:wei4=0;wei2=1;break;

case2:〃选通第三个数码管

if(a==0){P0=icnipcraiurc2[l%10];)〃若a=0则在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论