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

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

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

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

# 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Kinect开发学习笔记之(一)Kinect介绍和应用

    Kinect开发学习笔记之(一)Kinect介绍和应用

    2021年12月5日
    35
  • duilib消息类型[终于解决]

    //定义所有消息类型//////////////////////////////////////////////////////////////////////////#defineDUI_MS

    2021年12月18日
    48
  • 软件测试工程师自我介绍_软件测试工程师简历自我评价

    软件测试工程师自我介绍_软件测试工程师简历自我评价目录:导读一、前言:浅谈面试二、软件测试工程师:简历模板三、软件测试工程师:简历包装1.基本信息:2.教育背景:3.专业技能4.工作经历5.项目经验6.自我评价四、软件测试工程师:简历总结一、前言:浅谈面试面试是我们进入一个公司的门槛,通过了面试才能进入公司,你的面试结果和你的薪资是息息相关的。那如何才能顺利的通过面试,得到公司的认可呢?面试软件…

    2022年10月21日
    3
  • MFC中ASSERT_VALID fails with NULL pointer的个人解决办法[通俗易懂]

    MFC中ASSERT_VALID fails with NULL pointer的个人解决办法[通俗易懂]基于MFC在写一个利用GDAL和GDI+显示图像的系统,原有的Image::FromFile和Image::FromStream都用了一遍发现均会造成锁文件的情况,即使在程序用了delete的情况下,按道理FromStream应该不会锁但是我笨拙的编码依然是锁上了。。。索性换GDAL读图像然后用GDI+显示。在码代码中出现了如下的问题:VS2005调试输出显示:ASSERT_VALIDfai

    2025年9月16日
    4
  • python sobel滤波_Sobel滤波器

    python sobel滤波_Sobel滤波器一.sobel滤波器介绍sobel滤波器常用来提取灰度图像的水平边缘(水平特征)和竖直边缘(竖直特征)二.sobel算子纵向算子,提取图像水平边缘↑横向算子,提取图像竖直边缘↑三.实验:python实现sobel算子并将算子作用于图像importcv2importnumpyasnp#GrayscaledefBGR2GRAY(img):b=img[:,:,0].cop…

    2025年7月28日
    3
  • 用心做软件—细节决定成败「建议收藏」

    用心做软件—细节决定成败「建议收藏」软件是什么?也许在编程者的眼中这是自己智慧的结晶,是技术运用的成果。但是在用户的眼中呢,用户会在乎你到底用了多少高级的技术、用了什么前卫的技术吗?我想大部分用户是不会管的,无论你是C#做的,Java做的,C++还是C做的,你的系统是Windows还是Linux,android还是塞班。用户的眼中你的软件只是一件产品,那么既然是产品,就要有价值,要能为用户带来方便,能为用户解决问题。当今的互联网上,

    2022年9月23日
    2

发表回复

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

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