问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

请大侠帮忙编一下程 超声波测距的

发布网友 发布时间:2022-05-30 06:35

我来回答

2个回答

热心网友 时间:2023-10-12 23:33

我做过和你一样的电路的超声波测距
下面是成功的代码

#include <reg52.h> //包括一个52标准内核的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
sbit Tx = P3^3; //产生脉冲引脚
sbit Rx = P3^2; //回波引脚
sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚
sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚
sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
unsigned char code string[ ]= {"CHAO SHENG BO"};
//unsigned char code string1[ ]={"QUICK STUDY MCU"};
unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字
//uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9
uint distance[4]; //测距接收缓冲区
uchar kk,ww,ge,shi,,temp,flag,outcomeH,outcomeL,i; //自定义寄存器
bit succeed_flag; //测量成功标志
//********函数声明
void conversion(uint temp_data);
void delay_20us();
void pai_xu();

/*****************************************************
函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
unsigned char BusyTest(void)
{
bit result;
RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1; //E=1,才允许读写
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
result=BF; //将忙碌标志电平赋给result
E=0; //将E恢复低电平
return result;
}
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_(); //空操作两个机器周期,给硬件反应时间
P0=dictate; //将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:指定字符显示的实际地址
入口参数:x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
}
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=y; //将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
***************************************************/
void LcdInitiate(void)
{
delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
delay(5); //延时5ms ,给硬件一点反应时间
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x38); //连续三次,确保初始化成功
delay(5);
WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁
delay(5);
WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
delay(5);
WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除
delay(5);
}

void main(void) // 主程序
{ uint distance_data,a,b;
uchar CONT_1;
uchar k; //定义变量i指向字符串数组元素
LcdInitiate(); //调用LCD初始化函数
delay(10); //延时10ms,给硬件一点反应时间
WriteAddress(0x01); // 从第1行第3列开始显示
k = 0; //指向字符数组的第1个元素
while(string[k] != '\0')
{
WriteData(string[k]);
k++; //指向下字符数组一个元素
}
i=0;

flag=0;
Tx=0; //首先拉低脉冲输入引脚
TMOD=0x10; //定时器0,定时器1,16位工作方式
// TR0=1; //启动定时器0
IT0=0; //由高电平变低电平,触发外部中断
//ET0=1; //打开定时器0中断
EX0=0; //关闭外部中断
EA=1; //打开总中断0

while(1) //程序循环
{
WriteAddress(0x41); // 从第2行第6列开始显示
WriteData('J'); //将万位数字的字符常量写入LCD
WriteData('U'); //将万位数字的字符常量写入LCD
WriteData('L'); //将万位数字的字符常量写入LCD
WriteData('I'); //将万位数字的字符常量写入LCD
WriteData(':'); //将万位数字的字符常量写入LCD
WriteData(digit[ww]); //将万位数字的字符常量写入LCD
WriteData(digit[kk]); //将万位数字的字符常量写入LCD
WriteData(digit[]); //将万位数字的字符常量写入LCD
WriteData(digit[shi]); //将千位数字的字符常量写入LCD
WriteData('.'); //将万位数字的字符常量写入LCD
WriteData(digit[ge]); //将百位数字的字符常量写入LCD
WriteData(' '); //将百位数字的字符常量写入LCD
WriteData('C'); //将万位数字的字符常量写入LCD
WriteData('M'); //将万位数字的字符常量写入LCD
EA=0;
Tx=1;
delay_20us();
Tx=0; //产生一个20us的脉冲,在Tx引脚
while(Rx==0); //等待Rx回波引脚变高电平
succeed_flag=0; //清测量成功标志
EX0=1; //打开外部中断
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //
TR1=1; //启动定时器1
EA=1;

while(TH1 < 250);//等待测量的结果,周期65.535毫秒(可用中断实现)
TR1=0; //关闭定时器1
EX0=0; //关闭外部中断

if(succeed_flag==1)
{
distance_data=outcomeH; //测量结果的高8位
distance_data<<=8; //放入16位的高8位
distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据
distance_data*=12; //因为定时器默认为12分频
distance_data/=58; //微秒的单位除以58等于厘米
} //为什么除以58等于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
if(succeed_flag==0)
{
distance_data=0; //没有回波则清零

}

distance[i]=distance_data; //将测量结果的数据放入缓冲区
i++;
if(i==3)
{
distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;

pai_xu();
distance_data=distance[1];

a=distance_data;
if(b==a) CONT_1=0;
if(b!=a) CONT_1++;
if(CONT_1>=3)
{ CONT_1=0;
b=a;
conversion(b);
}
i=0;
}
}
}
//***************************************************************
//外部中断0,用做判断回波电平
INTO_() interrupt 0 // 外部中断是0号
{
outcomeH =TH1; //取出定时器的值
outcomeL =TL1; //取出定时器的值
succeed_flag=1; //至成功测量的标志
EX0=0; //关闭外部中断
}
//****************************************************************
//定时器0中断,用做显示
timer0() interrupt 1 // 定时器0中断是1号
{
// TH0=0xfd; //写入定时器0初始值
// TL0=0x77;

}

//显示数据转换程序
void conversion(uint temp_data)
{
uchar ge_data,shi_data,_data,k_data,w_data ;
w_data=temp_data/10000 ;
temp_data=temp_data%10000; //取余运算
k_data=temp_data/1000 ;
temp_data=temp_data%1000; //取余运算
_data=temp_data/100 ;
temp_data=temp_data%100; //取余运算
shi_data=temp_data/10 ;
temp_data=temp_data%10; //取余运算
ge_data=temp_data;

//_data=SEG7[_data];
//shi_data=SEG7[shi_data]&0x7f;
//ge_data =SEG7[ge_data];

EA=0;
kk=k_data;
ww=w_data;
= _data;
shi = shi_data;
ge = ge_data ;
EA=1;
}
//******************************************************************

void delay_20us()
{ uchar bt ;
for(bt=0;bt<60;bt++);
}
void pai_xu()
{ uint t;
if (distance[0]>distance[1])
{t=distance[0];distance[0]=distance[1];distance[1]=t;}
if(distance[0]>distance[2])
{t=distance[2];distance[2]=distance[0];distance[0]=t;}
if(distance[1]>distance[2])
{t=distance[1];distance[1]=distance[2];distance[2]=t;}
}

热心网友 时间:2023-10-12 23:34

摘 要 I
ABSTRACT(英文摘要) II
目 录 IV
第一章 引 言 1
1.1 课题的提出 1
1.2 超声波测距发展概况 2
1.3 本课题研究内容及科学意义 3
第二章 超声波测距技术综述 4
2.1 超声及超声传感器简介 4
2.1.1 超声概述 4
2.1.2 超声传感器结构 6
2.1.3 超声传感器的主要参数及选择 9
2.2 超声测距原理与方法 10
2.3 测量盲区的影响 12
2.4 本章小结 13
第三章 硬件系统设计 15
3.1 方案论证 15
3.2 凌阳61板简介 16
3.2.1 功能区分与工作原理 16
3.2.2 系统各模块工作原理 16
3.3 超声波测距模组简介 20
3.3.1 超声波谐振频率发生电路、调理电路 20
3.3.2 超声波回波接受处理电路 21
3.3.3 超声波模组电源设置 22
3.4 LED键盘模组简介 23
3.5 硬件系统设计说明 23
3.5.1 系统设计 23
3.5.2 硬件原理图 24
3.5.3 系统连接 24
3.6本章小结 26
第四章 软件系统设计 27
4.1 主程序设计 27
4.2 超声波测距程序设计 29
4.3 本章小结 31
第五章 试验结果与改进 32
5.1 系统调试 32
5.2 试验结果分析 34
5.2.1 试验结果 34
5.2.2 误差分析 37
5.2.3 系统改进方法 37
5.3 本章小结 38
结论 39
参考文献 41
致谢 44
附录一 45
附录二 46
附录三 47
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 奥格瑞玛传送门大厅怎么走 锻炼颈椎的几个动作 水多久能结冰 冰能在多长时间内形成 请问水低于0度会结冰吗? 如何防止脱发严重 嘴唇上有黑印用蜜蜡和棉线去除了胡须 一体化超声波测距的运放电路 项目需要,需用到一款一体化的超声波测距电路,附图想请都后面的信号放大和滤波,用什么运放合适? 中国移动怎么发信息给泰国的手机 请问泰国手机怎么给中国移动手机发短信 泰国用微信接到的红包是泰币还是人命币,怎么取出来。 qq泰国版能不能发红包? 怎么让手机淘宝店铺装修跟电脑的一样 因为我看手机版别人的店铺首页都跟在电脑上的一样 我有一些高档女装外套,羊毛的中老年人穿的,有20-30件吧,怎么出手呢 在桂林开超市办营业证,税务证,烟草证方便吗 去滑雪需要准备什么物品?用不用准备运动鞋啊? 熊猫抓娃娃,抓到的娃娃到货了会不会付钱? 小爱怎样才能让熊猫抓娃娃有更多金额? 环形电场中电势怎么变化 带q电圆环对圆心轴线上一点P(圆环各点距离P为d)的电势和点电荷q对于距离为d的P点的电势相等么? 半径为R的均匀带电细圆环,电荷线密度为U,则环心处的电势是? 大物一个均匀带电半圆环,场强我会,它圆心电势怎么求?无穷吗? 圆环中心电势为什么用KQ/r? 那不是点电荷电势公式吗 圆环为什么产生电动势 视频朋友圈怎么发 WIN10网络无法连接,显示“设备的登录要求与网络不相符”,怎么处理啊? 第一次使用超声波测距模块! 求控制端 和接收端 使用技巧即超级简单电路原理图! 谢谢!详细答题 怎样利用超声波测距模块制作开关,就是达到一定距离就会接通电路那种 带超声波传感器的电路怎么用软件仿真,做的超声波测距 如何用555定时器替代超声波测距模块引脚图及功能 超声波测距模块里元件作用 HC-SR04超声波测距模块能不能把5V的工作电压改成20V的工作电压(不伤害电路的情况下)? 应急响应的介绍 如何做好应急响应 歌词,(漫长这些天,你不在我身边,我相信羁绊还会容我们再见一面)是啥歌? 让我们在见一面,说声好久不见是那首歌 漫长的一天,你不在身边,好多话要对你说等待再见那一天,走过好远,有你在身边,好多话要对你说等待再见 和see you again调子一样的曲子,是一首中文歌 没有你在身边,过每一天都是那么的漫长什么意思 速度与激情7的主题曲中文翻译(漫长的时间你不在身边后面什么) 男女对唱求歌词:原来天空也黑了.站在这熟悉的街,这些年你 不在身边 你不在的这些天好难熬好漫长英文翻译 “这些天我总是想起,过去的时光;偶然间我变得慌张,你不在身旁”这首歌叫什么?完整的歌词 唉,你不在的这些天里,你(她)知道我心里有多想你吗?我心里有一万个舍不得你走…… 女孩发我不在的这些天,过得如何?什么意思? 落叶黄了 天变凉了 你不在身旁了。。。是什么歌???