单片机C语言实现的采用DS18B20的温度检测装置
这几天老师布置了一个课程设计题目:采用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的温度检测装置的更多相关文章
- 单片机modebus RTU通信实现,采用C语言,可适用于单片机,VC,安卓等(转)
源:单片机modebus RTU通信实现,采用C语言,可适用于单片机,VC,安卓等 //modebus_rtu.c /***************************************** ...
- 单片机C语言下LCD多级菜单的一种实现方法
摘要: 介绍了在C 语言环境下,在LCD 液晶显示屏上实现多级嵌套菜单的一种简便方法,提出了一个结构紧凑.实用的程序模型. 关键词: 液晶显示屏; 多级菜单; 单片机; C 语言; LCD 中 ...
- 51单片机C语言学习笔记3: 存储器结构
MCS-51单片机在物理结构上有四个存储空间: 1.片内程序存储器2.片外程序存储器3.片内数据存储器4.片外数据存储器 但在逻辑上,即从用户的角度上,8051单片机有三个存储空间: 1.片内外统一编 ...
- 单片机C 语言与汇编语言混合编程
在单片机应用系统设计中,过去主要采用汇编语言开发程序. 汇编语言编写的程序对单片机硬件操作很方便,编写的程序代码短,效率高,但系统设计的周期长,可读性和可移植性都很差.C语言程序开发是近年来单片机系统 ...
- 如何快速入门单片机C语言
一.为什么要学单片机技术? 传统的电子产品升级改造成智能化的电子产品需要用到单片机技术.也就是说传统的电子产品如电视机.电子表.计算器.数码相机.手机.MP3.遥控器.洗衣机等产品智能化.微型化,需要 ...
- C语言和单片机C语言为什么会有差异?虽不同但理同!
许多小伙伴在学完C语言后想入门单片机,但学着学着发现明明都是C语言,为什么单片机C语言和我当初学的C语言有差异呢? 今天小编就来梳理我们平时所学的C语言与单片机C语言的有什么样的不同. 单片机c语言比 ...
- 51单片机C语言学习笔记6:51单片机C语言头文件及其使用
很多初学单片机者往往对C51的头文件感到很神秘,而为什么要那样写,甚至有的初学者喜欢问,P1口的P为什么要大写,不大写行不行呢?其实这个是在头文件中用sfr定义的,现在定义好了的是这样的 sfr P1 ...
- 单片机C语言中标志位的经典应用
/* 本例程是C语言的位域操作示例 这里为什么位域结构体与联合体一起使用? -->因为这样定义后,即可以单独使用标志位 也可同时使用整个字节数据 主要应用:单片机C语言 好处:用标志位可以节省R ...
- 单片机c语言教程:C51循环语句
单片机c语言教程第十三课 C51循环语句 循环语句是几乎每个程序都会用到的,它的作用就是用来实现需要反复进行多次的操 作.如一个 12M 的 51 芯片应用电路中要求实现 1 毫秒的延时,那么就要执行 ...
随机推荐
- iOS:(接口适配器3)--iPhone适应不同型号 6/6plus 前
对于不同的苹果设备.检查每个参数<iOS:机型參数.sdk.xcode各版本号>. 机型变化 坐标:表示屏幕物理尺寸大小,坐标变大了.表示机器屏幕尺寸变大了: 像素:表示屏幕 ...
- Python获取当地的天气和随意城市的天气
先从中国天气网得到数据('http://www.weather.com.cn/data/cityinfo/'+城市编码),每一个城市都有各自的编码,怎样得到用户所在地的城市编码呢?用一个网页就是专门干 ...
- RelativeLayout的一些感想
1.如果只是是3-4个线性,则可以考虑RelativeLayout;多于等于5个还是尽量考虑LinearLayout好 补充:如果要把RelativeLayout作为线性布局的话,可以采用不断设置be ...
- 安装apk程序进android
package com.example.installmyapk; import java.io.File; import android.net.Uri; import android.os.Bun ...
- C语言宏定义技巧
出处:http://blog.chinaunix.net/uid-14022540-id-2849095.html 1.宏中"#"和"##"的用法 一.一般用法 ...
- Eclispse 换主题、皮肤、配色,换黑色主题护眼
链接地址:http://jingyan.baidu.com/article/6c67b1d68c03be2787bb1ed6.html Eclipse写android代码时,默认的文本和框架都是白色, ...
- 关于C++异常机制的笔记(SEH, try-catch)
昨天晚上加班解决了一个问题,是由于无法正确的捕获到异常导致的.刚开始用try-catch,但是没法捕获到异常:后面改成SEH异常才解决.因此今天将这个问题重新梳理了一遍,关于try-catch, SE ...
- mysql事务和锁InnoDB(转)
背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备 ...
- Android_简单笔记一
入门学习Android的简单笔记(已经安装好了开发环境ADT) 一.关于 AndroidManifest.xml文件 1. android:icon和android:label定义了应用程序安装后显示 ...
- Android中通过耳机按键控制音乐播放的实现
今天在研究Android中实现Android 4.2.2源码中的Music应用的源码,关于通过耳机按键控制音乐播放的实现,有点好奇,就仔细分析了一下源码, 主要由 MediaButtonIntentR ...