|
基于STC51单片机超声波测距精简设计只需三个元件(测距模块暂且算做是一个元件吧)
1.所需元件:STC单片机+超声波模块+4位共阳数码管
2.原理:单片机向测距模块trig脚发送20us的高电平触发测距,Echo 测距结束时会输出高电平,电平时长为超声波信号往返时间之和。Echo 脚开始输出高电平时启动定时计数器计时,当Echo 脚高电平结束时停止计数,根据定时器的时间可算出距离。
3.连接:单片机插在面包板上数码管直接插在单片机上面(引脚一一对应见原理图)测距模块trig脚接P5.4Echo 脚接P5.5
单片机插在面包板上
数码管插在单片机对应的位置
测距时序图
测距原理图
- /***************************************************************
- 作者: 刘海龙(部分程序来自网络及STC官网)
- 程序名: 51单片机超声波测距()
- 编写时间:2016年7月4日
- 硬件支持:超声波模块US-020、四位共阳数码管、STC单片机
- /***************************************************************/
- #include <STC15w.H>// 单片机头文件
- #include <intrins.h>
- #include <4LED_YANG.h>//包含共阳数码管驱动程序
- #define uchar unsigned char
- #define uint unsigned int
- uint timeH,timeL;//定义2个存储计时器值的变量
- uint distance;//定义测量值的变量
- uint time;//定义Echo脚返回的高电平时间变量
- /***************************************************************/
- sbit Echo = P5 ^ 5; //超声波测距模块Echo连接的IO
- sbit Trig = P5 ^ 4; //超声波测距模块Trig连接的IO
- /*******************************************/
- void delay1ms (unsigned int a){ // 1ms延时程序
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < 630; i++);//STC单片机在晶振为12MHz时i值上限为630
- } //AT89C51单片机在外部晶振为12MHz时i值上限为125
- }
- /*******************************************/
- void delay_20us() //@12.000MHz
- {
- unsigned char i;
- _nop_();
- _nop_();
- i = 57;
- while (--i);
- }
- /*********************************************************************************************
- 函数名:定时器初始化函数
- 调 用:INT_init();
- /**********************************************************************************************/
- void INT_init (void){
- TMOD=0x01; //定时器0,16位工作方式计数模式
- TH0=0; //定时器0清零
- TL0=0; //定时器0清零
- EA = 1; //总中断开
- Trig=0;//拉低为下次触发做准备
- }
- //***************************************************************
- void dist (void){//测量距离程序
- Trig=1; //
- delay_20us(); //延时20us
- Trig=0; //Trig输出20us高电平触发测距
- while(Echo==0); //等待Echo回波引脚变高电平
- TR0=1;//程序运行到此处时说明Echo脚变成了高电平,此时启动T0开始计时
- while(Echo==1); //等待Echo回波引脚高电平结束
- TR0=0;//程序运行到此处时说明Echo脚变成了低电平,此时T0停止计时
- time=TH0*256+TL0;
- distance=time*0.170; //测量距离
- distance=distance-2;//测量起点不同减去的数值不同
- TH0 = 0; //重置计时器
- TL0 = 0;
-
- }
- void main()//主函数
- {
- init();//单片机IO口工作方式初始化
- INT_init;//T0初始化
- while(1)
- {
- dist();//测量距离
- disp();//数码管显示距离
- delay1ms(20);//两次测量间需要有10ms间隔
- }
- }
- //***************************************************************END
复制代码
|
评分
-
查看全部评分
|