为了实现系统的自动化功能,硬件设计只是完成了整个系统设计的基础部分,整个功能的智能化实现还是要靠软件设计来实现的。为了满足系统的要求,编制软件时一般要符合以下基本要求:
(1)易理解性、易维护性。要达到易理解和易维护等指标,在软件的设计方法中结构化设计是最好的一种设计方法,这种设计方法是由整体到局部,然后再由局部到细节,先考虑整个系统所要实现的功能,确定整体目标,然后把这个目标分成一个个的任务,任务中可以分成若干个子任务,这样逐层细分,逐个实现。 (2)实时性。实时性是电子测量系统的普遍要求,即要求系统及时响应外部事件的发生,并及时给出处理结果。近年来,由于硬件的集成度与速度的提高,配合相应的软件,实时性比较容易满足设计的要求。
(3)准确性。准确性对整个系统具有重要意义,尤其是测量系统,系统要进行一定量的运算。算法的正确性和准确性对结果有着直接的影响,因此在算法的选择、计算的精度等方面都要符合设计的要求。
4.1 主程序的设计
AT89S52单片机上电复位后,即进入主程序。主程序的作用是完成温湿度的测量,并把测量结果通过LED显示出来。主程序首先要做初始化,包括SHT11测量开始命令的初始化、I2C地址的初始化、LED字型码的定义等等。除了系统的初始化程序和从E2PROM中读取参数外,其余部分是个循环圈,循环圈的大小需要看工作时的条件,除非系统掉电或程序受干扰飞跑等异常情况而重新使系统复位。主程序流程图如图4-1所示。
开始 初始化 启动温/湿度测量 判断显示温/湿度 判断显示通道 读取温/湿度值 显示温/湿度值 N 判断是否超出 设定范围 Y 报警 图4-1 主程序的流程图 SHT11传感器共有5个用户命令。这5个命令是测量湿度、测量湿
度、读寄存器状态、写寄存器状态、软启动。具体命令见表4-1所示。
表4-1 SHT11传感器命令表
命令 测量温度
编码 00011
说明 温度测量
测量湿度 读寄存器状态
写寄存器状态 软启动
00101 00111
湿度测量 “读” 状态寄存器
00110
“写” 状态寄存器
11110 重启芯片,清除状态寄存器错误
记录11毫秒后进入下一个状态
系统主程序如下: 初始化
#include \"AT89X51.h \" #include \"intrins.h\" #define uchar unsigned char #define uint unsigned int
#define IIC_ADDRESS1 0X10 //I2C总线地址10H #define IIC_ADDRESS2 0X11 #define IIC_ADDRESS3 0X12
#define IIC_ADDRESS4 0X14 //I2C总线地址14H #define temperature_start 0x03 //温度传感器首选地址03H #define humidity_start 0x05 #define get_value 0x07
#define set_temperature_max 26℃ //设定最高报警温度 #define set_temperature_min 10℃
#define set_humidity _max 70% //设定最高报警湿度 #define set_temperature_min 40%
uchar code dis_7[]={0XC0,0xF9,0XA4,0XB0,0X99,0x92,
0x82, 0XF8,0x80,0x90};
uchar code yw[]={0xfe,0xfd,0xfb,0xf7,0xef};
uchar code iicaddress[4]= {IIC_ADDRESS1,IIC_ADDRESS2,
IIC_ADDRESS3,IIC_ADDRESS4}
I/O口定义
sbit SCL=P1^6; //定义I2C时钟控制位 sbit SDA=P1^7; //定义I2C数据传送位 sbit alarm_led=P3^4; sbit alarm_sou=P3^5; sbit key_sw1 = P1^0; sbit key_sw2 = P1^1;
延时函数 void nopdelay() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); }
void mDelay(uint t) //延时 { uchar I; while(t--) {
For ( i=0;i<125;i++) } } void main()
{ int temperature = 0; //初始温度为零
int humidity = 0; //初始湿度为零 static uchar states_sw= 0; static uchar channels_sw = 0;
while(1) {
if(key_sw1== 0) { }
if(key_sw2== 0) { }
if(states_sw == 0) {
Writebyte_i2c(iicaddress[channels_sw]temperature_start); temperature = readbyte_i2c(IIC_ADDRESS1, get_value ); Display(temperature); //显示温度数据
If((temperature>set_temperature_max)||(temperat-ure channels_sw = channels_sw%4; states_sw++; states_sw = states_sw%2; } alarm(); else { writebyte_i2c(iicaddress[channels_sw], humidity_start); humidity = readbyte_i2c(IIC_ADDRESS1, get_value ); Display(humidity); If((humidity>set_humidity_max)&&(humidity } alarm(); } 4.2 I2C模块程序设计 启动总线函数 void start_i2c(void) { SDA=1; //发送起始条件的数据信号 _Nop(); //数据线保持高,延时 SCL=1; //发送起始条件的时钟信号 _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; //发送起始信号 _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; //钳住总线,准备发送或接收数据 _Nop(); _Nop(); } 结束总线函数 void stop_i2c() { SDA_i2c=0; //发送结束条件的数据信号 _Nop(); //等待 SCL_i2c=1; _Nop(); _Nop(); _Nop(); _Nop(); SDA_i2c=1; //发送总线结束信号 _Nop(); _Nop(); _Nop(); _Nop(); } I2C字节数据传送函数 void sendbyte(uchar c) { uchar BitCnt; for (BitCnt=0; BitCnt<8; BitCnt+ +) { if((c<< BitCnt)&0x80) SDA=1; //判断发送位 else SDA=0; _Nop(); SCL=1; //置时钟线为高,通知被控器开始接收数据 _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; } _Nop(); _Nop(); SDA=1; //发送完后释放数据线,准备接受应答位 _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); If (SDA= =1) ack=0; else ack=1; //判断是否接收到应答信号 SCL=0; _Nop(); _Nop(); } I2C接收字节数据 uchar receivebyte_i2c() { uchar retc; uchar BitCnt; retc=0; SDA=1; //置数据线为输入方式 for(BitCnt=0;BitCnt<8;BitCnt + +) { _Nop(); SCL_i2c=0; //置时钟线为低,准备接收数据位 _Nop_(); _Nop_(); _Nop_(); _Nop_(); _Nop_(); SCL_i2c=1; //置时钟线为高位,使数据线上的数据有效 _Nop_(); _Nop_(); retc=retc<<1; if(SDA_i2c= =1) retc=retc+1; //读数据位,接收的数据位放入retc _Nop_(); _Nop_(); } SCL=0; _Nop_(); _Nop_(); return(retc); //返回 4.3 显示程序设计 void Display(int number) //显示数据 { int I; long int t; uchar key_data[4]; t=number; for(i=4;i>=0;i--) { key_data[i]=t%10; t=t/10; } for(i=0;i<4;i++) { P0=1; P2=yw[i]; P0=dis_7[key_data[i]]; Delay(10); P0=1; } 4.4 报警电路程序设计 void alarm() { alarm_led=1; alarm_sou=1; nopdelay(); nopdelay(); nopdelay(); alarm_led=0; alarm_sou=0; nopdelay(); nopdelay(); nopdelay(); } 因篇幅问题不能全部显示,请点此查看更多更全内容