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

上传人:b****6 文档编号:2925276 上传时间:2022-11-16 格式:DOCX 页数:23 大小:360.20KB
下载 相关 举报
单片机设计数字温度计流程图源码实物图片要点.docx_第1页
第1页 / 共23页
单片机设计数字温度计流程图源码实物图片要点.docx_第2页
第2页 / 共23页
单片机设计数字温度计流程图源码实物图片要点.docx_第3页
第3页 / 共23页
单片机设计数字温度计流程图源码实物图片要点.docx_第4页
第4页 / 共23页
单片机设计数字温度计流程图源码实物图片要点.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

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

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

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

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

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,表示读取的温度

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

当前位置:首页 > 表格模板 > 调查报告

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

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