攀枝花学院本科毕业设计(论文) 4 软件设计
4 软件设计
4.1 软件设计架构
硬件电路的设计是一切的基础,在此础上,而软件的设计是关键的部分,它
是单片机的工作重点,就是让各个部分协调工作的命令,软件的程序重要性是毋庸置疑的,它是整个控制系统的命脉,根据各个部分编写出相应的驱动程序,才能够使得相应的芯片具有相应的功能,所以程序的设计是非常重要的。芯片的工作有着和自己相对应的时序图,只有根据芯片的时序准确的执行命令才能够达到想要的目的,才能够实现芯片的功能。程序的设计还需要有一定的思路,根据系统的运行过程要画出相应程序的流程图,而根据流程图写出程序是非常方便的,也是不容易产生错误的,而且可以得到正确的程序。如图4.1所示
21
攀枝花学院本科毕业设计(论文) 4 软件设计
Y 开始 初始化 开中断 显示温度和水位 是否到了水位低线 N 自动上水 关进水阀门 是否到了设定的温N 开加热器 Y 关加热器
图4.1 系统软件流程图
22
攀枝花学院本科毕业设计(论文) 4 软件设计
4.2 主控程序
void main() { }
while(1)
{ }
xianshiTemperature(); xianshishuiwei(); if(shuiwei<20) kai1=0; if(shuiwei>90) kai1=1; if(wendu<35) kai2=0; if(wendu>40) kai2=1;
4.3 应用程序
4.3.1 DS18B20的驱动设计
1延时函数 ○
延时函数delay用于延时指定的时间,用来构成1-wire总线协议所需要的时序。在程序中通过一个空循环语句便可以实现延时。 Void delay(int usecond) {
Int s;
For(s=0;s 复位函数reset用于完成1-wire总线的复位操作,程序中首先将数据DQ拉低并保持一段时间来实现1-wire总线上所有器件的复位。接着主机等待DS18B20返回的存在脉冲,并返回存在信号。如果返回0,则表示器件存在;返回1,则表示无器件。 Uchar reset(void) { Uchar presencesignal; 23 攀枝花学院本科毕业设计(论文) 4 软件设计 DQ=0; Delay(30); DQ=1; Delay(3); Presencesignal=DQ; Delay(30); Return presencesignal; } 3位写入函数 ○ 位写入函数writebit用于向1-wire总线上的器件写入一位值。程序中首先拉低数据线DQ开始写时间隙,然后向DQ写入数据。如果写入1,则数据DQ置1,反之置0。 Void writebit(char val) { DQ=0; If(val==1) DQ=1; Else DQ=0; Delay(5); DQ=1; } 4字节写入函数 ○ 字节写入函数writebyte用于1-wire总线上的器件写入一个字节数据。程序中采用循环移位的方式,每次调用位写入函数writebit写入一位。 Void writebyte(char val) { Uchar i; Uchar temp; For(i=0;i<8;i++) { temp = val>>i; Temp &= 0x01; Writebit(temp); } Delay(5); } 5位读取函数 ○ 位读取函数readbit用于从1-wire总线上读取从器件返回的一位值。程序中首先拉低数据线DQ开始读时间隙,然后将DQ置1。最后延时一段时间,读取并返回数据总线DQ上的位数据。 24 攀枝花学院本科毕业设计(论文) 4 软件设计 Uchar readbit(void) { Uchar i; DQ=0; DQ=1; For(i=0;i<3;i++) Rreturn DQ; } 6字节读取函数 ○ 字节读取函数readbyte用于1-wire总线上读取从器件返回的一个字节数据。程序中采用循环移位的方式,每次调用位读取函数readbit读取一位。 Uchar readbyte(void) { Uchar i; Uchar value=0; For(i=0;i<8;i++) { if(readbit()) Value|=0x01< Return(value); } 7读取温度函数 ○ 读取温度函数readtemperature用于读取DS18B20测量的温度。程序中首先复位1-wire总线,然后启动温度转换命令(代码为44H)。接着通过读暂存器命令(代码为BEH)。读取温度数据,最后通过处理输入对应的摄氏温度。 ReadTemperature(void) { uchar a=0; uchar b=0; uint t=0; float tt=0; Init_DS18B20(); Write(0xCC); Init_DS18B20(); Write(0xCC); Write(0xBE); 25 Write(0x44);