(完整word版)基于89C52单片机和液晶显示的温度测量系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JIANGSU TEACHERS UNIVERSITY OF TECHNOLOGY
测控系统综合训练
基于单片机和液晶显示的温度测量系统
学院名称:电气信息工程学院
专业:测控技术与仪器
班级:08测控2班
姓名:董亮
学号:08314237
指导教师:王久龙
2011年12月
基于单片机及液晶显示的温度测量系统
摘要:本文将介绍一种基于单片机控制的数字温度测量系统,本温度计属于多功能温度计,可以软件预设置上下报警温度,当温度不在设置范围内时,可以报警。
本文设计的数字温度计具有读数方便,测温范围广,测温精确,液晶显示,适用范围宽等特点。
它的主要组成部分有:AT89C52单片机、温度传感器、温度显示电路、温度报警电路等。
关键词:温度测量;温度传感器;液晶显示;仿真
目录
前言 (1)
第一章设计目的及设计要求 (2)
1.1 设计目的 (2)
1.2 设计要求 (2)
第二章设计方案论证 (3)
2.1 总体设计原理 (3)
2.2 单片机AT89C51介绍 (3)
2.3 温度传感器的选择 (5)
2.4 显示元件的选择 (7)
第三章硬件电路设计 (8)
3.1 时钟振荡电路 (8)
3.2 测温电路 (8)
3.3 复位电路 (8)
3.4 报警电路 (9)
3.5 显示电路 (9)
第四章软件设计 (10)
4.1 主程序设计 (10)
4.2 液晶显示程序设计 (10)
4.3 温度采集程序设计 (11)
第五章安装调试与分析 (12)
结束语 (13)
参考文献 (14)
附录 (15)
附录一系统仿真图 (15)
附录二实物组装图 (16)
附录三元器件清单 (17)
附录四程序清单 (18)
前言
在这个信息化高速发展的时代,单片机作为一种最经典的微控制器,单片机技术已经普及到我们生活、工作、科研等各个领域,已经成为一种比较成熟的技术。
随着科技的不断进步,在工业生产中温度是常用的参数,而采用单片机来对这些参数进行测量与控制已成为当今的主流,现代社会对各种信息参数的准确度和精确度的要求也在不断增长,而如何准确而又迅速的获得这些参数就取决于现代信息基础的发展水平。
在现代信息采集技术中,传感器属于信息技术的前沿尖端产品,尤其是温度传感器技术,在我国各领域应用广泛,可以说是渗透到社会的每一个领域,与人的生活与环境的温度息息相关,因此研究温度的测量方法和装置具有重要的意义。
本文将介绍智能集成温度传感器DS18B20的结构特征及控制方法,并对以此传感器和
AT89C52单片机控制器构成的数字温度测量装置的工作原理及程序设计作了详细的介绍。
本设计采用了新型单片机对温度进行测量,它可以实时的显示,通过测试表明,以其测量精度高,操作简单,可运行性强,价格低廉等优点,适用于生活,医疗,工业生产等方面的温度测量及控制。
第一章设计目的及设计要求
1.1设计目的
通过对设计任务的实现,起到串起几年来所学的模数技术、传感器技术、单片机技术及智能仪器等知识,通过理论联系实际,从题目分析、电路设计调试、程序编制调试到传感器的标定等这一完整的实验过程,培养正确的设计思想,使充分发挥主观能动性,去独立解决实际问题。
以达到提升综合能力、动手能力、文献资料查阅能力的作用,为毕业设计和以后工作打下一个良好的基础。
1.2设计要求
利用数字温度传感器DS18B20测量温度信号,计算后在LCD液晶屏上显示相应的温度值。
(1)LCD直读显示
(2)其温度测量范围为-50℃~120℃
(3)要求精确到0.5℃
第二章设计方案论证
2.1总体设计原理
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。
进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
总体设计框如图1.1所示。
图2.1 总体设计框图
2.2 AT89C52单片机介绍
AT89C52是INTEL公司MCS-51系列单片机中基本的产品。
它结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统,属于80C51增强型单片机版本,集成时钟输出和向上或向下计数器等更多的功能,适合类似马达控制等应用场合。
AT89C52引脚如图2.2所示。
图2.2 AT89C52引脚图
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写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口作为AT89C51的一些特殊功能口,管脚备选功能。
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(计时器0外部输入)
P3.5 T1(计时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)
RST:复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
PSEN:外部程序存储器的选通信号。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
2.3温度传感器的选择
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点:
独特的单线接口仅需要一个端口引脚进行通信;
多个DS18B20可以并联在惟一的三线上,实现多点组网功能;
无须外部器件;
可通过数据线供电,电压范围为3.0~5.5V;
测量温度范围为-55℃至+125℃,精度为±0.5℃
零待机功耗;
温度以9或12位数字;
用户可定义报警设置;
报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;DS18B20内部结构如图2.3.1所示。
图2.3.1 DS18B20内部结构图
低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
DS18B20测温原理如图2.3.2所示。
图2.3.2 DS18B20测温原理图
2.4显示元件的选择
在系统中要显示数值或文字,就必需有显示器件,目前市场上显示元器件很多,有LED数码管、点阵显示等。
虽然LED数码管在价格方面占有一定的优势,但考虑到显示文字以及美观自然的效果,我们选择LCD1602液晶显示器。
LCD1602是工业字符型液晶,能够同时显示16x02即32个字符。
1602采用标准的16脚接口,其中:
第1脚:VSS为地电源
第2脚:VDD接5V正电源
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:RS为寄存器选择,高电平选数据寄存器、低电平选指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW 共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:E端为使能端,当E由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15脚:背光电源正极
第16脚:背光电源负极
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A” 。
第三章硬件电路设计
3.1 时钟振荡电路
时钟振荡电路如图3.1所示。
图3.1 时钟振荡电路图3.2 测温电路
测温电路如图3.2所示。
图3.2 测温电路图3.3 复位电路
复位电路如图3.3所示。
图3.3 复位电路图
3.4 报警电路
报警电路如图3.4所示。
图3.4 报警电路图3.5 显示电路
显示电路如图3.5所示。
图3.5 显示电路图
第四章软件设计4.1主程序设计
主程序流程图如图4.1所示。
图4.1 主程序流程图
4.2液晶显示程序设计
液晶显示程序流程图如图4.2所示。
图4.2 液晶显示程序流程图4.3温度采集程序设计
温度采集程序流程图如图4.3所示。
图4.3 温度采集程序流程图
第五章安装调试与分析
温度计的电路系统较大,对于焊接方面更是不可轻视,庞大的电路系统中只要出于一处的错误,则会对检测造成很大的不便。
硬件调试时,可先检查印制板及焊接的质量是否符合要求,有无虚焊点及线路间有无短路、断路。
然后用万用表测试或通电检测,检查无误后,可通电检查LCD液晶显示器亮度情况,一般情况下取背光电压为4~5.5V即可得到满意的效果。
测温程序设计中,向DS18B20发温度命令转换后,程序要等待DS18B20的返回信号,一旦线路不好或断线,将陷入死循环。
LCD 程序也较为复杂,在编写程序和调试时出现了相对较多的问题。
最后经过多次的模块子程序的修改,一步一步的完成,最终解决了问题。
我们可以实用Proteus软件进行整体电路的仿真。
Proteus可提供的调试手段Proteus提供了比较丰富的测试信号用于电路的测试。
在绘制好原理图后,调入已编译好的目标代码文件:*.HEX,可以在PROTEUS的原理图中看到模拟的实物运行状态和过程。
经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力。
同时在软件的编程方面得到更到的提高,对编程能力得到加强。
同时对所学的知识得到很大的提高与巩固,对自己的动手能力有了极大的帮助。
结束语
通过本次课程设计使我进一步熟悉了单片机的内部结构和工作原理,掌握了单片机应用系统设计的基本方法和步骤,了解单片机在自动化装置中的作用以及掌握单片机的编程和调试方法。
通过这次实训,我发现在现实设计中还需要注意很多的细节,包括程序设计和硬件设计都要我们小心仔细,一个地方出错就可能会整个系统失效。
在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多,从这次的设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
本次设计中,我遇到了一些难题,然而这些难题让我不断的学习,在困难中进步,在此我要感谢学校给我们提供这次机会,感谢指导教师给我的提供了宝贵的意见以及同学对于我的帮助,我将继续以务实的态度,在接下来的毕业设计中,争取做出更好的成绩。
参考文献
[1] 杨拴科.模拟电子技术基础.高等教育出版社.2004
[2] 阎石.数字电子技术基础(第五版).高等教育出版社2008
[3] 谭浩强.C程序设计.清华大学出版社.2006
[4] 赵负图.传感器集成电路手册.化学工业出版社.2002
[5] 郁有文.传感器原理及工程应用(第三版).西安电子科技大学出版社. 2008
[6] 高峰.单片微型计算机与接口技术.科学出版社.2003
[7] 余发山.王福忠.单片机原理及应用技术.中国矿业大学出版社.2003
[8] 汤竞南.51单片机C语言开发与实例.人民邮电出版社.2008
附录一附录二
元器件清单
序号名称规格数量
1单片机AT89C521个
2晶振12Mhz1个
3LCD显示器16021片
4温度传感器DS18B201只
5发光二极管红色1只
6发光二极管绿色1只
7电解电容10μF1只
8电位器10K1个
9瓷片电容20pF2片
10色环电阻5101只
11色环电阻 4.7K1只
12按钮开关1只
13按键1只
14通用焊接板1块
15插针插座若干
1杜邦线若干
附录三
附录四
程序清单#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar i;
sbit lcdrs=P3^0;
sbit lcdrw=P3^1;
sbit lcden=P3^2;
sbit d1=P1^0;
sbit d2=P1^1;
uchar code t0[]="the temperature ";
uchar code t1[]=" is ";
uchar code wendu[]="0123456789";
sbit DQ = P3^7; //定义ds18B20总线IO void delay(uint z) //液晶显示模块
{
uint x,y;
for(x=100;x>1;x--)
for(y=z;y>1;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date) {
lcdrs=1;
P2=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init_lcd()
{
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x01);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
for(i=0;i<16;i++)
{
write_date(t0[i]);
delay(0);
}
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
write_date(t1[i]);
delay(0);
}
}
//温度采集模块
void tmpDelay(int num) //延时函数
{
while(num--) ;
}
void Init_DS18B20() //初始化DS1820
{
unsigned char x=0;
DQ = 1; //DQ复位
tmpDelay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
tmpDelay(80); //精确延时大于480us DQ = 1; //拉高总线
tmpDelay(14);
x=DQ;
tmpDelay(20);
}
unsigned char ReadOneChar() //读一个字节{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
tmpDelay(4);
}
return(dat);
}
void WriteOneChar(unsigned char dat) //写一个字节{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
tmpDelay(5);
DQ = 1;
dat>>=1;
}
}
unsigned int Readtemp() //读取温度
{
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;
t<<=8;
t=t|a; //两字节合成一个整型变量。
tt=t*0.0625; //得到真实十进制温度值
t= tt*10+0.5; //放大十倍
return(t);
}
void display()
{
unsigned int num,num1;
unsigned int shi,ge,xiaoshu; //用unsigned int无符号整数来表示num=Readtemp();
num1=num/10;
if(num1>37)
{d1=0;d2=1;delay(500);}
if(num1<10)
{d1=1;d2=0;delay(500);}
else
{d1=1;d2=1;}
shi=num/100;
ge=num/10%10;
xiaoshu=num%10;
write_com(0x80+0x40+5);
write_date(wendu[shi]);
write_com(0x80+0x40+6);
write_date(wendu[ge]);
write_com(0x80+0x40+7);
write_date(0x2e);
write_com(0x80+0x40+8);
write_date(wendu[xiaoshu]); }
void main()
{
init_lcd();
while(1)
{
display();
delay(10);
}
}。