温度采集与显示系统.docx

上传人:b****8 文档编号:29408035 上传时间:2023-07-23 格式:DOCX 页数:40 大小:603.17KB
下载 相关 举报
温度采集与显示系统.docx_第1页
第1页 / 共40页
温度采集与显示系统.docx_第2页
第2页 / 共40页
温度采集与显示系统.docx_第3页
第3页 / 共40页
温度采集与显示系统.docx_第4页
第4页 / 共40页
温度采集与显示系统.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

温度采集与显示系统.docx

《温度采集与显示系统.docx》由会员分享,可在线阅读,更多相关《温度采集与显示系统.docx(40页珍藏版)》请在冰豆网上搜索。

温度采集与显示系统.docx

温度采集与显示系统

温度采集与显示系统

1课程设计内容

1.1设计要求

利用STC89C52、DS18B20、LCD1602、AT24C02等元器件设计温度采集与显示系统。

系统具有以下功能:

1)能正确检测温度;

2)在1602上实时显示温度;

3)每隔10秒采集一次温度数据并保存到AT24C02;

4)按键按下后,可逐个显示之前采集到的数据;

5)其他功能可根据系统上的资源自行设定。

1.2设计任务

1)根据设计内容与要求,弄清系统及各个模块的工作流程,完成电路原理图,包括单片机最小系统模块、LCD显示模块、存储模块、串行口下载模块和电源模块,最终在万用板上焊接,完成整个系统硬件设计。

2)根据设计内容与要求,弄清系统及各个模块的工作流程,完成系统的软件设计,包括系统主程序、温度读取子程序、LCD显示子程序、存储子程序等,可使用汇编语言或是C语言编写,建议使用C语言编写。

3)完成系统的仿真与调试,使得系统在脱机情况下,能稳定可靠的工作。

1.3课程设计原理

基于DS18B20的数字温度计设计主要由数字温度传感器、单片机控制电路、数码显示电路组成。

DS18B20测量温度采用了特有的温度测量技术。

它是通过计数时钟周期来实现的。

低温度系数振荡器输出的时钟信号通过由高温度系数振荡器产生的门周期而被计数。

计数器被预置在与-55℃相对应的一个基权值。

如果计数器在高温度系数振荡周期结束前计数到零,表示测量的温度值高于-55℃,被预置在-55℃的温度寄存器的值就增加1℃,然后重复这个过程,直到高温度系数振荡周期结为止这时温度寄存器中的值就是被测温度值,这个值以16位形式存放在便笺式存贮器中,此温度值可由主机通过发存贮器读命令而读出,读取时低位在前,高位在后。

斜率累加器用于补偿温度振荡器的抛物线特性。

读出的二进制数可以直接转换为十进制由单片机驱动数码管显示输出。

DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃;可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温,典型的转换时间为200ms;用户可以设定温度的上下限;独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

DS1820具有测温系统简单、测温精度高、连接方便、占用口线少等优点,所以在测量领域得到广泛的运用。

2课程设计思路

 

3硬件设计

3.1单元模块设计

本节主要介绍系统中单片机STC89C52外围电路重要模块的功能和电路原理图分析。

并对电路中的核心器件进行必要的说明单元模块设计

3.1.1时钟电路

图3.1晶振电路

3.1.2复位电路

图3.2复位电路

3.1.3报警电路

图3.3报警电路

3.1.4温度采集电路

图3.4温度采集电路

3.1.5存储电路

图3.5存储电路

3.1.6LCD显示模块

图3.6LCD模块电路

3.1.7按键部分

图3.7按键电路

3.1.8串口通信电路

图3.8串口通信电路

3.2核心器件介绍

3.2.1单片机STC89C52介绍

⏹STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。

主要特性如下:

工作电压:

5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机。

1.工作频率范围:

0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz。

2.用户应用程序空间为8K字节。

3.片上集成512字节RAM。

4.通用I/O口(32个)复位后为FFH,P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。

5.ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片

6.具有EEPROM功能。

7.具有看门狗功能。

8.共3个16位定时器/计数器。

即定时器T0、T1、T2。

9.外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触发中断方式唤醒。

⏹STC89C52RC引脚功能说明

VCC(40引脚):

电源电压。

VSS(20引脚):

接地。

P0端口(P0.0~P0.7P0.7,39~32引脚):

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

作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入每个引脚能驱动写入“1”时,可以作为高阻抗输入。

在访问外部程序和数据存储器时在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线位数据的复用总线。

此时,P0口内部上拉电阻有效。

在FlashROM编在程时,P0端口接收指令字节端口接收指令字节;而在校验程序时,则输出指令字节则输出指令字节。

验证时,要求外接上拉电阻。

P1端口(P1.0~P1.7,1~8引脚):

P1口是一个带内部上拉电阻的8位双向I/O口。

P1的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。

对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。

P1口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流()。

此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),具体参见下表:

在对FlashROM编程和程序校验时,P1接收低8位地址。

P2端口(P2.0~P2.7,21~28引脚):

P2口是一个带内部上拉电阻的8位双向I/O端口。

P2的输出缓冲器可以驱动(吸收或输出电流方式)4个TTL输入。

对端口写入1时,通过内部的上拉电阻把端口拉到高电平,这时可用作输入口。

P2作为输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流(I)。

在访问外部程序存储器和16位地址的外部数据存储器(如执行“MOVX@DPTR”指令)时,P2送出高8位地址。

在访问8位地址的外部数据存储器(如执行“MOVX@R1”指令)时,P2口引脚上的内容(就是专用寄存器(SFR)区中的P2寄存器的内容),在整个访问期间不会改变。

在对FlashROM编程和程序校验期间,P2也接收高位地址和一些控制信号。

P3端口(P3.0~P3.7,10~17引脚):

P3是一个带内部上拉电阻的8位双向I/O端口。

P3的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。

对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。

P3做输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输入一个电流()。

在对FlashROM编程或程序校验时,P3还接收一些控制信号。

P3口除作为一般I/O口外,还有其他一些复用功能,如下所示:

RST(9引脚):

复位输入。

当输入连续两个机器周期以上高电平时为有效,复位高电平有效。

ALE/ROG(30引脚)地址锁存控制信号:

(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。

在Flash编程时,此引脚(ROG)也用作编程输入脉冲。

在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。

然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。

XTAL1(19引脚):

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

XTAL2(18引脚):

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

图3.9AT89C52引脚图图3.11LCD1602引脚图

3.2.2DS18B20介绍

DS18B20是DALLAS公司生产的一线式传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55摄氏度到+125摄氏度,可编程为9到12位A/D转换精度,测温分辨率可达0.0625摄氏度,被侧温度用符号扩展的16位数字量方式串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产生。

CPU只需一根端口线就能与诸多DS18B20通信,占用问处理器的端口较少,可节省大量的引线和逻辑电路。

DS18B20主要由四部分组成:

64位光刻ROM、温度传感器、非挥发的温度报警触发器TH个TL、配置寄存器。

DS18B20中的温度传感器可完成对温度的测量,用16位符号扩展的二进制补码读数形式提供,以0.0625摄氏度/LSB形式表达,其中S为符号位。

例如+125摄氏度的数字输出为07DOH,+25.0625摄氏度的数字输出为0191H,-25.0625摄氏度的数字输出为FF6FH,-55摄氏度的数字输出为FC90H.

图3.10DS18B20的两种封装形式

DS18B20采用一线通信接口。

因为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。

主要首先提供以下功能命令之一:

⑴读ROM指令0X33,⑵ROM匹配指令0X55,⑶搜索ROM指令0XF0,⑷跳过ROM指令0XCC,⑸报警检查指令0XEC。

这些指令操作作用在没有一个器件的64位光刻ROM序列号。

3.2.3LCD1602介绍(LCD1602引脚图见图3.11)

1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。

每位之间有一个点距的间隔每行之间也有也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形。

1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。

液晶显示器各种图形的显示原理:

线段的显示

点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。

例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。

这就是LCD显示的基本原理。

字符的显示

用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。

这样一来就组成某个字符。

但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。

汉字的显示

汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5……右边为2、4、6……根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就可以LCD上得到一个完整汉字。

⏹1602LCD主要技术参数:

显示容量:

16×2个字符

芯片工作电压:

4.5—5.5V

工作电流:

2.0mA(5.0V)

模块最佳工作电压:

5.0V

字符尺寸:

2.95×4.35(W×H)mm

⏹引脚功能说明及11条控制指令

1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如

1602液晶模块内部的控制器共有11条控制指令,如表下:

图3.10LCD1602中文字符代码与字符图形对应的关

3.2.4AT24C02引脚图及MAX232E引脚图

AT24C02引脚图MAX232E引脚图

4软件设计

用模块化程序设计此课程设计,各模块程序如下所示

⏹总程序main模块

#include

#include

charmiao,shi,fen;

uints1num;

ucharcount;

uintsu,tt,mm,m,n;

ucharbuff[4];

unsignedcharpDat[7],pDat1[7];

sbits1=P2^3;

sbits2=P2^4;

sbits3=P2^5;

voidmain()

{m=0;

n=0;

init();

EX0=1;

while

(1)

{write_sfm(10,miao);

write_sfm(7,fen);

write_sfm(4,shi);

dis_temp(tt);

dis_temp1(mm);

keyscan();

}

}

voidint_0()interrupt0

{EA=0;

IRcvStr(0xa0,n,&pDat1[0],8);

mm=pDat1[0]*100+pDat1[1]*10+pDat1[2];

pDat1[0]=0;

pDat1[1]=0;

pDat1[2]=0;

n=n+8;

EA=1;

}

voidkeyscan()

{if(s1==0)

{delay(5);

if(s1==0)

{s1num++;

while(!

s1);

if(s1num==1)

{TR0=0;

write_com(0x80+0x40+10);

write_com(0x0f);

}

}

if(s1num==2)

{write_com(0x80+0x40+7);}

if(s1num==3)

{write_com(0x80+0x40+4);}

if(s1num==4)

{s1num=0;

write_com(0x0c);

TR0=1;

}

}

if(s1num!

=0)

{if(s2==0)

{delay(5);

if(s2==0)

{while(!

s2);

if(s1num==1)

{miao++;

if(miao==60)

miao=0;

write_sfm(10,miao);

write_com(0x80+0x40+10)

}

if(s1num==2)

{fen++;

if(fen==60)

fen=0;

write_sfm(7,fen);

write_com(0x80+0x40+7);

}

if(s1num==3)

{shi++;

if(shi==24)

shi=0;

write_sfm(4,shi);

write_com(0x80+0x40+4);

}

}

}

if(s3==0)

{delay(5);

if(s3==0)

{while(!

s3);

if(s1num==1)

{miao--;

if(miao==-1)

miao=59;

write_sfm(10,miao);

write_com(0x80+0x40+10);

}

if(s1num==2)

{fen--;

if(fen==-1)

fen=59;

write_sfm(7,fen);

write_com(0x80+0x40+7);

}

if(s1num==3)

{shi--;

if(shi==-1)

shi=23;

write_sfm(4,shi);

write_com(0x80+0x40+4);

}

}

}

}

}

voidtimer0()interrupt1

{TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

su++;

if(su==20)

{su=0;

tempchange();

tt=get_temp();

pDat[0]=tt/100;

pDat[1]=(tt%100)/10;

pDat[2]=tt%10;

ISendStr(0xa0,m,&pDat[0],8);

m=m+8;

pDat[0]=0;

pDat[1]=0;

pDat[2]=0;

}

count++;

if(count==20)

{count=0;

miao++;

if(miao==60)

{miao=0;

fen++;

if(fen==60)

{

fen=0;

shi++;

if(shi==24)

{

shi=0;

}//write_sfm(4,shi)

}//write_sfm(7,fen)

}//write_sfm(10,miao);

}

}

⏹I2C程序模块

#include

#include

#include

#defineNOP()_nop_()

#define_Nop()_nop_()

sbitSCL=P2^1;

sbitSDA=P2^0;

bitack;

voidStart_I2c()

{SDA=1;

_Nop();

SCL=1;

_Nop();

_Nop();

_Nop();

_Nop();

_Nop();

SDA=0;

_Nop();

_Nop();

_Nop();

_Nop();

_Nop();

SCL=0;

_Nop();

_Nop();

}

voidStop_I2c()

{SDA=0;

_Nop();

SCL=1;

_Nop();

_Nop();

_Nop();

_Nop();

_Nop();

SDA=1;

_Nop();

_Nop();

_Nop();

_Nop();

}

voidSendByte(unsignedcharc){

unsignedcharBitCnt;

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

{if((c<

SDA=1;

else

SDA=0;

_Nop();

SCL=1;

_Nop();

_Nop();

_Nop();

_Nop();

_Nop();

SCL=0;

}

_Nop();

_Nop();

SDA=1;

_Nop();

_Nop();

SCL=1;

_Nop();

_Nop();

_Nop();

if(SDA==1)ack=0;

elseack=1;

SCL=0;

_Nop();

_Nop();

}

unsignedcharRcvByte()

{unsignedcharretc;

unsignedcharBitCnt;

retc=0;

SDA=1;

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

{_Nop();

SCL=0;

_Nop();

_Nop();

_Nop();

_Nop();

_Nop();

SCL=1;

_Nop();

_Nop();

retc=retc<<1;

if(SDA==1)

retc=retc+1;

_Nop();

_Nop();

}

SCL=0;

_Nop();

_Nop();

return(retc);

}

voidAck_I2c(bita)

{if(a==0)

SDA=0;

else

SDA=1;

_Nop();

_Nop();

_Nop();

SCL=1;

_Nop();

_Nop();

_Nop();

_Nop();

_Nop();

SCL=0;

_Nop();

_Nop();

}

⏹AT24C02模块

#include

bitISendStr(unsignedcharsla,unsignedcharsuba,unsignedchar*s,unsignedcharno)

{

unsignedchari;

Start_I2c();

SendByte(sla);

if(ack==0)return(0);

SendByte(suba);

if(ack==0)return(0);

for(i=0;i

{SendByte(*s);

if(ack==0)return(0);

s++;

}

Stop_I2c();

return

(1);

}

bitIRcvStr(unsignedc

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

当前位置:首页 > 农林牧渔 > 林学

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

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