本篇文章论述的是基于51单片机的温度检测及报警装置系统的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。

文章末尾附有系统仿真演示视频介绍链接。

目录

1 摘要

2 总体设计方案

代码实现(部分)

3  硬件设计

4  软件设计

5  系统调试

6  结论

资源下载


如果这篇文章对你有帮助的话,可以点赞、关注、转发,您的支持是我更新最大的动力!

1 摘要

本文介绍一种基于STC89C51单片机的温度测量及报警电路,该电路采用DS18B20作为温度监测元件,测量范围-55℃-~+125℃,使用液晶模块显示,能设置温度报警上下限。正文着重给出了软硬件系统的各部分电路,介绍了集成温度传感器DS18B20的原理,STC89C51单片机功能和应用。该电路设计合理、功能实用、结构简单。

2 总体设计方案

2.1 方案阐述

通过分析可以知道,所要设计温度检测与报警装置的温度测量范围为-55~125℃,在lcd上并能设置上下限报警温度,超过或低于限制温度发出报警提示。该系统主要由温度测量和数据采集两部分电路组成,实现的方法有很多种,下面将列出两种在日常生活中和工农业生产中经常用到的实现方案。

2.2 基本思路

利用单片机的P2.5、P2.6、P2.7作为LCD1602的控制位,P0口作为数据位控制LCD1602,用LCD1602显示被测量温度的数值、上下限报警温度;P3.4、P3.5 、P3.6、P3.7口控制手动控制按键,用来调节上下限报警温度;P2.0口作为18b20的接入端;

P2.口作为蜂鸣器的接入端。

2.3系统设计原理

利用温度传感器DS18B20可以直接读取被测温度值,进行转换的特性,模拟温度值经过DS18B20处理后转换为数字值,然后送到单片机中进行数据处理,并与设置的温度报警限比较,超过限度后通过扬声器报警。同时处理后的数据送到LCD中显示。

原理图



仿真图



代码实现(部分)


#include <REGX52.H>
sbit keyu=P3^4;//加按键
sbit keyl=P3^5;//减按键
sbit keyh=P3^6;//调节尺度
sbit keym=P3^7; //转换模式
sbit RS=P2^5;//数据/命令选择端(H/L)
sbit RW=P2^6;//读/写端(H/L)
sbit EN=P2^7;//使能
sbit DQ=P2^0;  //DS18B20接入口
sbit buzz=P2^1;//蜂鸣器接口	-
bit f=1;  //正负温度标志位
unsigned char  m=1,y=0,o=0;//寄存器
unsigned int sdata;//存放整数温度
unsigned char xiaoshu1;	//存放小数后第一位温度数值
unsigned char xiaoshu2;	 //存放小数后第二位温度数值
unsigned char code huany[]=" Welcome to use "; //欢迎使用
unsigned char code tt[]  =" ter thermometer"; //温度计
unsigned char code duqu[]="   loading...   "; //读取
unsigned char code tab1[]=" T:      C   M  ";	//框架
unsigned char code tab2[]="U:        L:    "; 
unsigned char code shuzu[]="0123456789+- .*";	//数字,,10加号,,,11减号,,,12空格,,,,13点,,,,14*
unsigned char u=40;//上限
char l=15,p;
			  //下限
void delay_50us(unsigned int t)	 //延时函数
{
 unsigned int j,k;
 for (;t>0;t--)
 {
  for(j=10;j>0;j--)
  {
   for(k=1;k>0;k--);
  }
 }
}
void button() //报警蜂鸣器
{
  unsigned char k=2;
  while(k--)
 {
  buzz=0;delay_50us(200);
  buzz=1;delay_50us(200);
 }
}
///lcd
void write_com(unsigned com)//写操纵
{
   EN=0;
   RS=0;
   RW=0;
   P0=com;
   delay_50us(1);
   EN=1;
   delay_50us(5);
   EN=0;
}
void write_data(unsigned char dat)//写数据
{
   EN=0;
   RS=1;
   RW=0;
   P0=dat;
   delay_50us(1);
   EN=1;
   delay_50us(5);
   EN=0;
}
void init(void)//初始化
{
     delay_50us(5);
	 write_com(0x38);
	 delay_50us(1);
	 write_com(0x38);
	 delay_50us(1);
	 write_com(0x38);
	 write_com(0x38);
	 write_com(0x08);
	 write_com(0x01);
	 write_com(0x06);
	 write_com(0x0C);
}  
void delay_18B20(unsigned int i)	//18b20全局延时
{
  while(i--);
}
///18b20//
//初始化传感器函数
  Init_DS18B20(void)
  {
  unsigned char x=0;
  DQ=1;//DQ复位
  delay_18B20(10);//稍做延时
  DQ=0;//单片机将DQ拉低
  delay_18B20(80);//精确延时大于480us
  DQ=1;//拉高总线
  delay_18B20(20);
  x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
  delay_18B20(30);
  return x;
}
//读一个字节
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_18B20(4);
   }
   return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
   unsigned char i=0;
   for(i=8;i>0;i--)
   {
      DQ=0;
      DQ=dat&0x01;
      delay_18B20(5);
      DQ=1;
      dat>>=1;
   }
   return(dat);
}
void ReadTemperature(void)
{
   unsigned char L=0;
   unsigned char H=0;
   Init_DS18B20();
   WriteOneChar(0xCC);//跳过读序号列号的操作
   WriteOneChar(0x44);//启动温度转换
   delay_18B20(100);
   Init_DS18B20();
   WriteOneChar(0xCC);//跳过读序号列号的操作
   WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器前两个就是 温度                
   L=ReadOneChar();
   H=ReadOneChar();
   if(H>0xf8)      	//高位前五位为1时温度是负
   {
		L=~L+1;
		H=~H;    
		f=0;      					//读取温度为负时fg=0
		sdata = L/16+H*16;      	//整数部分
	    xiaoshu1 = (L&0x0f)*10/16; 		//小数第一位
    	xiaoshu2 = (L&0x0f)*100/16%10;	//小数第二位
	}
//传感器返回值除16得实际温度值
//为了得到2位小数位,先乘100,再除16,考虑整型数据长度,
	else
   	{
	    f=1;
        sdata = L/16+H*16;           	//整数部分
    	xiaoshu1 = (L&0x0f)*10/16; 		//小数第一位
    	xiaoshu2 = (L&0x0f)*100/16%10;	//小数第二位
	}
}
///18b20结束/
void display0()//显示welcome   to use the  
{
       unsigned char i,w,h=0x8f,i1,w1,h1=0xcf,w2,i2,h2,g=2;
       init();
	   for(w=0;w<16;w++)  //显示欢迎
	   {
	       write_com(h--);//第一行自减左移
	       for(i=0;i<16;i++)
	       {
	          write_data(huany[i]);
			  delay_50us(15);
	       }
	   }
	   for(w1=0;w1<16;w1++)//第二行自减左移
	   {
	       write_com(h1--);
	       for(i1=0;i1<16;i1++)
	       {
	          write_data(tt[i1]);
			  delay_50us(15);
	       }
	   }
       delay_50us(5000);//显示loading
	   init(); 
	   write_com(0x80);
	   for(w2=0;w2<16;w2++)//向右显示
	   {	    
           write_data(duqu[w2]);
		   delay_50us(200);	       
	   }
	   while(g--)//小数点循环亮灭
	   {   
	       write_com(0x8a);
	       for(i2=0;i2<3;i2++)
	       {
		      write_data(duqu[i2]);
			    
		   }
		   write_com(0x8a);
	       for(h2=10;h2<14;h2++)
		   {  
		      delay_50us(300);
		      write_data(duqu[h2]);
			  delay_50us(300);
		   }
	   }
      
}

3  硬件设计

3.1硬件原理框图    

温度检测与报警系统设计由主控制器STC89C52RC、单片机复位、报警温度按键设置、时钟振荡、LCD1602显示、温度传感器及蜂鸣器组成。

原理框图如图2所示:

3.2硬件结构及原理  

3.2.1 STC89C52RC单片机工作电路

本设计的核心是单片机电路,考虑到需要一个中断输入,存储容量、外部接口对单片机端口的需要以及兼顾到节约成本的原则,选用了常用的STC89C52RC单片机。STC89C52RC是低功耗、高性能、经济的8位CMOS微处理器,工作频率为0—40MHz,内置8K字节可编程只读闪存,512位的内部RAM,16位可编程I/O总线。它采用Atmel公司的非易储器制造技术,与MCS-51的指令设置和芯片引脚可兼容。STC89C52RC可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。STC89C52RC工作的最简单的电路是其外围接一个晶振和一个复位电路,给单片机接上电源和地,单片机就可以工作了。

STC89C52RC各管脚功能如下:

VCC:供电电压。  

GND:接地。  

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。   

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。  

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。   

P3口也可作为STC89C52RC的一些特殊功能口,如下表所示。在flash编程和校验时,P3口也接收一些控制信号。

 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。    

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。

/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周

期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。  

/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。   

XTAL2:来自反向振荡器的输出。

4  软件设计

本设计智能温度报警系统由温度采集、信号处理、温度监测、输出控制四部分组成。它通过预先设在单片机中的高低温度值来对非常温度值进行报警,也可以通过安检的控制对温度进行高低的设定最低可以由0℃开始进行温度的设定,从DSI8B20 采集到的温度经信号调理电路处理后直接送入单片机进行刷新。微控制器根据信号数据及设定的各种控制参数,按照嵌入的软件控制规律执行计算与处理,自动显示温度值、输出相应的控制信号,并根据当前状态输出正常、报警等信号,同时将各种数据通过数码管进行显示监控。

5  系统调试

5.1 硬件调试

(1)目测,检查外部的各种元件或者电路是否有断点。

(2)温度检测与报警装置在没通电的情况下,用数字万用表的二极管档检查电路板线路是否导通或者短路。

(3)加电检测,给电路板加电检测所有的插座或者硬件的电源是否符合要求的值。

5.2 软件调试

5.2.1 仿真软件

随着科技的发展,“计算机仿真技术”已成为许多设计部门重要的前期设计手段。它具有设计灵活,仿真的结果与测试结果较为接近。Proteus软件是英国L阿宝center electronics公司出版的EDA工具软件。它不仅具有其他EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。该软件功能强大。先在proteus上按照电路图连接好电路图,打开程序HEX文件进行仿真。仿真结果如下,lcd能正常显示温度和上下限温度,按键可以准确调节上下限温度,仿真结果与理论接近。

6  结论

该智能温度报警系统结构简单,具有一定的实际应用价值。该智能温度报警系统只是DS18B20在温度控制领域的一个简单实例,此外,还能广泛地应用于各种工业生产领域,如建筑,仓储等行业,特别是在蔬菜大棚的应用上,本次设计虽然完成了,但是次设计也还是有些许不足的地方,与实际温度计测量到的温度还是有差距,因为能力的问题,该智能温度报警系统精确度最高可达到相差0.1℃,最大误差为1.5℃;能够设定的上限温度范围为0℃到120℃,下限温度为-50℃到99℃。

参考文献

[1]  康华光,陈大钦. 电子技术基础模拟部分[M].北京:高等教育出版社,1999:1-495

[2]  康华光. 电子技术基础数字部分[M].北京:高等教育出版社,2004

[3]  曹巧媛. 单片机原理及应用[M].北京:电子工业出版社,2002:1-351

[4]  沈文,詹卫前. 单片机C语言开发入门指导[M].北京:清华大学出版社,2003:17-131

[5]  黄智伟. 全国大学生电子设计竞赛系统设计[M].北京:北京航空航天大学出版社,2006

[6]  林捷,杨绪业. 模拟电路与数字电路[M].北京:人民邮电出版社,2007

[7]  阮忠,林金宝. 综合电子电路应用[M].北京:机械工业出版社,2004:147-338

[8]  耿德根,宋建国. AVR高速嵌入式单片机原理与应用[M].北京:北京航空航天大学出版社,05:358-410

[9] 周坚.单片机C语言轻松入门[M]. 北京:北京航空航天大学出版社,2006.

[10] 曹天汉.单片机原理与接口技术[M]. 北京:电子工业出版社,2006.

资源下载


如果有需要的小伙伴可以私信联系我获取。

视频链接:

基于AT89C51单片机的温度检测及报警装置系统_哔哩哔哩_bilibili

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐