基于51单片机数字温度计课程设计.docx
《基于51单片机数字温度计课程设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机数字温度计课程设计.docx(32页珍藏版)》请在冰豆网上搜索。
基于51单片机数字温度计课程设计
单片机原理及应用课程设计
题目基于单片机的数字温度计
《单片机原理及应用课程设计》任务书
1.课程设计的内容和要求(包括原始数据、技术要求、工作要求等):
课程设计目的:
1.理解掌握MCS-51系列单片机的功能和实际应用。
2.掌握仿真开发软件的使用。
3.掌握数字式温度计电路的设计、组装与调试方法。
设计的目标及要求:
1.设计基于MCS-51系列单片机数字温度计
2.设计A/D转换电路
3.设计数码管显示电路
4.进一步熟悉proteus,protel,word软件功能和使用方法。
2.对课程设计成果的要求〔包括图表(或实物)等硬件要求〕:
①设计电路,安装调试或仿真,分析实验结果;
②并写出设计说明书,语言流畅简洁,文字不得少于3500字;
③使用Protel软件绘出原理图(SCH)和印制电路板(PCB),器件的选择要有计算依据。
3.主要参考文献:
[1]《单片机基础实用教程》.尹念东.中国地质大学出版社.2005
[2]《数字电路与数字电子技术》.岳怡.西北工业大学出版社.2004
[3]《单片级高级语言C51应用程序设计》.徐爱钧.电子工业出版社.2001
4.课程设计工作进度计划:
序号
起迄日期
工作内容
1
12.15-12.16
方案设计
2
12.17-12.18
电路设计
3
12.19-12.21
软件设计
4
12.22-12.23
软件联调
5
12.24-12.25
系统仿真
6
12.26-12.28
完成报告
主指导教师
日期:
2013年12月28日
1.绪论
随着时代的发展,控制智能化,仪器小型化,功耗微量化得到广泛关注。
单片机控制系统无疑在这些忙面起到了举足轻重的作用。
单片机的应用系统设计业已成为新的技术热点,其中数字温度计就是一个典型的例子。
随着人们生活水平的提高,人们对各种测量器具的智能化、多功能化提出了更高的要求,而电子技术的飞速发展使得单片机在各种测量产品领域中的应用越来越广泛。
把以单片机为核心,开发出来的各种测量及控制系统作为测量产品的主要部分,使各种测量产品更具智能化、拥有更多功能、便于人们操作和使用,更具时代感,这是测量产品的发展方向和趋势所在。
这就要求我们的生产具有自动控制系统,自动控制主要是由计算机的离线控制和在线控制来实现的,离线应用包括利用计算机实现对控制系统总体的分析、设计、仿真及建模等工作;在线应用就是以计算机代替常规的模拟或数字控制电路使控制系统“软化”,使计算机位于其中,并成为控制系统、测试系统及信号处理系统的一个组成部分,这类控制由于计算机要身处其中,因此对计算机有体积小、功耗低、价格低廉以及控制功能强有很高的要求,为满足这些要求,应当使用单片机。
单片机在电子产品中应用的广泛,在很多的电子产品中也用到了温度检测和温度控制,但那些温度检测与控制电路通常较复杂,成本也高,本设计提供了一种低成本的利用单片机多余I/O口实现的温度检测电路,该电路非常简单,且易于实现,并且适用于几乎所有类型的单片机。
2.设计目的
温度作为一个重要的物理量,是工业生产过程中最普遍、最重要的工艺参数之一,所以温度测量技术和测量仪器的研究是一个重要的课题。
随着时代的进步和发展,单片机技术已经伸入到各个领域,基于单片机数字温度计与传统的温度计相比,具有读数方便,测温范围广,其输出温度采用数字显示。
本次设计目是利用51单片机及温度传感器设计一个温度采集系统,通过学过的单片机和数字电路及面向对象编程等课程的知识设计。
要求的功能是能通过温度传感器采集的数据在液晶屏显示,采集的温度达一定的精度。
3.设计正文
系统的硬件电路包括微控制器部分(主机),温度检测,显示三个主要部分。
温度检测部分采用DS18B20这个芯片大大简化了温度检测模块的设计,它无需A/D转换,可直接将测得的温度值以二进制形式输出。
单片机主要控制LCD显示器显示正确的温度值,LCD显示器实现显示功能。
系统结构框图和硬件原理图分别如图2.1所示。
DS18B20是美国达拉斯半导体公司生产的新型温度检测器件,它是单片结构,无需外加A/D即可输出数字量,通讯采用单线制,同时该通讯线还可兼作电源线,即具有寄生电源模式。
它具有体积小、精度易保证、无需标定等特点,特别适合与单片机合用构成智能温度检测及控制系统。
4.系统各模块介绍
4.1AT89C52芯片介绍
本设计以AT89C52单片机系统为核心。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
AT89C52的引脚图如图4.1所示。
图4.1AT89C52芯片引脚图
0口:
P0口是一个8位漏极开路的双向I/O口。
作为输出口,每位能驱动8个TTL逻辑电平。
对P0端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。
在这种模式下,P0具有内部上拉电阻。
在flash编
程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。
程序校时,需要外部上拉电阻。
P1口:
P1口是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。
对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
P2口:
P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。
对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX@DPTR)时,P2口送出高八位地址。
P3口:
P3口是一个具有内部上拉电阻的8位双向I/O口,p2输出缓冲器能驱动4个TT逻辑电平。
对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
P3口亦作为AT89C52特殊功能(第二功能)使用AT89C52的P3口的第二功能表如表4.2所示。
脚号
第二功能
P3.0
RXD(串行输入)
P3.1
TXD(串行输出)
P3.2
INT0(外部中断0)
P3.3
INT0(外部中断0)
P3.4
T0(定时器0外部输入)
P3.5
T1(定时器1外部输入)
P3.6
WR(外部数据存储器写选通)
P3.7
RD(外部数据存储器写选通)
表4.2AT89C52的P3口的第二功能表
RST:
复位输入。
晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。
看门狗计时完成后,RST脚输出96个晶振周期的高电平。
特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。
DISRTO默认状态下,复位高电平有效。
ALE/PROG:
地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。
在flash编程时,此引脚(PROG)也用作编程输入脉冲。
在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。
然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。
PSEN:
外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。
当AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。
EA/VPP:
访问外部程序存储器控制信号。
为使能从0000H到FFFFH的外部程序存储器读取指令,EA必须接GND。
为了执行内部程序指令,EA应该接VCC。
在flash编程期间,EA也接收12V编程电源(VPP)。
XTAL1:
振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2:
振荡器反相放大器的输出端。
(2)晶振电路
晶振电路是单片机的最小系统的组成部分。
典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)/12MHz(产生精确的uS级时歇,方便定时操作)。
特别注意:
对于31脚(EA/Vpp),当接高电平时,单片机在复位后从内部ROM的0000H开始执行;当接低电平时,复位后直接从外部ROM的0000H开始执行。
(3)复位电路
复位电路也是单片机的最小系统的组成部分。
当单片机系统在运行中,受到环境干扰出现程序执行错乱的时候,按下复位按钮内部的程序自动从头开始执行。
复位电路的原理是单片机RST引脚接收到2us以上的电平信号,只要保证电容的充放电时间大于2US,即可实现复位,所以电路中的电容值是可以改变的。
按键按下系统复位,是电容处于一个短路电路中,释放了所有的电能,电阻两端的电压增加引起的。
单片机最小系统如图4.3所示。
图4.3单片机最小系统图
4.2温度检测电路设计
DS18B20是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:
(1)独特的单线接口仅需一个端口引脚进行通讯
(2)简单的多点分布应用
(3)无需外部器件
(4)可通过数据线供电
(5)零待机功耗
(6)测温范围-55~+125℃,以0.5℃递增。
华氏器件-67~+2570F,以0.90F递增
(7)温度以9位数字量读出
(8)温度数字量转换时间200ms(典型值)
(9)用户可定义的非易失性温度报警设置
(10)报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件。
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
D电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引脚。
当工作于寄生电源时,次引脚必须接地。
测温电路:
如图4.4DS18B20测温电路
图4.4DS18B20测温电路
DS18B20的测温原理如图4.5所示,图中低温度系数晶振的振荡频率受温度的影响很小用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温图5.3.3中的斜率累加器用于补偿和修正测温过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。
另外,由于DS18B20单线通信功能是分时完成的,有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的各种操作必须按协议进行。
操作协议为:
初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
在正常测温情况下,DS1820的测温分辨力为0.5℃。
图4.5测温原理
4.3显示电路
1602LCD液晶屏为5V电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字。
液晶1、2端为电源;15、16为背光电源;为防止直接加5V而烧坏背光灯,在15脚串联一个1K电阻晶3端为液晶对比度调节端,通过一个10K的电位器来调节液晶显示对比度。
用于限流。
液液晶4端为向液晶控制器写数据/写命令选择端,接单片机P1.0端口。
液晶5端为读/写选择端,因为我们不需要从液晶中读取数据,只向其写入命令和数据,因此此端始终选择为写状态,即低电平接地。
液晶6端为使能信号,是操作必须的信号,接单片机的P1.1口。
1602LCD液晶屏显示电路如图4.6所示:
图4.6显示电路
5.系统软件设计
5.1主程序流程图
主程序流程图如图5.1
图5.1主程序流程图
5.2温度检测数据读取图
温度检测数据读取图如图5.2
图5.2温度程序读取图
6.编程与仿真
6.1Keil软件
KeilC51是美国Keilsoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。
运行Keil需要win98、NT、win2000、winXP、win7等操作系统。
2009年2月发布的KeiluVision4,KeiluVision4引入灵活的窗口管理系统,使开发人员能够使用多台监视器,并提供了视觉上的表面对窗口位置的完全控制的任何地方,新的用户界面可以更好地利用屏幕空间和更有效地组织多个窗口,提供一个整洁、高效的环境来开发应用程序。
6.2仿真软件Proteus
Proteus软件是Labcenterelectronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
它是目前最好的仿真单片机及外围器件的工具。
虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。
在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。
6.3仿真界面
仿真如图所示:
图6.1为温度检测部分;图6.2为显示部分。
图6.1温度检测部分
图6.2显示部分
由图6.1和图6.2可以看出检测温度与显示温度一致。
电路仿真成功。
7.结论
本次课设对我来说是一次难得的经历,首先是第一次接触了仿真软件Protel,在使用时经历了很多次失败,因为这款软件与以前使用的各种软件有很多不同,使用时不停出错,接线时由于元件放置不合理而接的杂乱无章;输入源程序时还较为顺利,显示结果比较满意。
其次是程序设计,我们在参考别人成功先例的基础上根据自己设计的需要编制程序,我的收获是,编程一定要细心,针对每一个细节,稍有疏忽,程序就不能正常工作。
我前期花了一些时间专门学习DS18B20的工作原理的时序图。
在这次的实践与学习中,尽管期间困难重重,但我还是从中学习了不少新的知识与技能和解决困难的方法,也终于体验到了经历困难到最终获得成功的那种无以言表的喜悦之情总之,本次课设是我收获最多的一次。
参考文献
[1]温度传感器和一线总线协议.林继鹏.传感器技术.2002
[2]《单总线数字温度传感器的自动识别技术》.罗文广.电子产品世界.2002
[3]《单片机基础实用教程》.尹念东.中国地质大学出版社.2005
[4]《数字电路与数字电子技术》.岳怡.西北工业大学出版社.2004
[5]《单片级高级语言C51应用程序设计》.徐爱钧.电子工业出版社.2001
附录
源程序
#include//头文件
#defineucharunsignedchar
#defineuintunsignedint
sbitrs=P2^0;
sbitlcden=P2^1;//液晶使能端
sbitDATA=P3^7;//DS18B20接入口
ucharFLAG_DIS=0;
ucharbai_18b20,shi_18b20,ge_18b20,num;//定义变量
bitflag_Negative_number;//负数标志
ucharcodetable[]={"tempreture:
"};//提示语
/*****一毫秒定时*****/
voiddelay_ms(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*延时子函数*/
voiddelay(uintnum)
{
while(num--);
}
/*液晶写命令*/
voidwrite_lcd_com(ucharcom)
{
rs=0;
lcden=0;
P0=com;
delay_ms
(1);
lcden=1;
delay_ms
(1);
lcden=0;
}
/*液晶写数据*/
voidwrite_lcd_date(uchardate)
{
rs=1;
lcden=0;
P0=date;
delay_ms
(1);
lcden=1;
delay_ms
(1);
lcden=0;
}
/*液晶初始化程序*/
voidlcd_init()
{
write_lcd_com(0x38);
write_lcd_com(0x0c);
write_lcd_com(0x06);
write_lcd_com(0x01);
}
/*************DS18b20温度传感器函数*********************/
voidInit_DS18B20(void)//传感器初始化
{
ucharx=0;
DATA=1;//DQ复位
delay(10);//稍做延时
DATA=0;//单片机将DQ拉低
delay(80);//精确延时大于480us//450
DATA=1;//拉高总线
delay(20);
x=DATA;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay(30);
}
/*温度传感器读一个字节*/
ReadOneChar(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DATA=0;//给脉冲信号
dat>>=1;
DATA=1;//给脉冲信号
if(DATA)
dat|=0x80;
delay(8);
}
return(dat);
}
/*温度传感器写一个字节*/
voidWriteOneChar(uchardat)
{
uchari=0;
for(i=8;i>0;i--)
{
DATA=0;
DATA=dat&0x01;
delay(10);
DATA=1;
dat>>=1;
}
delay(8);
}
/*读取温度传感器温度*/
intReadTemperature(void)
{
uchara=0;
ucharb=0;
intt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
t=b;
t<<=8;
t=t|a;
if(b&0x80)
{
t=~t+1;
flag_Negative_number=1;
}
else{flag_Negative_number=0;}
tt=t*0.0625;
t=tt*10+0.5;
return(t);
}
/*液晶显示温度*/
voiddis_D18B20(void)
{
inttemp;
temp=ReadTemperature();//读温度
bai_18b20=temp%1000/100;//显示十位
shi_18b20=temp%100/10;//显示个位
ge_18b20=temp%10;//显示十分位
if(flag_Negative_number)//负数
{
if(bai_18b20==0)//十位为0,则不显示十位
{
write_lcd_com(0x80+0x40);
write_lcd_date(0x2D);
write_lcd_date(0x30+shi_18b20);
write_lcd_date(0x30+ge_18b20);
write_lcd_date(0xDF);
write_lcd_date(0x43);
}
else
{
write_lcd_com(0x80+0x40);
write_lcd_date(0x2D);
write_lcd_date(0x30+bai_18b20);
write_lcd_date(0x30+shi_18b20);
write_lcd_date(0xDF);
write_lcd_date(0x43);
}
}
else//正数
{
if(bai_18b20==0)//十位为0,则不显示十位
{
write_lcd_com(0x80+0x40);
write_lcd_date(0x30+shi_18b20);
write_lcd_date(0x2E);
write_lcd_date(0x30+ge_18b20);
write_lcd_date(0xDF);
write_lcd_date(0x43);
}