多点式单总线数字温度监测系统(完整程序)(5)

2018-11-22 18:40

第4章 系统软件设计

4.1 软件设计总体思路及主程序流程图

本系统采用C语言编写,主程序主要由四部分构成,系统通电后首先初始化系统,依次完成温度采集、温度处理、数据显示等三项功能。温度采集部分主要完成4个温度测试点的温度数据采集任务;温度处理部分主要实现对采集到的温度进行处理;数据显示部分主要实现温度数据的显示。系统软件主流程如图4-1所示:

开始 系统初始化 温度采集 温度处理 数据显示 图4-1 系统软件总流程图

4.2 测温模块流程图

每一片DSl8B20在其ROM中都存有其唯一的48位序列号,在出厂前已写入片内ROM中,主机在进入操作程序前必须逐一接入DSl8B20,用读ROM(33H)命令将该DSl8B20的序列号读出并登录。当主机需要对众多在线DSl8B20的某一个进行操作时首先要发出匹配ROM命令(55H),紧接着主机提供64位序列(包括该DSl8B20的48位序列号)之后的操作就是针对该DSl8B20的,而所谓跳过ROM命令即为之后的操作,是对所有DSl8B20的框图中先有跳过ROM即是启动所有DSl8B20进行温度变换之后通过匹配ROM再逐一地读回每个DSl8B20的温度数据在DSl8B20组成的测温系统中主机在发出跳过ROM命令之后再发出统一的温度转换启动码44H就可以实现所有DSl8B20的统一转换再经过1s后就

1

4.2.1 温度的采集

可以用很少的时间去逐一读取这种方式,使其T值往往小于传统方式。由于采取公用的放大电路和A/D转换器只能逐一转换,显然通道数越多这种省时效应就越明显。

读温度 初始化温度传感器 进行温度转换 读取温度 调试显示子程序 子程序返回 图4-2 DSl8B20操作流程图

4.2.2 多点温度的采集

单总线 已经挂接了4个DS18B20。由于已经在上面获取了多个DS18B20的ROM代码并在AT89C51单片机内部的中建立了测量位置点和传感器64位ROM代码之间的关系表,因此对多个温度的巡回测量的步骤如下:

(1)发跳过ROM命令CCH。

(2)发启动所有在线的DS18B20进行温度转换命令44H。 (3)延迟1s。

(4)发匹配ROM命令55H。

(5)按照AT89C51中建立的关系表的顺序取出64位ROM代码发送到单总线。 (6)发读温度值命令BEH,读取温度值。

(7)进行CRC校验和数据处理后送LCD显示器显示。 (8)重复第4步到第7步,直到所有的DS18B20测量处理完。 (9)再重复第1步到第8步,进行下一轮的巡回测量。

如果只对某一个DS18B20进行温度测量,只要将第1步跳过ROM命令CCH,

2

改为匹配ROM命令55H,将拨动开关拨到和要测量的DS18B20的编号相对应的数值上,单片机读取拨动开关的数值(编号)n,到AT89C51建立的关系表中从(n -1)×8开始的单元取出ROM代码发送到总线,去掉第8步,其余和上面步骤相似即可。测试中,DS18B20选择芯片出厂时默认的12位转换精度,转换的结果用16位符号扩展的二进制补码读数形式提供。

初始化 设置18B20个数 跳过ROM 符合ROM 等待1S 读存储器 初始化 缓冲指针增一 初始化 否 B-1=0? 是 图4-3 多路温度测量电路流程图

4.3 显示模块流程图

开始 初始化LCD1602 写显示地址 写显示字符 子程序返回 图4-4 LCD1602操作流程图

3

4.4 参照流程图编写程序

程序如下: 4.4.1 头文件 LCD1602.H

/*********lcd1602.h头文件****功能LCD1602驱动函数的申明********/ #ifndef _LCD1602_H_ #define _LCD1602_H_ #include #include #define uchar unsigned char #define uint unsigned int

/***接口定义**********************/ sbit LcdRs =P2^0; sbit LcdRw =P2^1; sbit LcdEn =P2^2; sfr DBPort =0x80; //sbit LcdRs =P3^7; //sbit LcdRw =P3^6; //sbit LcdEn =P2^0; //sfr DBPort =0x80;

/*********功能:判断LCD忙 ****参数:无**********/ unsigned char Lcd_Wait(void);

/************功能:写LCD函数 **** 参数:style为写命令/数据,0-命令,1-数据;input为写入的8位 ****

#define Lcd_Command 0 #define Lcd_Data 1

#define Lcd_Clear_Screen 0x01 #define Lcd_Home 0x02

void Lcd_Write(bit style,unsigned char input);

/**********功能:设置显示模式 ****参数: ***************/ #define Lcd_Display_On 0x04 #define Lcd_Display_Off 0x00 #define Lcd_Cursor 0x02 #define Lcd_No_Cursor 0x00 #define Lcd_Flash 0x01

4

命令/数据**********/

#define Lcd_No_Flash 0x00

void Lcd_SetDisplay(unsigned char DisplayMode);

/**************功能:LCD移动设置****参数:取值如下***************/ #define Lcd_CursorMove 0x00 #define Lcd_PictureMove 0x08 #define Lcd_Left 0x00 #define Lcd_Right 0x04

void Lcd_Move(unsigned char MoveMode);

/********功能:LCD输入设置 ****参数:取值如下***********/ #define Lcd_Ac_Up 0x02 #define Lcd_Ac_Down 0x00 #define Lcd_Move_To 0x01 #define Lcd_No_Move 0x00

void Lcd_SetInput(unsigned char InputMode);

/********功能:LCD初始化****参数:取值如下************/ void Lcd_Init(void);

/*********功能:显示位置设置 **参数:x-行;y-列*******/ void GotoXY(unsigned char x,unsigned char y);

/********功能:LCD显示函数****参数:str-要显示的字符串指针******/ void Print(unsigned char *str); void print_char(uchar );

/*********功能:LCD清屏函数**参数:无 *******/ void ClrScreen(void);

/*********功能:LCD归位函数**参数:无 *******/ void Screen_home(void); #endif

4.4.2 头文件 DS18B20.H

#ifndef _DS18B20_H_ #define _DS18B20_H_

extern void ds18b20_init(void);

extern unsigned char ds18b20_readdata(void);

extern void ds18b20_writecommand(unsigned char command); extern void temperature_process(unsigned char,unsigned char);

5


多点式单总线数字温度监测系统(完整程序)(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:案例分析

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: