C51:超声波测距

前言

每次把标题写成C51都有点心虚,之前还想着全TM都用汇编写。但是有一次看了别的学校的家伙的微机原理实验报告才知道。我学的汇编一点皮毛啊。也许微机原理是单片机课程的进阶版,下次去图书馆看看多哪些内容。


在这里插入图片描述

超声波测距模块HC-SR04

原理图
在这里插入图片描述

电器特性

电器特性 HC-SR04超声波模块
工作电压 DC 5V (直流5V)
工作电流 15mA
工作频率 40kHz
最远射程 4m
最近射程 2cm
测量角度 15°
输入触发信号 10us的TTL脉冲
输出回响信号 输出TTL电平信号,与射程相关
规格尺寸 452015mm (长宽高)

实物图
在这里插入图片描述
在这里插入图片描述
时序图
在这里插入图片描述

用T1发出触发,用T0测量时间



#include<reg52.h>


sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;


sbit ECHO_port=P2^1;
sbit TRIG_port=P2^0;

bit UltraWave_Flag=0;


unsigned char code table[]={
	0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
	0x77,0x7c,0x39,0x5e,0x79,0x71
};
unsigned char leds[4]=0;



void delay(int i);
void Init();
void Show();
void Count();
void main(){
	Init();
	while(1){
		while(!ECHO_port);
		//start T0
		TR0=1;
		while(ECHO_port);
		TR0=0;
		//analyze T0's data
		Count();
	}
}


void delay(int i){
	while(i--);
}
void Init(){
	TMOD=0x11;//T1-mode1   T0-mode1
	//initialize T0
	TH0=0;
	TL0=0;
	//initialize T1
	TH1=(0xff + 1 - 2000)/256;
	TL1=(0xff + 1 - 2000)%256;
	IE=0x8a;//1000 1010
	//start T1
	TR1=1;

}
void Show(){
	int i;
	for(i=0;i<4;i++){
		switch(i){
			case 0:
				LSC=0,LSB=0,LSA=0;
				break;
			case 1:
				LSC=0,LSB=0,LSA=1;
				break;
			case 2:
				LSC=0,LSB=1,LSA=0;
				break;
			case 3:
				LSC=0,LSB=1,LSA=1;
				break;				
		}
		P0=leds[i];
		delay(10);
		P0=0;
	}
}
void Count(){
	unsigned long a,b;
	a=TH0 * 256 + TL0;
	b=(long)a*0.17;
	//clear T0
	TH0=0;
	TL0=0;
	if(b>=4000||UltraWave_Flag){
		UltraWave_Flag=0;
		leds[3]=0x79;//E
		leds[2]=0x50;//r
		leds[1]=0x50;//r
		leds[0]=0x3f;//0
	}
	else{
		leds[3]=table[b/1000%10];
		leds[2]=table[b/100%10];
		leds[1]=table[b/10%10];
		leds[0]=table[b%10];
	}

}


void timer0_interrupt()interrupt 1{
	UltraWave_Flag=1;
}


void timer1_interrupt()interrupt 3{
	static int c=0;
	//initialize T1
	TH1=(0xff + 1 - 2000)/256;
	TL1=(0xff + 1 - 2000)%256;
	Show();
	if(++c>=100){///100 X 2ms
		c=0;
		TRIG_port=1;
		delay(1);
		TRIG_port=0;
	}

}


显示效果:
在这里插入图片描述

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

念心科道尊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值