基于STC89C52单片机的数字温度计(附源代码,完美实现)

更新时间:2023-12-23 08:50:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于STC89C52单片机的数字温度计

学院:信息科学与工程学院专业:电子信息科学与技术

基于STC89C52单片机的数字温度计

一、摘 要

温度的检测是工业生产中比较典型的应用之一,随着传感器在生产和生活中的更加广泛的应用,利用新型数字温度传感器实现对温度的测试与控制得到更快的开发。本文设计了一种基于STC89C52单片机的温度检测系统,该系统将温度传感器DS18B20接在控制器的端口上,对温度进行采集,将采集到的温度值显示在1602液晶屏上。经实验测试表明,该系统设计和布线简单,结构紧凑,有可读性高,反应速度快,测量准确,抗干扰能力强,性价比高,扩展方便等优点,具有关阔的应用前景。 关键词:STC89C52 数字温度计 DS18B20

二、前言

随着人民生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便是不可否定的,其中数字温度计就是一个典型的例子。 单片机控制温度检测系统的温感系统主要是DS18B20芯片,该芯片由一根总线控制,电压范围为3.0v--5.5v。DS18B20具有测温方便、测温范围广、测温精度高等特点。出于对此类问题的探索,我们设计并制作了此温度检测系统。

本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确。其输出温度采用数字显示,主要用于对测温比较准确的场所,该设计控制器模块主要使用STC89C52单片机,测温传感模块使用DS18B20;显示模块使用1602液晶显示屏,可以只管、准确的显示所测温度值。

三、系统组成及工作原理

3.1、总体设计方案

经分析,将系统分为两个部分,一个是由温度传感器DS18B20组成的检测部分,另一个是由单片机和1602液晶组成的主控与显示部分。如图所示DS18B20将检测到的数据送到单片机,单片机对接收到的数据进行处理并送到1602显示,6V电源给各个部分供电。

3.2系统单元的选择与论证

3.2.1单片机控制模块的选择与论证

方案一:采用XC9000系列的FPGA。该类器件具有并行处理能力,能快速的响应外部的各种数字信号,但在数据处理方面过于复杂,而且芯片价格较昂贵。

2

基于STC89C52单片机的数字温度计

方案二:采用单片机作为控制核心,单片机数学运算功能较强。在程序相互调用方面,处理方便灵活,性能稳定,适合实际应用。且单片机技术发展较为成熟,价格便宜。

基于以上分析,采用单片机控制可更为简便灵活地实现系统功能,故拟采用方案二

3.2.2温度检测模块的选择与论证

方案一:选用铂电阻作为温度检测模块。铂电阻温度传感器精度高,稳定性好,应用温度范围广,是中低温区(-200摄氏度到650摄氏度)最常用的一种温度检测器,不仅广泛应用于工业测温,而且被制成各种标准温度计。

方案二:选用DS18B20温度传感器。DS18B20是一线式数字温度传感器,具有独特的单线式接口方式,测量范围在-55℃~125℃,-10℃~85℃,误差为-\\+0.5℃。最高精度可达0.0625℃。

铂电阻需要配合模数转换电路,后续电路复杂,精度较高,而ds18b20将AD转换继承与内部,无需外部电路,仅需一个端口引脚进行通信,从设计要求的简洁性来看,本方案二更优。 综上所述,虽然方案一精度高,但是方案二外围电路配置更简洁,精度也不差于方案一,故本模块采用方案二。

3.2.3温度显示模块的选择与论证

方案一:采用12864液晶模块显示测得的数据,可显示较多组的数据,字体较大,可清晰读数,但12864液晶模块价格昂贵,接线复杂,故不采用。

方案二:采用1602液晶模块显示所测数据,1602液晶接线简单方便,同时也能满足显示需要,价格远低于12864液晶。

方案三:采用LED数码管显示所测数据,LED数码管价格便宜可以降低成本但是由于LED数码管需要锁存电路接线复杂,故部采用。

综上所述故选用方案二。

3.3系统模块组成

本系统由单片机主控电路、DS18B20温度检测模块、1602液晶显示模块3部分组成。

四、系统电路设计

4.1STC89C52单片机主控制器

STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35Mhz,6T/12T可选。 STC89C52引脚图如下所示:

3

基于STC89C52单片机的数字温度计

STC89C52单片机主控电路原理图如下:

单片机主控模块包括了振荡电路、复位电路,同时接入了各个模块的接口,保证了整 个系统的灵活性。

单片机是整个系统的控制中枢,它指挥外围器件协调工作,从而完成特定的功能。硬件实现上采用模块化设计,每一模块只实现一个特定功能,最后再将各个模块搭接在一起。这种设计方法可以降低系统设计的复杂性。

控制电路的核心器件是由STC公司生产的STC89C52单片机,属于MCS-51系列。STC89C52是一种低功耗、高性能的CMOS8位微控制器,具有8K在系统可编程Flash存储器,采用的工艺是Atmel公司的高密度非易失存储器技术;片上Flash允许程序存储器

4

基于STC89C52单片机的数字温度计

在系统可编程,亦适于常规编程器;在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案;价格低廉、性能可靠、抗干扰能力强。因此广泛应用于工业控制和嵌入式系统中。

4.2 1602温度显示模块

1602液晶屏原理图如下所示:

在日常生活中,我们对液晶显示器并不陌生。液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。

在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高、数字式接口 、体积小、重量轻 、功耗低 、 1602LCD 主要技术参数: 显示容量:16×2 个字符 芯片工作电压:4.5—5.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V

字符尺寸:2.95×4.35(W×H)mm

引脚功能说明:1602LCD 采用标准的 14脚(无背光)或 16脚(带背光)接口, 第 1 脚:VSS 为地电源。

第 2 脚:VDD接 5V正电源。

第 3 脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,

对比度过高时会产生“鬼影”,使用时可以通过一个 10K 的电位器调整对比度。

第 4 脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第 5 脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS和 R/W

共同为低电平时可以写入指令或者显示地址,当 RS 为低电平 R/W 为高电平时可以读忙信号,当 RS 为高电平 R/W为低电平时可以写入数据。

第 6 脚:E端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。 第 7~14脚:D0~D7为 8 位双向数据线。 第 15脚:背光源正极。 第 16脚:背光源负极。

5

基于STC89C52单片机的数字温度计

4.3温度检测模块

DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。DS18B20的性能特点如下: ●独特的单线接口仅需要一个端口引脚进行通信;

●多个DS18B20可以并联在惟一的三线上,实现多点组网功能; ●无须外部器件;

●可通过数据线供电,电压范围为3.0~5.5V; ●零待机功耗;

●温度以9或12位数字; ●用户可定义报警设置;

●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;

●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作; DS18B20引脚如下图所示:

DS18B20接线图如下所示:

五、系统软件设计

设计中使用德国Keil公司出品的Keil uVision编程软件,它是业内对51系列单片机编程的常用工具。下载器为STC公司的专用程序下载器,与使用的STC89C52RC单片机兼容。

六、系统测试

6.1主要指标测试

本系统测量范围为-55.0℃-99.9℃,报警温度值设定范围为0℃-99℃,时间为预设的北京

6

基于STC89C52单片机的数字温度计

时间,温度误差为0.1℃。

6.2测试结果分析

通过测试,与标准仪器所测得的温湿度相比较,可得系统的误差为信号传输过程中可能存在误码,及误判。

七、参考文献

1、电子技术基础 数字部分(第五版) 康华光 主编 高等教育出版社 2、电子技术基础 模拟部分(第五版) 康华光 主编 高等教育出版社 3、C程序设计教程 谭浩强 著 清华大学出版社

4、单片机原理及应用 张毅刚 主编 高等教育出版社

5、新概念51单片机C语言教程:入门、提高、开发、拓展全攻略业出版社

7

郭天祥 编著 电子工基于STC89C52单片机的数字温度计

附录一、系统图

1、 系统完整原理图

2、1602液晶显示模块原理图

2、 DS18B20温度检测模块原理图

8

基于STC89C52单片机的数字温度计

附录二、程序源代码

#include

#define uchar unsigned char #define uint unsigned int

/*************************液晶接口定义********************************/ sbit rs=P1^0; //定义RS口为P10 sbit rw=P1^1; //定义RW口为P11 sbit e=P1^2; //定义E口为P12 sbit DQ=P3^5; //定义温度器接口

/*******************************各种变量定义************************/ bit flag=0; //温度标示位 uint temp=0,temp_l=0,temp_h=0; //定义读取的温度值 uchar busy,k=1; uint a=0;

uchar table1[]={%uchar table2[]={\void write_com(uchar);

/*******************************1602液晶显*************************************/

void delay(uint z) //液晶延时 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }

void busy_1602(void) //查询忙碌标志信号程序 { do { e=0; rw=1; rs=0; e=1;

9

基于STC89C52单片机的数字温度计

busy=P0; e=0; delay(1); } while(busy&&0x80==1); }

void init(void) //初始化液晶 { P1=1; e=0; write_com(0x38); write_com(0x0c); write_com(0x06); }

void write_com(uchar com) {

busy_1602(); rs=0; rw=0; P0=com; delay(5); e=1; delay(5); e=0; }

void write_dat(uchar dat) { busy_1602(); rs=1; rw=0; P0=dat; delay(5); e=1; delay(5); e=0; }

void display(void) //液晶显示 { uint j,k; init(); write_com(0x80); table1[10]=0xdf; for(j=0;j<16;j++) { write_dat(table1[j]);

//写指令 //写数据 10

基于STC89C52单片机的数字温度计

} write_com(0x80+0x40); for(k=0;k<16;k++) { write_dat(table2[k]); } }

/****************************ds18b20程序*******************************/ void delay1(uint y)//ds18b20延时 { while(y--); }

bit init_ds18b20(void)//初始化ds18b20 { bit res; DQ=1; delay1(8); DQ=0; delay1(80); DQ=1; delay1(8); res=DQ; delay1(4); return(res); }

void write_ds18b20(uchar c)//写一个字节的指令 { uint i; for(i=0;i<8;i++) { DQ=0; DQ=c&0x01; delay1(4); DQ=1; c=c>>1; } delay1(4); }

uchar read_ds18b20(void) //读一个字节的数据 { uchar i; uchar shuj=0; for(i=0;i<8;i++) {

11

基于STC89C52单片机的数字温度计

DQ=1; delay1(1); DQ=0; shuj>>=1; DQ=1; if(DQ) shuj=shuj|0x80; delay1(2); } return shuj; }

void get_temp(void) //获取温度 { init_ds18b20(); write_ds18b20(0xcc); write_ds18b20(0x44); init_ds18b20(); write_ds18b20(0xcc); write_ds18b20(0xbe); temp_l=read_ds18b20(); temp_h=read_ds18b20(); delay1(200); temp=temp_h*256+temp_l; }

void judge_temp(void)//判断正负温度 { if((temp_h&0x80)==0x80) { flag=1;//负温度 temp=~temp+1; } else flag=0; }

/******************DS1302:写入操作(上升沿)*********************/ void write_byte(unsigned char da) {

unsigned char i; ACC=da;

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

T_IO=ACC0; T_CLK=0; T_CLK=1;

12

基于STC89C52单片机的数字温度计

ACC=ACC>>1; } }

/******************DS1302:读取操作(下降沿)*****************/ unsigned char read_byte(void) {

unsigned char i; for(i=0;i<8;i++) {

ACC=ACC>>1; T_CLK = 1; T_CLK = 0; //delay(1); ACC7 = T_IO; }

return(ACC); }

/******************DS1302:写入数据(先送地址,***************************/

void write_1302(unsigned char addr,unsigned char da) {

T_RST=0; //停止工作 T_CLK=0; T_RST=1; //重新工作 write_byte(addr); //写入地址 write_byte(da); T_RST=0; T_CLK=1; }

/******************DS1302:读取数据(先送地址,**************************/

unsigned char read_1302(unsigned char addr) {

unsigned char temp;

T_RST=0; //停止工作 T_CLK=0;

T_RST=1; //重新工作 write_byte(addr); //写入地址 temp=read_byte(); T_RST=0;

13

再写数据)再读数据)基于STC89C52单片机的数字温度计

T_CLK=1; //停止工作 return(temp); }

void main(void) { float tem=0; uchar slum=0,num=0,flag2=0; uchar clk_time[3]={0x00,0x00,0x00}; //秒,分,时寄存器初始值 uchar temp11=0x80; uchar i; while(1) { get_temp(); judge_temp(); tem=temp*0.0625; //温度值 temp=tem*10+0.5; if(flag) { table1[5]='-'; } table1[6]=temp/100+0x30; table1[7]=(temp-100*(temp/100))/10+0x30; table1[9]=(temp-100*(temp/100))+0x30; temp11=0x81; for(i=0;i<3;i++) { clk_time[i]=read_1302(temp11); //实现每秒读时间 temp11+=2; } table2[4]=clk_time[2]/16+0x30; table2[5]=clk_time[2]+0x30; table2[7]=clk_time[1]/16+0x30; table2[8]=clk_time[1]+0x30; table2[10]=clk_time[0]/16+0x30; table2[11]=clk_time[0]+0x30;

/**************按键*************/ if(function==0) { delay(10); if(function==0) {

14

基于STC89C52单片机的数字温度计

while(!function); slum++; } } if(slum==1) { flag2=0; beep=1; if(add==0) { delay(10); if(add==0) { while(!add); num++; if(num==100) num=99; } } if(red==0) { delay(10); if(red==0) { while(!red); num--; if(num==-1) num=0; } }

table1[13]=num/10+0x30; table1[14]=num+0x30; }

if(slum==2) { slum=0; table1[13]='*'; table1[14]='*'; flag2=0; beep=1; write_com(0x0c); } if(confirm==0) {

15

基于STC89C52单片机的数字温度计

delay(10); if(confirm==0) { while(!confirm); flag2=1; slum=0; table1[13]=num/10+0x30; table1[14]=num+0x30; } } if(flag2) { if(tem>num) beep=0; if(tem<=num) beep=1;} display(); } }

16

本文来源:https://www.bwwdw.com/article/as75.html

Top