温度测控报告.docx
- 文档编号:25070658
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:29
- 大小:367.67KB
温度测控报告.docx
《温度测控报告.docx》由会员分享,可在线阅读,更多相关《温度测控报告.docx(29页珍藏版)》请在冰豆网上搜索。
温度测控报告
一、概述
单片机控制无疑是人们追求目标之一,它给人们带来了很大的方便,其中温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作,科研,生活,提供更好的更方便的设施就需要从多数单片机技术入手,一切向着数字化控制,智能化控制方向发展,温度传感器适用范围广,数量多,居各种传感器之首。
本文是讲述温度测控过程,在控制过程中应用单片机AT89C51、数字温度传感器DS18B20、LCD液晶显示器。
主要是通过DS18B20数字温度传感器采集温度,以单片机为核心控制部件,并通过存储器进行存储、LCD液晶显示器显示实时温度的一种数字温度计。
软件方面采用C语言来进行程序设计,使指令执行速度快,节省存储空间。
本设计主要做了如下几方面的工作:
一是确定系统的总体设计方案,包括其功能设计、组成与工作原理、设计说明;二是进行硬件电路设计,包括电路构成及测量原理、温度传感器的选择、单片机的选择;三是进行了调试和仿真,获得仿真结果。
二、方案论证
以单片机为控制核心,采用温度测量技术,以温度传感器作为测量元件,构成温度测量系统。
该系统可分为温度测量电路以及显示电路,见图1。
选用的主要器件有:
单片机AT89C51,温度传感器DS18B20,LCD1602液晶显示器等。
图1硬件结构图
本系统以单片机AT89C51为核心,数据采集、显示都要通过单片机。
数据采集通过单总线的温度传感器DS18B20完成;由LCD1602液晶显示器实时显示接收的数值。
本设计是一个数字温度测量及控制系统,能测量环境中的温度,并能在超限的情况下报警,保证环境保持在限定的温度中。
该系统的总体设计思路如下:
温度传感器DS18B20把所测得的温度发送AT89C52单片机上,经过单片机处理,将其数值进行显示。
系统的核心器件是单片机,它是整个系统的心脏,由它来接受信号并控制协调各功能模块的正常工作。
温度控制系统采用AT89C51八位机作为微处理单元进行控制,温度传感器把采集的信号再加上单片机里的数据处理获得测温的数据显示。
根据系统的设计要求,选择DS18B20作为本系统的温度传感器,选择单片机AT89C52为测量控制系统的核心来完成数据采集、处理、显示等功能。
选用智能数字温度传感器DS18B20,与传统的热敏电阻等测温元件相比,它省去了采样/保持电路、运放、数/模转换电路以及进行长距离传输时的串/并转换电路,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式,简化了电路,缩短了系统的工作时间,降低了系统的硬件成本。
三、电路设计
1、DS18B20工作原理
DS18B20的内部结构如图2所示。
图2DS18B20内部结构图
DS18B20电路图如图3所示。
图3DS18B20电路图
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。
图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
2、时钟电路
AT89C51中有一个用于构成内部振荡器的高增益反向放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。
这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器。
外接石英晶体(或陶瓷谐振器)及电容C1、C2接在放大器的反馈回路中构成并联振荡电路,对外接电容C1、C2虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低,振荡器工作的稳定性,起振的难易程度及温度稳定性,使用石英晶体
由于外部时钟信号时通过一个2分频触发器后作为内部时钟信号的,所以对外部时钟信号的占空比没有特殊要求,但最小高电平持续时间和最大的低电平持续时间应符合产品技术条件的要求,振荡电路如图4所示。
图4内/外部振荡电路图
3、复位电路
单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。
所以可以通过按键的断开和闭合在运行的系统中控制其复位。
如图5所示
图5复位电路图
4、LCD1602显示电路
LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,本系统采用LCD1602来显示所采集的数据,下面对LCD1602进行简单的介绍。
LCD1602引脚介绍
第1脚:
VSS为电源地
第2脚:
VCC接5V电源正极
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
第6脚:
E(或EN)端为使能(enable)端,高电平
(1)时读取信息,负跳变时执行指令。
第7~14脚:
D0~D7为8位双向数据端。
第15~16脚:
空脚或背灯电源。
15脚背光正极,16脚背光负极。
RS,RW,E分别与单片机的P2.0、P2.1、P2.2口相连,通过软件对LCD的功能进行初始化。
电路图如图6所示。
图6图LCD1602液晶显示电路图
5、声光报警电路
声光报警电路是光敏电阻随光的强弱改变而电阻发生改变,电阻改变电流就发生变化从而控制电路,声敏电阻随声的强弱改变而电阻发生改变,电阻改变电流就发生变化从而控制电路。
原理图如图7所示。
图7声光报警电路图
6、键盘输入电路
本系统采用键盘输入来设置温度的上下限,其电路图如图8所示。
图8键盘输入电路图
四、软件设计
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如下图所示
图9主程序流程图
图10读温度流程图
五、性能的测试
1、温度采集测试
仿真图如图12所示。
图12温度采集仿真
2、键盘输入测试
通过对12、13、14、15四个功能键的按压,对温度的上下限进行设定,仿真图如图13所示。
图13键盘输入仿真
3、超温报警测试
当温度传感器的温度不在控制范围内,温度超过上限报警仿真如图14所示.
图14超温报警仿真
温度低于温度的最下限报警电路如图15所示。
图15低温报警仿真
六、结论
通过protel99对电路图的绘制,proteus对电路图进行仿真,证实了此设计的可行性,完成了可以设定电压上下限值;、对温度进行显示,以及当外界温度不在规定温度范围内时要求有声光报警的基本要求。
本系统通过利用LCD1602,18B20温度传感器和AT89C51等芯片和元件,搭建出来的实时温度测控系统。
通过单片机将它们连接到一起。
实现了相应的功能。
七、性价比
这个电路用到的电子元件都是比较常见的,很容易能购买到,用到的的器件也比较经济,此电路是一个性价比较高的电路。
本次课程设计完全达到设计要求,性能良好,是一个比较成功的设计。
电路设计简单易行,容易进行实际的实现,操作简单,运行也很可靠。
是比较适合实际应用的设计。
八、课设体会
这两周的课程设计期间,我遇到了平时从未有过的困难。
因为课程设计不是依靠某一方面的知识就可以完成的,而是对平时所学的理论知识的高度整合。
又因为自己所学的知识有限,要设计出此电路需要花费大量的时间去查找资料,虽然很是艰难,但经过艰苦的努力,终于还是完成了课程设计的任务。
通过此次课程设计,我学到了很多知识。
一方面,我掌握了protues仿真软件的综合应用,另一方面,对c语言的编程也有了更进一步的学习,好的设计不仅要求正确,而且是最简单的,这样不仅可以降低成本,而且可以增加系统的可靠性和稳定性。
参考文献
1.朱定华.单片机微机原理与应用[M].北京:
清华大学出版社,2003.
2.李全利.单片机原理与接口技术[M].北京:
高等教育出版社,2004.
3.何立民.单片机高级教程[M].北京:
北京航空航天大学出版社,2000.
4.郭改枝.基于单片机控制的多功能温湿度显示系统的设计与实[J].自然科学与技术,1001-8735(2006)
附录I总电路图
附录II元器件清单
序号
编号
名称
型号
数量
1
J2
温度传感器
18B20
1
2
U1
单片机
AT89C51
1
3
LCD1
液晶显示屏
LCD1602
1
4
S12
键盘
SW-PB
1
5
S13
键盘
SW-PB
1
6
S14
键盘
SW-PB
1
7
S15
键盘
键盘
1
8
X1
晶振
CRYSTAL
1
9
U3
蜂鸣器
BUZZER
1
10
R1
电阻
RES
1
11
R2
电阻
RES
1
12
R3
电阻
RES
1
7
Q1
三极管
MPS3702
1
14
C1
电容
CAP
1
15
C2
电容
CAP
1
16
C3
电容
CAP
1
17
J1
二极管
DIODE
1
附录三程序代码
#include
#include"lcd.h"
#include"temp.h"
#include
sbitLED=P3^2;
sbitBEEP=P3^3;
//--定义使用的IO口--//
#defineGPIO_KEYP1
uintCurrent_temp=0;//当前温度
ucharMax_temp=50;
ucharMin_temp=30;
ucharKeyValue=0;
voidLcdDisplay(int);
voidKeyScan(void);
voidDelay10ms(unsignedintc);//误差0us
voidDelay1000ms();//@11.0592MHz
voidkeyjust();
/*******************************************************************************
*函数名:
main
*函数功能:
主函数
*输入:
无
*输出:
无
*******************************************************************************/
voidmain()
{
LcdInit();//初始化LCD1602
LcdWriteCom(0x88);//写地址80表示初始地址
LcdWriteData('w');
LcdWriteData('e');
LcdWriteData('l');
LcdWriteData('c');
LcdWriteData('o');
LcdWriteData('m');
LcdWriteData('e');
Ds18b20ReadTemp();//防止读出数据不对
Delay1000ms();
LcdWriteCom(0x01);
LcdDisplay(Ds18b20ReadTemp());
while
(1)
{
LcdDisplay(Ds18b20ReadTemp());
KeyScan();
keyjust();
if(Current_temp
{
LED=1;
BEEP=1;
}else
{
LED=0;
BEEP=0;
}
}
}
/*******************************************************************************
*函数名:
LcdDisplay()
*函数功能:
LCD显示读取到的温度
*输入:
v
*输出:
无
*******************************************************************************/
voidLcdDisplay(inttemp)//lcd显示
{
unsignedchardatas[]={0,0,0,0,0};//定义数组
floattp;
if(temp<0)//当温度值为负数
{
LcdWriteCom(0x80);//写地址80表示初始地址
LcdWriteData('-');//显示负
//因为读取的温度是实际温度的补码,所以减1,再取反求出原码
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
//算由?
.5,还是在小数点后面。
}
else
{
LcdWriteCom(0x80);//写地址80表示初始地址
LcdWriteData('+');//显示正
tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
//如果温度是正的那么,那么正数的原码就是补码它本身
temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
//算加上0.5,还是在小数点后面。
}
datas[0]=temp/10000;
datas[1]=temp%10000/1000;
datas[2]=temp%1000/100;
datas[3]=temp%100/10;
datas[4]=temp%10;
Current_temp=datas[0]*100+datas[1]*10+datas[2]*1;//温度取整数
LcdWriteCom(0x82);//写地址80表示初始地址
LcdWriteData('0'+datas[0]);//百位
LcdWriteData('0'+datas[1]);//十位
LcdWriteData('0'+datas[2]);//个位
LcdWriteData('.');//显示‘.’
LcdWriteData('0'+datas[3]);//显示小数点
LcdWriteData('0'+datas[4]);//显示小数点
LcdWriteData('C');
}
/*******************************************************************************
*函数名:
KeyScan
*函数功能:
检测有按键按下并读取键值
*输入:
无
*输出:
无
*******************************************************************************/
voidKeyScan(void)
{
uchara=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!
=0x0f)//读取按键是否按下
{
Delay10ms
(1);//延时10ms进行消抖
if(GPIO_KEY!
=0x0f)//再次检测键盘是否按下
{
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70):
KeyValue=0;break;
case(0Xb0):
KeyValue=4;break;
case(0Xd0):
KeyValue=8;break;
case(0Xe0):
KeyValue=12;break;
}
//测试列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07):
KeyValue+=3;break;
case(0X0b):
KeyValue+=2;break;
case(0X0d):
KeyValue+=1;break;
case(0X0e):
KeyValue=KeyValue;break;
}
//测试行
while((a<50)&&(GPIO_KEY!
=0xf0))//检测按键松手检测
{
Delay10ms
(1);
a++;
}
}
//LcdWriteCom(0x82+0x40);//写地址80表示初始地址
//LcdWriteData('0'+KeyValue/10);//百位
//LcdWriteData('0'+KeyValue%10);//百位
}
}
voidkeyjust()
{
if(KeyValue==12)
{
Max_temp++;
}
if(KeyValue==13)
{
if(Max_temp>Min_temp+1)
Max_temp--;
}
if(KeyValue==14)
{
if(Min_temp Min_temp++; } if(KeyValue==15) { if(Min_temp! =0) Min_temp--; } LcdWriteCom(0x80+0x40); LcdWriteData('M'); LcdWriteData('a'); LcdWriteData('x'); LcdWriteData(': '); LcdWriteData('0'+Max_temp/10); LcdWriteData('0'+Max_temp%10); LcdWriteCom(0x80+0x48); LcdWriteData('M'); LcdWriteData('i'); LcdWriteData('n'); LcdWriteData(': '); LcdWriteData('0'+Min_temp/10); LcdWriteData('0'+Min_temp%10); KeyValue=0; } /******************************************************************************* *函数名: Delay10ms *函数功能: 延时函数,延时10ms *输入: 无 *输出: 无 *******************************************************************************/ voidDelay10ms(unsignedintc)//误差0us { unsignedchara,b; //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--// for(;c>0;c--) { for(b=38;b>0;b--) { for(a=130;a>0;a--); } } } voidDelay1000ms()//@11.0592MHz { unsignedchari,j,k; _nop_(); i=8; j=1; k=243; do { do { while(--k); }while(--j); }while(--i); }#include"temp.h" /******************************************************************************* *函数名: Delay1ms *函数功能: 延时函数 *输入: 无 *输出: 无 *******************************************************************************/ voidDelay1ms(unsignedinty) { unsignedintx; for(y;y>0;y--) for(x=110;x>0;x--); } /******************************************************************************* *函数名: Ds18b20Init *函数功能: 初始化 *输入: 无 *输出: 初始化成功返回1,失败返回0 *******************************************************************************/ unsignedcharDs18b20Init() { unsignedinti; DSPORT=0;//将总线拉低480us~960us i=70; while(i--);//延时642us DSPORT=1;//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低 i=0; while(DSPORT)//等待DS18B20拉低总线 { i++; if(i>5000)//等待>5MS return0;//初始化失败
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度 测控 报告