基于AT89C52单片机的数字温度测量及显示系统设计Word文件下载.docx

上传人:b****5 文档编号:19802981 上传时间:2023-01-10 格式:DOCX 页数:19 大小:185.42KB
下载 相关 举报
基于AT89C52单片机的数字温度测量及显示系统设计Word文件下载.docx_第1页
第1页 / 共19页
基于AT89C52单片机的数字温度测量及显示系统设计Word文件下载.docx_第2页
第2页 / 共19页
基于AT89C52单片机的数字温度测量及显示系统设计Word文件下载.docx_第3页
第3页 / 共19页
基于AT89C52单片机的数字温度测量及显示系统设计Word文件下载.docx_第4页
第4页 / 共19页
基于AT89C52单片机的数字温度测量及显示系统设计Word文件下载.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

基于AT89C52单片机的数字温度测量及显示系统设计Word文件下载.docx

《基于AT89C52单片机的数字温度测量及显示系统设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于AT89C52单片机的数字温度测量及显示系统设计Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。

基于AT89C52单片机的数字温度测量及显示系统设计Word文件下载.docx

1.2小组成员所做贡献

姓名

学号

主要贡献

张朔萌

140210103

主程序的编写以及程序的编译、调试

郭星星

140210119

设计电路并在Proteus中进行仿真模拟

石凤丹

140210115

子程序的编写

李丹丹

140210132

整体实验的设计以及实验报告的设计和编辑

2设计方案

2.1设计目的

单片机是单片微型计算机的简称,其具有体积小、可靠性高、功能强、灵活方便等优点,故可以广泛应用于各种领域。

其中数字温度计就是一个典型的例子。

本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确等特点,其输出温度采用数字显示,主要用于对测温要求较高的场所,该设计主要使用的元件有单片机AT89C52,测温传感器使用DS18B20和LCD1602液晶显示器。

2.2性能指标

(1)基本范围-50℃-110℃;

(2)精度为0.5℃;

(3)液晶LCD显示;

(4)可以设定温度的上下限以及报警功能。

3数字温度计系统的硬件设计

3.1数字温度计硬件框图

数字温度计系统硬件框图如图1所示。

图1系统的硬件框图

3.2AT89C52单片机

AT89C52单片机引脚配置图,如图2所示。

图2AT89C52单片机引脚配置图

3.3外围电路

AT89C52的时序就是CPU在执行指令时所需控制信号的时间顺序。

选择了内部时钟方式,即利用芯片内部的振荡器,然后在引脚XTAL1和XTAL2两端跨接晶体或陶瓷谐振器,就构成了稳定的自激振荡器,其发出的脉冲直接送入内部时钟电路。

外接晶振时,C1和C2值通常选择为30PF左右。

C1和C2对频率有微调作用。

晶体的频率范围可在1.2~12MHZ之间选择。

AT89C52的复位电路是按键电平复位电路,相当于按复位键后复位端通过电阻与Vcc电源接通。

复位是单片机的初始化操作。

单片机在启动运行时,都需要先复位,其作用是使CPU和系统中其他部件都处于一个确定的初始状态,并从这个状态开始工作。

显示电路采用LCD1602液晶显示器显示。

故障状态指示电路采用发光二级管以及蜂鸣器对运行方式进行指示,可清楚看到系统的故障状态。

测温传感器DS18B20可以直接读出被测温度值,采用三线制和单片机相连,少了外部的硬件电路,具有低成本和易使用的特点。

3.4总设计图

数字温度计系统的硬件总设计图如图3所示。

图3总设计图

4数字温度计系统的软件设计及系统整体流程

整个系统的功能是由硬件电路配合软件来实现的,从软件的功能不同,可以分为两类:

主程序和子程序。

主程序是整个软件的核心,专门用来协调各个执行模块和操作者的联系。

子程序是用来完成各种实质性的工作的,如读温度子程序、转换温度子程序、计算温度子程序等。

各执行模块规划好以后,就可以规划监控软件了。

首先要根据系统的总体功能选择一种最合适的主程序结构,然后根据实时性的条件,合理安排监控软件和执行软件之间的调度关系。

4.1总体流程图

数字温度计系统总体流程图如图4所示。

图4主流序流程图

4.2子程序流程图

数字温度计系统子程序主要包含:

读温度子程序、转换温度子程序、计算温度子程序。

(1)读温度子程序流程图

读温度子程序流程图如图5所示。

图5读温度子程序流程图

(2)转换温度子程序流程图

转换温度子程序流程图如图6所示。

图6转换温度子程序流程图

(3)计算温度子程序流程图

计算温度子程序流程图如图7所示。

图7计算温度子程序流程图

5仿真结果

(1)正常温度显示

温度计正常温度显示如图8所示。

图8正常温度显示

(2)报警温度显示

温度计报警温度显示如图9所示。

图9报警温度显示

6总结

通过这次单片机课程设计,不仅让我加深了解了单片机课本上所学的知识,更通过自己的动手设计,将课本知识与动手操作能力相结合,让我对单片机及其系统设计的认识更进一步。

在此次的课程设计中我学会了很多的东西。

经过自己努力,基本上完成了设计要求的内容,在系统可行性分析、原理图设计等方面都作了许多实际工作,取得了一些结果,同时也发现了许多不足。

对于本次的课程设计还有很大提升空间,目前仅完成的是基本功能实现,还有很多的扩展功能可以提升。

附录

1.参考文献:

1.王思明.单片机原理及应用系统设计[M].北京:

科学出版社,2012.

2.李广弟.单片机基础[M].北京:

北京航空航天大学出版社,1994.

3.艾德才.pentium/80486实用汇编语言程序设计[M].北京:

清华大学出版社。

2.源程序

//使用1602LCD显示DS18B20转换的温度值

#include<

reg52.H>

intrins.H>

math.H>

#defineucharunsignedchar

#defineuintunsignedint

sbitRS=P3^0;

//RS--数据/命令选择端(H/L)

sbitLCDEN=P3^2;

//使能端

sbitdeng=P1^6;

//超过温度限制指示灯

sbitbeep=P1^7;

//超过温度限制报警器

ucharhigh=30;

//最高温度

ucharlow=10;

//最低温度

unsignedcharr;

voiddelayUs()//短延时

{

_nop_();

}

voiddelayMs(uinta)//长延时

uinti,j;

for(i=a;

i>

0;

i--)

for(j=100;

j>

j--);

//第一行开始地址为0x80,第二行开始地址为0xc0;

voidwriteComm(ucharcomm)//写命令:

RS=0,RW=0;

RS=0;

P2=comm;

LCDEN=1;

delayUs();

LCDEN=0;

delayMs

(1);

voidwriteData(uchardat)//写数据:

RS=1,RW=00

{

RS=1;

P2=dat;

LCDEN=1;

//init()为初始化函数

//显示模式,固定指令为00111000=0x38,16*2显示,5*7点阵,8位数据接口

//显示开/关及光标设置00001100=0x0c

//指令1:

00001DCB:

D:

开显示/关显示(H/L);

C:

显示光标/不显示(H/L),B:

光标闪烁/不闪烁(H/L)

//指令2:

000001NS:

//N=1,当读/写一个字符后地址指针加1,且光标也加1;

N=0则相反

//S=1,当写一个字符,整屏显示左移(N=1)或右移(N=0),但光标不移动;

S=0,整屏不移动

voidinit()

writeComm(0x38);

//显示模式

writeComm(0x0c);

//开显示,关光标

writeComm(0x06);

//写字符后地址加1,光标加1

writeComm(0x01);

//清屏

voidwriteString(uchar*str,ucharlength)//写字符串函数

uchari;

for(i=0;

i<

length;

i++)

writeData(str[i]);

/*****************************DS18B20*******************************/

sbitds=P3^7;

//DS18B20的数据端

//初始化DS18B20

//让DS18B20一段相对长时间低电平,然后一段相对非常短时间高电平,即可启动

voiddsInit()

//对于11.0592MHz时钟,unsignedint型的i,作一个i++操作的时间大于为8us

unsignedinti;

ds=0;

i=100;

//拉低约800us,符合协议要求的480us以上

while(i>

0)i--;

ds=1;

//产生一个上升沿,进入等待应答状态

i=4;

voiddsWait()

while(ds);

while(~ds);

//检测到应答脉冲

while(i>

0)i--;

//向DS18B20读取一位数据

//读一位,让DS18B20一小周期低电平,然后两小周期高电平,

//之后DS18B20则会输出持续一段时间的一位数据

bitreadBit()

bitb;

i++;

//延时约8us,符合协议要求至少保持1us

//延时约16us,符合协议要求的至少延时15us以上

b=ds;

i=8;

//延时约64us,符合读时隙不低于60us要求

returnb;

}

//读取一字节数据,通过调用readBit()来实现

unsignedcharreadByte()

unsignedcharj,dat;

dat=0;

for(i=0;

i<

8;

j=readBit();

//最先读出的是最低位数据

dat=(j<

<

7)|(dat>

>

1);

returndat;

//向DS18B20写入一字节数据

voidwriteByte(unsignedchardat)

unsignedcharj;

for(j=0;

j<

8;

j++)

b=dat&

0x01;

dat>

=1;

//写"

1"

将DQ拉低15us后,在15us~60us内将DQ拉高,即完成写1

if(b)

//拉低约16us,符号要求15~60us内

//延时约64us,符合写时隙不低于60us要求

else//写"

0"

将DQ拉低60us~120us

//拉低约64us,符号要求

//整个写0时隙过程已经超过60us,这里就不用像写1那样,再延时64us了

//向DS18B20发送温度转换命令

voidsendChangeCmd()

dsInit();

//初始化DS18B20,无论什么命令,首先都要发起初始化

dsWait();

//等待DS18B20应答

//延时1ms,因为DS18B20会拉低DQ60~240us作为应答信号

writeByte(0xcc);

//写入跳过序列号命令字SkipRom

writeByte(0x44);

//写入温度转换命令字ConvertT

//向DS18B20发送读取数据命令

voidsendReadCmd()

writeByte(0xbe);

//写入读取数据令字ReadScratchpad

//获取当前温度值

intgetTmpValue()

unsignedinttmpvalue;

intvalue;

//存放温度数值

floatt;

unsignedcharlow,high;

sendReadCmd();

//连续读取两个字节数据

low=readByte();

high=readByte();

//将高低两个字节合成一个整形变量

//计算机中对于负数是利用补码来表示的

//若是负值,读取出来的数值是用补码表示的,可直接赋值给int型的value

tmpvalue=high;

tmpvalue<

=8;

tmpvalue|=low;

value=tmpvalue;

//使用DS18B20的默认分辨率12位,精确度为0.0625度,即读回数据的最低位代表0.0625度

t=value*0.0625;

//将它放大10倍,使显示时可显示小数点后一位,并对小数点后第二位进行4舍5入

//如t=11.0625,进行计数后,得到value=111,即11.1度

//如t=-11.0625,进行计数后,得到value=-111,即-11.1度

value=t*10+(value>

0?

0.5:

-0.5);

//大于0加0.5,小于0减0.5

returnvalue;

//显示温度

voiddisplay(intv)

unsignedcharcount;

unsignedchardatas[]={0,0,0,0};

unsignedinttmp=abs(v);

datas[0]=tmp/1000;

datas[1]=tmp%1000/100;

datas[2]=tmp%100/10;

datas[3]=tmp%10;

r=tmp/10;

writeComm(0xc0+3);

if(v<

0)

writeString("

-"

2);

else

+"

if(datas[0]!

=0)

writeData('

0'

+datas[0]);

for(count=1;

count!

=4;

count++)

+datas[count]);

if(count==2)

.'

);

/******************************报警*******************************/

voidBEEP()//报警

{if((r>

=high&

&

r<

129)||r<

low)

{

beep=!

beep;

deng=1;

{beep=1;

deng=0;

}

/******************************DS18B20*******************************/

voidmain()

{

uchartable[]="

NowTemperature"

;

sendChangeCmd();

init();

//液晶初始化程序

writeComm(0x80);

writeString(table,16);

while

(1)

delayMs(1000);

//温度转换时间需要750ms以上

writeComm(0xc0);

display(getTmpValue());

BEEP();

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1