第一章、总体方案设计···································4 第二章、系统硬件选择···································5
1、单片机的选择································ ·5 2、温度传感器的选择····························· 6 第三章、硬件电路设计··································8 1.温度检测电路··································8
2.显示电路······································9 第四章、系统软件设计·································12
1.概述···········································12 2.主程序流程图···································12 设计体会···················· ········· ······ · ·13 参考文献······················ ············· ···· 14 附录:C语言程序······································15
硬件实物图······································22
1
摘要
当今,单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术, 本文主要介绍了一个基于89C51单片机的测温系统,详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,对各部分的电路也一一进行了介绍,该系统可以方便的实现实现温度采集和显示,并可根据需要任意设定上下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。
2
第一章 总体方案设计
采用数字温度芯片DS18B20 测量温度,输出信号全数字化。便于单片机处理及控制,省去传统的测温方法的很多外围电路。且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好。在0—100 摄氏度时,最大线形偏差小于1 摄氏度。DS18B20 的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和微控制器AT89C51构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。这样,测温系统的结构就比较简单,体积也不大。采用51 单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。既可以单独对多DS18B20 控制工作,还可以与PC 机通信上传数据,另外AT89S51 在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟。
该系统利用AT89C51芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。该系统扩展性非常强,它可以在设计中加入时钟芯片DS1302以获取时间数据,在数据处理同时显示时间,并可以利用AT24C16芯片作为存储器件,以此来对某些时间点的温度数据进行存储,利用键盘来进行调时和温度查询,获得的数据可以通过MAX232芯片与计算机的RS232接口进行串口通信,方便的采集和整理时间温度数据。
3
第二章 系统硬件选择
2.1、 单片机的选择
对于单片机的选择,可以考虑使用8031与8051系列,由于8031没有内部RAM,系统又需要大量内存存储数据,因而不适用。AT89C51 是美国 ATMEL 公司生产的低功耗,高性能 CMOS8 位单片机,片内含 4kbytes 的可编程的 Flash 只读程序存储器,兼容标准 8051 指令系统及引脚。它集 Flash 程序存储器既可在线编程(ISP),也可用传统方法进行编程,所以低价位 AT89C51单片机可为提供许多高性价比的应用场合,可灵活应用于各种控制领域,对于简单的测温系统已经足够。单片机AT89C51 具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。主要特性如下图-1所示:
●与MCS-51 兼容
●4K字节可编程闪烁存储器 ●寿命:1000写/擦循环 ●数据保留时间:10年 ●全静态工作:0Hz-24Hz ●三级程序存储器锁定 ●128*8位内部RAM
4
●32可编程I/O线 ●两个16位定时器/计数器
●5个中断源 ●可编程串行通道 ●低功耗的闲置和掉电模式 ●片内振荡器和时钟电路
2.2、温度传感器的选择
2.2.1. DS18B20 简单介绍:
DALLAS 最新单线数字温度传感器DS18B20是一种新型的“一线器件”,其体积更小、更适用于多种场合、且适用电压更宽、更经济。DALLAS 半导体公司的数字化温度传感器DS18B20是世界上第一片支持“一线总线”接口的温度传感器。温度测量范围为-55~+125 摄氏度,可编程为9位~12 位转换精度,测温分辨率可达0.0625摄氏度,分辨率设定参数以及用户设定的报警温度存储在EEPROM 中,掉电后依然保存。被测温度用符号扩展的16位数字量方式串行输出;其工作电源既可以在远端引入,也可以采用寄生电源方式产生;多个DS18B20可以并联到3 根或2 根线上,CPU只需一根端口线就能与诸多DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列、各种封装形式如图 4.2 所示,DQ 为数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。其电路图 4.3所示.。
5
图 4.2 外部封装形式 6
4.3 传感器电路图
图
第三章.硬件电路设计
本设计由DS18B20温度传感器芯片测量当前的温度并将转换后的结果送入单片机。然后通过A89C51单片机驱动两位共阳极8段LED数码管显示测量温度值。如附录中本设计硬件电路图所示,本电路主要有DS18B20温度传感器芯片,两位共阳极数码管,AT89C51单片机及相应外围电路组成。其中DS18B20采用“一线制”与单片机相连。
3.1、温度检测电路
DS18B20 最大的特点是单总线数据传输方式,DS18B20 的数据I/O 均由同一条线来完成。DS18B20 的电源供电方式有2 种: 外部供电方式和寄生电源方式。工作于寄生电源方式时, VDD 和GND 均接地, 他在需要远程温度探测和空间受限的场合特别有用, 原理是当1 W ire 总线的信号线DQ 为高电平时, 窃取信号能量给DS18B20 供电, 同时一部分能量给内部电容充电, 当DQ为低电平时释放能量为DS18B20 供电。但寄生电源方式需要强上拉电路, 软件控制变得复杂(特别是在完成温度转换和拷贝数据到E2PROM 时) , 同时芯片的性能也有所降低。外部电源供电方式是DS18B20最佳的工作方式,工作稳定可靠,抗干扰能力强,而且电路也比较简单,可以开发出稳定可靠的多点温度监控系统。因此本设计采用外部供电方式。如下图所示:
DS18B20 +5V
4.7K +5V 温度传感器DS18B20的测量范围为-55℃~+125℃,在-10℃~+85℃时精度为±0.5℃。因为本设计只用于测量环境温度,所以只显示0℃~+85℃。
7
3.2、显示电路
液晶显示屏具有微功耗、体积小、显示内容丰富、超薄轻巧等诸多优点。在袖珍式仪表和低功耗应用系统中,LCD得到越来越广泛的应用。字符型液晶显示屏,是一种用5*7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等,本设计以常用的2行16个字的JDL162A液晶模块作为数据显示模块。JDL162A采用标准的16脚接口,其中:
第1脚:VSS接地
第2脚:VDD接5V正电源。
第3脚:为液晶显示器对比度调整端,接电源时对比度最弱,接地时对比度最高,对比度过高时会产使用时可以通过一的电位器来调整对第4脚:RS器选择,高择数据寄存指令寄存器。
第5脚:
R110KVCC10kVCC1R173VCC生“鬼影”,
2个10K欧姆
比度。 为寄存电平时选
器、低电平时选择
161514131211109876543218
16151413121110987654321LCD_RSLCD_RWLCD_ELCD_D0LCD_D1LCD_D2LCD_D3LCD_D4LCD_D5LCD_D6LCD_D7RW为读写信号
线,高电平时JDL162A进行读操作,低电平时进行写操作。当RS
和RW共同为低电平时,可以写入指令或者显示地址,当RS为低电平RW为高电平时,可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。 第15~16脚:空脚
JDL162A与单片机的I/O口电路连接如图4-9所示:
本设计采用数码管动态显示,电路如下图所示:
9
显示部分电路 图-6
图中由单片机P174HC245驱动两位共阳极数码管,上拉电阻排为10K。由P2.0和P2.1通过PNP型三极管Q1,Q2驱动其字位。三极管发射极接高电平,当P2.0或P2.1为低电平时使三极管导通选通数码管的某一位。
10
第四章、系统软件设计
4.1、 概述
整个系统的功能是由硬件电路配合软件来实现的,当硬件基本定型后,软件的功能也就基本定下来了。从软件的功能不同可分为两大类:一是监控软件(主程序),它是整个控制系统的核心,专门用来协调各执行模块和操作者的关系。二是执行软件(子程序),它是用来完成各种实质性的功能如测量、计算、显示、通讯等。每一个执行软件也就是一个小的功能执行模块。这里将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义。各执行模块规划好后,就可以规划监控程序了。首先要根据系统的总体功能选择一种最合适的监控程序结构,然后根据实时性的要求,合理地安排监控软件和各执行模块之间地调度关系。
4.2.总程序流程图
开始 ① 对温度传感器 进行设置,读取温度 ②数据转化 ③显示温度 结束
11
设计体会
温度传感器DS18B20外形像一个小三极管,硬件连接非常简单,应用非常方便。它不仅能测量温度,而且也是一个ADC转换器,它能将测得的温度信号直接转换成数字信号输入到单片机。硬件开销较小,相对需要复杂的软件进行补偿,DS18B20软件编程比较复杂,但是可以把复位、读和写3个基本操作的子程序看成是3个固定的基本模块。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
12
参考文献
[1]孙育才.《单片微型计算机及其应用》.东南大学出版社.2004
[2]沈德金 陈粤初.《单片机接口电路与应用程序实例》.北京航天航空大学出版 [3]张齐,朱宁西. 单片机应用系统设计技术 .北京:电子工业出版社 [4]DS18B20中文资料 [5]百度网站 www.baidu.com
13
附录:
C语言程序:
#include #define uchar unsigned char #define uint unsigned int uchar teH = 35,teL = 20; sbit DQ=P3^7;//ds18b20与单片机连接口 sbit RS=P2^5; sbit RW=P2^6; sbit EN=P2^7; sbit SET=P1^0; sbit ADD=P1^1; sbit SUB=P1^2; sbit BEEP = P3^2; sbit L = P3^3; sbit H = P3^4; uchar s1num = 0, s2num = 0; uchar dis3[]={\"0123456789 \uchar val_sp[5]={0}; uchar fre_sp[5]={0}; uchar code str1[]={\"Tem: \ uchar code str2[]={\"studentN0: \uchar code str3[]={\"11314230\uchar code str4[]={\"teH:35\uchar code str5[]={\"teL:20\uchar data disdata[5]; uchar data str6[2]; uchar p=0; uint tvalue;//温度值 uchar tflag; //温度正负标志 //*************************lcd1602程序**************************/ void delay1ms(uint ms)//延时1毫秒 { uint i,j; for(i=0;i 14 { //delay1ms(1); RS=0; RW=0; EN=0; P0=com; //delay1ms(1); EN=1; delay1ms(1); EN=0; } void wr_dat(uchar dat)//写数据// { //delay1ms(1); RS=1; RW=0; EN=0; P0=dat; //delay1ms(1); EN=1; delay1ms(1); EN=0; } void lcd_init()//初始化设置// { wr_com(0x38);delay1ms(5); wr_com(0x08);delay1ms(5); wr_com(0x01);delay1ms(5); wr_com(0x06);delay1ms(5); wr_com(0x0c);delay1ms(5); } void display(uchar *p)//显示// { while(*p!='\\0') { wr_dat(*p); p++; delay1ms(1); } } void init_play()//初始化显示 { lcd_init(); wr_com(0x80); 15 display(str2); wr_com(0xc0); display(str3); delay1ms(2000); lcd_init(); wr_com(0x80); display(str1); wr_com(0xc0); display(str4); wr_com(0xc0+8); display(str5); } /***************************ds18b20程序****************************/ void delay_18B20(uint i)//延时1微秒 { while(i--); } void ds1820rst()/*ds1820复位*/ { DQ = 1; //DQ复位 delay_18B20(4); //延时 DQ = 0; //DQ拉低 delay_18B20(100); //精确延时大于480us DQ = 1; //拉高 delay_18B20(40); } uchar ds1820rd()/*读数据*/ { uchar i=0; uchar dat = 0; for (i=8;i>0;i--) { DQ = 0; //给脉冲信号 dat>>=1; DQ = 1; //给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); } return(dat); } void ds1820wr(uchar wdata)/*写数据*/ { 16 uchar i=0; for (i=8; i>0; i--) { DQ = 0; DQ = wdata&0x01; delay_18B20(10); DQ = 1; wdata>>=1; } } read_temp()/*读取温度值并转换*/ { uint a,b; ds1820rst(); ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0x44);//*启动温度转换*/ ds1820rst(); ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0xbe);//*读取温度*/ a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0x08ff) tflag=0; else { tvalue=~tvalue+1; tflag=1; } tvalue=tvalue*(0.0625)*10;//温度值扩大10倍,精确到1位小数 return(tvalue); } /*******************************************************************/ void ds1820disp()//温度值显示 { uchar flagdat; disdata[0]=tvalue/1000+0x30;//百位数 disdata[1]=tvalue%1000/100+0x30;//十位数 disdata[2]=tvalue%100/10+0x30;//个位数 disdata[3]=tvalue%10+0x30;//小数位 if(tflag==0) flagdat=0x20;//正温度不显示符号 17 else flagdat=0x2d;//负温度显示负号:- if(disdata[0]==0x30) { disdata[0]=0x20;//如果百位为0,不显示 if(disdata[1]==0x30) { disdata[1]=0x20;//如果百位为0,十位为0也不显示 } } wr_com(0x80+4); wr_dat(flagdat);//显示符号位 wr_com(0x81+4); wr_dat(disdata[0]);//显示百位 wr_com(0x82+4); wr_dat(disdata[1]);//显示十位 wr_com(0x83+4); wr_dat(disdata[2]);//显示个位 wr_com(0x84+4); wr_dat(0x2e);//显示小数点 wr_com(0x85+4); wr_dat(disdata[3]);//显示小数位 wr_com(0x86+4); wr_dat(0x43); } void zeroff(uchar *p) //灭0处理 { uchar i; for(i=0;i<5;i++) { if(*p==0) {*p=10;p++;} else break;}} void teL_dis(uint value) { uchar i; val_sp[0] = value/10; val_sp[1] = value%10; wr_com(0xc0+12); zeroff(val_sp); for(i=0;i<2;i++) {wr_dat(dis3[val_sp[i]]);} } void teH_dis(uint fre) { uchar i; fre_sp[0] = fre/10; 18 fre_sp[1] = fre%10; wr_com(0xc0+4); zeroff(fre_sp); for(i=0;i<2;i++) {wr_dat(dis3[fre_sp[i]]);} } void settings(void) //设置 { s1num++; if(s1num == 1) {teH_dis(teH); wr_com(0xc0+13);//lcd_pos(1,14); wr_dat(0x0f);//write_com(0x0f); } else if(s1num == 2) {teL_dis(teL); wr_com(0xc0+5); //lcd_pos(1,6); wr_dat(0x0f);} else { s1num = 0; teL_dis(teL); teH_dis(teH); } } void add(void) //加 { if(s1num == 1) { teL++; if(teL == 36) teL = 0; teL_dis(teL); } if(s1num == 2) { teH++; if(teH == 51) teH = 10; teH_dis(teH); } } void minus(void) //减 { if(s1num == 1) { teL--; if(teL == -1)teL = 35; teL_dis(teL); //cmd 19 } if(s1num == 2) { teH--; if(teH == 9) teH = 50; teH_dis(teH); } } //*************************报警程序**************************/ void baojing(void) { if(((read_temp()/10)>teH)||((read_temp()/10) if((read_temp()/10) void keyscan() {if(!SET) { delay1ms(30);if(!SET) settings();} if(!ADD) { delay1ms(30);if(!ADD) add();} if(!SUB) { delay1ms(30);if(!SUB) minus();} } //********************主程序***********************************// void main() { //BEEP=0; init_play();//初始化显示 while(1) { read_temp();//读取温度 ds1820disp();//显示 keyscan(); baojing() ; baojing2(); //} delay1ms(150);}} 20 硬件实物图: 21 因篇幅问题不能全部显示,请点此查看更多更全内容