这几天老师布置了一个课程设计题目:采用51单片机控制的DS18B20温度检测系统。大概花了我一个礼拜的时间,幸好我的C语言学得还可以,最后还是让我搞出来了,真是高兴,我是采用STC-52单片机和DS18B20数字温度传感器做的一个温度检测系统:实现的主要功能是:能够通过按键设置报警温度,报警温度分为上限温度和下限温度,就是说当温度超过上限温度和下限温度时蜂鸣器就会报警,同时流水灯开始流动。并且由于温度的上下限是写入到DS18B20的ROM中,所以断电之后还是可以保存上次设定的温度上下限值,系统缺陷是开机时由于温度检测装置还未开始工作,会显示85度(默认值),之后就会显示正确的温度,整个程序采用中断显示温度和按键扫描中断程序,检测温度是否超过报警上下限值的函数也放在中断显示温度服务程序中。

下面是流程图:

部分程序如下:(完整的程序我上传到我的CSDN资源中,是免费的。链接http://download.csdn.net/detail/zhulike2011/5627441)

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

模块名:基于DS18B20的数字温度计

创建人:  lecco

VERSION:rick  1.0.1  beta

功能描述:本模块采用DALLS公司的单线数字温度传感器DS18B20,抗干扰能力强,便

于远距离测量,因而得到了广泛应用。

功能要求:采用按键设置上下限温度报警值,按确认键生效当温度超过预警值就会发出

蜂鸣声,用STC89C51控制DS18B20,读取数据,并对DS18B20转换后的数据

管显示,最高位为符号位,如果温度值为正,不显示,如果温度为负,则显示 。

温度支持范围:  -50℃  ~ 125℃

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

#include <reg51.h>

#include <helloDemo.h>

#include <intrins.h>

unsigned char tx[10]={0};

unsigned char code table1[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,

0xf8,0x80,0x90};

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

void Delay(int num)//延时函数

{

while(num--) ;

}

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

void Delaynms(unsigned int di) //延时

{

unsigned int da,db;

for(da=0;da<di;da++)

for(db=0;db<100;db++);

}

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

void Init_DS18B20(void)//初始化ds18b20

{

unsigned char x=0;

DQ = 1;    //DQ复位

Delay(8);  //稍做延时

DQ = 0;    //单片机将DQ拉低

Delay(80); //精确延时 大于 480us

DQ = 1;    //拉高总线

Delay(14);

x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

Delay(20);

}

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

unsigned char ReadOneChar(void)//读一个字节

{

unsigned char i=0;

unsigned char dat = 0;

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

{

DQ = 0; // 给脉冲信号

dat>>=1;

DQ = 1; // 给脉冲信号

if(DQ)

dat|=0x80;

Delay(4);

}

return(dat);

}

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

void WriteOneChar(unsigned char dat)//写一个字节

{

unsigned char i=0;

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

{

DQ = 0;

DQ = dat&0x01;

Delay(2);

DQ = 1;

dat>>=1;

}

}

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

void ReadTemperature(void)//读取温度和报警温度上下限TH、TL值

{

unsigned char a=0;

unsigned char b=0;

unsigned char Data_L=0;  //用来存放小数部分的温度值

unsigned char num=0;

unsigned int  temp=0;  //临时存放负数温度值

Init_DS18B20();

Delay(20);

WriteOneChar(0xCC); // 跳过读序号列号的操作

Delay(20);

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

Delay(20);

Init_DS18B20();

Delay(20);

WriteOneChar(0xCC); //跳过读序号列号的操作

Delay(20);

WriteOneChar(0xBE); //读取温度寄存器

Delay(20);

a    =   ReadOneChar();  //读低8位

b    =   ReadOneChar(); //读高8位

Delay(20);

tx[4]=  ReadOneChar();  //报警温度TH

tx[5]=   ReadOneChar();  //报警温度TL

temp =  b*256+a;

temp = temp * 0.625 + 0.5; //0.0625扩大10倍显示1位小数,若显示两位小数则扩大100倍为6.25

tx[2]= temp /1000;     //温度的百位

tx[1]=temp %1000/100 ;  //温度的十位

tx[0]=temp %100/10;  //温度的个位

//读取温度正负值

if((b&0xf8)!=0x00){

tx[6]=1;  //温度值是负数的标志位

//temp为补码,需要减一求反得原码

temp  = ( b * 256 ) + a;

temp  = ~temp + 1;

tx[1] = temp % 1000 / 100;  //温度的十位

tx[0] = temp % 100  / 10;  //温度的个位

}

tx[6]=0;

Data_L=a&0X0F;

tx[3]=table1[Data_L];

}

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

void Display_SMG(void)

{

unsigned char a;

for(a=0;a<=50;a++)

{  //如果得到的温度是负数就显示符号

if(tx[6]==1){

P0=0xbf;

led1 = 0;

Delaynms(4);

led1 = 1;   }

if(tx[2]>0){

P0=table[tx[2]];

led1 = 0;

Delaynms(4);

led1 = 1;  }

P0=table[tx[1]];

led2 = 0;

Delaynms(4);

led2 = 1;

P0=(table[tx[0]])&0x7f;

led3 = 0;

Delaynms(4);

led3 = 1;

P0=table[tx[3]];

led4 = 0;

Delaynms(4);

led4 = 1;

}

}

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

void beep()

{

unsigned char i=0;

if(((tx[1]*10+tx[0])>(tx[4])||(((tx[1]*10+tx[0])==(tx[4]))&&(tx[3]>tx[7]-1)))&&(tx[9]==5))

{

P1=_cror_(P1,1);

WAV=~WAV;

Delaynms(35);    }       if((tx[6]==1)&&((((tx[1]*10+tx[0])>(tx[5]))||(((tx[1]*10+tx[0])==(tx[5]))&&(tx[3]>tx[8]-1)))&&(tx[9]==5)))

{           P1=_crol_(P1,1); WAV=~WAV;Delaynms(35);  }   }

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

void main(void)

{

TMOD=0x11;  //T1,T0均工作于方式一

EA=1;   //开总中断

ET0=1;   //开定时器T0中断

ET1=1;     //开定时器T1中断

TH1=(65536-20000)/256;  //显示温度

TL1=(65536-20000)%256;

TH0=(65536-500)/256;

TL0=(65536-500)%256;

TR1=1;  //启动定时器T1

TR0=1;  //禁止定时器T0

P1=0x7f;

while(1)

{    WAV=1;  }

}

单片机C语言实现的采用DS18B20的温度检测装置的更多相关文章

  1. 单片机modebus RTU通信实现,采用C语言,可适用于单片机,VC,安卓等(转)

    源:单片机modebus RTU通信实现,采用C语言,可适用于单片机,VC,安卓等 //modebus_rtu.c /***************************************** ...

  2. 单片机C语言下LCD多级菜单的一种实现方法

    摘要:     介绍了在C 语言环境下,在LCD 液晶显示屏上实现多级嵌套菜单的一种简便方法,提出了一个结构紧凑.实用的程序模型. 关键词: 液晶显示屏; 多级菜单; 单片机; C 语言; LCD 中 ...

  3. 51单片机C语言学习笔记3: 存储器结构

    MCS-51单片机在物理结构上有四个存储空间: 1.片内程序存储器2.片外程序存储器3.片内数据存储器4.片外数据存储器 但在逻辑上,即从用户的角度上,8051单片机有三个存储空间: 1.片内外统一编 ...

  4. 单片机C 语言与汇编语言混合编程

    在单片机应用系统设计中,过去主要采用汇编语言开发程序. 汇编语言编写的程序对单片机硬件操作很方便,编写的程序代码短,效率高,但系统设计的周期长,可读性和可移植性都很差.C语言程序开发是近年来单片机系统 ...

  5. 如何快速入门单片机C语言

    一.为什么要学单片机技术? 传统的电子产品升级改造成智能化的电子产品需要用到单片机技术.也就是说传统的电子产品如电视机.电子表.计算器.数码相机.手机.MP3.遥控器.洗衣机等产品智能化.微型化,需要 ...

  6. C语言和单片机C语言为什么会有差异?虽不同但理同!

    许多小伙伴在学完C语言后想入门单片机,但学着学着发现明明都是C语言,为什么单片机C语言和我当初学的C语言有差异呢? 今天小编就来梳理我们平时所学的C语言与单片机C语言的有什么样的不同. 单片机c语言比 ...

  7. 51单片机C语言学习笔记6:51单片机C语言头文件及其使用

    很多初学单片机者往往对C51的头文件感到很神秘,而为什么要那样写,甚至有的初学者喜欢问,P1口的P为什么要大写,不大写行不行呢?其实这个是在头文件中用sfr定义的,现在定义好了的是这样的 sfr P1 ...

  8. 单片机C语言中标志位的经典应用

    /* 本例程是C语言的位域操作示例 这里为什么位域结构体与联合体一起使用? -->因为这样定义后,即可以单独使用标志位 也可同时使用整个字节数据 主要应用:单片机C语言 好处:用标志位可以节省R ...

  9. 单片机c语言教程:C51循环语句

    单片机c语言教程第十三课 C51循环语句 循环语句是几乎每个程序都会用到的,它的作用就是用来实现需要反复进行多次的操 作.如一个 12M 的 51 芯片应用电路中要求实现 1 毫秒的延时,那么就要执行 ...

随机推荐

  1. 转:python中函数curry化

    1 柯里化(Currying) 一个函数有多个参数,我们希望能固定其中几个参数的值. from functools import partial def foo(a,b,c): return a+b+ ...

  2. 为什么C语言在2013年仍然很重要:一个简单的例子

    附注:在最初的文章里,我没说明进行模2^64的计算——我当然明白那些不是“正确的”斐波那契数列,其实我不是想分析大数,我只是想探寻编译器产生的代码和计算机体系结构而已. 最近,我一直在开发Dynvm— ...

  3. Chapter 17 Replication 复制

    Chapter 17 Replication 复制 Table of Contents 17.1 Replication Configuration 17.2 Replication Implemen ...

  4. RequiredFieldValidator控件--必填验证控件

    RequiredFieldValidator控件: ·RequiredFieldValidator控件也被称之为必填验证控件,顾名思义,也就是与RequiredFieldValidator控件关联的控 ...

  5. BZOJ 3163: [Heoi2013]Eden的新背包问题( 背包dp )

    从左到右, 从右到左分别dp一次, 然后就可以回答询问了. ---------------------------------------------------------- #include< ...

  6. BZOJ 3211: 花神游历各国( 线段树 )

    线段树...区间开方...明显是要处理到叶节点的 之前在CF做过道区间取模...差不多, 只有开方, 那么每个数开方次数也是有限的(0,1时就会停止), 最大的数10^9开方10+次也就不会动了.那么 ...

  7. 高级UIKit-10(UDPSocket)

    [day1201_UDPSocket]:utpsocket的使用 使用UDP网络传输,是一种无连接的传输协议,不安全,一般使用在监控视频中或QQ聊天中,该网络传输就向广播传播模式,一对多. 在ios中 ...

  8. 知识点1-1:什么是ASP.NET MVC

    ASP.NET MVC是微软.NET平台上的一个Web开发框架,它为开发者提供了一种构建结构良好的Web应用程序的方式.自2007年首次公布预览以来,作为Web Form的替代品,ASP.NET MV ...

  9. 我的CSS架构

    写在前面 都是自己看别人的架构,自己积累下来的一些东西,这里只是阐述自己的一些观念.借此希望同行交流交流下看法,共勉. 不同架构的CSS 业务流程不同,团队配员不同.会有各种各样的CSS架构. 有的会 ...

  10. 基于visual Studio2013解决C语言竞赛题之0810链表去重

     题目