八路温度数据采集系统设计(LED显示)
摘要
八路温度数据采集系统采用LED显示,选用8只DS18B20温度传
感器总线的方式。温度采集器以89C51单片机为控制核心,由控制、显示、采集等模块组成。详细分析了该采集器各模块的功能和接口电路原理、给出了软件系统的框架和各个函数的结构。附件:源程序代码、proteus的仿真图。
关键词:温度采集;单片机应用;Proteus仿真;LED显示;89C51
1 / 29
西华大学课程设计
目 录
摘 要.................................................. 错误!未定义书签。
1.1 绪论 .............................................. 错误!未定义书签。 1.2课题研究内容....................................................... 3 2 总体方案设计 .......................................................... 3 2.1 总体方案框图 ..................................................... 4 2.2 各模块的功能 ..................................................... 4 2.3 整体电路图 ....................................... 错误!未定义书签。 4 软件系统设计 .......................................................... 8 4.1 编程语言及开发工具 ............................................... 8 4.2 软件系统的流程结构 ............................................... 8 4.3 程序模块设计 ...................................................... 9 5 仿真及实验调试........................................................ 18
5.1 仿真原件 ........................................................ 18 5.2 仿真 ............................................................ 19 参 考 文 献.............................................................. 19 致 谢.................................................................. 20 附件1 .................................................................. 21 附件2 .................................................................. 21 附件3 .................................................................. 21
2 / 29
西华大学课程设计
1.1 绪论
随着科技的不断进步,在工业生产中温度是常用的被控参数,而采用单片机来对这些被控参数进行控制已成为当今的主流。本文介绍了数字温度测量及自动控制系统的设计。阐述了以89C5单片机为核心的温度控制系统的工作原理和设计方法。主要组成部分:89C51单片机、温度传感器、显示电路。仿真表明,本设计对温度的显示方便、简单的特点,元器件利用率高。温度信号由温度芯片DS18B20采集,并以数字信号的方式传送给单片机。文中介绍了该控制系统的硬件部分,包括:温度检测与温度显示。单片机通过对信号进行相应处理,从而实现温度在LED上显示的目的。
1.2课题研究内容
1主要内容
能采集8路温度,并每一秒钟显示一个通道的温度。 2具体要求
用MCS-51系列单片机作为控制器; 温度可采用DS18B20,误差±1℃; 用LED显示;
用1个键可以暂停一个通道的显示; 用Proteus完成所有功能的仿真; 设计或选用5V直流稳压电源模块。
2 总体方案设计
本课题将设计一个8路温度采集&显示器,但它上面装有LED液晶屏幕显示,可以根据时间显示不同通道的环境温度,切换时间位1s,也可以根据需求通过功能按键将一个通道的显示暂停。首先采用89C51单片机为控制核心,选用DS18B20温度传感器作为8路采集模块的采集器,由于每一片DS18B20芯片有自身的系列好,可以利用
3 / 29
西华大学课程设计
DS18B20单总线技术将8个传感器用一根总线连接一起。(单总线不同于I2C、SPI、SCI总线技术,单总线减低了IO口的开支,硬件开销少,成本低廉,便于总线的扩展和维护等有点。)由于采用单总线方式,对不同DS18B20的温度传感器有不同的序列号,因此特别设置了一个附加电路测DS18B20的序列号。
根据设计方案的分析:由于DS18B20温度传感器在启动的时候需要内部初始化,大概需要1S的时间,之后才会正确的显示各个通道的温度。
2.1 总体方案框图
八路温度采集器系统的硬件框图如图所示。 按键输入 8路温度传感器 51 单 片 机 Led显示 2.2 各模块的功能
温度采集器:电源模块、温度采集模块、键盘模块、信号选择模块、显示模块5个模块组成。
电源模块:选择市场上常用的5v充电电源;
温度采集模块:由单总线连8路DS18B20而成,8路DS18B20采用非寄生电源,由外部5v供电。
键盘控制模块:由一个独立按钮形成独立的按键,实现“暂停”功能。
4 / 29
西华大学课程设计
液晶显示模块:由4位LED、1位LED、限流电阻、三极管构成,实现对温度值的显示。
2.3 主要器件功能介绍
89C51
简介:
89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压、高性能CMOS8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 主要特性:
·与MCS-51 兼容 ·4K字节可编程闪烁存储器 寿命:1000写/擦循环 数据保留时间:10年 ·全静态工作:0Hz-24MHz ·三级程序存储器锁定 ·128*8位内部RAM ·32可编程I/O线 ·两个16位定时器/计数器 ·5个中断源 ·可编程串行通道 ·低功耗的闲置和掉电模式 ·片内振荡器和时钟电路
5 / 29
西华大学课程设计
DS18B20
概述:
DS1820 数字温度计提供 9 位温度读数,指示器件的温度。信息经过单线接口送入 DS1820 或从 DS1820 送出,因此从中央处理器到 DS1820 仅需连接一条,读写和完成温度变换所需的电源可以由数据线本身提供 而不需要外部电源;
因为每一个 DS1820 有唯一的系列号,因此多个 DS1820 可以存在于同一条单线总线上。这允许在许多不同的地方放置温度灵敏器件。此特性的应用范围包括 HVAC、环境控制、建筑物、设备或机械内的温度检测 以及过程监视和控制中的温度检测。 DS18B20的主要特性
1.1、适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数 据线供电
1.2、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯
1.3、 DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温
1.4、DS18B20在使用中不需要任何外围元件,全部 传感元件及转换电路集成在形如一只三极管的集成电路内
1.5、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃ 1.6、可编程 的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温
1.7、在9位分辨率时最多在 93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快
1.8、测量结果直接输出数字温度信号,以\"一 线总线\"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力 1.9、负压特性:电源极性接反时,芯片不会因发热而烧毁, 但不能正常工作
6 / 29
西华大学课程设计
内部ROM: 光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位 (28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用 是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。 ROM指令表 指 令 读ROM 符合 ROM 搜索 ROM 跳过 ROM 告警搜索命令 温度变换 读暂存器 写暂存器 复制暂存器 重EEPROM 调 44H 0BEH 4EH 48H 0B8H 0ECH 约定代码 33H 55H 0FOH 0CCH 功 能 读DS1820温度传感器ROM中的编码(即64位地址) 发出此命令之后,接着发出 64 位 ROM 编码,访问单总线上与该编码相对应的 DS1820 使之作出响应,为下一步对该 DS1820 的读写作准备。 用于确定挂接在同一总线上 DS1820 的个数和识别 64 位 ROM 地址。为操作各器件作好准备。 忽略 64 位 ROM 地址,直接向 DS1820 发温度变换命令。适用于单片工作。 执行后只有温度超过设定值上限或下限的片子才做出响应。 启动DS1820进行温度转换,12位转换时最长为750ms(9位为93.75ms)。结果存入内部9字节RAM中。 读内部RAM中9字节的内容 发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数据。 将RAM中第3 、4字节的内容复制到EEPROM中。 将EEPROM中内容恢复到RAM中的第3 、4字节。 读供电方式 0B4H 读DS1820的供电模式。寄生供电时DS1820发送“ 0 ”,外接电源供电 DS1820发送“ 1 ”。
7 / 29
西华大学课程设计
3.1 八路温度采集器电路图
4 软件系统设计
4.1 编程语言及开发工具
本系统的处理器是兼容8051指令集的高速单片机STC89C51。为此,首选Keil μVision 作为其开发工具。Keil μVision 是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统。其功能强大,生成的代码紧凑,是目前世界上使用最广泛的51系列兼容单片机开发工具。 4.2 软件系统的流程结构
温度采集器的软件主要包括温度的采集、数据的处理、LED显示、键盘管理等模块组成。其流程结构框图如下图所示:
系统经过初始化之后,过段时间采集温度传感器的值,避免温度传感器输出特性误报85读。显示一只温度传感器的温度持续1秒左右,检测时候按键按下,按下则持续显示这位温度传感器的温度。若没有按下则判断是否已经显示到最后只传感器,若是,则刷新温度值;若否则显示下一只温度传感器温度。
8 / 29
西华大学课程设计
4.3 程序设计
/*****************************miann.c**************************************/ #include //初始化ds18b20 不是最后只 最后只传 感器判断 显示当前传 感器温度 刷新温度 初始化 是最后只按键按下extern void read_dealtemp(); 9 / 29 按键检测 //读取并处理温度 西华大学课程设计 extern void showled(); sbit button=P3^0; uint wei; void delaym(unsigned int i) { char j; for(i; i > 0; i--) for(j = 200; j > 0; j--); } void main() { uint n,m; tmstart(); 动特性,所以加端程序屏蔽掉显示85度 read_dealtemp(); delaym(20000); while(1) { tmstart(); read_dealtemp(); for(n=0;n<8;n++) { button=1; for(m=0;m<100;m++) 描次数,决定显示不同温度传感器数值的时间 { wei=n; 10 / 29 //由于DS18B20的启 //初始化 //读取温度 //温度传感器循环 //传感器显示扫 西华大学课程设计 } showled(); while(button==0) { } } showled(); } } /*****************************18b20.c***********************************/ #include uchar lcdrom[8][8]={{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e}, {0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9}, {0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0}, {0x28,0x33,0xc5,0xb8,0x00,0x00,0x00,0xd7}, uint tvalue; 11 / 29 {0x28,0x34,0xc5,0xb8,0x00,0x00,0x00,0x52}, {0x28,0x35,0xc5,0xb8,0x00,0x00,0x00,0x65}, {0x28,0x36,0xc5,0xb8,0x00,0x00,0x00,0x3c}, {0x28,0x37,0xc5,0xb8,0x00,0x00,0x00,0x0b}, }; 西华大学课程设计 /****lcd程序****/ void delayms(uint ms)//延时 { } /****ds18b20程序****/ void dsrst()//ds18b20复位 { } bit dsrd0()//读一位数据 { 12 / 29 uint i,j; for(i=ms;i>0;i--) for(j=110;j>0;j--); uint i; ds=0; i=103; while(i>0)i--; ds=1; i=4; while(i>0)i--; uint i; 西华大学课程设计 } bit dat; ds=0;i++; ds=1;i++;i++; dat=ds; i=8;while(i>0)i--; return(dat); uchar dsrd()//读1个字节数据 { } void dswr(uchar dat)//写数据 { 13 / 29 uchar i,j,dat; dat=0; for(i=8;i>0;i--) { } return(dat); j=dsrd0(); dat=(j<<7)|(dat>>1); uint i; uchar j; bit testb; for(j=8;j>0;j--) { testb=dat&0x01; dat=dat>>1; 西华大学课程设计 } } if(testb) { } else { } ds=0; i=8;while(i>0)i--; ds=1; i++;i++; ds=0; i++;i++; ds=1; i=8;while(i>0)i--; void tmstart()//初始化ds18b20 { } void read_dealtemp()//读取并处理温度 { 14 / 29 dsrst(); delayms(1); dswr(0xcc); dswr(0x44); uchar i,j; uchar a,b; 西华大学课程设计 for(j=0;j<8;j++) { } dsrst(); delayms(1); dswr(0x55); for(i=0;i<8;i++) { } dswr(0xbe); a=dsrd(); b=dsrd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; temp[j]=tvalue; delayms(50); } dswr(lcdrom[j][i]);//发送64位序列号 /*************************show.c*****************************/ #include 15 / 29 西华大学课程设计 extern uint wei; extern uint temp[8]; void showled(); void shub(uint temp); extern delaym(unsigned int i); sbit LSA=P2^0; //管脚定义 sbit LSB=P2^1; sbit LSC=P2^2; sbit LSD=P2^3; sbit LSE=P2^4; unsigned char code Disp_Tab[] = {0x40,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //段码 unsigned int LedOut[5]; /********以下将读18b20的数据送到LED数码管显示*************/ void showled() { int i; LedOut[0]=Disp_Tab[wei+1]; shub(temp[wei]); for(i=0; i<5; i++) 16 / 29 { 西华大学课程设计 switch(i) { case 0:LSA=1;LSB=0;LSC=0;LSD=0;LSE=0; break; case 1:LSA=0;LSB=1;LSC=0;LSD=0;LSE=0; break; case 2:LSA=0;LSB=0;LSC=1;LSD=0;LSE=0; break; case 3:LSA=0;LSB=0;LSC=0;LSD=1;LSE=0; break; case 4:LSA=0;LSB=0;LSC=0;LSD=0;LSE=1; break; } P0 = LedOut[i] ; delaym(100); } P0 =0xff; } void shub(uint temp) { uint fl,i; if(temp&0x8000) { temp=~temp; temp+=1; fl=0; } else fl=1; i=temp*0.0625; 12位,分辨率是0.0625 temp=i*10+0.5; 只取1位,加0.5是四折五入 17 / 29 //温度数据处理 //温度在寄存器中是 //乘10表示小数点后 西华大学课程设计 temp=temp/10; LedOut[1]=Disp_Tab[temp%10000/1000]; LedOut[2]=Disp_Tab[temp%1000/100]; LedOut[3]=Disp_Tab[temp%100/10]; LedOut[4]=Disp_Tab[temp%10]; } if(fl==0) { if((temp/10)==0) LedOut[3]=Disp_Tab[10]; else if(temp/100==0)LedOut[2]=Disp_Tab[10]; else if(temp/1000==0)LedOut[1]=Disp_Tab[10]; //十位 //个位 } 5 仿真及实验调试 5.1 仿真原件: AT89C51(单片机) 7SEG-MPX1-CA(共阳级一位数码管) 7SEG-MPX4-CA(共阳级四位数码管) 电阻 电容 晶振 按键 DS18B20(温度传感器) 18 / 29 西华大学课程设计 5.2 仿真 参 考 文 献 [1] 黄惟公,邓成中,王燕.单片机原理与应用技术[M],西安-西安电子科技大学出版社, 2007.08 [2] 张毅刚.MC-51单片机应用设计(二版):哈工大出版社 2005 [3] 杨文龙.单片微机原理及应用.西安电子科技出版社 [4] 王桂敏,齐风河. 基于1-Wire总线技术的巡检系统[M],大庆师范学院学报,2007.4 [5] 周航慈.单片机程序设计基础.北京:北京航天航空大学出版社 [6] 胡汉才.单片机原理及其借口技术.北京:清华大学出版社 [7] DS18b20说明书 [8]常敏等 单片机应用程序开发与实践 电子工业出版社 2009; [9]周润景等 基于PROTEUS的电路及单片机系统设计与仿真 北航出版社 2006.5 19 / 29 西华大学课程设计 致 谢 首先我要感谢我的指导老师邓成中老师,他为我们为我们此次设计指明方向,形成了良好的学习氛围,指导我正确的学习方法,在此谨邓老师表达深深的谢意! 在设计的进行过程中,还得到了机械工程与自动化学院其张老师、余老师等几位老师的热心指导和帮助,帮我排除了很多困难,在此表示衷心的感谢! 还要非常感谢我的同学,我们同宿舍的同班的许多好朋友,他们给了我很多帮助! 20 / 29 西华大学课程设计 读序列程序 #include /********************************************************************/ sbit DS = P3^3; //温度传感器信号线 sbit rs = P1^4; //LCD数据/命令选择端(H/L)位声明 sbit rw = P1^3; //LCD读写控制,写为0,读为1 sbit lcden = P1^2; //LCD使能信号端位声明 /********************************************************************/ void delay(uint z); //延时函数 void DS18B20_Reset(void); //DS18B20复位,初始化函数 bit DS18B20_Readbit(void); //读1位数据函数 uchar DS18B20_ReadByte(void); //读1个字节数据函数 void DS18B20_WriteByte(uchar dat); //向DS18B20写一个字节数据函数 void LCD_WriteCom(uchar com); //1602液晶命令写入函数 void LCD_WriteData(uchar dat); //1602液晶数据写入函数 21 / 29 西华大学课程设计 void //LCD初始化函数 LCD_Init(); void Display18B20Rom(char Rom); //显示18B20序列号函数 /**********************************************/ /* 主函数 */ /**********************************************/ void main() { uchar a,b,c,d,e,f,g,h; LCD_Init(); rw = 0; DS18B20_Reset(); delay(1); DS18B20_WriteByte(0x33); delay(1); a = DS18B20_ReadByte(); b = DS18B20_ReadByte(); c = DS18B20_ReadByte(); d = DS18B20_ReadByte(); e = DS18B20_ReadByte(); f = DS18B20_ReadByte(); g = DS18B20_ReadByte(); h = DS18B20_ReadByte(); LCD_WriteCom(0x80+0x40); Display18B20Rom(h); Display18B20Rom(g); 22 / 29 西华大学课程设计 Display18B20Rom(f); Display18B20Rom(e); Display18B20Rom(d); Display18B20Rom(c); Display18B20Rom(b); Display18B20Rom(a); while(1); } /***************************************************/ /* 延时函数:void delay() */ /* 功能:延时函数 */ /***************************************************/ void delay(uint z)//延时函数 { uint x,y; for( x = z; x > 0; x-- ) for( y = 110; y > 0; y-- ); } /***************************************************/ /* DS18B20函数:void DS18B20_Reset() */ /* 功能:复位18B20 */ /***************************************************/ void DS18B20_Reset(void)//DS18B20复位,初始化函数 { uint i; DS = 0; 23 / 29 西华大学课程设计 i = 103; while( i > 0 ) i--; DS = 1; i = 4; while( i > 0 ) i--; } /***************************************************/ /* DS18B20函数:void DS18B20_Readbit() */ /* 功能:读1个字节数据函数 */ /***************************************************/ bit DS18B20_Readbit(void) //读1位数据函数 { uint i; bit dat; DS = 0; i++; //i++起延时作用 DS = 1; i++; i++; dat = DS; i = 8; while( i > 0 )i--; return( dat ); } /***************************************************/ /* DS18B20函数:void DS18B20_ReadByte() */ /* 功能:读1个字节数据函数 */ 24 / 29 西华大学课程设计 /***************************************************/ uchar DS18B20_ReadByte(void) //读1个字节数据函数 { uchar i,j,dat; dat = 0; for( i = 1; i <= 8; i++ ) { j = DS18B20_Readbit(); dat = ( j << 7 ) | ( dat >> 1 ); } return(dat); } /***************************************************/ /* DS18B20函数:void DS18B20_WriteByte() */ /* 功能:向DS18B20写一个字节数据函数 */ /***************************************************/ void DS18B20_WriteByte(uchar dat) //向DS18B20写一个字节数据函数 { uint i; uchar j; bit testb; for( j=1; j<=8; j++) { testb = dat&0x01; dat= dat>>1; 25 / 29 西华大学课程设计 if(testb) //写1 { DS = 0; i++;i++; DS = 1; i = 8;while(i>0)i--; } else { DS = 0; //写0 i = 8;while(i>0)i--; DS = 1; i++;i++; } } } /***********************************************/ /* LCD函数:void LCD_WriteCom() */ /* 功能:向LCD写入命令 */ /***********************************************/ void LCD_WriteCom(uchar com) { rs = 0; rw = 0; P0 = com; delay(5); lcden = 0; 26 / 29 西华大学课程设计 delay(5); lcden = 1; delay(5); lcden = 0; } /***********************************************/ /* LCD函数:void LCD_WriteData(uchar dat) */ /* 功能:向LCD写入数据 */ /***********************************************/ void LCD_WriteData(uchar dat) { rs = 1; //选择LCD为写入数据状态 rw = 0; lcden = 0; P0 = dat; //将待写入数据放到总线上 delay(5); lcden = 1; //给LCD使能端一个脉冲 delay(5); //信号将之前放到总线上 lcden = 0; //的数据写入LCD delay(5); } /***********************************************/ /* LCD函数:void LCD_Init() */ 27 / 29 西华大学课程设计 /* 功能:初始化LCD,设定LCD的初始状态 */ /***********************************************/ void LCD_Init() { LCD_WriteCom(0x38); //LCD显示模式设定 delay(15); LCD_WriteCom(0x08); //关闭LCD显示 delay(3); LCD_WriteCom(0x01); //LCD显示清屏 delay(3); LCD_WriteCom(0x06); //设定光标地址指针为自动加1 delay(3); LCD_WriteCom(0x0c); //打开LCD显示,但不显示光标 } /**********************************************/ /* */ /* 显示18B20序列号 */ /* */ /**********************************************/ void Display18B20Rom(char Rom) { uchar h,l; l = Rom & 0x0f; //取低4位 h = Rom & 0xf0; //取高4位 28 / 29 西华大学课程设计 h >>= 4; if( ( h >= 0x00 )&&( h <= 0x09 ) ) LCD_WriteData(h+0x30); //取ASCII码 else LCD_WriteData(h+0x37); //取ASCII码 if( ( l >= 0x00 )&&( l <= 0x09 ) ) LCD_WriteData(l+0x30); //取ASCII码 else LCD_WriteData(l+0x37); //取ASCII码 } 仿真图 29 / 29 因篇幅问题不能全部显示,请点此查看更多更全内容