杂:(3)超声波

本文档展示了一个基于12MHz时钟的超声波测距系统的程序实现,包括Timer0和Timer1的初始化,以及测距算法。主要功能是通过发送10us高电平信号并检测回响信号来计算距离,并在数码管上显示结果。程序中还包含了中断服务函数和延时函数,确保系统稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

12mhz下载 跳线是否连接正确

main.c

#include "mycode.h"

sbit TX=P1^0;
sbit RX=P1^1;
bit flag3;            //200ms±ê??
unsigned int t,distance;

void Timer0Init(void)		//5毫秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xA0;		//设置定时初始值
	TH0 = 0x15;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;
}


void Timer1Init(void)		//5毫秒@12.000MHz
{
	AUXR |= 0x40;		//定时器时钟1T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x00;		//设置定时初始值
	TH1 = 0x00;		//设置定时初始值
	TF1 = 0;		//清除TF1标志
//	TR1 = 1;		//定时器1开始计时
}

void main()
{
	System_init();
	Timer0Init();
	Timer1Init();
	EA = 1;
	while(1)
	{
		if(flag3==1)  //400ms更新一次
	   {
	   	//先发送10us高电平信号
			 TX=1;
			 delay_us(15);
			 TX=0;
			 等待输出回响信号高电平
			 while(RX==0);
			 TR1=1;
			 //等待回响信号变为低电平
		   while((RX==1)&&(TF1==0));
		   TR1=0;
		   if(TF1==1)//定时器计数溢出65536
		   {
			  distance=999;
			  TF1=0;
		   }
		   else
		   {
			   t=(TH1<<8)|TL1;
			   distance=((float)t*0.017)/12;//如果定时器为1分频则需要除以12  12个数为1us
			   //如果12T 12分频则不用除以12  一个数几位1us
		   }
		   TH1=0;
		   TL1=0;
		   flag3=0;
	   }
		 
		 
	   display(0,distance/100);
		 display(1,distance%100/10);
	   display(2,distance%10);
		 HC138(6,0xff);//消隐 位选
		 HC138(7,0xff);//消隐 段选
	}
}
void timer0() interrupt 1
{
	static unsigned char i;
	i++;
	if(i==80)
	{
	   flag3=1;
	   i=0;
	}
}

mycode.c

#include "mycode.h"

unsigned char code numb[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
};




void display(unsigned char x,unsigned char dat)
{
	HC138(7,0xff);
	HC138(6,1<<x);
	HC138(7,numb[dat]);
	
	delay_us(700);//延时保证数码管数字亮度

}


void System_init(void)
{
	HC138(4,0xff);
	HC138(5,0x00);
	HC138(0,0x00);

}




void delay_us(unsigned int t)		//@12.000MHz
{
	while(t--){
	_nop_();
	_nop_();
	_nop_();
	_nop_();}
}
void delay_ms(unsigned int t)		//@12.000MHz
{
	unsigned char i, j;
	while(t--){
	i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);}
}

mycode.h

#ifndef __MYCODE_H__
#define __MYCODE_H__

#include <reg52.h>
#include <stdio.h>
#include <intrins.h>

#define HC138(x,y) {P2&=0x1f;P2|=x<<5; P0=y;}
sfr AUXR=0x8e;




void System_init(void);
void display(unsigned char x,unsigned char dat);
void delay_us(unsigned int t);		//@12.000MHz
void delay_ms(unsigned int t);		//@12.000MHz
#endif


超声波信号进行数字检波的过程可以分为以下几个步骤: 1. 信号采集:使用超声波传感器将超声波信号转换为电信号,并通过模拟到数字转换器(ADC)将电信号转换为数字信号。 2. 预处理:对采集到的数字信号进行预处理,包括滤波、放大和去噪等操作。滤波可以去除高频噪声和散信号,放大可以增强信号的幅度,去噪可以减少背景噪声的影响。 3. 时域分析:通过对数字信号进行时域分析,可以获得信号的幅值、频率和时延等信息。常用的时域分析方法包括峰值检测、包络检测和时差测量等。 4. 频域分析:将数字信号进行傅里叶变换或小波变换等频域分析方法,可以将信号从时域转换到频域。频域分析可以提取信号的频率成分和频谱特征,用于进一步的信号处理和分析。 5. 检波处理:根据具体应用需求,对数字信号进行检波处理。常见的检波方法包括整流、平方、包络检测等。检波处理可以提取信号的振幅信息,用于后续的信号分析和判定。 6. 结果显示:将检波处理后的信号结果进行可视化显示或输出,以便用户进行观察和分析。可以使用图表、波形图或声音等形式展示检测结果。 需要注意的是,对超声波信号进行数字检波的具体方法和算法会因应用场景和需求而有所不同,上述步骤仅为一般的处理流程,具体实现需要根据具体情况进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值