单片机原理及应用课程设计温度测量.docx

上传人:b****1 文档编号:687856 上传时间:2023-04-29 格式:DOCX 页数:20 大小:87.15KB
下载 相关 举报
单片机原理及应用课程设计温度测量.docx_第1页
第1页 / 共20页
单片机原理及应用课程设计温度测量.docx_第2页
第2页 / 共20页
单片机原理及应用课程设计温度测量.docx_第3页
第3页 / 共20页
单片机原理及应用课程设计温度测量.docx_第4页
第4页 / 共20页
单片机原理及应用课程设计温度测量.docx_第5页
第5页 / 共20页
单片机原理及应用课程设计温度测量.docx_第6页
第6页 / 共20页
单片机原理及应用课程设计温度测量.docx_第7页
第7页 / 共20页
单片机原理及应用课程设计温度测量.docx_第8页
第8页 / 共20页
单片机原理及应用课程设计温度测量.docx_第9页
第9页 / 共20页
单片机原理及应用课程设计温度测量.docx_第10页
第10页 / 共20页
单片机原理及应用课程设计温度测量.docx_第11页
第11页 / 共20页
单片机原理及应用课程设计温度测量.docx_第12页
第12页 / 共20页
单片机原理及应用课程设计温度测量.docx_第13页
第13页 / 共20页
单片机原理及应用课程设计温度测量.docx_第14页
第14页 / 共20页
单片机原理及应用课程设计温度测量.docx_第15页
第15页 / 共20页
单片机原理及应用课程设计温度测量.docx_第16页
第16页 / 共20页
单片机原理及应用课程设计温度测量.docx_第17页
第17页 / 共20页
单片机原理及应用课程设计温度测量.docx_第18页
第18页 / 共20页
单片机原理及应用课程设计温度测量.docx_第19页
第19页 / 共20页
单片机原理及应用课程设计温度测量.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

单片机原理及应用课程设计温度测量.docx

《单片机原理及应用课程设计温度测量.docx》由会员分享,可在线阅读,更多相关《单片机原理及应用课程设计温度测量.docx(20页珍藏版)》请在冰点文库上搜索。

单片机原理及应用课程设计温度测量.docx

单片机原理及应用课程设计温度测量

成绩

信息工程学院

课程设计说明书(论文)

 

题目:

温度测量

课程名称:

单片机原理及应用课程设计

专业:

电子信息工程

班级:

电信0902

 

设计起止时间:

年月日至年月日

目录

一、设计功能要求3

二、系统总体设计方案3

三、系统分析与设计3

四、源码清单3

五、改进意见与收获体会3

六、主要参考资料4

 

一、设计功能要求

采用数字式温度传感器为检测器件,进行单点温度检测。

用数码管直接显示温度值,微机系统作为数字温度计的控制系统。

1.基本要求:

(1)检测的温度范围:

-20℃~70℃,检测分辨率

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"

#include"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

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)];

delay(250);

P0=0x00;

P2=0xfd;

P0=tab[((int)k)%10];

P07=1;

delay(250);

P0=0x00;

P2=0xfe;

P0=tab[((int)(k*10))%10];

delay(250);

P0=0x00;

}

Init_DS18B20(void)

{

unsignedcharx=0;

DQ=1;

delay(8);

DQ=0;

delay(85);

DQ=1;

delay(14);

x=DQ;

delay(20);

}

ReadOneChar(void)

{

unsignedchari=0;

unsignedchardat=0;

for(i=8;i>0;i--)

{

DQ=1;

delay

(1);

DQ=0;

dat>>=1;

DQ=1;

if(DQ)dat|=0x80;

delay(4);

}

return(dat);

}

WriteOneChar(unsignedchardat)

{

unsignedchari=0;

for(i=8;i>0;i--)

{

DQ=0;

DQ=dat&0x01;

delay(5);

DQ=1;

dat>>=1;

}

delay(4);

}

ReadTemperature(void)

{

charctempL,ctempH;

Init_DS18B20();

WriteOneChar(0xcc);

WriteOneChar(0x44);

delay(125);

Init_DS18B20();

WriteOneChar(0xcc);

WriteOneChar(0xbe);

tempL=ReadOneChar();

tempH=ReadOneChar();

if(tempH<0xf8)

temperature=((tempH*256)+tempL)*0.0625;

else

{

ctempL=tempL;

ctempH=tempH;

temperature=(((~ctempH)*256)+(~ctempL)+1)*0.0625;

temperature=-temperature;

}

delay(200);

return(temperature);

}

voidDisplay2()

{

if(m==0||m==1)

{

P2=0xf7;

P0=0x76;

delay(70);

P0=0x00;

if(m==0&&k==-1)delay(70);

else

{

if(tH==1)

{

P2=0xfb;

P0=0x71;

delay(70);

P0=0x00;

}

else

{

P2=0xfb;

P0=0x3f;

delay(70);

P0=0x00;

}

}

if(m==1&&k==-1)delay(100);

else

{

if(temperatureH>=0)

{

P2=0xfd;

P0=tab[(int)(temperatureH/10)];

delay(70);

P0=0x00;

P2=0xfe;

P0=tab[(int)(temperatureH)%10];

delay(70);

P0=0x00;

}

else

{

P2=0xfd;

P0=0x40;

delay(70);

P0=0x00;

P2=0xfe;

P0=tab[(int)(-temperatureH)%10];

delay(70);

P0=0x00;

}

}

}

elseif(m==2||m==3)

{

P2=0xf7;

P0=0x38;

delay(70);

P0=0x00;

if(m==2&&k==-1)delay(70);

else

{

if(tL==1)

{

P2=0xfb;

P0=0x71;

delay(70);

P0=0x00;

}

else

{

P2=0xfb;

P0=0x3f;

delay(70);

P0=0x00;

}

}

if(m==3&&k==-1)delay(100);

else

{

if(temperatureL>=0)

{

P2=0xfd;

P0=tab[(int)(temperatureL/10)];

delay(70);

P0=0x00;

P2=0xfe;

P0=tab[(int)(temperatureL)%10];

delay(70);

P0=0x00;

}

else

{

P2=0xfd;

P0=0x40;

delay(70);

P0=0x00;

P2=0xfe;

P0=tab[(int)(-temperatureL)%10];

delay(70);

P0=0x00;

}

}

}

if(l==200){k=-k;l=0;}

l++;

}

voidseting()

{

if(SET==1&&NEXT==1&&REDUCE==1&&ADD==1);

else

{

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&&NEXT==1&&REDUCE==1&&ADD==1)

{

if(keytype==1)

{

if(m>=3)m=0;

elsem++;

}

if(keytype==2)

{

if(m==0)tH=-tH;

if(m==1)

{

if(temperatureH>(temperatureL+1))temperatureH--;

elsetemperatureH=99;

}

if(m==2)tL=-tL;

if(m==3)

{

if(temperatureL>-9)temperatureL--;

elsetemperatureL=(temperatureH-1);

}

}

if(keytype==3)

{

if(m==0)tH=-tH;

if(m==1)

{

if(temperatureH<99)temperatureH++;

elsetemperatureH=(temperatureL+1);

}

if(m==2)tL=-tL;

if(m==3)

{

if(temperatureL<(temperatureH-1))temperatureL++;

elsetemperatureL=-9;

}

}

if(keytype==0)

{

keyon=0;

keytype=4;

out=1;

}

keyon=0;

keytype=4;

}

}

voidmain()

{

P1=0XFF;

while

(1)

{

ReadTemperature();

display(temperature);

if(SET==0)

{

out=0;

delay(300);

while(SET==0);

m=0;

l=0;

keyon=0;

keytype=4;

while

(1)

{

Display2();

seting();

if(out==1)break;

}

delay(200);

while(SET==0);

}

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的制作

王凯:

资料收集和后期调试

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2