单片机原理及系统课程设计报告:基于89C51单片机的数字温度计设计

勿忘初心 范文 报告范文
精选回答

单片机原理及系统课程设计报告:基于89C51单片机的数字温度计设计本文简介:单片机原理及系统课程设计报告基于89C51单片机的数字温度计设计1引言本次课程设计的目的是设计一种数字温度计,在设计方法要遵循模块化的设计方法,该数字温度计主要应用于环境的温度检测,所以需要以下几点要求:(1)测量的温度的范围不宜过大,保证同时能够测量零上温度和零下温度。(2)误差应当小于物理温度计

单片机原理及系统课程设计报告:基于89C51单片机的数字温度计设计本文内容:

单片机原理及系统课程设计报告

基于89C51单片机的数字温度计设计

1

引言

本次课程设计的目的是设计一种数字温度计,在设计方法要遵循模块化的设计方法,该数字温度计主要应用于环境的温度检测,所以需要以下几点要求:

(1)测量的温度的范围不宜过大,保证同时能够测量零上温度和零下温度。

(2)误差应当小于物理温度计由于观察造成的误差。

(3)该温度计的数字界面要友好直观在温度计出现错误时要能够报错。

2

设计方案及原理说明

2.1设计方案

本次可程设计的课题是数字温度计,我们的重点是温度的采集即测温电路。由此可以得到以下两个方案:

方案一:通过利用热敏电阻的感温效应,将随被测温度变化的电压或电流采集过来,进行A/D转换后,用单片机对其进行温度处理,在显示元件上显示。优点:所用的电子元件容易得到,单片机处理程序简单。缺点:电路过于复杂,精度较差,容易受到外界环境的影响。

方案二:使用DS18B20传感器。该传感器可以测量-55℃至125℃范围内的温度值,将采集的温度数据转换成16位二进制数,由单片机负责计算转换成相应温度值,并且通过显示元件上显示。优点;精度较高,电路设计较为简单,用到的电子元件较少。缺点:对与软件的要求比较高。综上,选择方案二更为合理。

2.2设计原理

有上述方案,我们可以将本次课程设计分为硬件设计和软件设计两部分。其中硬件电路又分为DS18B20传感器检测电路、1602LCD显示电路、包含复位电路及内部时钟电路的单片机控制电路。软件设计通过使用C语言编程,利用Keil

Uvision3对其进行编译并通过单片机开发板进行仿真。

该系统总的来说有三大模块构成,分别是传感器模块、显示模块以及单片机模块。其组成原理是这样的,单片机写入读取和控制传感器的命令,使DS18B20采集温度数据并将其传输到单片机后单片机负责把接收到的数字量经过数据的进制转换和相应的计算,并且将其送入到显示屏显示。为了能够显示信息,单片机还通过自行编写的程序来控制写入地址,写入数据及显示命令来达到在1602LCD显示屏上显示温度传感器检测到的温度的功能。设计框图如下图1所示。

晶振

复位电路

1602LCD

显示屏

DS18B20

传感器电路

AT89C51单片机

图1

数字温度计设计框图

3

数字温度计硬件电路设计

3.1数字温度计设计芯片选择

本次课程设计用到了89C51单片机、DS18B20温度传感器和1602LCD屏。

3.2数字温度计硬件连接方法及原理

该系统连接方法如下1602LCD

的DB口是双向的数据线与单片机P0口连接,用单片机P

2.1,P2.2

,P2.3来分别与1602LCD的RS、RW、E三个管脚连接,VDD接5V电源,VEE与VSS接地即可。传感器的DQ与单片机P3.3相连,晶振和复位电路不作说明,该系统连接图如图2所示

图2

数字温度计硬件原理连接图

该系统是基于这样的原理进行设计:首先因为DS18B20传感器采集的温度数据是以两个字节的数据存放,用DQ口串行传输并与单片机P3.3相连,通过这根线单片机读取数据和写入指令。数据进入单片机后经处理由P0口送入显示块DB口,因为单片机的P2.1,P2.2,P2.3与液晶屏的RS、RW、E相连以起到对液晶屏命令写入和数据读取的控制作用使液晶块实时读入命令和数据。

4

数字温度计软件设计

软件编写有三个模块,传感器温器度读取和液晶屏数据显示及单片机对采集来温度数据的计算。因为DS18B20温度传感器与单片机之间单总线串行传输,时序非常的重要,所以我们编写的程序时序为:传感器复位→发送存在脉冲→发送传感器存储器操作指令→执行数据读写指令周→传感器复位周而复始的做温度的采集。因为是单片测量在温度传感器进行测量流程图中跳过ROM指令,传感器流程序程图如附录A图(a)所示。1602LCD与单片机之间有八条数据线负责二者之间的通信。这里我们要注意D7口是作为忙碌位,当单片机在向液晶屏写入数据时必须当该位为检测为低电平时才可以写入数据。显示模块的程序流程图如附录图A(b)所示。综上主程序流程如下图3所示。源代码详见附录C。

Y

N

开始

液晶屏初始化

检测传感器是否存在?

传感器检测温度

液晶屏显示温度

显示报错信息显示

温度传感器初始化

图3

主程序流程图

在Keil

Uvision3上将编写的源代码录入生成后缀名为.c的文件,经过编译可将生成的.hex格式的文件。程序编译调试结果如附录B图所示。

6

数字温度计的硬件仿真调试及说明

将生成的.hex其烧入单片机后接通单片机电源,系统开始工作。刚开始界面会显示85℃约有1秒,后恢复正常测得室温下如图4所示。经过查询资料得因为在初始化时传感器的寄存器中会默认一个国定数值,经计算后显示正好为85,所以不可避免但能通过修改延时程序改变其显示时间。

图4

测量室内温度

由上图可知室内温度为24.13℃,为了证明其是否可以测量实时温度用手捏住DS18B20温度传感器,发现其温度有所变化,上升至32.05℃,如下图6所示。

图5

手捏住传感器的温度

当拔掉DS18B20温度传感器,重新启动传感器时,屏幕会显示报错信息,如下图7所示.。

图7

报错提示信息

经过认真分析,实物仿真正确,达到之前的设计要求。

7

总结

我在设计中遇到了这样的问题,在程序编译好之后无法在Protues软件中仿真电路中实现,但是程序却可以在实物电路中正常运行。经过查资料终于解决,原因是我所使用的传感器与仿真软件中的传感器型号相同,但是只能够行程序时序不同,导致仿真结果不能正确显示。我通过下载新版本的软件完成了对该设计的仿真,由于篇幅所限,这里未能展示出结果。

通过本次课程设计在设计方法上我有以下几点需要总结:首先,是模块化的设计思想,这一点对于我们以后的学习十分重要,因为无论工程有多么的庞大总是可以划分成很多小模块,只要将这些小模块挨个解决,庞大的工程问题也就迎刃而解。其次是对于这次课程设计本身的结果,我同样有很多收获。首先在设计中我认识了可以单片机控制的很多电子元器件比如1602LCD显示屏和DS18B20温度传感器,还有其工作的方式都有了很深的认识,其次我还明白了时序对于程序和电子元器件的重要性,如果在程序中时序处理不好轻则会影响单片机处理数据的速度,重则还会导致元件无法正常工作。就拿这次来说DS18B20温度传感器和单片机的通信就需要严格的时序控制,必须用延时程序严格控制延时的子程序。

参考文献

[1]

王思明,张金敏,苟军年,张鑫,杨乔礼.单片机原理及应用系统设计[M].

北京:科学出版社,2012

[2]

李群芳.单片机原理、接口及应用[M].北京:清华大学出版社,2005

[3]

彭为等.单片机典型系统设计实例精讲[M].北京:电子工业出版社,2006

[4]

杜洋,DS18B20传感器技术手册[J].深圳市安特凌科技有限公司,2007

[5]

杜洋,通用1602液晶显示模块使用手册[J].伟纳电子科技有限公司,2009

附录A

子程序流程图

Y

N

Y

Y

N

N

跳过ROM指令

检测存在脉冲

写入一位控制指令

是否写完

读出一位温度数据

是否读完

读温流程结束

写入显示模式设置

写入显示显示地址

写入显示符号

是否接收到报错信息

写入显示温度

报错

传感器复位

液晶屏初始化

图(a)

传感器模块流程图

图(b)

显示平模块流程图

附录B

程序调试结果图

图(a)

程序编译结果图

图(b)

程序链接接结果图

附录C

数字温度计程序源代码

#include

//包含单片机寄存器的头文件

#include

//包含_nop_()函数定义的头文件

unsigned

char

code

digit[10]={“0123456789“};

//定义字符数组显示数字

unsigned

char

code

Str[]={“Thermomenter

“};

//说明显示的是温度

unsigned

char

code

Error[]={“No

Sensor

check!“};

//说明没有检测到

unsigned

char

code

Temp[]={“Temp:“};

//说明显示的是温度

unsigned

char

code

Cent[]={“C“};

//温度单位

sbit

RS=P2^0;

//寄存器选择位,将RS位定义为P2.0引脚

sbit

RW=P2^1;

//读写选择位,将RW位定义为P2.1引脚

sbit

E=P2^2;

//使能信号位,将E位定义为P2.2引脚

sbit

BF=P0^7;

//忙碌标志位,,将BF位定义为P0.7引脚

void

delay1ms()

//延时功能函数延时1ms

{

unsigned

char

i,j;

for(i=0;i>=1;

_nop_();

//等待一个机器周期

DQ

=

1;

//将数据线拉高,为单片机检测DS18B20的输出作准备

for(time=0;time>=1;

//将dat中的各二进制位数据右移1位

}

for(time=0;time<4;time++);

//稍作延时,给硬件一点反应时间

}

void

display_error(void)

//显示没有检测到DS18B20的函数

{

unsigned

char

i;

WriteAddress(0x00);

//写显示地址,将在第1行第1列开始显示

i

=

0;

//从第一个字符开始显示

while(Error[i]

!=

\0

)

//只要没有写到结束标志,就继续写

{

WriteData(Error[i]);

//将字符常量写入LCD

i++;

//指向下一个字符

delaynms(100);

//延时100ms较长时间

}

while(1)

//进入死循环,等待查明原因

;

}

void

display_explain(void)

//显示说明函数

{

unsigned

char

i;

WriteAddress(0x00);

//写显示地址,将在第1行第1列开始显示

i

=

0;

//从第一个字符开始显示

while(Str[i]

!=

\0

)

//只要没有写到结束标志,就继续写

{

WriteData(Str[i]);

//将字符常量写入LCD

i++;

//指向下一个字符

delaynms(100);

}

}

void

display_symbol(void)

//显示温度符号

{

unsigned

char

i;

WriteAddress(0x40);

//写显示地址,将在第2行第1列开始显示

i

=

0;

//从第一个字符开始显示

while(Temp[i]

!=

\0

)

//只要没有写到结束标志,就继续写

{

WriteData(Temp[i]);

//将字符常量写入LCD

i++;

//指向下一个字符

delaynms(50);

//延时50ms给硬件一点反应时间

}

}

void

display_dot(void)

//显示温度的小数点

{

WriteAddress(0x49);

//写显示地址,将在第2行第10列开始显示

WriteData(

.

);

//将小数点的字符常量写入LCD

delaynms(50);

//延时50ms给硬件一点反应时间

}

void

display_minus();

(void)

{

WriteAddress(0x45);

//写显示地址,将在第2行第10列开始显示

WriteData(

-

);

//将小数点的字符常量写入LCD

delaynms(50);

//延时50ms给硬件一点反应时间

}

void

display_cent(void)

//显示温度的单位函数

{

unsigned

char

i;

WriteAddress(0x4c);

//写显示地址在第2行第13列

i

=

0;

//从第一个字符开始显示

while(Cent[i]

!=

\0

)

//只要没有写到结束标志,就继续写

{

WriteData(Cent[i]);

//将字符常量写入LCD

i++;

//指向下一个字符

delaynms(50);

//延时50ms给硬件一点反应时间

}

}

void

display_temp1(unsigned

char

x)

//整数输出部分

{

unsigned

char

j,k,l;

//j,k,l分别储存温度的百位、十位和个位

j=x/100;

//取百位

k=(x%100)/10;

//取十位

l=x%10;

//取个位

WriteAddress(0x46);

//写显示地址,将在第2行第7列开始显示

WriteData(digit[j]);

//将百位数字的字符常量写入LCD

WriteData(digit[k]);

//将十位数字的字符常量写入LCD

WriteData(digit[l]);

//将个位数字的字符常量写入LCD

delaynms(50);

//延时50ms给硬件一点反应时间

}

void

display_temp2(unsigned

char

x)

//显示小数部分函数

{

unsigned

char

m,n;

m=x/10;

n=x%10;

WriteAddress(0x4a);

//写显示地址,将在第2行第11列开始显示

WriteData(digit[m]);

//将小数部分的第一位数字字符常量写入LCD

WriteData(digit[n]);

delaynms(50);

//延时50ms给硬件一点反应时间

}

void

ReadyReadTemp(void)

//读温度准备函数

{

Init_DS18B20();

//将DS18B20初始化

WriteOneChar(0xCC);

//

跳过读序号列号的操作

WriteOneChar(0x44);

//

启动温度转换

for(time=0;time<100;time++);

//温度转换需要一点时间

Init_DS18B20();

//将DS18B20初始化

WriteOneChar(0xCC);

//跳过读序号列号的操作

WriteOneChar(0xBE);

//读取温度寄存器,前两个分别是温度低位和高位

}

void

main(void)

{

unsigned

char

TL;

//储存暂存器的温度低位

unsigned

char

TH;

//储存暂存器的温度高位

unsigned

char

TN;

//储存温度的整数部分

unsigned

char

TD;

//储存温度的小数部分

LcdInitiate();

//将液晶初始化程序包含显示模式的设置

delaynms(5);

//延时5ms给硬件一点反应时间

if(Init_DS18B20()==1)

display_error();

display_explain();

display_symbol();

//显示温度说明

display_dot();

//显示温度的小数点

display_cent();

//显示温度的单位

while(1)

//不断检测并显示温度

{

ReadyReadTemp();

//读温度准备包括传感器初始化和写入读温和温度转换命令

TL=ReadOneChar();

//先读的是温度值低位

TH=ReadOneChar();

//接着读的是温度值高位

if(TH

//实际温度值为(TH*256+TL)/16

//这样得出的是温度的整数部分,小数部分被舍去

TD=(TL%16)*100/16;

//计算温度的小数部分取整,

//这样得到的是温度小数部分的两位数字

display_temp1(TN);

//显示温度的整数部分

display_temp2(TD);

//显示温度的小数部分

delaynms(10);

}

else

//如果读的温度是零下温度

{

TH=~TH;//温度值高位取反

TL=~TL;

//温度值低位取反

TN=(TH*256+TL+1)/16;

//得出零下温度的整数值

TD=((TL+1)%16)*100/16;

//得出零下温度的小数值

display_temp1(TN);

//显示温度的整数部分

display_temp2(TD);

//显示温度的小数部分

display_minus();

//显示负号

delaynms(10);}

}

}

18

清雅淡然 2022-07-10 06:47:43

相关推荐

得意洋洋,反义词(得意洋洋的反义词)

1、得意洋洋的反义词有郁郁寡欢的,有空虚进取的书,有哭天抢地的,有郁郁寡欢的,有失意的,有垂头丧气的,有谦虚谨慎的,有黯然销魂的,有抑郁的。2、“得意”是中国成语,读作:dyyngyng,解释为:得意:明白意图...
展开详情

蚍蜉撼树是什么意思蚍(蚍蜉撼树是什么意思)

1、蜉蝣树(拼音pfhnsh)是中国成语,蜉蝣树(蜉蝣:一种大蚂蚁;Shake:摇动)比喻力量本来就很弱,但是你想摇动一个很强大的东西,就不能随心所欲了。这个成语一般用作主语、谓语、宾语,属于主谓式,含有贬义。...
展开详情

友谅怎么读(友谅)

1、智,友谅,朋友多听,说明和老实人、老实人、有见识的人交朋友是有益的。信任:忠诚和诚实。2、这句话出自先秦孔子《论语季氏篇》第十六章。全文是孔子说,“得者有三友,失者有三友。朋友,友谅,朋友多听,有益;友善一...
展开详情

飘逸的字体(飘逸)

1、飘逸是一个汉字,它的拼音是pio,解读为洒脱、自然、有特色;浮动;飘走。通常飘逸用来形容人:气质好,动作自然优美。2、出自唐图《二十四诗品飘逸》:“飘逸:落而欲去,修正不强,山上鹤是山上鹤,花顶云。钟会,高...
展开详情

回眸一笑是啥意思(回眸一笑什么意思)

1、回首微笑,拼音是humuy和ao,中国成语,意思是翻白眼,微笑。常用来形容女人妩媚的表情,诱惑人,引人入胜。出自唐白居易《长恨歌》。2、唐白居易《长恨歌》:“只要她转过头来笑一笑,就有一百个符咒在施,六宫的...
展开详情

精选推荐更多>

有志不在什么

是“有志不在年高”。
有志不在年高:yǒu zhì bù zài nián gāo,意是指年轻人只要有志向,成就不可限量,不在年纪大。也指只要有志向,岁数大了,也可以干出一番事业。
出处:明·许仲琳《封神演义》第二十三回:“樵子抚掌大笑不止,对子牙点头叹曰:‘有志不在年高,无谋空言百岁。’”
释义:樵子拍手大笑不停,对子牙点头叹道:“只要有远大志向,就算年纪大也没事,一个没有远大志向的人,即便活到很大的岁数也是虚度光阴。”
近义词:有志者,事竟成。

孟子认为造就人才的客观因素和主观因素分别是什么

孟子认为造就人才的客观因素是艰苦环境的磨炼,主观因素是思想斗争的折磨。在《生于忧患,死于安乐》中,孟子认为造就人才的客观条件是“苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为”。造就人才的主观条件是“人恒过,然后能改;困于心,衡于虑,而后作;征于色,发于声,而后喻。”
《生于忧患,死于安乐》选自《孟子·告子下》,是一篇论证严密、雄辩有力的说理散文。作者先列举六位经过贫困、挫折的磨炼而终于担当大任的人的事例,证明忧患可以激励人奋发有为,磨难可以促使人有新成就。接着,作者从一个人的发展和一个国家的兴亡两个不同的角度进一步论证忧患则生、安乐则亡的道理。

窥镜而自视的而的用法

“窥镜而自视”的“而”的用法表承接关系。
该句出自西汉·刘向《邹忌讽齐王纳谏》:“窥镜而自视,又弗如远甚。”
译文:(邹忌)再照着镜子看看自己,更觉得远远比不上人家。
赏析:《邹忌讽齐王纳谏》出自《战国策·齐策一》,讲述了战国时期齐国谋士邹忌劝说君主纳谏,使之广开言路,改良政治的故事。文章塑造了邹忌这样有自知之明,善于思考,勇于进谏的贤士形象。又表现了齐威王知错能改,从谏如流的明君形象,和革除弊端,改良政治的迫切愿望和巨大决心。告诉读者居上者只有广开言路,采纳群言,虚心接受批评意见并积极加以改正才有可能成功。

因往晓之的之什么意思

“因往晓之”中“之”是代词,代指人或事。出自《杞人忧天》。
原文节选:又有忧彼之所忧者,因往晓之,曰:“天,积气耳,亡处亡气。若屈伸呼吸,终日在天中行止,奈何忧崩坠乎?”其人曰:“天果积气,日月星宿,不当坠耶?”晓之者曰:“日月星宿,亦积气中之有光耀者,只使坠,亦不能有所中伤。”
译文:杞国有个人担忧天会塌地会陷,自己无处存身,便整天睡不好觉,吃不下饭。又有一个为他的忧愁而担心的人,就去开导他,说:“天不过是积聚的气体罢了,没有哪个地方没有空气的。你一举一动,一呼一吸,整天都在天空里活动,怎么还担心天会塌下来呢?”那个人说:“天如果是气体,日月星辰不就会坠落下来了吗?”开导他的人说:“日月星辰也是空气中发光的东西,即使掉下来,也不会伤害什么。”
这则寓言故事运用对话刻画人物,人物形象分明。故事短小,但寓意深刻,耐人寻味。文章基本以对话构成,言简意赅,逻辑严谨,读来文气贯通。这则寓言也成为后世文人常用的典故,如李白有诗曰“杞国有人忧天倾”,即出于此。
常见热点问答
热点搜索
1-20
21-40
41-60
61-80
81-100
101-120
121-140
141-160
161-180
181-200
作文大全
1-20
21-40
41-60
61-80
81-100
101-120
121-140
141-160
161-180
181-200