单片机课程设计1.docx
- 文档编号:20255477
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:20
- 大小:595.59KB
单片机课程设计1.docx
《单片机课程设计1.docx》由会员分享,可在线阅读,更多相关《单片机课程设计1.docx(20页珍藏版)》请在冰豆网上搜索。
单片机课程设计1
课程设计报告
设计名称:
超声波测距
班级:
15q物联网1班
学号:
201524690127
姓名:
王东升
指导教师:
邢玉秀
2017年12月11日--2017年12月15日
基于单片机的超声波测距设计
1设计目的
我所设计的基于ATMEL公司AT89C52单片机的超声波测距,是利用该51单片机和HC-SR04超声波模块来测量距离。
超声波是只频率高于20kHz以上的声波,它属于机械波。
遵循一般机械波在弹性介质种的传播规律,如在介质的分界面处发生反射和折射的现象,在进入介质后被介质吸收而发生衰减等。
正是因为这些性质,使得超声波可以被用于距离的测量中。
超声测距是一种非接触检测技术,不受光线,被测对象的颜色等的影响,抗干扰能力强。
利用超声波检测往往比较迅速、方便、计算简单、易于实现实时控制,并且在测量精度方面能达到工业实用的指标要求,因而超声波测距被广泛的应用于生活中的各个方面,甚至于很多机器人能及时避开障碍物也是用的超声波测距。
因此研究超声波测距是非常有意义的。
基于市面上单片机成本低、精度高、易于控制、操作简单,故本设计采用AT89C52单片机和HC-SR04超声波模块来测量距离。
2设计方案
本设计采用以AT89C52单片机为核心的低成本、高精度、微型化数字显示超声波测距仪的硬件电路和软件设计方法。
整个电路采用模块化设计,由主程序、预置子程序、发射子程序、接收子程序、显示子程序等模块组成。
各探头的信号经单片机综合分析处理,实现超声波测距仪的各种功能。
在此基础上设计了系统的总体方案,最后通过硬件和软件实现了各个功能模块。
基本工作原理:
(1)采用IO口TRIG触发测距,给最少10us的高电平信呈。
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声
波从发射到返回的时间。
测试距离=(高电平时间*声速(340M/S))/2;
1)硬件设计:
超声波测距按模块可化分为:
·1单片机主控芯片
·2超声波发射部分(包括功率驱动电路、超声波发生器)
·3超声波接收部分(包括超声波接受器、放大电路、锁相环电路)
·4显示部分(显示电路LCD1602)
*5超声波是一种声波,属于机械波,其速度和使用环境的温度及空气的湿度、是否有尘埃物质都有较大的响,所以若要测量得更加精确,则必须要相关的传感器来检测使用的环境。
此处只列出温度的影响情况。
此处可加温湿度传感器和空气种颗粒物含量传感器,用以来补偿或估测环境引起的误差
LCD1602
2)软件设计
·1主程序设计:
主程序对整个单片机系统进行初始化后,先将超声波的回波接受标志位置位并且使单片机P2.1端口输出一个低电平用来启动超声波发射电路,,同时将定时器T0启动,然后调用距离计算的子程序,再根据定时器T0记录的时间计算出所需要测量的距离,然后再调用显示子程序,再将测出的距离以十进制的形式送至LCD1206液晶显示屏显示。
最后主程序通过对回拨信号的接收,完成后续的工作,假如标志位清0则说明接受到了回波信号,那么主程序就返回到初始端重新将回拨接收标志置位并且在单片机的P2.0端口上发送低电平到超声波的发射电路,就这样连续不断的来运行,循环不断的工作用来实现测距。
·2显示程序
初始化-->写命令-->写数据
*将各类函数声明都写到同一个头文件中,方便查看各个函数的参数以及功能。
3硬件电路
HC-SR04
超声波测距模块说明书
产品特点:
HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。
注:
1、此模块不宜带电连接,若要带电连接,则先让模块的GND端先连接,否则会影响
模块的正常工作。
单片机主控芯片原理图:
LCD1602液晶屏显示电路图:
HC-SR04模块硬件电路:
4软件程序
·1主程序(main.c)
#include
#include
#include"lcd.h"
sbitTrig=P2^1;
sbitEcho=P2^0;
unsignedcharUs[]="UltrasonicRange";
unsignedcharcodeASCII[15]={'0','1','2','3','4','5','6','7','8','9','.','-','M'};
staticunsignedcharDisNum=0;//显示用指针
unsignedinttime=0;
unsignedlongS=0;
bitflag=0;
unsignedchardisbuff[4]={0,0,0,0,};
/*******************************************************************************
*函数名:
main
*函数功能:
主函数
*输入:
无
*输出:
无
*******************************************************************************/
voidConut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100;//算出来是CM
if((S>=700)||flag==1)//超出测量范围显示“-”
{
flag=0;
DisplayOneChar(0,1,ASCII[11]);
DisplayOneChar(1,1,ASCII[10]);//显示点
DisplayOneChar(2,1,ASCII[11]);
DisplayOneChar(3,1,ASCII[11]);
DisplayOneChar(4,1,ASCII[12]);//显示M
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10%10;
DisplayOneChar(0,1,ASCII[disbuff[0]]);
DisplayOneChar(1,1,ASCII[10]);//显示点
DisplayOneChar(2,1,ASCII[disbuff[1]]);
DisplayOneChar(3,1,ASCII[disbuff[2]]);
DisplayOneChar(4,1,ASCII[12]);//显示M
}
}
voidzd0()interrupt1//T0中断用来计数器溢出,超过测距范围
{
flag=1;//中断溢出标志
}
voidStartModule()//启动模块
{
Trig=1;//启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig=0;
}
voiddelayms(unsignedintms)
{
unsignedchari;
for(ms;ms>0;ms--)
{
for(i=110;i>0;i--);
}
}
voidmain(void)
{
TMOD=0x01;//设T0为方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1;//允许T0中断
EA=1;//开启总中断
InitLcd1602();
LcdShowStr(0,0,Us);
while
(1)
{
StartModule();
while(!
Echo);//当RX为零时等待
TR0=1;//开启计数
while(Echo);//当RX为1计数并等待
TR0=0;//关闭计数
Conut();//计算
delayms(80);
}
}
·2LCD1602液晶显示函数声明(LCD.h)
#ifndef__LCD_H_
#define__LCD_H_
/**********************************
当使用的是4位数据传输的时候定义,
使用8位取消这个定义
**********************************/
#defineLCD1602_4PINS
/**********************************
包含头文件
**********************************/
#include
//---重定义关键词---//
#ifndefuchar
#defineucharunsignedchar
#endif
#ifndefuint
#defineuintunsignedint
#endif
/**********************************
PIN口定义
**********************************/
#defineLCD1602_DBP0//databus数据总线
sbitLCD1602_RS=P3^5;
sbitLCD1602_RW=P3^6;
sbitLCD1602_EN=P3^4;
/**********************************
函数声明
**********************************/
/*在51单片机12MHZ时钟下的延时函数*/
voidLcd1602_Delay1ms(uintc);//误差0us
voidRead_Busy();//忙检测函数,判断bit7是0,允许执行;1禁止
voidLcd1602_Write_Cmd(unsignedcharcmd);//写命令
voidLcd1602_Write_Data(unsignedchardat);//写数据
voidLcdSetCursor(unsignedcharx,unsignedchary);//坐标显示
voidLcdShowStr(unsignedcharx,unsignedchary,unsignedchar*str);//显示字符串
voidInitLcd1602();//1602初始化
voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData);
#endif
·3LCD1602液晶显示函数及初始化(LCD.c)
#include"lcd.h"
voidRead_Busy()//忙检测函数,判断bit7是0,允许执行;1禁止
{
unsignedcharsta;//
LCD1602_DB=0xff;
LCD1602_RS=0;
LCD1602_RW=1;
do
{
LCD1602_EN=1;
sta=LCD1602_DB;
LCD1602_EN=0;//使能,用完就拉低,释放总线
}while(sta&0x80);
}
voidLcd1602_Write_Cmd(unsignedcharcmd)//写命令
{
Read_Busy();
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_DB=cmd;
LCD1602_EN=1;
LCD1602_EN=0;
}
voidLcd1602_Write_Data(unsignedchardat)//写数据
{
Read_Busy();
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_DB=dat;
LCD1602_EN=1;
LCD1602_EN=0;
}
voidLcdSetCursor(unsignedcharx,unsignedchary)//坐标显示
{
unsignedcharaddr;
if(y==0)
addr=0x00+x;
else
addr=0x40+x;
Lcd1602_Write_Cmd(addr|0x80);
}
//按指定位置显示一个字符
voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData)
{
Y&=0x1;
X&=0xF;//限制X不能大于15,Y不能大于1
if(Y)X|=0x40;//当要显示第二行时地址码+0x40;
X|=0x80;//算出指令码
Lcd1602_Write_Cmd(X);//发命令字
Lcd1602_Write_Data(DData);//发数据
}
voidLcdShowStr(unsignedcharx,unsignedchary,unsignedchar*str)//显示字符串
{
LcdSetCursor(x,y);//当前字符的坐标
while(*str!
='\0')
{
Lcd1602_Write_Data(*str++);
}
}
voidInitLcd1602()//1602初始化
{
Lcd1602_Write_Cmd(0x38);//设置16*2显示,5*7点阵,8位数据接口
Lcd1602_Write_Cmd(0x0c);//设置开显示,不显示光标
Lcd1602_Write_Cmd(0x06);//写一个字符后地址指针加1
Lcd1602_Write_Cmd(0x01);//清屏,显示清0,数据指针清0
}
5调试结果及说明
最终调试出了正确的结果,理论上HC-SR04能测精确测量的量程是四米,然而实际精确测量的范围只有2.5米。
这与实验使用的单片机型号有很重要的关系。
所用的AT89C52单片机内部本来就焊接了很多电路,在本次超声波测距课设中都不会用到,其中的一部分电路还会影响其正常工作的性能。
另外AT89C52单片机的晶振为11.0592MHz,T0中断计数也有些微小的误差。
不仅如此,超声波的声速还受到温度、空气湿度、空气中固体颗粒尘埃物的含量有关,甚至还与不同障碍物表面材料的不同介质有关。
使用的超声波接受器和发射器是分开的,中间存在夹角,而在本次课程设计中并未考虑此因素,若想更精确一般回再乘以超声波感应夹角一半的余弦值。
除此之外,还有我们很少考虑到的余弦波的影响……。
*超生波测距被广泛地应用于生活中,本次设计也还可以做一些拓展,例如再加上蜂鸣器,当距离小于1米是蜂鸣器开始响,此项常用于车尾,倒车是后方距离太小就会发出警报。
实习收获
通过这次课程设计对我来说收获甚多。
单片机在生活中应用很广泛,起初选题的时候本来打算选可插SD卡的tft彩屏,可是发现tft彩屏太难,代码量太大,于是选择了比较简单且常用的超声波测距。
超声波测距原理的确简单,可是但对于设计菜鸟来说的我,真正接触到超声波时才发现原来超声波并不简单,它涉及的内容也不少,看了很比较多的资料,然而之后让我更加混乱了,更加没有头绪。
接着几天就没有看书,暂时放下课设,静静思考老师之前上理论课和实验课讲的步骤与方法,觉得做这些东西一般都采用自顶向下或者自底向上的设计方法,然而这些方法中有一个最核心的,那就是模块化。
于是我按照这种方法重新整理思路,接着再看书,果然效果好多了,一共两周的时间,我的课程设计终于步入正轨。
此次课程设计将我之前学习的很多知识都用上了,比如大学物理、模电、数电、C语言等,通过次次课程设计对之前所学的内容进行了一个整合,这是一种很美妙的体验,感觉自己的能力在此次课程设计种提升了不少。
同时也让我接触到了很多以前不知道的知识,对超声波有了更深的认识。
这次的课设让我收益最大的是学会了做一件是得有正确的思想理论方法指导,这样会事半功倍,在学习的时候一定得积极思考,否则会被一些资料引偏,最终毫无方向感。
学生:
年月日
成绩评定
优秀
良好
中等
及格
不及格
指导老师
参考文献:
胡汉才.单片机原理及其接口技术.清华大学出版社,2004
王安敏,张凯.基于AT89C52 单片机的超声波测距系统,仪表技术与传感器
杨居义.单片机课程设计指导,清华大学出版社
新浪博客—天涯海角,超声波模块HC-SR04简介及编程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计