单片机课程设计高度检测仪.docx
《单片机课程设计高度检测仪.docx》由会员分享,可在线阅读,更多相关《单片机课程设计高度检测仪.docx(20页珍藏版)》请在冰豆网上搜索。
![单片机课程设计高度检测仪.docx](https://file1.bdocx.com/fileroot1/2022-11/28/9f2e240b-3f4f-4788-a60e-e09176f83a6b/9f2e240b-3f4f-4788-a60e-e09176f83a6b1.gif)
单片机课程设计高度检测仪
课题:
高度检测
任务书
设计内容:
本课题以52系列单片机为核心,设计一个超声波测距系统。
要求用按键控制超声波模块实现对障碍物的测量,并在LCD显示器上显示测量到的距离。
设计要求:
1)确定系统设计方案;
2)进行系统的硬件设计;
3)完成必要的参数计算与元器件选择;
4)完成应用程序设计;
5)应用程序的调试。
一、课题名称….……………………….............................................................................1
二、内容摘要……………………………………………………………………………..1
三、方案论证………………………………………………………………………..……2
四、单独电路设计…………………………………………………………………………3
4.1键盘接口电路……………………………………………………………………..3
4.2液晶显示电路………………………………………………………………………4
4.3超声波驱动电路…….…………………………………………………………….5
4.4电源供电电路……………………………………………………………………..6
4.5单片机的选择………………………………………………………………………7
4.6单片机最小系统…………………………………………………………………...9
五、完整电路图…………………………………………………………………………….10
六、系统软件设计………………………………………………………………………….11
6.1液晶显示…………………………………………………………………………..11
6.2主程序……………………………………………………………………………..15
七、实验心得……………………………………………………………………………….23
致谢……………………………………………………………………………………24
参考文献………………………………………………………………………………25
附录……………………………………………………………………………………26
一、课题名称:
高度检测仪
二、内容摘要
电子测距仪要求测量范围在0.10~2.00m,测量精度1cm,测量时与被测物体无直接接触,
能够清晰稳定地显示测量结果。
由于超声波指向性强,能量消耗缓慢,在介质中传播的距
离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来
实现。
超声波测距器,可以应用于汽车倒车、建筑施工工地以及一些工业现场的位置监控,
也可用于液位、井深、管道长度的测量等场合。
利用超声波检测往往比较迅速、方便、计
算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,因此在移动机
器人的研制上也得到了广泛的应用。
本设计采用以STC89C52单片机为核心的低成本、高精度、微型化数字显示超声波测距
仪的硬件电路和软件设计方法。
整个电路采用模块化设计,由主程序、预置子程序、发射
子程序、接受子程序、显示子程序、语音播报子程序等模块组成。
发射模块发射超声波,接
受模块接受回波等。
三、方案论证
3.1超声波高度仪的设计思路
超声波是指频率高于20KHz的机械波。
为了以超声波作为检测手段,必须产生超生波和接收超声波。
完成这种功能的装置就是超声波传感器,习惯上称为超声波换能器或超声波探头。
超声波传感器有发送器和接收器,但一个超声波传感器也可具有发送和接收声波的双重作用。
超声波传感器是利用压电效应的原理将电能和超声波相互转化,即在发射超声波的时候,将电能转换,发射超声波;而在收到回波的时候,则将超声振动转换成电信号。
超声波测距的原理一般采用渡越时间法。
首先测出超声波从发射到遇到障碍物返回所经历的时间,再乘以超声波的速度就得到二倍的声源与障碍物之间的距离
测量距离的方法有很多种,短距离的可以用尺,远距离的有激光测距等,超声波测距适用于高精度的中长距离测量。
因为超声波在标准空气中的传播速度为331.45米/秒,由单片机负责计时,单片机使用12.0MHZ晶振,所以此系统的测量精度理论上可以达到毫米级。
由于超声波指向性强,能量消耗缓慢,在介质中传播距离远,因而超声波可以用于距离的测量。
利用超声波检测距离,设计比较方便,计算处理也较简单,并且在测量精度方面也能达到要求。
超声波发生器可以分为两类:
一类是用电气方式产生超声波,一类是用机械方式产生超声波。
本课题属于近距离测量,可以采用常用的压电式超声波换能器来实现。
3.2超声波测距仪原理图框图
根据设计要求并综合各方面因素,可以采用STC89C52单片机作为主控制器,用动态扫描法实现LCD数字显示,超声波驱动信号用单片机的定时器完成,超声波测距器的系统框图如图1.
四、单独电路设计
4.1键盘接口设计
键盘是人工干预计算机的主要手段,输入数据、查询及控制系统的工作状态,都要用到键盘。
微型计算机所用的键盘可分为编码键盘和非编码键盘两种。
编码键盘采用硬件线路来实现键盘编码,每按下一个键,键盘能自动生成按键代码,键数较多,而且还具有去抖动功能,这种键盘使用方便,但硬件较复杂,PC机所用的键盘就属于这种。
非编码键盘仅提供按键开关工作状态,其他工作由软件完成,这种键盘键数较少,硬件简单,一般在单片机应用系统中广泛用。
按键盘与CPU的连接方式可以分为独立式按键和矩阵式键盘,本系统采用独立式键盘,分为四个独立键盘:
液位下限增加键、减少键,液位上限增加键、减少键,键盘接口电路如图2所示。
图2键盘接口电路图
4.2液晶显示电路
液位显示采用液晶1602显示,显示容量为16*2个字符,工作电压在4.5~5.5V,字符尺寸2.95*4.35(WXH)mm,更直观的反映液位的变化,范围从20~4000(单位mm),更方便对高度范围的设置。
图3是显示电路的原理图。
图3显示电路原理图
4.3超声波驱动电路
HC-SR04超声波测距模块可提供2cm-400cm的非接触距离感测功能,测距精度可高达3mm;模块包括超声波发射器、接收器与控制电路。
采用IO口TRIG触发测距,模块发送8个40kHZ的方波,自动检测信号返回,测试距离=(发送到返回时间差*声速340M/S))/2。
原理图如图4所示。
图4超声波驱动原理图
4.4电源供电电路
由于本系统单片机及其他芯片的工作电压在4.5-5.5V之间,而供电的电压为12V远远超过其工作电压,需要通过此电路进行转换。
如图5所示
图5电源供电电路原理图
4.5单片机的选择
本文选用STC89C52RC单片机,STC89C52RC是一种带8K字节闪存可编程可擦除只读存储器的低电压、高性能CMOS8位微处理器,俗称单片机。
单片机的可擦除只读存储器可以反复擦除100000次以上。
AT89C51是一种带4K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,STC89C52RC是它的一种升级版本。
STC89C52RC单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
主要特性:
与MCS-51兼容
8K字节可编程闪烁存储器
寿命:
100000写/擦循环
数据保留时间:
10年
全静态工作:
0Hz-80MHz
三级程序存储器锁定
256×8位内部RAM
32可编程I/O线
两个16位定时器/计数
5个中断源
可编程串行通道
低功耗的闲置和掉电模式
片内振荡器和时钟电路
如图6是STC89C52单片机的示意图
图6STC89C52单片机示意图
4.6单片机最小系统
其作用主要是为了保证单片机系统能正常工作。
如图7所示,单片机最小系统主要由STC89C52单片机、外部振荡电路、复位电路和+5V电源组成。
在外部振荡电路中,单片机的XTAL1和XTAL2管脚分别接至由12MHZ晶振和两个30PF电容构成的振荡电路两侧,为电路提供正常的时钟脉冲。
图7单片机最小系统
五、完整电路图
六、系统软件设计
主程序模块要做的主要工作是上电后对系统初始化和构建系统整体软件框架,其中初始化包括对单片机的初始化和串口初始化等。
本次课题软件方面的程序包括主程序和液晶显示程序。
6.1液晶显示模块
#defineucharunsignedchar
#defineuintunsignedint
//LCD管脚声明
sbitLCDRS=P2^0;
sbitLCDEN=P2^1;
//初始画时显示的内容
ucharcodeInit1[]="IN:
0000MM-0000MM";
ucharcodeInit2[]="LevelNOW:
0000MM";
//LCD延时
voidLCDdelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
//写命令
voidwrite_com(ucharcom)
{
LCDRS=0;
P0=com;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
}
//写数据
voidwrite_data(uchardate)
{
LCDRS=1;
P0=date;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
}
//1602显示
voidinit_1602()
{
uchari=0;
write_com(0x38);//屏幕初始化
write_com(0x0c);//打开显示无光标无光标闪烁
write_com(0x06);//当读或写一个字符是指针后一一位
write_com(0x01);//清屏
write_com(0x80);//设置位置
for(i=0;i<16;i++)
{
write_data(Init1[i]);
}
write_com(0x80+3);
write_data('0'+LEVEL_one/1000);
write_data('0'+LEVEL_one%1000/100);
write_data('0'+LEVEL_one%1000%100/10);
write_data('0'+LEVEL_one%1000%100%10);
write_com(0x80+10);
write_data('0'+LEVEL_two/1000);
write_data('0'+LEVEL_two%1000/100);
write_data('0'+LEVEL_two%1000%100/10);
write_data('0'+LEVEL_two%1000%100%10);
write_com(0x80+40);//设置位置
for(i=0;i<16;i++)
{
write_data(Init2[i]);
}
write_com(0x80+0x40+10);
write_data('0'+VALUE[0]);
write_data('0'+VALUE[1]);
write_data('0'+VALUE[2]);
write_data('0'+VALUE[3]);
}
voiddisplay_1602()
{
write_com(0x80+3);
write_data('0'+LEVEL_one/1000);
write_data('0'+LEVEL_one%1000/100);
write_data('0'+LEVEL_one%1000%100/10);
write_data('0'+LEVEL_one%1000%100%10);
write_com(0x80+10);
write_data('0'+LEVEL_two/1000);
write_data('0'+LEVEL_two%1000/100);
write_data('0'+LEVEL_two%1000%100/10);
write_data('0'+LEVEL_two%1000%100%10);
write_com(0x80+0x40+10);
write_data('0'+VALUE[0]);
write_data('0'+VALUE[1]);
write_data('0'+VALUE[2]);
write_data('0'+VALUE[3]);
}
voiddisplay_NNNN()
{
write_com(0x80+3);
write_data('0'+LEVEL_one/1000);
write_data('0'+LEVEL_one%1000/100);
write_data('0'+LEVEL_one%1000%100/10);
write_data('0'+LEVEL_one%1000%100%10);
write_com(0x80+10);
write_data('0'+LEVEL_two/1000);
write_data('0'+LEVEL_two%1000/100);
write_data('0'+LEVEL_two%1000%100/10);
write_data('0'+LEVEL_two%1000%100%10);
write_com(0x80+0x40+10);
write_data('N');
write_data('O');
write_data('N');
write_data('O');
}
6.2主程序
#include//器件配置文件
#include
unsignedintLEVEL_one=40,LEVEL_two=60;
unsignedintVALUE[4]={0,0,0,0,};
#include
sbitRX=P1^7;
sbitTX=P1^6;
sbitKEY0=P1^0;
sbitKEY1=P1^1;
sbitKEY2=P1^2;
sbitKEY3=P1^3;
sbitMOTOR_one=P1^4;//排水水泵
sbitMOTOR_two=P1^5;//进水水泵
voidDelay5Ms(void);
voidDelay400Ms(void);
unsignedinttime=0;
unsignedlongintS=0;
unsignedcharflag=0,sign;
//400ms延时
voidDelay400Ms(void)
{
unsignedcharTempCycA=5;
unsignedintTempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
/********************************************************/
voidConut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*2.15)/10;//算出来是MM
if((S>=7000)||flag==1)//超出测量范围显示“-”
{
flag=0;
sign=1;
}
else
{
VALUE[0]=S%10000/1000;
VALUE[1]=S%10000%1000/100;
VALUE[2]=S%10000%1000%100/10;
VALUE[3]=S%10000%100%100%10;
}
}
/********************************************************/
voidtime_init()
{
TMOD=0x01;//设T0为方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1;//允许T0中断
EA=1;//开启总中断
}
/********************************************************/
voidStartModule()//启动模块
{
TX=1;//启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
/********************************************************/
voiddelayms(unsignedintms)
{
unsignedchari=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
/*********************************************************/
voidmain(void)
{
P0=0x00;
time_init();
init_1602();
Delay400Ms();//启动等待,等LCM讲入工作状态
while
(1)
{
StartModule();
while(!
RX);//当RX为零时等待
TR0=1;//开启计数
while(RX);//当RX为1计数并等待
TR0=0;//关闭计数
Conut();//计算
if((S%10000){
MOTOR_two=0;
MOTOR_one=1;//排水
}
elseif((S%10000)>LEVEL_two)
{
MOTOR_one=0;
MOTOR_two=1;//进水
}
else
{
MOTOR_one=1;
MOTOR_two=1;
}
if(KEY0==0)
{
while(KEY0==0);
if((LEVEL_one+1)<(LEVEL_two-14))
{
LEVEL_one++;
if(LEVEL_one==LEVEL_two)
LEVEL_one=30;
}
}
if(KEY1==0)
{
while(KEY1==0);
LEVEL_one--;
if(LEVEL_one==30)
LEVEL_one=LEVEL_two-14;
}
if(KEY2==0)
{
while(KEY2==0);
LEVEL_two++;
if(LEVEL_two==80)
LEVEL_two=LEVEL_one+14;
}
if(KEY3==0)
{
while(KEY1==0);
if((LEVEL_two-1)>(LEVEL_one+14))
{
LEVEL_two--;
if(LEVEL_two==50)
LEVEL_two=80;
}
}
if(sign==0)
display_1602();
else
{
display_NNNN();
sign=0;
}
delayms(10);//80MS
}
}
/********************************************************/
voidtimer0()interrupt1//T0中断用来计数器溢出,超过测距范围
{
TH0=0;
TL0=0;
flag=1;//中断溢出标志
}
七、实验心得
此次实验花费的心神较多,首先是设计电路,然后是单片机代码,由于我做的是高度仪,
通过超声波来实现的,无法在单片机上仿真。
在做实验期间挫折不断,但是在有一点成功后就会有无与伦比的喜悦,很有成就感。
通
过自己的努力,最终圆满完成了本次实验,结果很理想。
致谢
在这次超声波高度仪设计的过程中,我得到了许多人的帮助。
首先我要感谢的是我的老
师,在课程设计上给了我各方面的指导,这是我能顺利完成这次报告的首要条件。
更重
要的是帮我解决了许多技术上的难题,让我能把系统做的更加完善。
在此期间,我不仅
学到了许多的新知识,而且也开阔了视野,提高了自己的设计能力。
其次,我要感谢我
的同学,他们也为我解决了不少的设计难题。
这次课程设计让我明白了一个道理,个人
英雄主义精神自然可贵,但我发现,个人最终还是离不开集体。
参考文献
【1】黄智伟.全国大学生电子设计竞赛系统设计【M】.北京航空航天大学出版社,2006.
【2】张永瑞.电子测量技术基础【M】.西安电子科技大学出版社,1994.
【3】张谦琳.超声波检测原理和方法.北京:
中国科技大学出版社,1993.10
【4】九州.放大电路实用设计手册.沈阳:
辽宁科学技术出版社,2002.5
【5】樊昌元,丁义元.高精度测距雷达研究.电子测量与仪器学报,2000.10
【6】苏伟,巩壁建.超声波测距误差分析.传感器技术,2004.
【7】恒清,张靖.加强单片机系统抗干扰能力的方法.通化师范学院学报,2004.10
【8】晗晓,袁慧梅.单片机系统的印制板设计与抗干扰技术.电子工艺技术,2004.6
附录
材料清单
STC89C52芯片1个
上拉电阻1个
LCD显示1个
超声波模块1个
开关4个
滑动变阻1个
电容2个30pF
晶振1个12MHZ
电阻2个1K
LEDD灯2个