基于AT89C51单片机的温度计设计

点击链接获取Keil源码与Project Backups仿真图:
https://download.csdn.net/download/qq_64505944/87773445
在这里插入图片描述

源码获取

主要内容:
设计一个简易温度计;要求电路实现如下功能:
设计通过单片机和数码管、led灯等组成,可以显示温度,并且可以显示大于零度的温度和小于零度的温度,还可以超出限定温度时可以报警。
基本要求:
1、设计一个能显示温度的简易温度计。
2、该建议温度计可以正常显示相应环境的温度。
3、通过单片机课程设计,熟练掌握汇编语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力。
4、完成控制系统的硬件设计、软件设计、仿真调试。
主要参考资料:
[1] 胡宴如主编.模拟电子技术[M] 高等教育出版社,2008-2-1
[2] 赵利主编.数字电子技术[M] 冶金工业出版社,2009-1-1
[3] 李华.单片机C语言编程[M].北京:北京航空航天大学出版社,2005-8-1.
[4] 张晔、王玉民等.单片机应用技术[M] .北京:高等教育出版社.2006-3
[5] 王东峰等.单片机C语言应用100例[M].电子工业出版社,2009.

           完  成  期  限:12 月 11 日 - 12 月 26 日  
        指导教师签名:                     
           课程负责人签名:                           

摘 要
随着时代的进步和发展﹐单片机技术已经普及到我们生活、工作、科研、各个领域﹐已经成为一种比较成熟的技术惇,本文详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析﹐特别是数字温度传感器DS18B20的数据采集过程。对各部分的电路也一一进行了介绍﹐该系统可以方便的实现实现温度采集和显示﹐并可根据需要任意设定上下限报警温度﹐它使用起来相当方便﹐具有精度高、量程宽、灵敏度高、体积小、功耗低等优点﹐适合于我们日常生活和工、农业生产中的温度测量﹐也可以当作温度处理模块嵌入其它系统中﹐作为其他主系统的辅助扩展。DS18B20与AT89C51结合实现最简温度检测系统﹐该系统结构简单﹐抗干扰能力强﹐适合于恶劣环境下进行现场温度测量﹐有广泛的应用前景。
本设计是一款简单实用的小型数字温度计,本次数字温度计的设计共分为六部分﹐主控制器,LED显示部分﹐传感器部分﹐复位部分﹐时钟电路﹐报警电路。主控制器即单片机部分﹐用于存储程序和控制电路;LED显示部分是指四位共阴极数码管﹐用来显示温度﹔传感器部分﹐即温度传感器﹐用来采集温度﹐进行温度转换﹔复位部分﹐即复位电路。测量的总过程是﹐传感器采集到外部环境的温度﹐并进行转换后传到单片机,经过单片机处理判断后将温度传递到数码管显示。
关 键 词:数字温度传感器;单片机

目录

摘 要 I
1 概述 1
1.1设计背景 1
1.2设计意义 1
1.3设计目标 1
2方案总体设计 2
2.1总体设计 2
2.2方案工作原理 2
3硬件设计 3
3.1 AT89C51芯片 3
3.2 时钟电路 3
3.3 温度传感电路 4
3.4 温度报警电路 5
3.5 显示电路 5
4 软件设计 6
4.1 系统流程 6
4.2 延时源代码 6
4.3 数码管显示代码 6
4.4 DS18B20初始化 7
4.5 写命令函数 8
4.6 读取温度函数 8
4.7 温度数据处理函数 8
4.8 报警提示电路函数 9
4.9 主函数 9
5 系统仿真与调试 10
5.1 Proteus 10
5.2 软件调试 10
5.3 硬件调试 11
6运行结果分析 11
6.1 仿真图 11
6.2 运行结果 11
6.3 运行分析 12
总结 13
参考文献 14

1 概述
1.1设计背景
随着现代信息技术的飞速发展和传统工业改造的逐步实现﹐能够独立工作的温度检测和显示系统应用于诸多领域。传统的温度检测以热敏电阻为温度敏感元件。热敏电阻的成本低﹐但需后续信号处理电路﹐而且可靠性相对较差﹐测温准确度低﹐检测系统也有一定的误差。这里设计的数字温度计具有读数方便﹐测温范围广,测温精确﹐数字显示﹐适用范围宽等特点。本设计选用AT89C51型单片机作为主控制器件﹐DS18B20作为测温传感器,通过LCD1602实现温度显示。通过DS18B20直接读取被测温度值﹐进行数据转换﹐该器件的物理化学性能稳定﹐线性度较好﹐在0℃~100°C最大线性偏差小于0.01℃。该器件可直接向单片机传输数字信号﹐便于单片机处理及控制。另外﹐该温度计还能直接采用测温器件测量温度﹐从而简化数据传输与处理过程。
1.2设计意义
1、掌握单片机电路的设计原理、组装与调试方法;
2、掌握LED数码显示电路的设计和使用方法;
3、掌握DS18B20温度传感器的工作原理与使用方法。

1.3设计目标
由于本设计主要用于温度的测量,因此在设计上尽量使其安全以及简单易操作。其次,在这次设计可行性上进行分析如下:
1、经济可行性:所谓经济可行性,即在这次设计上需要投入资金的多少,由于课程设计是提高我们的动手能力以及资金有限。因此在经济.上必须能够承受,比较理想化的对于我们课程设计来说是不可行的。通过分析后,无论是在器件价格或是常见度.上均是可行的。
2、技术可行性:技术可行性主要是分析技术条件上是否能够顺利开展并完成课程设计的主要问题,硬件、软件能否满足设计者的需要等。通过分析各种软件环境,硬件仿真环境等均已经具备。
综上所述,本系统设计目标已经明确,在经济与技术上均可行,因此本系统的开发是完全可行的。

2方案总体设计
本次课程设计的课题所要达到的要求如下:
1、设计一个数字式温度计,要求使用DS18B20温度传感器测量温度。
2、经单片机处理后,要求用四位一体共阴LED数码管来设计显示电路,以显示测量的温度值。
3、要求在设计中加入上下限警报温度设置电路。
4、另外还要求在设计中加入警报系统,如果我们所设计的系统用来监控某一设备,当设备的温度超过或低于我们所设定的温度值时,系统会产生报警。
2.1总体设计

在这里插入图片描述

图2-1 单片机总体框架图

2.2方案工作原理
在做数字温度计的单片机电路中﹐对信号的采集电路大多都是使用传感器﹐这是非常容易实现的﹐所以可以采用一只温度传感器DS18B20,此传感器﹐可以很容易直接读取被测温度值﹐进行转换﹐就可以满足设计要求。采集之后,通过使用51系列的单片机,可以对数据进行相应的处理﹐再由LED显示电路对其数据进行显示。

3硬件设计
3.1 AT89C51芯片
AT89C51提供以下标准功能:4k字节Flash闪速存储器,256字节片内数据存储器(00H-7FH为片内RAM,80H-FFH为特殊功能寄存器SFR),32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。单片机引脚图如图2所示:
在这里插入图片描述

图3-1 AT89C51
3.2 时钟电路
80C51时钟有两种方式产生,即内部方式和外部方式。80C51中有一个构成内部震荡器的高增益反向放大器﹐引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。本次采用内部震荡电路,瓷片电容采用22PF,晶振为12MHZ。

在这里插入图片描述

图3-3 时钟电路图

3.3 温度传感电路
DALLAS最新单线数字温度传感器DS18B20是一种新型的“一线器件”,其体积更小、更适用于多种场合、且适用电压更宽、更经济。DALLAS半导体公司的数字化温度传感器DS18B20是世界上第一片支持“一线总线"接口的温度传感器。温度测量范围为-55~+125摄氏度﹐可编程为9位~12位转换精度﹐测温分辨率可达0.0625摄氏度﹐分辨率设定参数以及用户设定的报警温度存储在EEPROM中,掉电后依然保存。被测温度用符号扩展的16位数字量方式串行输出。
DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列、各种封装形式,DQ为数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引脚。当工作于寄生电源时﹐此引脚必须接地﹐如下图所示。

在这里插入图片描述

图3-5 数码管电路图

3.4 温度报警电路
对于数字温度计的设计﹐除了温度的数字显示功能外还加入了报警系统,当测量的温度超过或低于我们所设定的温度值时﹐系统会产生报警并亮红灯报警。

在这里插入图片描述

图3-6 温度报警电路

3.5 显示电路
对于数字温度的显示,我们采用4位一体共阴LED数码管,足够显示0到100中各位数,并且还能显示一位小数部分。

在这里插入图片描述

图3-7 显示电路

4 软件设计

4.1 系统流程
在这里插入图片描述

图4-1 程序流程图

4.2 延时源代码

void delay(uint t)
{
    
    
	for(;t>0;t--);
}

4.3 数码管显示代码

void xianshi()
{
    
    
	int j;
	for(j=0;j<4;j++)
	{
    
    
		switch(j)
		{
    
    
			case 0:
			dm=table_dm[display[0]];;
			w0=0;
			delay(300);
			w0=1;						
			case 1:
			dm=table_dm1[display[1]];
			w1=0;
			delay(300);
			w1=1;					
			case 2:
			dm=table_dm[display[2]];
			w2=0;
			delay(300);
			w2=1;					   			
case 3:
			dm=table_dm[display[3]];
			w3=0;
			delay(300);
			w3=1;								
}
	}
}

4.4 DS18B20初始化

ow_reset(void)
{
    
    
	char presence=1;
	while(presence)
	{
    
    
		while(presence)
		{
    
    
			DQ=1;_nop_();_nop_();
			DQ=0;
			delay(50);
			DQ=1;
			delay(6);
			presence=DQ;
		}
		delay(45);
		presence=~DQ;
	}
	DQ=1;	
	return presence;
}

4.5 写命令函数

void write_byte(uchar val)
{
    
    
	uchar i;
	for(i=8;i>0;i--)
	{
    
    
		DQ=1;_nop_();_nop_();
		DQ=0;_nop_();_nop_();_nop_();_nop_();
		DQ=val&0x01;
		delay(6);
		val=val>>1;		
	}
	DQ=1;
	delay(1);
}	

4.6 读取温度函数

read_temp()
{
    
    
	ow_reset();
	delay(200);
	write_byte(0xcc);
	write_byte(0x44);
	ow_reset();
	delay(1);
	write_byte(0xcc);
	write_byte(0xbe);
	temp_data[0]=read_byte();
	temp_data[1]=read_byte();
	temp=temp_data[1];
	temp<<=8;
	temp=temp|temp_data[0];
	return temp;
}

4.7 温度数据处理函数

work_temp(uint tem)
{
    
    
	uchar n=0;
	if(tem>6348)
	{
    
    
		tem=65536-tem;
		n=1;
	}
	display[4]=tem&0x0f;
	display[0]=ditab[display[4]];
	display[4]=tem>>4;
	display[3]=display[4]/100;
	display[1]=display[4]%100;			    
	display[2]=display[1]/10;
	display[1]=display[1]%10;
	r=display[1]+display[2]*10+display[3]*100;
	if(!display[3])
	{
    
    
		display[3]=0x0a;
		if(!display[2])	
		{
    
    
			display[2]=0x0a;
		}
	}
	if(n)
	{
    
    
		display[3]=0x0b;
	}
	return n;
}

4.8 报警提示电路函数

void BEEP()
{
    
    


	if((r>27))
	{
    
    
		beep=!beep;
	}
		else
	{
    
    
		beep=0;
	}}

4.9 主函数

void main()
{
    
    
	beep=0;
	dm=0x00;
	w0=0;
	w1=0;
	w2=0;
	w3=0;
	for(h=0;h<4;h++)
	{
    
    
		display[h]=0;
	}
	ow_reset();
	write_byte(0xcc);
	write_byte(0x44);
	for(h=0;h<50;h++)
	{
    
    
		xianshi();
	}
	while(1)
	{
    
    
		if(temp1==0)
		{
    
    
		work_temp(read_temp());
		xianshi(); 
		BEEP();		 		}
	}
}

5 系统仿真与调试
5.1 Proteus
Proteus是功能强大的单片机仿真软件。Proteus与其他的仿真软件相比较,在下面的优点:(1)能仿真模拟电路、数字电路、数模混合电路;(2)能绘制原理图、PCB图;(3)几乎包括实际中所有使用的仪器(4)其最大的亮点在于能够对单片机进行实物级的仿真。从程序的编写,编译到调试,目标版的仿真一应俱全。支持汇编语言和C语言的编程。还可配合Keil C实现程序的联合调试,将Proteus中绘制的原理图作为实际中的目标板,而用Keil C集成环境实现对目标板的控制,与实际中通过硬件仿真器对目标板的调试几乎完全相同。

5.2 软件调试
调试主要方法和技巧:通常一个调试程序应该具有至少四种性能:跟踪、断点、查看变量、更改数值。整个程序是一个主程序调用各个子程序实现功能的过程,要使主程序和整个程序都能平稳运行,各个模块的子程序的正确与平稳运行必不可少,所以在软件调试的最初阶段就是把各个子程序进行分别调试。

图5-2 生成相应程序的HEX软件

然后再将生成的hex文件放到仿真中。

5.3 硬件调试
硬件调试是针对单片机部分进行的调试。
在上电之前,先确保电路中不存在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。在这部分调试中主要使用的工具是万用表,用来完成检测电路中是否存在断路或者短路情况的任务。注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确保没有开路以及短路的现象出现。

6运行结果分析
6.1 仿真图

图6-1 仿真图
6.2 运行结果

图6-2 运行结果

6.3 运行分析
总体来说,此次单片机课程设计功能基本完成,虽然课程设计的过程中遇到了很多困难与问题,但是最终还是完成了设计的任务及要求。具体来说可以分为以下几点:
优点:整体各元器件布局清晰,各个程序模块运行顺利,功能基本完成。可以准确从测量温度。
缺点:可以再添加一些开始或停止的功能。

总结
这次课程设计中,通过进行试验,已经基本掌握了单片机电路的设计原理、组装与调试方法,也学习了LED数码显示电路的设计和使用方法,同时也掌握了DS18B20温度传感器的工作原理与使用方法。
通过在软件上的一步一步实验,不仅巩固了我学过的单片机知识,也锻炼了我解决实际问题的能力。虽然在过程中经常会出现一些命令、方法上的错误,但通过资料的查阅以及老师、同学们的帮助已经逐个发现并及时修正,我也体会到了做实验的时候不能太心急,没有对实验进行复查就继续进行,结果导致的是一步错,步步错。许多操作需要细心并且耐心地进行,否则一不小心就可能会导致测试失败。对于一些经常用到的操作,一定要反复地进行练习。在这个过程中,我也明白了许多道理,不过做什么我们都要相信自己,不能遇到什么困难就要放弃,什么都需要去尝试。
当然在这次宝贵的课程设计活动中,经验才是对于我们最大的收获,而且还增强了自身对未知问题以及对知识的深化认识的能力,用受益匪浅这个词语来概括再合适不过。在今后的实验设计里,我相信我会通过自己的努力做的越来越好。

参考文献
[1] 何立民.单片机高级教程[M].北京: 航空航天大学出版社,2001.
[2] 王东峰等.单片机C语言应用100例[M].电子工业出版社,2009.
[3] 马忠梅等.单片机的C语言应用程序设计.北京航空航天大学出版社,2003.
[4] 王晋凯.简简单单学通51单片机开发 [M].清华大学出版社,2014.
[5] 夏继强.单片机实验[M].北京: 航空航天大学出版社,2001.

猜你喜欢

转载自blog.csdn.net/qq_64505944/article/details/130621011