您的当前位置:首页正文

八路温度数据采集系统设计(LED显示)

2020-02-22 来源:步旅网
西华大学课程设计

八路温度数据采集系统设计(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 #define uchar unsigned char #define uint unsigned int //外部函数引用申明 extern void tmstart();

//初始化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 #define uchar unsigned char #define uint unsigned int uint temp[8]=1; sbit ds=P3^7;

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 #define uchar unsigned char #define uint unsigned int

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 #define uchar unsigned char #define uint unsigned int

/********************************************************************/

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

因篇幅问题不能全部显示,请点此查看更多更全内容