蓝桥杯单片机超声波模块代码编程

蓝桥杯单片机超声波模块代码编程

历年的省赛都没有考到超声波模块,但是超声波模块还是非常重要的一个模块,还有就是既然很久没有考过,那么突然考一波也是很有可能的喔。还不抓紧学起来。

其实呢超声波模块的编程并不难,其实非常的简单,下面直接来看代码吧。

# include "reg52.h"
# include "intrins.h"

#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}

typedef unsigned char u8;
typedef unsigned int u16;

u8 code shuma[10] = {
   0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

sbit TX = P1^0;       // 超声波发送端
sbit RX = P1^1;       // 超声波接受端


unsigned char distance_table[3];     // 超声波检测到的距离值

	// 选择开通的外设
void select(u8 local)
{
   
    switch(local)
	{
   
	    case(4): P2 = (P2 & 0x1f) | 0x80; break;
		case(5): P2 = (P2 & 0x1f) | 0xa0; break;
		case(6): P2 = (P2 & 0x1f) | 0xc0; break;
		case(7): P2 = (P2 & 0x1f) | 0xe0; break;
	}
}

    // 数码管的延时函数
void delay_shuma()
{
   
    u16 i = 200;
	while(i--);
}

    // 点亮单个数码管函数
void display(u8 local, u8 num)
{
   
    select(6);
	P0 = 0x80 >> (local - 1);
	P2 = P2 & 0x1f;

	select(7);
	P0 = shuma[num];
	P2 = P2 & 0x1f;

	// 延时一下先
	delay_shuma();

	// 消隐
	select(6);
	P0 = 0x00;
	P2 = P2 & 0x1f;
}


void send_wave()           // 超声波发送函数
{
   
    u8 i = 8;
	while(i--)           // 连续发送8个波形,方便检测接收
	{
   
	    TX = 1;
		somenop;somenop;somenop;somenop;somenop;
		TX = 0;
		somenop;somenop;somenop;somenop;somenop;

	}
}

   // 发送超声波的延时函数 不用发送太过于频繁
void delay()
{
   
    unsigned char i, j;

	_nop_();
	i = 40;
	j = 146;
	do
	{
   
		while (--j);
	} while (--i);
}

/* Timer0 interrupt routine */
void tm0_isr() interrupt 3
{
   
    TH1 = (65535 - 50000) / 256;
	TL1 = (65535 - 50000) % 256;
}

void main()
{
   
    u16 t,distance;
	TMOD = 0x10;
	TH1 = (65535 - 50000) / 256;
	TL1 = (65535 - 50000) % 256;

	ET1 = 1;
	EA = 1;

    while(1)
	    {
   
		    
		    send_wave();
			TR1 = 1;		    // 这里直接打开TR1就可以打开定时器1了
			
			while((RX == 1) && (TF1 == 0));    // 一直在等待 
			TR1 = 0;

			if (TF1 == 1)								 // 计时溢出的时候
			{
   
			    distance = 999;
				TF1 = 0;
			}											 // 接收到信号
			else
			{
   
			    t = TH1;
				t <<= 8;
				t |= TL1;
				distance = (u16)(t * 0.017); 
				   
			}
			TH1 = 0;
			TL1 = 0;
			display(1, distance%10);
			display(2, distance/10%10);
			display(3, distance/100);
			delay();   // 延时两毫秒,不用一直发送超声波
		    
		}
}

具体思路可以查看图片解析:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115110.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue 子传父 多个值

    vue 子传父 多个值子组件子组件通过 emit 触发父组件中的自定义函数 第一个值为自定义函数名 后面的参数是向父组件传的值 van button click emitGetList type info 搜索 emitGetList this emit refreshList this cityValue this amount this requires 父组件 van button click emitGetList type info

    2025年6月17日
    0
  • 5种很牛的两位数乘法速算方法「建议收藏」

    5种很牛的两位数乘法速算方法「建议收藏」5种很牛的两位数乘法速算方法第一种:十几乘以任意两位数公式推导(10+b)(10c+d)=100c+10(bc+d)+bd=10(10c+bc+d)+bd=10((10c+d)+bc)+bd 方法:如果c=1,那么就是一个因数,加上另一个因数的尾数,做前积;两个因数的乘积,做尾积应用举例:11×11=|11+1||1×1|=12112×14=|12+4||2×4|=1681

    2022年6月8日
    52
  • touchesBegan 触摸事件

    touchesBegan 触摸事件一、概念介绍1、在用户使用App过程中,会产生各种各样的事件,iOS中的事件可以分为3大类型:1)触摸事件2)加速计事件3)远程操控事件响应者对象UIResponder        在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件。我们称之为“响应者对象”。      UIApplication、UIViewController、UIView都继承…

    2022年7月25日
    6
  • 一级域名与二级域名有啥区别

    一级域名与二级域名有啥区别

    2021年10月21日
    62
  • Swift如何给应用添加3D Touch菜单

    Swift如何给应用添加3D Touch菜单

    2021年5月27日
    146
  • 前端工程配置Nginx反向代理[通俗易懂]

    前端工程配置Nginx反向代理HTTP配置HTTPS配置配置两个反向代理,一个代理http页面,一个代理https页面,前者监听80端口,后者监听443端口。配置后整个文件如下,其中有不少冗余,挑有用的看即可。#user nobody;worker_processes 1;#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;#pid

    2022年3月11日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号