重庆邮电大学本科毕业设计(论文)
第四章 软件设计
第一节 编译语言与编译思想
汇编语言和C语言是目前单片机的两种主流编程语言。汇编语言的优点是代码短、程序效率高,但存在可移植性可读性差的缺点;C语言的优点是可移植性好、可读性好,但存在代码较长、代码效率较低的缺点。考虑到本次设计的超声波液位测量控制系统要求不太高,本次超声波液位测量控制系统的设计采用C语言编写。
本次软件设计采用程序设计模块化的思想,对实现不同功能的程序进行分段编程,这样不但使得整个程序有比较清晰的层次和结构,而且还很有利于软件的后期调试和修改。按本次设计的需要,单片机主要任务是发出控制信号使超声波模块开始工作并自动发出40kHz的脉冲,控制信号驱动超声波探头器发射超声波,同时单片机通过一个I/O口检测回波,该I/O口在有回波时输出高电平,高电平持续时间即是超声波的传播时间,由此得出超声波在测距系统与被测物间的往返传输时间t,再用前文推导的公式(式2-2)
S2?V?t22
可求出待测距离S。
第二节 软件设计
一、 总体设计
单片机液位控制系统的软件首要功能是控制超声波的发射和接收,测量介质中超声波的传播时间,再根据介质中超声波的传输传播速度来计算出被测对象与测量仪器之间的距离,并将计算出来的数据加上相关标识用LCD1602液晶显示器显示出来,同时使单片机输出控制信号以控制报警系统和液位控制系
- 15 -
重庆邮电大学本科毕业设计(论文)
统。要实现上述功能,软件具体来说应该包含初始化、参数读入、超声波发射、超声波传接收、计时、距离计算、数据显示、超限报警、液位控制等功能模块。程序设计流程图如图4.1所示。
过高 液位测量 过低
图4.1 程序设计流程图
结束 排水 数据显示 进水 参数设置 初始化
二、关键模块程序设计
1、超声波测距子程序
通过测量超声波模块与液面的传播时间来计算液面高度,流程图如图4.2。
图4.2 超声波测距程序设计流程图
- 16 -
重庆邮电大学本科毕业设计(论文)
测距程序如下: void CJ(void) {
Trig=1; //启动一次检测模块 delay_20us();
Trig=0; //停止向检测模块Trig端发送高电平 while(!Echo); //无回波时等待 TR0=1; //计时开始
while(Echo); //有回波是计数并继续等待 TR0=0;
time=TH0*256+TL0; /计算超声波的传播时间 TH0=0; TL0=0;
distance=145.05-time*0.172;// 计算距离,算出来的单位是mm if(distance<=0)distance=0;
if(distance>=145.05)distance=145.05;
// distance=(int)(distance*100)/100; //强制保留2位小数 }
2、按键控制子程序
通过按键控制程序实现参数设定,其中主要是正常液位范围的设定。包括设置参数的模式选择、单次递增(减)值大小(1或0.1)、递减、递增。程序如下:
float set_distance(float set_dis) {
if(!key3) {
delay(10); if(!key3)
- 17 -
重庆邮电大学本科毕业设计(论文)
{
while(!key3); set_dis=set_dis+b;
if(set_dis>=99) set_dis=99;
} }
…… }
return set_dis;
3、显示子程序
显示程序实现数据的实时显示,包括实时液位,允许的最高液位和最低液位,液位正常与否的状态。程序如下:
void display(uchar x,uchar y,uchar sz,uint num)//x:位置 y:第几排 sz:位数 num:值
{
uchar a[5]={0}; uchar i=0; uint Temp=num; while(Temp) {
a[i] = Temp;
Temp = Temp/10; i++;
}
if(y%2==1)
write_Com(0x80+x-1); else
- 18 -
重庆邮电大学本科毕业设计(论文)
}
write_Com(0xc0+x-1); for(i=sz;i>0;i--) {
write_Data(0x30+a[i-1]); }
4、主程序
主程序通过调用个子程序实现各功能。主程序如下:
void main() { uint w; }
init(); while(1) {
w++; if(w==5) { } BJ();
w=0; CJ();
display_Init(); }
5、延时子程序
在系统编程中,延时程序的应用是极其普遍的,按键的延时去抖就是一个很好的例子。本次设计的演示程序如下:
void delay(uint x)
- 19 -