51单片机设计数字温度计流程图+源码+实物图片.docx

上传人:b****7 文档编号:16659236 上传时间:2023-07-16 格式:DOCX 页数:28 大小:359.83KB
下载 相关 举报
51单片机设计数字温度计流程图+源码+实物图片.docx_第1页
第1页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第2页
第2页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第3页
第3页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第4页
第4页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第5页
第5页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第6页
第6页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第7页
第7页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第8页
第8页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第9页
第9页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第10页
第10页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第11页
第11页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第12页
第12页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第13页
第13页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第14页
第14页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第15页
第15页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第16页
第16页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第17页
第17页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第18页
第18页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第19页
第19页 / 共28页
51单片机设计数字温度计流程图+源码+实物图片.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

51单片机设计数字温度计流程图+源码+实物图片.docx

《51单片机设计数字温度计流程图+源码+实物图片.docx》由会员分享,可在线阅读,更多相关《51单片机设计数字温度计流程图+源码+实物图片.docx(28页珍藏版)》请在冰点文库上搜索。

51单片机设计数字温度计流程图+源码+实物图片.docx

51单片机设计数字温度计流程图+源码+实物图片

DS18B20获取温度程序流程图

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

图3-4DS18B20程序流程图

显示程序设计

显示电路是由四位一体的数码管来实现的。

由于单片机的I/O口有限,所以数码管采用动态扫描的方式来进行显示。

程序流程图如图所示。

图显示程序流程图

按键程序设计

按键是用来设定上下限报警温度的。

具体的程序流程图如图所示。

图按键程序流程图

附1源程序代码

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

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

*功能:

实时测量温度,超过上下限报警,报警温度可手动调整。

K1是用来

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

*调节模式。

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

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

*按键音,再按一下启动按键音。

在调节上下限温度模式下,K2是实现加1功能,

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

*编程者:

ZPZ

*编程时间:

2009/10/2

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

#include//将AT89X52.h头文件包含到主程序

#include//将intrins.h头文件包含到主程序(调用其中的_nop_()空操作函数延时)

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

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

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

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

bits1=0;//s1标志位用于上下限查看时的显示

voiddisplay1(uintz);//声明display1()函数

#include"ds18b20.h"//将ds18b20.h头文件包含到主程序

#include"keyscan.h"//将keyscan.h头文件包含到主程序

#include"display.h"//将display.h头文件包含到主程序

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

voidmain()

{

beer=1;//关闭蜂鸣器

led=1;//关闭LED灯

timer1_init(0);//初始化定时器1(未启动定时器1)

get_temperature

(1);//首次启动DS18B20获取温度(DS18B20上点后自动将EEPROM中的上下限温度复制到TH和TL寄存器)

while

(1)//主循环

{

keyscan();//按键扫描函数

get_temperature(0);//获取温度函数

keyscan();//按键扫描函数

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

alarm();//报警函数

keyscan();//按键扫描函数

}

}

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

*程序名;__ds18b20_h__

*功能:

DS18B20的c51编程头文件

*编程者:

ZPZ

*编程时间:

2009/10/2

*说明:

用到的全局变量是:

无符号字符型变量temp(测得的温度整数部分),temp_d

*(测得的温度小数部分),标志位f(测量温度的标志位‘0’表示“正温度”‘1’表

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

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

*示“负温度”),标志位w(报警标志位‘1’启动报警‘0’关闭报警)。

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

#ifndef__ds18b20_h__//定义头文件

#define__ds18b20_h__

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

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

sbitDQ=P2^3;//可位寻址变量定义,用DQ表示P2.3口

sbitbeer=P1^0;//用beer表示P1.0

sbitled=P1^1;//用led表示P1.1

uchartemp=0;//测量温度的整数部分

uchartemp_d=0;//测量温度的小数部

bitf=0;//测量温度的标志位,0’表示“正温度”‘1’表示“负温度”)

bitf_max=0;//上限温度的标志位‘0’表示“正温度”‘1’表示“负温度”)

bitf_min=0;//下限温度的标志位‘0’表示“正温度”、‘1’表示“负温度”)

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

/*****************************延时子函数******************************/

voidds18b20_delayus(uintt)//延时几μs

{while(t--);}

voidds18b20_delayms(uintt)//延时1ms左右

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

/**************************ds18b20初始化函数*************************/

voidds18b20_init()//DS18B20初始化

{

DQ=1;//拉高数据线

DQ=0;//控制器向DS18B20发低电平脉冲

ds18b20_delayus(30);//延时480μs左右

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

while(DQ);//等待DS18B20拉低总线

ds18b20_delayus(20);//延时,等待上拉电阻拉高总线

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

}

/***************************ds18b20字节读函数************************/

uchards18b20_read()//DS18B20字节读取

{

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

uchard=0;//定义一个局部变量d

DQ=1;//准备读;

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

{

d>>=1;//d右移一位,低位先发;

DQ=0;

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

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

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

d|=0x80;

ds18b20_delayus(10);

}returnd;//返回读取的值

}

/*************************ds18b20字节写函数**************************/

voidds18b20_write(uchard)//ds18b20字节写

{

uchari;

for(i=8;i>0;i--)//一位一位的写

{DQ=0;

_nop_();_nop_();_nop_();DQ=d&0x01;//写数据

ds18b20_delayus(5);

DQ=1;

d>>=1;//d右移一位,低位先发;

}

}

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

voidget_temperature(bitf)

{

uchara=0,b=0,c=0,d=0;

uinti;

ds18b20_init();//DS18B20初始化

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

ds18b20_write(0x44);//写启动DS18B20进行温度转换命令,转换结果存入内部RAM

if(f==1)

{//首次启动DS18B20进行温度转换需要500ms,若转换时间不够就出错,读出的是85度的错误值。

display1

(1);//用开机动画耗时

}

else

ds18b20_delayms

(1);

ds18b20_init();//DS18B20初始化

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

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

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

b=ds18b20_read();//读内部RAM(MSB)

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

{

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

min=ds18b20_read();//读内部RAM(Tl)

}

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

{f_max=1;max=(max-0x80);}//将上限温度符号标志位置‘1’表示负温度,将上限温度转换成无符号数。

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

{f_min=1;min=(min-0x80);}//将下限温度符号标志位置‘1’表示负温度,将下限温度装换成无符号数。

i=b;i>>=4;

if(i==0)

{

f=0;//i为0,表示读取的温度是正温度,设立正温度标记

temp=((a>>4)|(b<<4));//整数部分

a=(a&0x0f);

temp_d=a;//小数部分

}

else

{

f=1;//i为1,表示读取的温度是负温度,设立负温度标记

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

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

temp=((a>>4)|(b<<4));//整数部分

a=(a&0x0f);//小数部分,低四位为小数位

temp_d=a;

}

}

/*************************存储极限温度函数***************************/

voidstore_t()

{

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

max=max+0x80;

if(f_min==1)//若下限温度为负,将下限温度转换成有符号数

min=min+0x80;

ds18b20_init();//DS18B20初始化

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

ds18b20_write(0x4e);//向DS18B20发写字节至暂存器2和3(TH和TL)命令

ds18b20_write(max);//向暂存器TH(上限温度暂存器)写温度

ds18b20_write(min);//向暂存器TL(下限温度暂存器)写温度

ds18b20_write(0xff);//向配置寄存器写命令,进行温度值分辨率设置

ds18b20_init();//DS18B20初始化

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

ds18b20_write(0x48);//向DS18B20发将RAM中2、3字节的内容写入EEPROM

}//DS18B20上电后会自动将EEPROM中的上下限温度拷贝到TH、TL暂存器

/**************************温度超限报警函数*************************/

voidalarm()

{

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

{

if(f_min==0)//若下限值是正值

{

if(f==0)//若测量值是正值

{

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

{w=1;TR1=1;}//当测量值小于最小值或大于最大值时报警

if((temp+temp_d*0.0625)min)

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

}if(f==1){w=1;TR1=1;}//若测量值是负值时报警

}

if(f_min==1)//若下限值是负值

{if(f==0)//若测量值是正值

{

if((temp+temp_d*0.0625)>=max)//当测量值大于最大值时报警

{w=1;TR1=1;}

if((temp+temp_d*0.0625)

{w=0;}

}

if(f==1)//若测量值是负值

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

{w=1;TR1=1;}

if((temp+temp_d*0.0625)

{w=0;}

}

}

}

if(f_max==1)//若上限值是负值

{if(f_min==1)//若下限值是负值

{if(f==1)//若测量值是负值

{

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

{w=1;TR1=1;}//当测量值小于最大值或大于最小值时报警,比较的是其绝对值

if((temp+temp_d*0.0625)max)

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

}

if(f==0){w=1;TR1=1;}//若测量值是正值时报警

}

}

}

#endif

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

*程序名;__keyscan_H__

*功能:

ds18b20键盘头文件,通过键盘设定设定上下限报警温度

*编程者:

ZPZ

*编程时间:

2009/10/2

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

#ifndef__keyscan_H__//定义头文件

#define__keyscan_H__

sbitkey1=P2^2;//可位寻址变量定义,用key1表示P2.2口

sbitkey2=P2^1;//用key2表示P2.1口

sbitkey3=P2^0;//用key3表示P2.0口

sbitkey4=P3^3;//用key4表示P3.3口

uchari=0;//定义全局变量i用于不同功能模式的选择,‘0’正常模式,‘1’上限调节模式,‘2’下限调节模式

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

bitk4=0;//K4按键双功能选择位,k4=0时K4按键选择消按键音的功能,k4=1时K4按键选择正负温度设定功能

bitv=0;//K2、K3按键双功能选择位,v=0时选择上下限查看功能,v=1时选择上下限温度加减功能

bitv1=0;//v1=1时定时1250ms时间到自动关闭报警上下限查看功能

bitv2=0;//消按键音功能调整位,为‘0’时开按键音,为‘1’时关按键音

/***************************读键盘延时子函数**************************/

voidkeyscan_delay(uintz)//延时1ms左右

{

uinti,j;

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

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

}

/****************************温度调节函数******************************/

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

{

if(key2==0)//判断K2是否按下

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

keyscan_delay(10);//延时10ms

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

{

beer=1;//K2按下关按键音

if(f==0)//若温度为正

{

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

if(a==1){if(count>125)count=125;}//当温度值大于125时不上调

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

}

if(f!

=0)//若温度为负

{

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

if(a==1){if(count>55)count=55;}//当温度值小于-55时不再下调

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

}

}

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

}

if(key3==0)

{

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

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

{

beer=1;

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

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

if(a==2){if(count<0)count=0;}

}

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

}

returncount;

}

/*****************************读键盘函数******************************/

voidkeyscan()

{if(key1==0)

{

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

if(key1==0)//K1按按键时消抖

{

beer=1;

TR1=1;//开定时器1,通过s标志位的变化,实现在上下限温度调整时温度显示时闪烁的功能

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

v=1;//在上下温度调节功能模式下选择K2、K3的温度加减功能

i++;//K1按一下i加1,i=‘0’进入正常模式,i=‘1’进入调上限模式,i=‘2’进入调下限模式

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

{

i=0;//进入正常模式

TR1=0;//关定时器1

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

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

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

}

switch(i)//显示选择

{

case0:

a=0;break;//a=0选择显示测得的温度

case1:

a=1;break;//a=1选择显示上限温度

case2:

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

default:

break;

}

}

while(key1==0);//K1松按键时消抖

keyscan_delay(10);

}

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

{led=0;max=temp_change(max,f_max);}//显示上限温度

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

{led=1;min=temp_change(min,f_min);}

else;

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

{

if(key4==0)

{

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

if(key4==0)

{beer=1;

if(a==1)

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

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2