资源描述
单片机课程设计
题 目 基于单片机超声波测距设计
目 录
1 课程设计目 1
2 课程设计任务及要求 1
3 方案论证 2
4 设计原理及功能说明 3
4.1 超声波测距原理 3
4.2 STC89C52RC单片机原理 4
4.3 超声波测距系统框图 5
5 单元电路设计 5
5.1 超声波模块电路 6
5.2 数码管显示电路 6
5.3 单片机最小电路 7
5.4 键盘连接 7
6 硬件制作及调试 8
6.1 硬件制作 8
6.2 调试 8
7 总结 9
参考文献 10
附录1:总体电路原理图 11
附录2:实物图 12
附录3:元器件清单 13
附录4:编程程序 14
24 / 27
1 课程设计目
1) 单片机课程设计是在教学及实验基础上,对课程所学理论知识深化和提高。因此,要求学生能综合应用所学知识,设计及制造出具有较复杂功能小型单片机系统,并在实践基本技能方面进行一次系统训练。 能够较全面地巩固和应用“单片机”课程中所学基本理论和基本方法,并初步掌握小型单片机系统设计基本方法。
2) 通过课程设计,培养综合运用本门课程及有关先修课程基本知识去解决某一实际问题实际本领,加深对该课程知识理解。主要培养以下能力:查阅资料:搜集及本设计有关部门资料(包括从已发表文献中和从生产现场中搜集)能力;方案选择:树立既考虑技术上先进性及可行性,又考虑经济上合理性,并注意提高分析和解决实际问题能力;迅速准确进行工程计算能力,计算机应用能力;用简洁文字,清晰图表来表达自己设计思想能力。
3) 培养学生正确设计思想,理论联系实际工作作风,严肃认真、实事求是科学态度和勇于探索创新精神。培养学生综合运用所学知识分析和解决工程实际问题能力。培养学生独立思考、独立收集资料、独立设计规定功能单片机系统能力;培养分析、总结及撰写技术报告能力。通过课程设计,使学生在理论计算、结构设计、仿真绘图、查阅设计资料、标准及规范运用和计算机应用方面能力得到训练和提高。巩固、深化和扩展学生理论知识及初步专业技能。
2 课程设计任务及要求
1) 使用51系列单片机、超声波模块等设计超声波测距系统;
2) 利用超声波模块进行测量系统到前方障碍物之间距离;
3) 通过数码管显示出测距距离。
3 方案论证
在当代工业生产中,普遍应用高科技测距方式有红外测距、激光测距及超声波测距三种。
1) 红外线测距技术: 红外线测距优点是成本便宜、仪器易制、安全性高,但其缺点较多,主要在于测量距离近、精度低、方向性差。自然界红外光分布比较广泛,容易引起测量误差。市场上红外线测距器一般测距范围在20cm-150cm之间,只适合于近距离测量,而其测量精度就更不值得一提了,只有1cm左右。
2) 激光测距方式激光测距优点是精确、距离远,缺点是需要注意人体安全,且制作难度较大,成本较高,而且光学系统需要保持干净,否则将影响测量结果。
3) 超声波测距方式 声音是及人类生活紧密相关一种自然现象。当声频率高到超过人耳听觉频率极限(根据大量实验数据统计,取整数为2000HZ)时,人们就会觉察不出周围声存在,因而称这种高频率声为“超”声。
超声波作为一种特殊声波,同样具有声波传输基本物理特性——反射、折射、干涉等等。超声波测距就是利用其反射特性。超声波反射器不断发出某一频率超声波,遇到被测物体后反射回反射波,然后超声波接收器接收到反射回来信号,并将其转换为电讯号,测出发射波和反射波时差,根据光速及计算公式,即可求出待测距离,超声波测距优点是比较耐脏污,即使传感器上有尘土,只要没有堵死就可以测量,测距范围比激光近,比红外远,一般为3cm-5cm,精度一般在1cm,有达到1mm级,超声波测距缺点是一定距离内有一定束角,受周围障碍物影响大,适合于室内测量,且测量精度受到温度一定影响。所以在这里我们选用超声波模块HC-SR04进行测距。-
4 设计原理及功能说明
本章主要介绍单片机超声波测距主要原理,包括超声波测距原理和STC89C52单片机原理。
4.1 超声波测距原理
谐振频率高于20kHz声波被称为超声波。超声波为直线传播频率越高、绕射能力越弱、但反射能力越强。利用超声波这种性能就可制成超声传感器、或称为超声换能器、它是一种既可以把电能转化为机械能、又可以把机械能转化为电能器件或装置。换能器在电脉冲激励下可将电能转换为机械能、向外发送超声波、反之,当换能器处在接收状态时它可将声能(机械能)转换为电能。压电式超声波发生器实际上是利用压电晶体谐振来工作。超声波发生器内部结构,它有两个压电晶片和一个共振板。当它两极外加脉冲信号,其频率等于压电晶片固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。
超声波发射器向某一方向发射超声波在发射时刻同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停 止计时。超声波测距是通过不断检测超声波发射后遇到障碍物所反射回波,从而测出发射和接收回波时间差t,然后求出距离S=Ct/2,式中C为超声波波速。
图4-1 超声波测距原理框图
由于超声波也是一种声波,其声速C及温度有关,察出了几种不同温度下声速。在使用时,如果温度变化不大,则可认为声速是基本不变。如果测距精度要求很高,则应通过温度补偿方法加以校正。声速确定后,只要测得超声波往返时间,即可求得距离。这就是超声波测距仪机理。其系统框图如图4-1所示。
4.2 STC89C52RC单片机原理
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35Mhz,6T/12T可选。
图4-2 STC89C52引脚图
4.3 超声波测距系统框图
图4-3 超声波测距系统框图
本系统以单片机控制为核心元件,单片机控制超声波发送,经过超声波测距模块处理后有一段高电平脉冲发送到单片机。经过单片机运算将时间系数转化为距离,最后通过处理将距离信息输出到数码管显示。
5 单元电路设计
硬件是一个机器基础,没有硬件,所有机器都不存在,本章主要介绍单片机超声波测距硬件原理。
5.1 超声波模块电路
图5-1 超声波模块电路
超声波模块如图4-1所示。从P2.6口给Trig口送一个10us脉冲,超声波模块自动发出40Khz超声波,单片机中断计时。当遇到障碍物时超声波返回,并将一个高平信号送入单片机,中断关闭。
5.2 数码管显示电路
图5-2 数码管显示电路
显示电路采用采用LED数码管显示。本系统采用动态显示方式。该组数码管位共阳极数码管。当有低电平驱动时,数码管亮。
5.3 单片机最小电路
图5-3 最小单片机电路
单片机最小电路是单片机能正常工作最小外接电路单元。是设计电路核心部分,也是整个作品最关键,最重要部分。单片机最小电路包括:复位电路,晶振电路。
5.4 键盘连接
图5-4 矩阵键盘电路
该矩阵键盘采用扫描式工作读入方式,扫描式键盘接口是一个输入输出接口,行是输入接口,而列式输出接口,输入接口主要功能是解决数据输入缓冲问题,而列输出接口主要功能是进行数据保持能力。系统扫描键盘是若有键按下,则执行主程序相应程序,实现相应功能。
6 硬件制作及调试
6.1 硬件制作
当设计好硬件电路之后,在Protues中画好电路图,然后进行调试。在进行调试之前,先及设计硬件电路图对照一下,看有没有画错,都确定之后调试,调试无误之后,即可在万能板上焊接。 当焊接时候,仔细对照仿真图,焊接完了之后再检查一遍,看有没有多焊、漏焊、错焊和虚焊等情况。
在电路焊接中,先把单片机最小系统焊接完成;在慢慢把其它模块外接电路焊接完成。我在这焊接过程中,主要遵守能不用条线地方尽量不用条线,在元器件上先小元器件开始焊接,在焊接高元器件。
6.2 调试
在Keil软件中输入软件程序,当软件程序主程序以及各部分子程序都编完之后,进行软件编译。 在编译过程中,下面提示框中提示有几个错误,找到相应错误区域之后,再对比之前程序,发现在输入程序时候出现了错误,对比改正之后再进行编译,发现没有错误。之后用烧录软件将生成.hex文件烧写单片机中,按下独立按键1,数码管开始显示测量距离;按下独立按键2时,数码管会保持前一秒所采集数据;按下独立按键3时,会复位数码管。
7 总结
为期一周单片机课程设计结束了,在这次课程设计中不仅检验了我所学习知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,及同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人及处世。
课程设计是我们专业课程知识综合应用实践训练,使我们迈向社会,从事职业工作前一个必不少过程.”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言真正含义.我今天认真进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实基础。
通过这次课程设计,本人在多方面都有所提高。通过这次课程设计,综合运用本专业所学课程理论和生产实际知识进行一次超声波测距设计工作实际训练从而培养和提高学生独立工作能力,巩固及扩充了单片机一些内容及编程技巧。提高了计算能力,绘图能力,熟悉了规范和标准,同时各科相关课程都有了全面复习,独立思考能力也有了提高。
在这次设计过程中,体现出自己单独设计能力以及综合运用知识能力,体会了学以致用、突出自己劳动成果喜悦心情,从中发现自己平
时学习不足和薄弱环节,从而加以弥补。
参考文献
[1] 余发山,王福忠.单片机原理及应用技术 [M].徐州:中国矿业大学出版社,2008.
[2] 蔡振江.单片机原理及应用[M].北京:电子工业出版社,2007.
[3] 吴黎明.单片机原理及应用技术[M].北京:科学出版社,2003.
[4] 刘乐善.微型计算机接口技术及应用[M].北京:华中科技大学出版社,2004.
[5] 李伯成.基于MCS-51单片机嵌入式系统设计[M].北京:电子工业出版社,2004.
[6] 吴黎明, 王桂棠, 洪添胜.单片机原理及应用技术[ M ] .北京: 科学出版社,2005.
附录1:总体电路原理图
附录2:实物图
附录3:元器件清单
序号
名称
型号规格
数量
1
单片机
STC89C52
1
2
四位一体数码管
S530-A2
1
3
三极管
S9012
4
4
电阻
1K
16
5
独立按键
3
6
电解电容
22uf
1
7
晶振
11.0592MHZ
1
8
电容
22PF
2
9
超声波测距模块
HC-SR04
10
导线
若干
附录4:编程程序
#include <reg52.h>
#include <intrins.h>
#define RX p26
#define TX p27
sbit RX = P2^6;
sbit TX = P2^7;
sbit p20 = P2^0;
sbit p21 = P2^1;
sbit p22 = P2^2;
sbit p23 = P2^3;
sbit p10 = P1^0;
sbit p11 = P1^1;
sbit p12 = P1^2;
unsigned int time = 0, timer = 0;
unsigned char posit = 0,a = 0;
unsigned long S = 0;
bit flag =0;
unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
unsigned char disbuff[4] ={ 0,0,0,0,};
void key_scanf(void);
void DelayUs2x(unsigned char t)
{ while(--t);}
void DelayMs(unsigned char t)
{ while(t--) //大致延时1mS
{ DelayUs2x(245);
DelayUs2x(245);
}
}
void Display(void) //扫描数码管
{
p20=0;p21=1;p22=1;p23=1;
P0=discode[disbuff[0]];
DelayUs2x(20);
P0=0xff;
p20=1;p21=0;p22=1;p23=1;
P0=discode[disbuff[1]];
DelayUs2x(20);
P0=0xff;
p20=1;p22=0;p21=1;p23=1;
P0=(discode[disbuff[2]])&0x7f;
DelayUs2x(20);
P0=0xff;
p20=1;p23=0;p21=1;p22=1;
P0=discode[disbuff[3]];
DelayUs2x(20);
P0=0xff;
}
/********************************************************/
void Conut(void)
{
float S1;
time=TH0*256+TL0;
TH0=0;
TL0=0;
S1=(time*1.7)/100; //算出来是CM
S=S1*10;
if((S>=7000)||flag==1) //超出测量范围显示“-”
{ flag=0;
disbuff[0]=10; //“-”
disbuff[1]=10; //“-”
disbuff[2]=10; //“-”
disbuff[3]=10; //“-”
}else{ disbuff[0]=S/1000;
disbuff[1]=S/100%10;
disbuff[2]=S/10%10;
disbuff[3]=S%10;
}
}
/********************************************************/
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{ flag=1; } //中断溢出标志
/********************************************************/
void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块
{ key_scanf();
TH1=0xf8;
TL1=0x30;
Display();
timer++;
if(timer>=400)
{ timer=0;
TX=1; //800MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;}
}
/*********************************************************/
void main( void )
{ TMOD=0x11; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
TH1=0xf8; //2MS定时
TL1=0x30;
ET0=1; //允许T0中断
ET1=1; //允许T1中断
TR1=1; //开启定时器
EA=1; //开启总中断
while(1)
{ while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0;
key_scanf();
if(a==1) //关闭计数
Conut();} //计算
}
void key_scanf(void)
{ if(p10==0)
{ DelayMs(10);
if(p10==0)
a=1;
}if(p11==0)
{ DelayMs(10);
if(p11==0)
a=0;
}if(p12==0)
{ DelayMs(10);
if(p12==0)
{ a=0;
disbuff[0]=0;
disbuff[1]=0;
disbuff[2]=0;
disbuff[3]=0;}
}}
展开阅读全文