单片机原理及应用课程设计温度测量Word格式文档下载.docx
- 文档编号:917613
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:20
- 大小:87.15KB
单片机原理及应用课程设计温度测量Word格式文档下载.docx
《单片机原理及应用课程设计温度测量Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机原理及应用课程设计温度测量Word格式文档下载.docx(20页珍藏版)》请在冰点文库上搜索。
0.5℃。
(2)用1602液晶屏来显示温度值。
(3)超过警戒值(自己定义)要报警提示。
二、系统总体设计方案
本系统是一个基于单片机AT89S51的数字温度计的设计,用来测量环境温度,测量范围为-20℃—70℃度。
整个设计系统分为4部分:
单片机控制、温度传感器、数码显示以及键盘控制电路。
整个设计是以AT89S52为核心,通过数字温度传感器DS18B20来实现环境温度的采集和A/D转换,同时因其输出为数字形式,且为串行输出,这就方便了单片机进行数据处理,但同时也对编程提出了更高的要求。
单片机把采集到的温度进行相应的转换后,使之能够方便地在数码管上输出。
采用1602液晶屏显示温度。
三、系统分析与设计
1.基本工作原理
以AT89C51作为核心控制温度传感器DS18B20进行实时温度检测并显示,其能够测量环境温度,根据此温度设定上下限报警温度。
所以,我们在电路设置了三个按钮,其中两个按钮作于调控温度的值的大小,剩下的一个是设置按钮,利用它来切换到调控温度最高值与最低值的界面。
当温度值达到上限或下限值甚至超多它,马上触发报警系统,二极管会闪烁,发声器发声。
温度计工作原理图
2.基本框图及各个部分的组成
本电路的小系统主要由四部分组成,复位电路、脉冲电路、检温电路、显示电路。
2.1复位电路:
计算机在启动运行的时候都需要复位,使中央处理器CPU和系统中的其他部件都处于一个确定的初始状态,并且从这个初始状态开始工作。
单片机的复位是靠外部电路实现的,51单片机有一个复位引脚RST,高电平有效。
最常用的复位电路有两种一种是有极性电容和一个电阻串联,电容接电源端,电阻的一端接地,电容和电阻的公共端接复位端口;
另外一种方法是一个按钮和极性电容并联,电容正极与按钮的公共端接复位电路,另外一个公共端接地。
在焊接硬件的时候我们是采用了第一种方法接复位电路的。
2.2脉冲电路:
计算机的正常运行是需要脉冲才能正常工作,一个12MHZ的晶振和两个电容并接一起接到单片机XTAL1和XTAL2的端口,根据自己程序的需要我们可以选择产生脉冲的大小,产生脉冲的大小与晶振和电容有关。
我们选择的是一个12MHZ的晶振和22pf的电容。
2.3检温电路:
DS18B20数字温度传感器
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的外形及管脚排列如下图1:
DS18B20引脚定义:
(1)DQ为数字信号输入/输出端;
(2)GND为电源地;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
DS18B20的管脚图
2.4测温工作:
温度传感器DS18B20连接时I/O口上要接一个上拉5K左右的电阻,这样可以保证温传感器工作时候的精度,还有抗干扰的作用。
温度传感器检测外界的温度,得到的数据,将进行数据的转换,转换完成的温度数字将会保留,然后在液晶上显示,同时也会与程序设计的温度的上限和下限进行比较,若超出设定的上限和下限的温度值,就报警。
显示电路:
第1脚:
VSS接地
第2脚:
VDD接5V正电源。
第3脚:
为液晶显示器对比度调整端,接电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K欧姆的电位器来调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时,可以写入指令或者显示地址,当RS为低电平RW为高电平时,可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15~16脚:
屏幕背光引脚
1602与单片机的I/O口电路连接如图5-5所示:
3.完整温度测量设计图:
4.程序流程图:
四、源码清单
#include"
reg52.h"
absacc.h"
unsignedcharcodetab[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X40};
sbitDQ=0xb7;
sbitP07=0x87;
sbitRED=0x97;
sbitGREEN=0x96;
sbitSET=0x90;
sbitNEXT=0x91;
sbitREDUCE=0x92;
sbitADD=0x93;
unsignedchartempL=0;
unsignedchartempH=0;
floattemperature;
floattemperatureH=35,temperatureL=0;
inttH=1,tL=1;
//报警状态,1为关闭
intm,k=1,l,keyon,keytype,out=0;
voiddelay(unsignedinttime)
{
unsignedintn;
n=0;
while(n<
time)n++;
return;
}
voiddisplay(floatk)
{
if(k>
=0)
{
P2=0xf7;
P0=tab[(int)(k/100)];
delay(250);
P0=0x00;
}
else
k=-k;
P2=0xf7;
P0=0x40;
delay(250);
P0=0x00;
P2=0xfb;
P0=tab[(int)(k/10)];
P2=0xfd;
P0=tab[((int)k)%10];
P07=1;
P2=0xfe;
P0=tab[((int)(k*10))%10];
Init_DS18B20(void)
unsignedcharx=0;
DQ=1;
delay(8);
DQ=0;
delay(85);
delay(14);
x=DQ;
delay(20);
ReadOneChar(void)
unsignedchari=0;
unsignedchardat=0;
for(i=8;
i>
0;
i--)
delay
(1);
DQ=0;
dat>
>
=1;
DQ=1;
if(DQ)dat|=0x80;
delay(4);
return(dat);
WriteOneChar(unsignedchardat)
{
DQ=dat&
0x01;
delay(5);
delay(4);
ReadTemperature(void)
charctempL,ctempH;
Init_DS18B20();
WriteOneChar(0xcc);
WriteOneChar(0x44);
delay(125);
WriteOneChar(0xbe);
tempL=ReadOneChar();
tempH=ReadOneChar();
if(tempH<
0xf8)
temperature=((tempH*256)+tempL)*0.0625;
ctempL=tempL;
ctempH=tempH;
temperature=(((~ctempH)*256)+(~ctempL)+1)*0.0625;
temperature=-temperature;
delay(200);
return(temperature);
voidDisplay2()
if(m==0||m==1)
P0=0x76;
delay(70);
if(m==0&
&
k==-1)delay(70);
if(tH==1)
P0=0x71;
P0=0x3f;
if(m==1&
k==-1)delay(100);
if(temperatureH>
=0)
P0=tab[(int)(temperatureH/10)];
P0=tab[(int)(temperatureH)%10];
P0=0x40;
P0=tab[(int)(-temperatureH)%10];
elseif(m==2||m==3)
P0=0x38;
if(m==2&
else
if(tL==1)
if(m==3&
if(temperatureL>
P0=tab[(int)(temperatureL/10)];
P0=tab[(int)(temperatureL)%10];
P0=tab[(int)(-temperatureL)%10];
if(l==200){k=-k;
l=0;
l++;
voidseting()
if(SET==1&
NEXT==1&
REDUCE==1&
ADD==1);
keyon=1;
if(SET==0)keytype=0;
if(NEXT==0)keytype=1;
if(REDUCE==0)keytype=2;
if(ADD==0)keytype=3;
if(keyon==1&
SET==1&
ADD==1)
if(keytype==1)
if(m>
=3)m=0;
elsem++;
if(keytype==2)
if(m==0)tH=-tH;
if(m==1)
(temperatureL+1))temperatureH--;
elsetemperatureH=99;
if(m==2)tL=-tL;
if(m==3)
-9)temperatureL--;
elsetemperatureL=(temperatureH-1);
if(keytype==3)
if(temperatureH<
99)temperatureH++;
elsetemperatureH=(temperatureL+1);
if(temperatureL<
(temperatureH-1))temperatureL++;
elsetemperatureL=-9;
if(keytype==0)
keyon=0;
keytype=4;
out=1;
voidmain()
P1=0XFF;
while
(1)
ReadTemperature();
display(temperature);
if(SET==0)
out=0;
delay(300);
while(SET==0);
m=0;
l=0;
Display2();
seting();
if(out==1)break;
if(tH==-1&
temperature>
=temperatureH)RED=0;
elseRED=1;
if(tL==-1&
temperature<
=temperatureL)GREEN=0;
elseGREEN=1;
五、改进意见与收获体会
经过将两周的单片机课程设计,终于完成了我们的数字温度计的设计,虽然没有完全达到设计要求,但从心底里说,还是高兴的,毕竟这次设计把实物都做了出来,高兴之余不得不深思呀!
在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,举个例子,以前写的那几次,数据加减时,我用的都是BCD码,这一次,我全部用的都是16进制的数直接加减,显示处理时在用对不同的位,求商或求余,感觉效果比较好。
还有时序的问题,通过这次的设计我明白了时序才真正是数字芯片的灵魂,所有的程序我们都可以通过对其时序的理解来实现对其操作,同时体会到了单总线结构的魅力。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
最重要的是本次设计是三个人一组,让我们有种组队做单片机开发项目的感觉,毕竟一个项目只靠一个人是很难完成的,今后我们做的项目肯定要多人协作。
在这次设计过程中培养了我们的团队协作精神,便于我们走到工作岗位后能很快适应工作环境。
六、主要参考资料
[1]DS18b20数据手册。
[2]求是科技编著8051系列单片机C程序设计完全手册北京:
人民邮电出版社,2006
[3]余发山,王福忠.单片机原理及应用技术.徐州:
中国矿业大学出版社,2003
组员分工:
于觐嘉:
原理图设计与程序编写
吴达盛:
实验报告和ppt的制作
王凯:
资料收集和后期调试
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 原理 应用 课程设计 温度 测量