第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
/***接口定义**********************/ 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