单片机的数字温度计.docx

上传人:b****3 文档编号:6959211 上传时间:2023-05-10 格式:DOCX 页数:17 大小:222.18KB
下载 相关 举报
单片机的数字温度计.docx_第1页
第1页 / 共17页
单片机的数字温度计.docx_第2页
第2页 / 共17页
单片机的数字温度计.docx_第3页
第3页 / 共17页
单片机的数字温度计.docx_第4页
第4页 / 共17页
单片机的数字温度计.docx_第5页
第5页 / 共17页
单片机的数字温度计.docx_第6页
第6页 / 共17页
单片机的数字温度计.docx_第7页
第7页 / 共17页
单片机的数字温度计.docx_第8页
第8页 / 共17页
单片机的数字温度计.docx_第9页
第9页 / 共17页
单片机的数字温度计.docx_第10页
第10页 / 共17页
单片机的数字温度计.docx_第11页
第11页 / 共17页
单片机的数字温度计.docx_第12页
第12页 / 共17页
单片机的数字温度计.docx_第13页
第13页 / 共17页
单片机的数字温度计.docx_第14页
第14页 / 共17页
单片机的数字温度计.docx_第15页
第15页 / 共17页
单片机的数字温度计.docx_第16页
第16页 / 共17页
单片机的数字温度计.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

单片机的数字温度计.docx

《单片机的数字温度计.docx》由会员分享,可在线阅读,更多相关《单片机的数字温度计.docx(17页珍藏版)》请在冰点文库上搜索。

单片机的数字温度计.docx

单片机的数字温度计

单片机论文

 

题目:

数字温度计

专业:

应用电子技术

班级:

学号:

姓名:

指导老师:

绪论

单片机是指一个集成在一块芯片上的完整计算机系统。

尽管他的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:

CPU、内存、内部和外部总线系统,目前大部分还会具有外存。

同时集成诸如通讯接口、定时器,实时时钟等外围设备。

而现在最强大的单片机系统甚至可以将声音、图像、网络、复杂的输入输出系统集成在一块芯片上。

单片机也被称为微控制器(Microcontroler),是因为它最早被用在工业控制领域。

单片机由芯片内仅有CPU的专用处理器发展而来。

最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对提及要求严格的控制设备当中。

INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。

早期的单片机都是8位或4位的。

其中最成功的是INTEL的8031,因为简单可靠而性能不错获得了很大的好评。

此后在8031上发展出了MCS51系列单片机系统。

基于这一系统的单片机系统直到现在还在广泛使用。

随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。

90年代后随着消费电子产品大发展,单片机技术得到了巨大的提高。

随着INTELi960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。

而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍。

目前,高端的32位单片机主频已经超过300MHz,性能直追90年代中期的专用处理器,而普通的型号出厂价格跌落至1美元,最高端的型号也只有10美元。

当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上。

而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的Windows和Linux操作系统。

单片机比专用处理器最适合应用于嵌入式系统,因此它得到了最多的应用。

事实上单片机是世界上数量最多的计算机。

现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。

手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。

而个人电脑中也会有为数不少的单片机在工作。

汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!

51单片机的数字温度计

摘要:

本文首先描述系统硬件工作原理,并附以系统结构框图加以说明,着重介绍了本系统所应用的各硬件接口技术和各个接口模块的功能及工作过程,其次,详细阐述了程序的各个模块和实现过程。

本设计以数字集成电路技术为基础,单片机技术为核心。

本文编写的主导思想是软硬件相结合,以硬件为基础,来进行各功能模块的编写。

关键词:

AT89S52DS18B20LCD1602蜂鸣器

目前温度计主要有水银温度计,酒精温度计,红外温度计等等。

本文利用单片机实现数字温度计功能的主要内容是利用DS18B20采集温度,其中AT89S52是核心元件同时采用点阵式液晶显示数据。

系统的温度测量范围为-55℃~+125℃,精度0.5℃,另外具有温度校准功能。

本系统以单片机的C语言进行软件设计,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了。

系统通过点阵式液晶为载体显示数据,所以具有较直观的效果。

可以显示当前温度值、报警温度,具有过温报警报警和在线温度校准功能。

1.设计功能要求

数字温度计功能要求是用51单片机(AT89S52)和温度传感器(DS18B20)通过程序控制来实现在液晶屏LCD1602上显示当前温度值、报警温度值,并可以通过蜂鸣器模块在过温时报警。

2.设计思路

设计思路是根据普通温度计的功能,在单纯测量温度的基础上增加蜂鸣器模块实现温度报警功能,并可以设定报警温度值。

3.系统的硬件构成

系统以AT89S52单片机作为核心控制器件,外围主要有液晶显示LCD1602、DS18B20和蜂鸣器,均为串行通信器件,使得系统线路简单可靠性高。

系统结构框图1所示。

3.1单片机主控模块

AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。

使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。

片上Flash允许程序存储器在系统可编程,亦适于常规编程器。

在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

它主要负责各个模块的初始化工作;设置定时器、寄存器的初值;读取并处理来自温度传感器的信号;处理按键响应;控制液晶实时显示等。

AT89S52的管脚排布如图2所示:

图2.AT89S52管脚排布

VCC:

电源

GND:

P0口:

P0口是一个8位漏极开路的双向I/O口。

作为输出口,每位能驱动8个TTL逻辑电平。

对P0口写“1”时,引脚用作高阻抗输入。

当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。

在这种模式下,P0具有内部上拉电阻。

在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。

程序校验时,需要外部上拉电阻。

P1口:

P1口是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。

对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。

作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。

此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。

在flash编程和校验时,P1口接收低8位地址字节。

引脚号

第二功能

P1.0

T2(定时器/计数器T2的外部计数输入),时钟输出

P1.1

T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)

P1.5

MOSI(在系统编程用)

P1.6

MISO(在系统编程用)

P1.7

SCK(在系统编程用)

P2口:

P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。

对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。

作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。

在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX@DPTR)时,P2口送出高八位地址。

在这种应用中,P2口使用很强的内部上拉发送1。

在使用8位地址(如MOVX@RI)访问外部数据存储器时,P2口输出P2锁存器的内容。

在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。

P3口:

P3口是一个具有内部上拉电阻的8位双向I/O口,p2输出缓冲器能驱动4个TTL逻辑电平。

对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。

作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。

P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。

在flash编程和校验时,P3口也接收一些控制信号。

引脚号

第二功能

P3.0

RXD(串行输入)

P3.1

TXD(串行输出)

P3.2

INT0(外部中断0)

P3.3

INT1(外部中断1)

P3.4

T0(定时器0外部输入)

P3.5

T1(定时器1外部输入)

P3.6

WR(外部数据存储器写选通)

P3.7

RD(外部数据存储器写选通)

RST:

复位输入。

ALE/PROG:

地址锁存控制信号。

PSEN:

外部程序存储器选通信号。

EA/VPP:

访问外部程序存储器控制信号。

XTAL1:

振荡器反相放大器和内部时钟发生电路的输入端。

XTAL2:

振荡器反相放大器的输出端。

在本设计中所用到的引脚有VCC,GND,RST,EA/VPP,XTAL1,XTAL2,P0口,P2口,P3口。

硬件电路连接如图3所示。

系统采用12M晶振;P0口为单片机与液晶显示器通信的数据端口,其中P0口有8个1K的上拉电阻;AT89S52单片机的复位靠外部电路来实现,信号由RESET(RST)引脚输入,高电平有效,在振荡器工作时,只要保持RESET(RST)引脚高电平两个机器周期,单片机即可以复位,系统既有上电复位电路又可以手动复位S4;P2.0~P2.2为液晶显示器的控制信号端口:

P3.7为蜂鸣器的控制端口;P1.4~P1.5为按键模块的接口;P3.3为温度传感器通信端口。

图3单片机主控电路

3.2液晶显示模块

系统中采用LCD1602作为显示器件输出信息。

与传统的LED数码管显示器件相比,液晶显示模块具有体积小、功耗低、显示内容丰富等优点,而且不需要外加驱动电路,现在液晶显示模块已经是单片机应用设计中最常用的显示器件了。

LCD1602可以显示2行16个字符,具有8位数据总线D0-D7,和RS、R/W、E三个控制端口,工作电压为5V,并且带有字符对比度调节和背光设置。

管脚功能简介:

VL:

LCD对比度调节端,电压调节范围为0-5V。

接正电源时对比度最弱,接地电源时对比度最高,可以用一个5K的电位器来调整对比度;

RS:

数据或者指令选择端。

处理器写入指令时,RS为低电平,写入数据时,RS为高电平

R/W:

读写控制端。

R/W为高电平时,读取数据;R/W为低电平时,写入数据

E:

LCD模块使能信号控制端。

写数据时,需要下降沿触发模块

D0-D7:

8位数据总线,三态双向

BL+:

LED背光正极。

需要背光时,BLA串接一个限流电阻接VCC

BL-:

LED背光负极

LCD1602的管脚功能排布如图4所示:

图4.LCD1602的管脚功能排布

3.3温度传感器模块

系统采用DS18B20作为温度信息采集模块。

DS18B20支持“一线总线”,温度测量范围为-55℃~+125℃,在-10℃~+85℃精度为±5℃。

现场温度直接以“一线总线”的数字方式进行传输,大大提高系统的可靠性,温度数字量转换时间为200ms(典型值)。

DS18B20的管脚功能排布如图5所示:

图5.温度传感器

3.5报警模块

系统采用蜂鸣器作为报警的输出,蜂鸣器的电路连接图如图6所示:

图6.蜂鸣器电路图

电路中采用PNP管8550来做为信号功率放大来驱动喇叭闹铃,由图可以看出PNP管8550的集电极接电源正5伏。

过温时从AT89S52的P3.7脚输出频率约为低频的方波信号使蜂鸣器报警。

4.系统的软件设计

根据设计任务的要求确定系统程序的完整结构,尽可能采用模块化程序设计方法,将任务划分为相对独立的功能模块,明确各模块的功能、时间顺序和相互关系,系统的软件设计可以分为几个部分,首先是各个模块的底层驱动程序编写,而后是系统联机调试,编写上层系统程序。

本系统软件程序主要包括:

液晶LCD1602的底层驱动模块、DS18B20的低层驱动模块、定时器0定时温度检测模块、按键扫描模块、蜂鸣器报警模块等。

4.1主程序

主程序如图7所示。

程序开始进行标识位初始化、端口初始化,对液晶显示进行初始化,等待中断响应,(扫描键盘,读取键值)。

进入温度采集子程序关闭中断。

等待温度子程序返回温度值,开始中断,进入液晶显示子程序,送入数据液晶显示模块显示。

(由于采用的芯片不具eeprom,这里取消了温度报警和校准功能)

4.2LCD1602的底层驱动

液晶显示分两个子程序,一个是初始化时候使用,如图9.所示。

另一个接受来自温度采集子程序的数据,送入液晶显示LCD1602显示。

以下是LCD1602包括的底层驱动源程序:

voidlcd_busy()//LCD模块忙检测

{

bitbusy;

busy=1;

while(busy)

{

LCD_RS=0;

LCD_RW=1;

LCD_EN=1;

busy=(bit)(P0&0x80);

delayNOP();

}

LCD_EN=0;

}

voidlcd_wcmd(unsignedcharcmd,bitCheck)//写指令到LCD

{

if(Check)

lcd_busy();

LCD_RS=0;

LCD_RW=0;

LCD_EN=1;

P0=cmd;

delayNOP();

LCD_EN=0;

}

voidlcd_wdat(unsignedchardat)//写数据到LCD

{

lcd_busy();

LCD_RS=1;

LCD_RW=0;

LCD_EN=1;

P0=dat;

delayNOP();

LCD_EN=0;

}

voidlcd_pos(unsignedcharxpos,unsignedcharypos)//显示位置设置

{

if(ypos==0x01)

lcd_wcmd((xpos|0x80),1);

if(ypos==0x02)

lcd_wcmd((xpos|0xc0),1);

}

voidwr_string(unsignedcharstr[])

{//写数显示据到LCD

unsignedcharnum=0;

while(str[num])

{

lcd_wdat(str[num++]);

delayms(150);

}

}

voiddelayms(unsignedintms)//延时函数ms

{

unsignedchark;

while(ms--)

{

for(k=0;k<114;k++)

;

}

}

4.3DS18B20的低层驱动

温度采集子程序程序框图如图8所示。

程序在定时器2中断产生时候响应,进入采集。

首先检测DS18B20是否正常,不正常进行温度报警,激活报警程序。

发送转换信号,等待转换完成,读DS18B20寄存器。

把接受的数据转换为10进制。

返回一个表示温度的整形数据。

以下是温度采集子程序的底层驱动源程序:

voidDelay(unsignedintnum)//延时函数us

{

while(--num);

}

voiddelayms(unsignedintms)//延时函数ms

{

unsignedchark;

while(ms--)

{

for(k=0;k<114;k++);

}

}

voiddelayNOP()//延时4.34us

{

_nop_();

_nop_();

_nop_();

_nop_();

}

unsignedcharReadOneChar(void)//读一字节

{

unsignedchari=0;

unsignedchardat=0;

DQ=1;

for(i=0;i<8;i++)

//一个字节8个bit

{

DQ=0;//给低脉冲信号

dat>>=1;

DQ=1;//释放总线

_nop_();

_nop_();

if(DQ)

//读总线电平状态

dat|=0x80;

//最高位置1

Delay(6);//延时>45us

DQ=1;//释放总线,表示此次读操作完成

}

return(dat);//返回所读得数据

}

voidWriteOneChar(intdat)//写一字节

{

unsignedchari=0;

for(i=0;i<8;i++)

{

DQ=0;//给低脉冲信号

Delay

(1);//延时<15us

dat>>=1;//数据右移一位,最低位移入CY

DQ=CY;//写1bit数据

Delay(6);//延时>45us

DQ=1;//释放总线,表示此次写操作完成

}

}

voidTemperature_conver()//温度数据格式转换子程序

{

unsignedcharminus=0;

if(temp_data[1]>127)

//温度为负值

{

temp_data[0]=(~temp_data[0])+1;//取反加一,将补码变成原码

if((~temp_data[0])>=0xff)

temp_data[1]=(~temp_data[1])+1;

else

temp_data[1]=~temp_data[1];

minus=1;//温度为负值标志

}

display[6]=temp_data[0]&0x0f;//取小数位数据

display[2]=(display[6]*10)/16;//保留一位小数

display[6]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);

//取整数

display[5]=display[6]/100;//百位

display[4]=(display[6]%100)/10;//十位

display[3]=display[6]%10;//个位

if(!

display[5])

//高位为0,不显示

{

display[5]='';

if(!

display[4])

//次高位为0,不显示

display[4]='';

elsedisplay3[2]=(number[display[4]]);

}

elsedisplay3[1]=(number[display[5]]);

if(minus)

display3[0]='-';

else

display3[0]='';

display3[3]=(number[display[3]]);

display3[4]='.';

display3[5]=(number[display[2]]);

}

4.4按键扫描程序

按键扫描子程序主要是去抖动方法。

发现有按键按下时,进入扫描程序延时30ms,再次检测是否有按键按下,有则检测哪个键按下,否则跳出程序。

返回按键值,进入循环直到按键松开。

以下是按键扫描程序的驱动程序源码:

charkey()//按键扫描程序

{

P2=0xFF;

charz=0;

if(P2!

=0xFF)

{

delayms(20);

if(P2!

=0xFF)

{

if(!

k1)z=1;

elseif(!

k2)z=2;

elsez=3;

while(P2!

=0xFF)

;

}

}

return(z);

}

4.5蜂鸣器驱动

蜂鸣器子程序程序框图如图10所示。

以下是驱动程序源码:

voidbeep()//蜂鸣器子程序

{

unsignedchari;

for(i=0;i<180;i++)

{

Delay(80);

BEEP=!

BEEP;//BEEP取反

}

BEEP=1;//关闭蜂鸣器

delayms(100);

设计总结

单片机的设计至今为止已经进入了令人鼓舞的阶段,在进行了长达两个多月的时间的摸索与实验,使我不仅仅是对于单片机入门软件与硬件的常用设计与功能,还使我对于一项设计研究的制作过程所需要的详细步骤和具体的实现方法的力度的掌握。

基于此作品作为毕业设计的创作成果,在当其中机器的功能等方面并非处于一个成熟的阶段,而且仅仅是因为向延元老师的要求以及我们的初步尝试,当中的缺点是无可非议地存在着。

当然在这次宝贵的毕业设计活动中,经验才是对于我们最大的收获,

而且还增强了自身对未知问题以及对知识的深化认识的能力,用受益匪浅

这个词语来概括这次难忘的活动我觉得再合适不过了。

但是,光是完成了

作品还是不可以自我满足的,在从一开始的时候就怀着将作品制作得更加

人性化,更加令人满意,更加地使功能完美又方便地被应用领域这个最终

目的下,随着对单片机这门学科的认识加深,到达了拓展的程度,我想这

个目的将在不远的时期内被实现。

总之,这次设计从软件编写、调试到软硬件联机调试,我倾注了大量

的时间和心血。

真是曾经为程序的编写而冥思查找过,曾经为无法找出错

误而郁闷苦恼过,也曾经为某一功能不能实现而犹豫彷徨过,但最终我成

功了。

因为我不仅品味到了结果的喜悦,更明白了过程的弥足珍贵。

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

当前位置:首页 > 小学教育 > 语文

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

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