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

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

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

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

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


相关推荐

  • 模电基础部分总结(自用)

    模电基础部分总结(自用)模电基础部分总结(自用)第一章1.1半导体基础知识1.什么是模拟信号,数字信号?答:模拟信号在时间和数值上均具有连续性,例如正弦波信号。模拟信号在时间和数值上均具有连散性,它们的数值是最小量值的整倍数,并以此倍数作为数字信号的数值。2模/数转换,数/模转换?答:模数:对模拟信号进行数字化处理时,需首先将其转换成计算机识别的数字信号。数模:计算机输出的数字信号常需转换为能够驱动负载的…

    2022年6月20日
    24
  • tree 命令安装

    tree 命令安装一、用yum安装tree命令yuminstall-ytree二、下载包安装下载安装包yuminstall-ywgetwgethttp://mama.indstate.edu/users/ice/tree/src/tree-1.8.0.tgztar-zxvftree-1.8.0.tgz-C/opt/softcdtree-1.8.0/yuminstall-ymakemakeinstall测试使用,命令:treemake:gcc:命令未找到make:**

    2022年7月25日
    10
  • Java设计模式之行为型:观察者模式

    Java设计模式之行为型:观察者模式

    2021年10月4日
    40
  • 我的 Vue.js 学习日记 (四) – v-bind:class / style 用法

    我的 Vue.js 学习日记 (四) – v-bind:class / style 用法

    2022年4月2日
    38
  • 虚拟机usb控制器_显示器上的USB接口

    虚拟机usb控制器_显示器上的USB接口windows下usb显示器的实现及效果

    2022年8月21日
    3
  • SQL语句的decimal[通俗易懂]

    SQL语句的decimal[通俗易懂]以decimal(18,0)为例:18是定点精度,0是小数位数。decimal(a,b) a指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38。 b指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从0到a之间的值。默认小数位数是0。、“Decimal为SQLServer、MySql等数据库的一种数据类型,不属于浮点数类型,可以在定义时划定整数部分以及小数…

    2022年7月20日
    47

发表回复

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

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