历史上的今天
返回首页

历史上的今天

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

正在发生

2020年09月24日 | 51单片机DS18B20的温度传感器

2020-09-24 来源:eefocus

一、设计要求

设计一个智能温度测量仪,利用温度传感器测量环境温度,并具有超温报警功能。要求可以通过按键设定报警温度和报警时间,并用数码管显示外界温度、报警温度和报警时间温度测量范围在0℃到99℃之间,温度测量误差小于0.1℃。


仿真图片


智能温度测量仪主要包括主控模块,温度测量模块,按键模块,声音报警模块以及数码显示模块。温度测量模块测量外界温度,并把数据传给主控模块,一方面主控模块把数据传给数码显示模块,实时显示外界温度,另一方面通过比较,当外界温度高于报警温度时,主控模块控制报警模块发出报警声,通过按键模块可以设定报警温度和报警时间。





可以用edge打开查看



可以用edge打开PDF



单片机程序

#include

#define uint unsigned int

#define uchar unsigned char           //宏定义

sbit SET = P3^1;                            //定义调整键

sbit DEC = P3^2;                           //定义减少键

sbit ADD = P3^3;                          //定义增加键

sbit BEEP = P3^6;                           //定义蜂鸣器

sbit ALAM = P1^2;                        //定义灯光报警

sbit DQ = P3^7;                             //定义DS18B20总线I/O        

bit shanshuo_st;                            //闪烁间隔标志

bit beep_st;                                     //蜂鸣器间隔标志

sbit DIAN = P0^5;                        //小数点

uchar x=0;                                      //计数器

signed char m;                                     //温度值全局变量

uchar n;                                              //温度值全局变量

uchar set_st=0;                             //状态标志

signed char shangxian=30;                  //上限报警温度

signed char xiaxian=10;                   //下限报警温度

//uchar code  LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};

uchar code  LEDData[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0xCF,0xDA,0x9B,0xDC,0x9B,0x8B};


//延时子程序

void Delay_DS18B20(int num)

{

  while(num--) ;

}

//初始化DS18B20

void Init_DS18B20(void)

{

  unsigned char x=0;

  DQ = 1;         //DQ复位

  Delay_DS18B20(8);    //稍做延时

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

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

  DQ = 1;         //拉高总线

  Delay_DS18B20(14);

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

  Delay_DS18B20(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_DS18B20(4);

  }

  return();

}

//写一个字节

void WriteOneChar(unsigned char dat)

{

  unsigned char i=0;

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

  {

    DQ = 0;

    DQ = dat&0x01;

    Delay_DS18B20(5);

    DQ = 1;

    dat>>=1;

  }

}

//读取温度

unsigned int ReadTemperature(void)

{

  unsigned char a=0;

  unsigned char b=0;

  unsigned int t=0;

  float tt=0;

  Init_DS18B20();

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

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

  Init_DS18B20();

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

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

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

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

  t=b;                                   //高8位转移到t

  t<<=8;                           //t数据左移8位

  t=t|a;                           //将t和a按位或,得到一个16位的数

  tt=t*0.0625;                   //将t乘以0.0625得到实际温度值(温度传感器设置12位精度,最小分辨率是0.0625)

  t= tt*10+0.5;     //放大10倍(将小数点后一位显示出来)输出并四舍五入

  return(t);                   //返回温度值

}


//延时子程序

void Delay(uint num)

{

while( --num );

}

//初始化定时器0

void InitTimer(void)

{

        TMOD=0x1;

        TH0=0x3c;

        TL0=0xb0;     //50ms(晶振12M)

}


//读取温度

void check_wendu(void)

{

        uint a,b,c;

        c=ReadTemperature();                          //获取温度值

        a=c/100;                                                     //计算得到十位数字

        b=c/10-a*10;                                            //计算得到个位数字

        m=c/10;                                                      //计算得到整数位

        n=c-a*100-b*10;                                    //计算得到小数位

        if(m<0){m=0;n=0;}                                   //设置温度显示上限

        if(m>99){m=99;n=9;}                                   //设置温度显示上限   

}

//数码管初始化

void Disp_init(void)   

{

        P0 = ~0x80;      //显示----

        P2 = 0x7F;

        Delay(200);

        P2 = 0xDF;

        Delay(200);   

        P2 = 0xF7;

        Delay(200);

        P2 = 0xFD;

        Delay(200);

        P2 = 0xFF;         //关闭显示

}

//显示温度子程序

void Disp_Temperature(void)     //显示温度

{

        P0 = ~0x98;      //显示C

        P2 = 0x7F;

        Delay(100);

        P2=0xff;

        P0=~LEDData[n];    //显示个位

        P2 = 0xDF;

        Delay(100);

        P2=0xff;

        P0 =~LEDData[m%10];    //显示十位

        DIAN = 0;         //显示小数点

        P2 = 0xF7;

        Delay(100);

        P2=0xff;

        P0 =~LEDData[m/10];    //显示百位

        P2 = 0xFD;

        Delay(100);

        P2 = 0xff;         //关闭显示

}

//显示报警温度子程序

void Disp_alarm(uchar baojing)

{

        P0 =~0x98;      //显示C

        P2 = 0x7F;

        Delay(100);

        P2=0xff;

        P0 =~LEDData[baojing%10]; //显示十位

        P2 = 0xDF;

        Delay(100);

        P2=0xff;

        P0 =~LEDData[baojing/10]; //显示百位

        P2 = 0xF7;

        Delay(100);

        P2=0xff;

        if(set_st==1)P0 =~0xCE;

        else if(set_st==2)P0 =~0x1A; //上限H、下限L标示

        P2 = 0xFD;

        Delay(100);

        P2 = 0xff;         //关闭显示

}

//报警子程序

void Alarm()

{

        if(x>=10){beep_st=~beep_st;x=0;}

        if((m>=shangxian&&beep_st==1)||(m        {

                BEEP = 0;

                ALAM=0;

        }

        else

        {

                BEEP=1;

                ALAM=1;

        }

}

//主函数

void main(void)

{

    uint z;

InitTimer();    //初始化定时器

EA=1;      //全局中断开关

TR0=1;

ET0=1;      //开启定时器0

IT0=1;        

IT1=1;

check_wendu();

check_wendu();

for(z=0;z<300;z++)

{

  Disp_init();        

  }

while(1)

  {

  if(SET==0)

  {

   Delay(2000);

   do{}while(SET==0);

   set_st++;x=0;shanshuo_st=1;

   if(set_st>2)set_st=0;

  }

  if(set_st==0)

  {

   EX0=0;    //关闭外部中断0

   EX1=0;    //关闭外部中断1

    check_wendu();

      Disp_Temperature();

   Alarm();   //报警检测

推荐阅读

史海拾趣

思瑞浦微电子科技(3PEAK INCORPORATED)公司的发展小趣事

思瑞浦微电子科技(3PEAK INCORPORATED)公司是一家总部位于台湾的电子元器件制造商,专注于高性能模拟和混合信号集成电路(IC)的设计、开发和销售。以下是关于该公司发展的五个相关故事:

  1. 公司成立和早期发展: 思瑞浦微电子科技公司成立于2003年,初期主要致力于集成电路设计和技术研发。公司在成立初期便注重技术创新和产品质量,通过不断提升研发能力和技术水平,逐渐树立了良好的品牌声誉。

  2. 产品线扩展和市场拓展: 随着公司技术实力的增强和市场需求的不断变化,思瑞浦逐步扩展了产品线,并开始向汽车电子、工业控制、消费电子等领域拓展市场。公司致力于提供高性能、低功耗的模拟和混合信号IC,满足不同领域客户的需求。

  3. 技术创新和专利积累: 思瑞浦在模拟和混合信号集成电路领域不断进行技术创新和研发投入,取得了多项关键技术的突破和专利成果。公司建立了完善的研发体系和技术团队,持续推出具有竞争优势的新产品,加强了在市场上的地位和竞争力。

  4. 国际合作和市场扩张: 为了进一步拓展市场和提升品牌影响力,思瑞浦积极开展国际合作,与全球知名的客户和合作伙伴建立了长期稳定的合作关系。公司产品逐渐进入国际市场,销售网络覆盖了全球多个地区,并取得了可观的业绩和市场份额。

  5. 持续发展和未来展望: 思瑞浦微电子科技公司在不断发展壮大的过程中,始终坚持技术创新和客户导向,不断提升产品质量和服务水平。公司未来将继续致力于研发投入、市场拓展和国际合作,加强在模拟和混合信号集成电路领域的领先地位,为客户提供更优质的产品和解决方案。

FWBELL公司的发展小趣事
合理的温度控制可以减少电池在充电过程中的热应力,从而延长电池的使用寿命。
Comtronic Gmbh-Verbindungstechnik公司的发展小趣事
不同规格和容量的镍镉电池对温度变化的敏感度不同,因此需要根据具体电池的数据手册来确定合适的温度范围。
上海晶丰明源(BPS)公司的发展小趣事

随着公司的快速发展,晶丰明源于XXXX年成功通过科创板上市审核,正式登陆资本市场。这一重大事件不仅为公司带来了充裕的资金支持,也进一步提升了公司的品牌影响力和市场竞争力。借助资本市场的力量,晶丰明源得以加速研发进程、扩大生产规模,为公司的长远发展奠定了坚实基础。

FCT Electronics公司的发展小趣事

随着电子产品的日益复杂化,FCT Electronics意识到技术创新是保持竞争力的关键。公司投入大量资源进行研发,成功开发出一系列高性能的测试设备。其中,一款多功能集成电路测试系统因其高效、稳定、可靠的特点,被众多电子制造商所采纳,为FCT Electronics赢得了极高的声誉。

Alliance Memory公司的发展小趣事

FCT Electronics的创立可以追溯到二十年前,当时电子行业正处于飞速发展的阶段。几位富有远见和创业精神的工程师看到了电子测试设备市场的巨大潜力,于是联手创立了FCT Electronics。公司最初的产品是一款简易的电路板测试仪,因其精准度高、操作简便而迅速在市场上占有一席之地。随着业务的不断拓展,FCT Electronics逐渐成为电子行业测试设备领域的佼佼者。

问答坊 | AI 解惑

TI 公司DSP产品相关FAQ整理

问:请TI公司的DSP技术专家GeorgeShen先生和AccountManager王剑先生做一下自我介绍。(10:36:50 AM)答:大家好,这里是TI公司的盛戎华、王剣,很高兴和大家一起讨论TI的DSP产品。 Good morning! Hello this is George Sheng, an Field Application Eng ...…

查看全部问答>

贴片元器件(密引脚IC)焊接教程

贴片元器件(密引脚IC)焊接教程…

查看全部问答>

首次发帖---国内最详细的linux基础教程(不过是第一版)---网域时代的教程

确实详细,只是版本有点老,贡献一下,供参考。 点击此处下载 或粘帖:http://download.eeworld.net/source/2251570…

查看全部问答>

如何去理解NTFS格式

如题,如何了解NTFS格式(各方面)。。。 有什么推荐的书?…

查看全部问答>

2410 的存储器以及有关启动的问题????????

2410 内部     1  ram起始地址被映射到哪里?容量有多大?     2  rom起始地址被映射到哪里?容量有多大? 2410 启动方式:     3  2410外启动时,第一条指令时在哪里执行的? & ...…

查看全部问答>

[求助]请教sim卡中通讯录的存储问题

大家好! 我们要开发一个sim卡的读卡器 gsm协议中提到了dialling number的概念,但是并没有明确提出通讯录是如何存储的, 请教大家dialling number和通讯录之间是什么关系?是不是通过读取dialling number就 可以读取通讯录了? 谢谢! …

查看全部问答>

OP放大器的双极性与FET连接的概念

什么是OP放大器的双极性连接 什么有是FET连接呢?谢谢…

查看全部问答>

求教LVDT传感器问题

我用高精度LVDT传感器测位移,LVDT信号调理电路是厂家自带的,我现在保持测头固定不动,隔半分钟测量一次,每次测量值(一次采样100个数据求平均值)下降一个mV,请问这是怎么回事?就算是LVDT受温度影响也不至于变化这么快吧?难道信号调理电路有 ...…

查看全部问答>

用ATMEGA16控制NRF905进行简单的收发,调了一周了,希望哪位大侠能帮俺播开云雾!!

发送段代码: #include <iom16v.h>#include <macros.h>#define uint  unsigned int#define uchar unsigned char#define   Low_TX_EN      PORTD&=~(1 << PD7)#define   High ...…

查看全部问答>