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

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

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

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

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


相关推荐

  • Linux 的解压缩文件命令「建议收藏」

    Linux 的解压缩文件命令「建议收藏」博客园首页新随笔联系管理随笔-122 文章-0 评论-14 压缩文件 tar -zcvf my.tarabcabc.txtar命令可以用来压缩打包单文件、多个文件、单个目录、多个目录。常用格式:单个文件压缩打包tarczvfmy.tarfile1多个文件压缩打包tarczvfmy.tarfile1file2,…单个目录压缩打包tarczvfmy.tar…

    2022年5月16日
    48
  • RCEP是什么协议_常用的隧道协议有哪些

    RCEP是什么协议_常用的隧道协议有哪些本发明涉及通信技术领域,特别是涉及一种对同一隧道下主LSP和HotLSP的识别方法、PCEP协议及计算机存储介质。背景技术:随着软件定义网络(SoftwareDefinedNetwork,SDN)技术的发展,路径计算单元(PathComputationElement,PCE)不仅仅是作为集中算路的服务组件,还可以主动的对已经建立的隧道进行动态规划和调优工作。draft-ietf-pce-…

    2025年9月30日
    3
  • Spring Data JPA 之 JpaRepository

    Spring Data JPA 之 JpaRepositoryJpaRepository是Spring提供的非常强大的基本接口。1JpaRepository1.1JpaRepository接口定义JpaRepository接口的官方定义如下:publicinterfaceJpaRepository&lt;T,ID&gt;extendsPagingAndSortingRepository&lt;T,ID&gt;,Q…

    2022年10月20日
    3
  • 微型计算机原理与接口技术——8086指令系统之移位指令

    微型计算机原理与接口技术——8086指令系统之移位指令移位指令移动一位时由指令直接给出;移动两位及以上,则移位次数由CL指定。要求操作数不能是立即数;这类指令的执行大多会影响6个状态标志位。非循环移位指令逻辑左移SHL(ShiftLogicLeft)算术左移SAL(ShiftArithmeticLeft)逻辑右移SHR(ShiftLogicRight)算术右移SAR(ShiftArithmeticRight)4条指令的格式完全相同,可实现对8位或16位寄存器操作数或内存操作数进行指定次数的移位。逻辑移位指令针对的

    2022年5月11日
    55
  • Excel宏编程,给出2列进行去重合并

    Excel宏编程,给出2列进行去重合并Sub去重合并()arr=Worksheets(“sheet1”).Range(“D1”).Clear’选择D列作为存储列,保存最后去重合并的值arr=Worksheets(“sheet1”).UsedRangeDimARowAsLong’A列的行数DimBRowAsLong’B列的行数ARow=Sheet1.Range(“A”&Rows.Count).End(xlUp).Row’不带空格的行数BRow=Sheet1.Range..

    2022年5月25日
    34
  • Linux安装mysql

    Linux安装mysqlLinux安装mysql

    2022年4月22日
    46

发表回复

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

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