×
单片机 > 单片机程序设计 > 详情

单片机设计的DS18820温度报警器

发布时间:2024-05-17 发布时间:
|

1、本设计使用单片机作为核心进行控制。单片机具有集成度高,通用性好,功能强,特别是体积小,重量轻,耗能低,可靠性高,抗干扰能力强和使用方便等独特优点,在数字化、智能化方面有广泛的用途。温度显示基本范围0.00℃—99.99℃。精度误差小于0.01℃。所测温度值由四位数码管显示。可以设定温度的上下限报警功能。

2、本设计主要是介绍了单片机控制下的温度报警系统,详细介绍了其硬件和软件设计,并对其各功能模块做了详细介绍,其主要功能和指标如下:

单片机实时检测温度传感器DS18B20的状态,并将DS18820得到的数据进行处理。上电后数码管显示当前的环境温度,通过按键可设置高低温报警值,当检测到的温度高于设置的报警值的时候,蜂鸣器报警同时报警灯闪烁,温度检测精确到0.1度。并具有掉电保存功能,数据保存在单片机内部EEPOM中,进入设置界面后如果没有键按下系统会在15秒后自动退出设置界面。



原理图

QQ截图20190105204716.png(191.04 KB, 下载次数: 27)

下载附件保存到相册

2019-1-5 20:48 上传





仿真图




调试图




实物图




单片机源程序如下:

#include //调用单片机头文件

#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255

#define uint unsigned int //无符号整型 宏定义 变量范围0~65535

#include "eeprom52.h"


//数码管段选定义 0 1 2 3 4 5 6 7 8 9

uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,

0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //断码

//数码管位选定义

uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};

uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};

uchar smg_i = 3; //显示数码管的个位数

sbit dq = P2^4; //18b20 IO口的定义

sbit beep = P2^3; //蜂鸣器IO口定义


bit flag_lj_en; //按键连加使能

bit flag_lj_3_en; //按键连3次连加后使能 加的数就越大了

uchar key_time,flag_value; //用做连加的中间变量

bit key_500ms ;



uint temperature ; //

bit flag_300ms ;

uchar menu_1; //菜单设计的变量

uint t_high = 300,t_low = 100; //温度上下限报警值


/***********************1ms延时函数*****************************/

void delay_1ms(uint q)

{

uint i,j;

for(i=0;i

for(j=0;j<120;j++);

}


/***********************小延时函数*****************************/

void delay_uint(uint q)

{

while(q--);

}



/***********************数码显示函数*****************************/

void display()

{

static uchar i;

i++;

if(i >= smg_i)

i = 0;

P1 = 0xff; //消隐

P3 = smg_we[i]; //位选

P1 = dis_smg[i]; //段选


}


/******************把数据保存到单片机内部eepom中******************/

void write_eeprom()

{

SectorErase(0x2000);

byte_write(0x2000, t_high % 256);

byte_write(0x2001, t_high / 256);

byte_write(0x2002, t_low % 256);

byte_write(0x2003, t_low / 256);

byte_write(0x2055, a_a);

}


/******************把数据从单片机内部eepom中读出来*****************/

void read_eeprom()

{

t_high = byte_read(0x2001);

t_high <<= 8;

t_high |= byte_read(0x2000);

t_low = byte_read(0x2003);

t_low <<= 8;

t_low |= byte_read(0x2002);

a_a = byte_read(0x2055);

}


/**************开机初始化保存的数据*****************/

void init_eeprom()

{

read_eeprom(); //先读

if(a_a != 1) //新的单片机初始单片机内问eeprom

{

t_high = 300;

t_low = 100;

a_a = 1;

write_eeprom(); //保存数据

}

}



/***********************18b20初始化函数*****************************/

void init_18b20()

{

bit q;

dq = 1; //把总线拿高

delay_uint(1); //15us

dq = 0; //给复位脉冲

delay_uint(80); //750us

dq = 1; //把总线拿高 等待

delay_uint(10); //110us

q = dq; //读取18b20初始化信号

delay_uint(20); //200us

dq = 1; //把总线拿高 释放总线

}


/*************写18b20内的数据***************/

void write_18b20(uchar dat)

{

uchar i;

for(i=0;i<8;i++)

{ //写数据是低位开始

dq = 0; //把总线拿低写时间隙开始

dq = dat & 0x01; //向18b20总线写数据了

delay_uint(5); // 60us

dq = 1; //释放总线

dat >>= 1;

}

}


/*************读取18b20内的数据***************/

uchar read_18b20()

{

uchar i,value;

for(i=0;i<8;i++)

{

dq = 0; //把总线拿低读时间隙开始

value >>= 1; //读数据是低位开始

dq = 1; //释放总线

if(dq == 1) //开始读写数据

value |= 0x80;

delay_uint(5); //60us 读一个时间隙最少要保持60us的时间

}

return value; //返回数据

}


/*************读取温度的值 读出来的是小数***************/

uint read_temp()

{

uint value;

uchar low; //在读取温度的时候如果中

[1] [2] [3]
单片机DS18820温度报警器


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址