历史上的今天
返回首页

历史上的今天

今天是:2024年09月03日(星期二)

正在发生

2020年09月03日 | 单片机设计的DS18820温度报警器

2020-09-03 来源:51hei

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

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

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



原理图

QQ截图20190105204716.png?imageView2/2/w/550 (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;                           //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序

        init_18b20();                   //初始化18b20

        write_18b20(0xcc);           //跳过64位ROM

        write_18b20(0x44);           //启动一次温度转换命令

        delay_uint(50);                   //500us


        init_18b20();                   //初始化18b20

        

        write_18b20(0xcc);           //跳过64位ROM

        write_18b20(0xbe);           //发出读取暂存器命令

        

        EA = 0;

        low = read_18b20();           //读温度低字节

        value = read_18b20();  //读温度高字节

        EA = 1;

        value <<= 8;                   //把温度的高位左移8位

        value |= low;                   //把读出的温度低位放到value的低八位中

        value *= 0.625;               //转换到温度值 小数

推荐阅读

史海拾趣

GE Solid State公司的发展小趣事
通过声音信号来反映曝光量,使得用户可以通过听觉直观地感知光线的强弱。
GradConn Ltd公司的发展小趣事

GradConn深知不同客户对连接解决方案的需求各不相同,因此公司特别注重提供定制化服务。通过与客户紧密合作,GradConn能够深入了解其特定需求,并据此设计出符合客户要求的定制化产品。这种服务不仅提升了客户的满意度,还增强了GradConn在市场上的竞争力。许多知名企业都选择GradConn作为其连接器和电缆组件的供应商,正是看中了其强大的定制化能力。

Crowd_Supply__Inc.公司的发展小趣事

在国内市场取得一定成绩后,Crowd Supply Inc.开始将目光投向更广阔的国际市场。公司通过与国外合作伙伴建立战略合作关系、参加国际电子展会等方式,积极拓展海外市场。同时,公司还针对不同国家和地区的市场需求,定制化开发符合当地需求的产品和服务。这些举措不仅为公司带来了新的增长点,也进一步提升了公司在国际电子行业的知名度和影响力。

请注意,以上故事是基于一般性的电子行业公司发展历程和模式进行构想的,并非针对Crowd Supply Inc.的实际情况。如果您需要关于Crowd Supply Inc.的具体故事,建议您查阅相关新闻报道、公司官网或行业分析报告等权威渠道获取更准确的信息。

American Custom Components公司的发展小趣事

近年来,电子行业面临着原材料价格上涨、市场竞争激烈等挑战。American Custom Components公司也不例外,面临着成本压力和市场份额的下降。为了应对这些挑战,公司采取了一系列措施,包括优化生产流程、降低生产成本、加强研发创新等。同时,公司还积极拓展新的应用领域和市场,寻找新的增长点。这些努力使得公司在行业竞争中保持了一定的优势。

General Dynamics SATCOM Technologies公司的发展小趣事

American Custom Components公司始终将产品质量放在首位。为了提升产品质量和客户满意度,公司引进了一套先进的质量管理体系,并定期对员工进行质量意识和技能培训。此外,公司还建立了完善的客户服务体系,及时收集和处理客户的反馈意见,不断优化产品和服务。这些举措使得公司的产品在市场上保持了良好的口碑和竞争力。

ECI公司的发展小趣事

面对日益激烈的市场竞争,ECI公司积极开拓国际市场。公司成立了专门的国际市场部,负责海外市场的调研、开发和推广。通过深入了解不同国家和地区的市场需求和文化差异,ECI公司成功推出了符合当地消费者需求的电子产品。同时,公司还与多家国际知名企业建立了长期稳定的合作关系,进一步扩大了市场份额。

问答坊 | AI 解惑

为什么我的复位电平上不去?

复位芯片采用MAX811,MCU采用C8051F020,上电后,电源电压时3.3V,为什么复位电平只有1.36V? …

查看全部问答>

请教几句2440 NBoot中的汇编代码

    ; Set up the memory control registers.     ;     add     r0, pc, #SMRDATA - (. + 8)     ldr                r1, =BWSCON  ...…

查看全部问答>

如何捕捉MSComm控件的错误异常

如题,如何捕捉MSComm控件的错误异常。    想捕捉MSComm错误异常后,做一些自定义操作,但是好像一般的捕捉异常方法不起作用!    求解!…

查看全部问答>

线程可抢占?

WinCE上的线程是可抢占的么?在一个线程进入内核态后(通过系统调用),这是调度器能调度其他线程运行么? …

查看全部问答>

一段嵌入式代码的理解

int main(void){         // disable JTAG port    DDPCONbits.JTAGEN = 0;           // 3.2 initialization    TRISB = 0;  & ...…

查看全部问答>

MEGA16 参考电源引脚VREF有驱动能力吗

当ADC打开内部2.56v参考时,VREF脚有2.56V电压,不知道这个脚的电压有多少驱动能力?能否同时为外部电路提供稳定的参考电压源…

查看全部问答>

贴片封装的51单片机如何进行程序烧写?

求教各位大侠,贴片封装的51单片机如何进行程序烧写?我手头现在有51单片机开发板(DIP40)和编程器(针对DIP封装单片机)。…

查看全部问答>

触摸感应式应用设计指南

刚刚看了个不错的资料,分享给大家,正在边喝茶边看呢。 …

查看全部问答>