基于单片机的红外测距仪设计
系统简介
红外测距系统是一种无线测量系统,用于测量任务中的设备,它是提高工厂测量效率的必要设备之一。为了满足测量近距离且高精度的需求,本文设计了一款操作简单、可靠性高、可以保证完成测量的红外测距系统。
本设计主要采用单片机作为系统处理器,并将红外传感器、液晶显示模块、蜂鸣器模块结合起来,完成红外测距功能。系统可以随时进行测量,可以把测量到的距离数值在液晶屏上显示出来。该系统的测量距离一般在几十厘米之内,超出极限测量范围则会发生报警。
硬件设计介绍了实现红外测距的一般想法,并制作了红外电路原理图,说明了工作原理,报警模块,液晶显示模块,STC89C51单片机的红外测距传感器的引脚分布。软件设计描述了整个程序流的设计和每个程序的功能。最后,总结了整体设计,证明了红外测距的可能性。然后,可以逐步形成设计,改进软件和硬件开发平台,进一步扩展和开发。
关键词:红外测距; STC89C51单片机; 液晶显示
1 控制系统设计
1.1 主控制器选择
基于单片机的红外测距系统设计需要通过一个主控制器来实现,通过查找资料和学习,提出了两种可供选择的主控制器,分别为单片机控制和DSP控制,具体方案如下:
方案一:采用DSP作为主控制器,DSP即数字信号处理器,是一种研究用数字对信号进行分析,转换,滤波,检测,调制,解调和高速算法的元件[3]。数字处理器是用来保证各模块之间的通信,主要包括开机引导、信号读取和液晶屏初始化,以及液晶屏显示数字编解码芯片的运行状态。音频数字信号存储在闪存中。
方案二:系统可以使用单片机作为主控制器,单片机是一种虽然小但很完整的芯片,应用在集成电路中,也可以称之为微型计算机系统。芯片中包含随机储存器RAM、中央处理器处理器、只读存储器ROM、中断、定时器以及若干个I/O口等模块[2]。有些芯片中还包括脉宽调节模块、驱动模块、多路模拟转换等电路。单片机大量运用在工业环境中。采用单片机作为本设计的控制部分,系统主要由单片机、红外传感器、蜂鸣器及液晶显示器构成。红外传感器接收到信号后,模数转换器将好的数字信号转换到单片机上,再由单片机进行数字信号处理,最后由软件计算出数据发送到LCD。综上,与单片机相比,DSP主要是针对一些应用程序需要更高的计算能力,DSP的运行速度很快,但其控制算法相对复杂。而单片机的系统的控制方法相对简单,且可靠性高、价格较低、功耗低,不过单片机相比DSP功能比较简单,但是完全满足本设计需求,同时单片机来实现红外测距有着非常大的研究价值。因此本设计选用单片机作为主控制器。
1.2 项目总体设计
本设计基于单片机的红外测距系统设计由:STC89C51、红外传感器、LCD1602液晶显示器以及报警装置组成。按下红外测距系统的启动按键,可以进行预测值的设置,接着红外传感器进行测距,信号通过单片机处理转变为数据,将数据显示在LCD1602液晶显示器上,构成完整的红外测距系统。由如下模块组成:
(1)测距模块:红外传感器,发射并接收被反射的红外线进行测距,将所测得的模拟信号信息传入单片机中。
(2)最小系统模块:STC89C51单片机作为系统的主控制器,接收红外传感器所传递的的模拟信号信息[1],经过处理后再传递到液晶显示模块上。
(3)报警模块:有源蜂鸣器,如若测距范围超出装置的预设测量范围,则蜂鸣器发生报警。
(4)液晶显示模块:LCD1602液晶显示屏,接收单片机所处理好的数字信号信息,显示最终测得的数据值。
系统总体结构图如图1.1所示:
图1.1 系统总体框图
2 项目硬件设计
2.1 单片机控制模块
2.1.1 单片机型号选择
基于单片机的红外测距系统设计,对单片机的要求较高,要选用带有4K字节EEPROM存储空间的单片机,其次为了保证系统更好的运行,应选用性价比高、可靠性高、低功耗的控制器,以防止器件的损坏,影响系统的运行。基于此有以下两种方案可供选择:
方案一:采用STC89C51作为主控制器。STC89C51是系统中的可编程芯片。它使用8051内核,工作频率高达80MHz。该设备包含4K字节的只读程序内存,可进行擦除1000次,单片机指令与MCS-51完全兼容该设备。该芯片由8位通用处理器和ISP闪存单元组成。STC89C51单片机是一个时钟/机器周期的速度很快、能量消耗较低的新型单片机,它具有的开发简单、可在线编程下载、成本低的特点是非常不错的选择。
方案二:使用MSP430单片机作为主控制器。它被叫做混合信号处理器,它可以使许多功能各异的模块和微处理器集成在一个芯片上,MSP430系列单片机具有16位能量消耗超低和精简指令集[5]。一般来说,需要使用电池供电的设备仪表使用该系列的单片机。但是开发难度相对比较大、价格昂贵。
综上所述,与MSP430单片机相比,STC89C51单片机开发难度较低、稳定性高,而且价格合适,结合设计所需要的性能,最终选用STC89C51单片机作为主控制器。
2.1.2单片机的引脚说明
STC89C51单片机有两种封装形式,分别是PDIP(40引脚)和PLCC(44引脚)。在本设计中,直接插入PDIP(40个引脚)。为了方便更换芯片,避免芯片在高温焊接时损坏,焊接时可采用集成电路插座进行焊接,焊接完成后可将芯片插入集成电路插座,STC89C51所拥有的40个引脚中可以控制的有P0、P1、P2、P3各32个。这些引脚可以单独或同时在特定位的I/O端口进行控制,不需要定义输入和输出就可以很方便地进行控制。当将值赋给I/O时,I/O端口将自动转换为输出,当读取I/O端口时,I/O端口将自动转换为输入。
2.1.3 单片机的最小系统
单片机最小系统有三个部分,分别为:电源电路、晶振电路以及复位电路。在本设计中,STC89C51单片机可以在4.5~5.5V的电压范围中正常工作。电源部分采用USB电源线,可连接手机充电插头或5V移动电源,为系统供电。单片机的最小系统如图2.2所示:
图2.2为STC89C51单片机最小系统的电路图
总体接线图
3 项目软件设计
3.1 软件开发环境
本设计使用Keil μVision来实现。Keil是一个软件开发系统,其中兼容C语言。对于汇编来说,C语言具备可移植、易于维护和修改、方便调用模块、简单易学。Keil提供了完整的开发计划,包括C编译器,库管理,宏程序集,连接器以及将这些组件组装到集成开发环境(Vision)中的非常强大的模拟器调试器[9]。而使用它则因为其集成环境很方便,并且适用于STC89C51单片机。,该软件开发界面如图3.1所示 。
图3.1 软件开发界面图
具体的操作步骤为:开发时首先需要建立“Project”工程,选择“New μVision Project”,为新建的工程命名后点击保存,选择本设计选取的单片机型号“STC89C51”;成功建立工程后,选择“Source Group”按键,可添加文件,如果想编辑文件,可以点击“Add”。如图3.2所示:
图3.2 Keil μVision软件开发流程图
3.2 系统主程序设计
在整个系统运行过程中,当红外测距系统被启动后,首先,在装置进行预测值设定,接着红外传感器开始进行测距,将测得的信号传入单片机中,单片机开始判断所测距离是否超出预测范围,如果超过了预测范围,则蜂鸣器开始报警,此时应该对单片机进行复位操作,并且重新设定预测值;如果所测距离没有超过预测范围,则单片机将数据送至液晶显示屏上进行距离显示,随后对距离进行记录并关闭红外测距装置。在软件设计中,主程序不宜放太多的代码,可以采用函数将具体的代码封装后,在主函数中调用,这样修改起来也很方便。如图3.3所示。
图3.3 系统主程序设计流程图
3.3 LCD显示程序设计
这里采用8位并行接口来操作LCD1602。D0-D7与单片机的P0.0至P0.7相连。采用89C51的P0口作为LCD1602显示器的数据输入口,需要严格按照产品的时序要求进行编程。LCD1602的液晶显示器首先需要设计显示数据的地址,然后通过命令按顺序写入数据。当地址写入后显示第一个内容时,地址自动递增一。如图3.4所示。
图3.4 LCD显示程序流程图
源程序清单
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include <math.h>
#include “delay.h”
#include “i2c.h”
sbit RS = P2^4;
sbit RW = P2^5;
sbit E = P2^6;
sbit RES = P2^3;
sbit PSB = P2^1;
sbit PAUSE = P3^0;
unsigned char temp[8];
float num,i;
float a,b;
double data3;
#define DataPort P0 //MCU P0<——> LCM
#define AddWr 0x90 //写数据地址
#define AddRd 0x91 //读数据地址
sbit key1=P1^2;
sbit key2=P1^3;
sbit key3=P1^4;
extern bit ack;
unsigned char ReadADC(unsigned char Chl);
bit WriteDAC(unsigned char dat);
/————————————————
检测忙位
————————————————/
void Check_Busy()
{
RS=0;
RW=1;
E=1;
DataPort=0xff;
while((DataPort&0x80)==0x80);//忙则等待
E=0;
}
/————————————————
写命令
————————————————/
void Write_Cmd(unsigned char Cmd)
{
Check_Busy();
RS=0;
RW=0;
E=1;
DataPort=Cmd;
DelayUs2x(5);
E=0;
DelayUs2x(5);
}
/————————————————
写数据
————————————————/
void Write_Data(unsigned char Data)
{
Check_Busy();
RS=1;
RW=0;
E=1;
DataPort=Data;
DelayUs2x(5);
E=0;
DelayUs2x(5);
}
/————————————————
液晶屏初始化
————————————————/
void Init_ST7920()
{
DelayMs(40); //大于40MS的延时程序
PSB=1; //设置为8BIT并口工作模式
DelayMs(1); //延时
RES=0; //复位
DelayMs(1); //延时
RES=1; //复位置高
DelayMs(10);
Write_Cmd(0x30); //选择基本指令集
DelayUs2x(50); //延时大于100us
Write_Cmd(0x30); //选择8bit数据流
DelayUs2x(20); //延时大于37us
Write_Cmd(0x0c); //开显示(无游标、不反白)
DelayUs2x(50); //延时大于100us
Write_Cmd(0x01); //清除显示,并且设定地址指针为00H
DelayMs(15); //延时大于10ms
Write_Cmd(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动
DelayUs2x(50); //延时大于100us
}
/————————————————
显示用户自定义字符
————————————————/
void DisplayCGRAM(unsigned char x,unsigned char y)
{
switch(y)
{
case 1: Write_Cmd(0x80+x);break;
case 2: Write_Cmd(0x90+x);break;
case 3: Write_Cmd(0x88+x);break;
case 4: Write_Cmd(0x98+x);break;
default:break;
}
Write_Data(00);
Write_Data(00);
}
/————————————————
显示字符串
x:横坐标值,范围0~8
y:纵坐标值,范围1~4
————————————————/
void LCD_PutString(unsigned char x,unsigned char y,unsigned char a[8])
{ unsigned char k=0;
switch(y)
{
case 1: Write_Cmd(0x80+x);break;
case 2: Write_Cmd(0x90+x);break;
case 3: Write_Cmd(0x88+x);break;
case 4: Write_Cmd(0x98+x);break;
default:break;
}
while(k<9)
{
Write_Data(a[k]);
k++;
DelayUs2x(50);
}
}
/————————————————
清屏
————————————————/
void ClrScreen()
{
Write_Cmd(0x01);
DelayMs(15);
}
/————————————————
显示图片
————————————————/
void LCD_PutGraphic(unsigned char code *img)
{
int i,j;
//显示上半屏内容设置
for(i=0;i<32;i++)
{
Write_Cmd(0x80 + i); //SET 垂直地址 VERTICAL ADD
Write_Cmd(0x80); //SET 水平地址 HORIZONTAL ADD
for(j=0;j<16;j++)
{
Write_Data(*img);
img++;
}
}
//显示下半屏内容设置
for(i=0;i<32;i++)
{
Write_Cmd(0x80 + i); //SET 垂直地址 VERTICAL ADD
Write_Cmd(0x88); //SET 水平地址 HORIZONTAL ADD
for(j=0;j<16;j++)
{
Write_Data(*img);
img++;
}
}
}
/————————————————
设置到绘图模式
————————————————/
void SetGraphicMode()
{
Write_Cmd(0x36); //选择8bit数据流 图形模式
DelayUs2x(20);
}
/————————————————
主程序
————————————————/
main()
{
unsigned char i,j;
Init_ST7920();
while(1)
{ LCD_PutString(0,1,"长 ");
LCD_PutString(0,2,"宽 ");
LCD_PutString(0,3,"S ");
while(key1)
{ i=ReadADC(0);
if(i>=20&&i<=31)
{num=-2.5i+130;}
else if(i>=31&&i<=39)
{num=-1.428i+95.714;}
else if(i>=39&&i<=48)
{num=-1.111i+83.333;}
else if(i>=48&&i<=54)
{num=-0.833i+70;}
else if(i>=54&&i<=69)
{num=-0.357i+44.286;}
else if(i>=69&&i<=90)
{num=-0.227i+35.455;}
else if(i>=90&&i<=126)
{num=-0.147i+28.235;}
a=num;
num=num100;
temp[0]=‘0’;
temp[1]=(int)num/1000+‘0’;
temp[2]=(int)num/100%10+‘0’;
temp[3]=‘.’;
temp[4]=(int)num/10%10+‘0’;
temp[5]=(int)num%10+‘0’;
temp[6]=‘c’;
temp[7]=‘m’;
temp[8]=’ ';
LCD_PutString(2,1,temp);
DelayMs(50);
}
while(key2)
{ i=ReadADC(0);
if(i>=20&&i<=31)
{num=-2.5i+130;}
else if(i>=31&&i<=39)
{num=-1.428i+95.714;}
else if(i>=39&&i<=48)
{num=-1.111i+83.333;}
else if(i>=48&&i<=54)
{num=-0.833i+70;}
else if(i>=54&&i<=69)
{num=-0.357i+44.286;}
else if(i>=69&&i<=90)
{num=-0.227i+35.455;}
else if(i>=90&&i<=126)
{num=-0.147i+28.235;}
b=num;
num=num100;
temp[1]=(int)num/1000+‘0’;
temp[2]=(int)num/100%10+‘0’;
temp[3]=‘.’;
temp[4]=(int)num/10%10+‘0’;
temp[5]=(int)num%10+‘0’;
temp[8]=’ ';
LCD_PutString(2,2,temp);
DelayMs(50);
}
data3=ab10;
temp[0]=(int)data3/10000+‘0’;
temp[1]=(int)data3/1000%10+‘0’;
temp[2]=(int)data3/100%10+‘0’;
temp[4]=‘.’;
temp[3]=(int)data3/10%10+‘0’;
temp[5]=(int)data3%10+‘0’;
temp[6]=‘c’;
temp[7]=‘m’;
temp[8]=‘2’;
while(key3)
{
LCD_PutString(2,3,temp);
DelayMs(50);
}
ClrScreen();
}
}
unsigned char ReadADC(unsigned char Chl)
{
unsigned char Val;
Start_I2c(); //启动总线
SendByte(AddWr); //发送器件地址
if(ack0)return(0);
SendByte(0x40|Chl); //发送器件子地址
if(ack0)return(0);
Start_I2c();
SendByte(AddWr+1);
if(ack==0)return(0);
Val=RcvByte();
NoAck_I2c(); //发送非应位
Stop_I2c(); //结束总线
return(Val);
## 结 论
本篇论文针对工厂维修人员在需要完成测量任务的情况下,无法及时准确得测量出距离,导致任务不能有效的完成这一问题,设计出一种基于单片机的红外测距系统。维修人员使用红外测距仪根据任务的需求来进行测量,从而快速有效的完成测量任务。
本设计是由STC89C51单片机、测距模块、LCD显示模块等组成的红外测距系统。也利用Keil μVision软件编写C语言程序,使各个模块实现相应功能。本设计经过了硬件以及软件的测试,各部分均达到预期功能:实现了对10cm-80cm范围内的距离测量,如果超出测量范围会进行报警。该红外测距系统操作简单,准确性高,抗干扰能力较强。
该系统实现了为工厂维修人员提供测量便利,同时对于各个行业需要进行小范围测量的工作人员可以快速完成工作中的测量任务,使用测量起来方便快捷、简单准确,而且该设计成本不高,在材料上 也很节约,与其他的测量装置相比,此测量仪器性价比方面可以说是很高,而且能很快的融入人群当中所使用,更迅速的贴近生活,也能满足工业生产的测量要求,随需随用,使用起来也是简单实用。应用本设计产品,可以提高工厂维修人员完成测量任务的效率,促进企业的进一步发展。
作者:QQ1694456187