基于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
正在阅读:
基于STC89C52单片机的数字温度计(附源代码,完美实现)12-23
失而复得的战舰——美奇提哀05-13
小学一升二语文集训01-27
农发行2014信贷工作总结03-12
主题班会:你的学习动机?06-03
网络练习题11-30
隋唐五代文学习题10-02
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 温度计
- 单片机
- 源代码
- STC89C52
- 基于
- 完美
- 实现
- 数字
- 课堂习题范里安中级微观
- 工业循环冷却水旁流处理工艺及设备
- 浅谈矿井高压开关的倒闸操作
- 小学六年级下册《科学》教案(广东教育)
- 人教版三年级数学上册第四单元检测试卷(含答案)
- 怎样看懂强电施工图 王晓锋
- 六年级上基础知识测评(答案)
- 一年级上册写字教案
- 木工打柜子、成品柜和全屋定制到底怎么选? 老木工掏心窝的大实话 - 图文
- 2018-2019写给30岁的自己的人生感悟-精选word文档(6页)
- 2014年春四年级下学期语文期中复习自测练习试题
- 成本控制文献综述
- 关于报送2003年重大农业专项资金项目建议书的通知
- 小额贷款公司实习心得
- 2018届高三地理一轮复习必备精品:世界的陆地和海洋 精品
- 《幻想水浒传 百年交织》108星收集
- 高中语文两用成语具体介绍
- 山东省实验中学2012届高三第四次诊断考试 数学理
- 2013内蒙古自治区公务员常识(绝对全)最新考试试题库(完整版)
- 2018秋季开学典礼校长讲话稿4篇