历史上的今天
今天是:2025年07月18日(星期五)
2020年07月18日 | 【蓝桥杯单片机组】超声波模块
2020-07-18 来源:eefocus
超声波模块分为发射、接收两个部分:
发射:通过跳线帽将P10与发射端相连
接收:连接P11,采用CX20106A作为解调芯片,主要频率在38K~41KHz,超声波实验中主要使用40Hz,当CX20106A接受到40KHz的信号时,会在7脚产生一个低电平下降脉冲,在实际调试的时候只关心芯片的7脚在收到信号是是否有一个下降沿产生。在本电路的调试中,如果一直发射超声波,在7脚将会有周期的低电平产生。不会像通常认为的那样,即一直发射信号时,7脚一直为低电平。这是刚用CX20106时的一个常见错误。
编程 思想:
(1)开定时器开始定时
(2)发射超声波40KHz(每个电平维持100个NOP,一共8周期脉冲)
(3)检测是否有RX == 0的情况,若RX == 0则接收到了反馈的波
(4)定定时器,读时间
(5)读温度(读数时:温度 = 读数 * 0.0625)
(6)计算声速(声速 = 332 + 0.607 * 温度 (m/s))、距离(距离 = 时间 (us)* 声速(m/s) / 2)
附:发送超声波代码
void sendsonic()
{
uchar i;
for(i=8;i>0;i--)
{
TX = 0;
SNOP;SNOP;SNOP;SNOP;SNOP; SNOP;SNOP;SNOP;SNOP;SNOP;
TX = 1;
SNOP;SNOP;SNOP;SNOP;SNOP; SNOP;SNOP;SNOP;SNOP;SNOP;
}
}
void main()
{
speed = 0;time = 0;distans = 0;temper = 0;
bit1=0;bit2=0;bit3=0;bit4=0;
cls_buzz();
Timer0Init();
Timer1Init();
EA = 1;
while(1)
{
display();
if(sonic_flag == 1)
{
sonic_flag = 0;
TR1 = 1;
sendsonic();
while(RX == 1 && timeflag < 3);
TR1 = 0;
if(timeflag >= 3) //out of time
{
bit1 = 10; bit2 = 10; bit3 = 10; bit4 = 10;
}
else
{
outarea = 0; //in area
time = ((TH1<<8)|TL1) + timeflag * 65536; //us
temper = readtemper();
speed = 332 + 0.607*temper;
distans = speed * time * 0.00005;
bit1 = ((unsigned int)distans) /1000;
bit2 = (((unsigned int)distans) % 1000)/100;
bit3 = (((unsigned int)distans) % 100)/10;
bit4 = ((unsigned int)distans) % 10;
}
TH1 = 0;
TL1 = 0;
timeflag = 0;
}
}
}
void t0_isr() interrupt 1
{
static uchar iss2;
iss2++;
TL0 = 0xCD; //设置定时初值 //2ms
TH0 = 0xF8; //设置定时初值
if(iss2>= 200) //0.4s
{
iss2 = 0;
sonic_flag = 1;
}
}
void t1_isr() interrupt 3
{
timeflag++;
}
编程的时候出现的问题:距离一直计算出为0或1:
解决:将distance time speed等变量设置成double
还存在的问题:数码管定时闪烁(推测是超声波测距的程序打断了显示程序,导致显示时间不均匀)尚未找到良好解决方法
史海拾趣
|
来源:http://www.51c51.com/bbs/dispbbs.asp?boardid=6&replyid=200397&id=34655&page=1&skin=0&Star=1 我们知道,如果采用12MHz时钟时候,51定时计数器最大延时为65536us,为了产生1秒的频率计时间基准,通常的做法是采用50ms定时,然后再计数20 ...… 查看全部问答> |
|
想把flash文件夹下的196MB文件通过activesync复制到电脑上,却显示老是传到四分之一左右时进度条又从头开始传输了,不知道怎么回事,望高手帮忙分析下,多谢了!!!… 查看全部问答> |
|
请问大侠: 我最近才发现,我对P33的前四个32k的block的操作(unlock、erase、write)并没有执行,但是FALSH依然可以驱动起来,并且能够识别 对P33的前四个32k的block的操作并没有执行的原因: &n ...… 查看全部问答> |
|
我参照msdn上wince服务的介绍写了个服务,但好像一直没有被系统调用,大家帮忙看下原因. appKey.SetValue(\"Dll\", \"MyMobileService.dll\"); appKey.SetValue(\"Order\", \"10\", RegistryValueKind.DWord); appKey.SetValue(\"Prefix\", \"CU\" ...… 查看全部问答> |
|
广嵌威客网站http://vk.gd-emb.org,是广嵌网新推出的威客平台,致力于为有需要的人解决疑难,为有能力的人创造赚钱机会,希望大家多多支持,如果有什么好的推广建议,欢迎你向我们提出!QQ:249907593… 查看全部问答> |
|
目前程序是开了串口1,点了灯,烧录的hex用stm32f103 和sm32f101c6t6均测试通过,就是能够复位,但是101ret6就是不复位。。。折磨我一个星期了快。感觉是硬件的问题,但实在找不出哪里有问题了,换了个芯片还是这样。 希望大家帮忙… 查看全部问答> |




