蓝桥杯单片机:超声波

该博客展示了如何使用12.000MHz定时器配合旗语通信实现无线距离测量,并集成按键识别功能。通过定时器精确计时回响信号,实现实时更新距离数据。同时介绍了mycode.c和mycode.h中的关键函数及其作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

main.c

#include "mycode.h"
sbit TX=P1^0;
sbit RX=P1^1;
bit flag3;            //200ms±ê??
unsigned int t,distance;
unsigned char key_value=0;
unsigned short int w,i=0;
bit flag=0;
void main()
{
	SystemInit();
	Timer0Init();
	Timer1Init();
//	uart1();
	EA  = 1;
//	Init_time();
	while(1)
	{
			if(flag3==1)  //400ms更新一次
	   {
	   	//先发送10us高电平信号
			 TX=1;
			 delay_us(15);
			 TX=0;
			///
			 while(RX==0);
			 TR1=1;
			 //等待回响信号变为低电平
		   while((RX==1)&&(TF1==0));
		   TR1=0;
		   if(TF1==1)//定时器计数溢出65536
		   {
			  distance=999;
			  TF1=0;
		   }
		   else
		   {
			   t=(TH1<<8)|TL1;
			   distance=((float)t*0.017)/12;//如果定时器为1分频则需要除以12  12个数为1us
			   //如果12T 12分频则不用除以12  一个数几位1us
		   }
		   TH1=0;
		   TL1=0;
		   flag3=0;
	   }
		 
		 
	   display(0,distance/100);
		 display(1,distance%100/10);
	   display(2,distance%10);
		 HC138(6,0xff);//消隐 位选
		 HC138(7,0xff);//消隐 段选
	}
}

void timer0() interrupt 1
{
	i++;
	if(i>=100)
	{
		flag3=1;
		i=0;
	}
}

mycode.c

#include "mycode.h"
unsigned char code numb[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0xbf

};


unsigned char getkey(void)
{
	if(!s7)//
	{
		delay_ms(10);
		if(!s7)
		{
			while(!s7);
			return s7_press;
		}
	}
	if(!s6)//
	{
		delay_ms(10);
		if(!s6)
		{
			while(!s6);
			return s6_press;
		}
	}
	if(!s5)//
	{
		delay_ms(10);
		if(!s5)
		{
			while(!s5);
			return s5_press;
		}
	}
	if(!s4)//
	{
		delay_ms(10);
		if(!s4)
		{
			while(!s4);
			return s4_press;
		}
	}
	return 0;
}

void display(unsigned char x,unsigned char dat)
{
	HC138(7,0xff);
	HC138(6,1<<x);
	HC138(7,numb[dat]);
	delay_us(500);
}

char putchar(char c)
{
    SBUF=c;
		while(!TI);
		TI = 0;
    return c;
}

void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x20;		//设置定时初始值
	TH0 = 0xD1;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;
}
void Timer1Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x40;		//定时器时钟1T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x00;		//设置定时初始值
	TH1 = 0x00;		//设置定时初始值
	TF1 = 0;		//清除TF1标志
//	TR1 = 1;		//定时器1开始计时
}

void SystemInit(void)
{
	HC138(4,0xff);
	HC138(5,0x00);
	HC138(0,0x00);
}
void uart1(void)
{
		SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x40;		//定时器时钟1T模式
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0xC7;		//设置定时初始值
	TH1 = 0xFE;		//设置定时初始值
	ET1 = 0;		//禁止定时器%d中断
	TR1 = 1;		//定时器1开始计时
	ES  = 1;
}
void delay_us(unsigned int t)		//@12.000MHz
{
	while(t--)
		{
	_nop_();
	_nop_();
	_nop_();
	_nop_();}
}

void delay_ms(unsigned int t)		//@12.000MHz
{
	unsigned char i, j;
	while(t--){
	i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);}
}

mycode.h

#ifndef __MYCODE_H__
#define __MYCODE_H__
#include <reg52.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <absacc.h>
#include <intrins.h>
#include "iic.h"
#include "onewire.h"
#include "ds1302.h"  

#define HC138(x,y)  {P2&=0x1f;P2|=(x<<5);P0=y;}
sfr AUXR  = 0x8e;
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;

#define s7_press 1
#define s6_press 2
#define s5_press 3
#define s4_press 4
void Timer0Init(void);		//1毫秒@12.000MHz
void Timer1Init(void);		//1毫秒@12.000MHz
unsigned char getkey(void);
void uart1(void);
void display(unsigned char x,unsigned char dat);
void SystemInit(void);
void delay_us(unsigned int t);		//@12.000MHz
void delay_ms(unsigned int t);		//@12.000MHz
#endif


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值