蓝桥杯超声波模块

【冉冰的成长日记009】
兄弟们,被超声波疯狂折磨的一天
QAQ救救孩子吧,我明明换算的是厘米,显示的是毫米,我人傻了

woc我悟了,,把定时器1改成12分频就是厘米为单位了,,,算了就这样吧,我把代码放下边,想测试的同学可以改一下

不懂的话看这个博客

#include
#include 
sbit TX=P1^0;//1.0发送
sbit RX=P1^1;//1.1接收

unsigned char code LED[]={
     0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xFF };//数码管
unsigned char LEDbuff[] = {
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; //数码管缓冲区

bit TXD_falg=0;//发送数据判断标志位
unsigned int cnt=0,dist=0,t=0;//用来计时,0.8s获取一次超声波的距离



void Timer0Init();	//定时器0,1ms
void Timer1Init();		//定时器1,用来计算发出到接收的时间
void Initial();		//模块初始化
void Distance();	//测距离

void main()
{
     
	Timer0Init();
	Timer1Init();
	Initial();	 //初始化函数
	while(1)
	{
     
		Distance();	
	}
}


void Initial()		//初始化函数
{
     
	P2 = (P2&0x1F)|0x80;
	P0 = 0xFF;		//初始化LED

	P2 = (P2&0x1F)|0xA0;
	P0 = 0x00;		//初始化继电器和蜂鸣器

	P2 = (P2&0x1F)|0xC0;
	P0 = 0xFF;
	P2 = (P2&0x1F)|0xE0;
	P0 = 0xFF;      //初始化数码管
}

void Delay10us()		//@12.000MHz
{
     
	unsigned char i;

	_nop_();
	_nop_();
	i = 27;
	while (--i);
}

void Timer0Init(void)		//1毫秒@12.000MHz
{
     
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	EA = 1;
	ET0 = 1;
}


void Timer1Init(void)		//
{
     
	AUXR |= 0x40;		//定时器时钟1T模式
	
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x00;		//设置定时初值
	TH1 = 0x00;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	//TR1 = 1;这句话在这里先不写,当我们需要获取发送超声波到接收超声波之间时间的时候让TR1=1,
	//接收完之后再设为0,这之间的时间就是发送到接受的时间了
}


void Display()	
{
     
	LEDbuff[7] = LED[10];
	LEDbuff[6] = LED[10];
	LEDbuff[5] = LED[10];
	LEDbuff[4] = LED[10];
	LEDbuff[3] = LED[dist/1000%10];
	LEDbuff[2] = LED[dist/100%10];
	LEDbuff[1] = LED[dist/10%10];
	LEDbuff[0] = LED[dist%10];		
}

void TXD_Sonic()
{
     
	unsigned char i;		
	
	for(i=0;i<8;i++)							//发送超声波的次数在8-15次均可
	{
     
	TX=1;								//高低电平变化,持续时间10us即可
	Delay10us();
	TX=0;
	Delay10us();
	}
	
}

void Distance()
{
     
	if(TXD_falg==1)		//如果标志位为一,然后我们获取一次数据
	{
     

		TXD_falg=0;			//标志位清零,然后重新计时,用来更新下一次数据
		TXD_Sonic();		//发送超声波,等待接收获取时间
		TR1=1;					//将定时器1打开,开始计时
		while((TF1==0)&&(RX==1));		//如果TF1=1或者RXD=0就可以跳出循环,即接收到超声波信号或者超时导致中断溢出就跳出循环
		TR1=0;					//定时器1关闭,防止计时持续增加导致测距出错
				

		if(TF1==1)
		{
     
			TF1=0;
			TH1=TL1=0x00;
			dist=9999;
		}
		else
		{
     
			t=TH1;
			t=t<<8|TL1;
//			dist=(340*(t/1000000))*100/2;
			dist=(unsigned int)(t*0.017);
			TH1=TL1=0x00;
		}
	}
}

void InterruptTimer0() interrupt 1
{
     
	static unsigned char i=0;

	switch(i)
	{
     
		case 0:P2 = 0xC0;P0=0x80;P2=0xE0;P0=LEDbuff[0];P2=0x00;i++;break;
		case 1:P2 = 0xC0;P0=0x40;P2=0xE0;P0=LEDbuff[1];P2=0x00;i++;break;
		case 2:P2 = 0xC0;P0=0x20;P2=0xE0;P0=LEDbuff[2];P2=0x00;i++;break;
		case 3:P2 = 0xC0;P0=0x10;P2=0xE0;P0=LEDbuff[3];P2=0x00;i++;break;
		case 4:P2 = 0xC0;P0=0x08;P2=0xE0;P0=LEDbuff[4];P2=0x00;i++;break;
		case 5:P2 = 0xC0;P0=0x04;P2=0xE0;P0=LEDbuff[5];P2=0x00;i++;break;
		case 6:P2 = 0xC0;P0=0x02;P2=0xE0;P0=LEDbuff[6];P2=0x00;i++;break;
		case 7:P2 = 0xC0;P0=0x01;P2=0xE0;P0=LEDbuff[7];P2=0x00;i=0;break;
		default : break;
	}
	cnt++;
	if(cnt>=800)	{
     TXD_falg=1;Display();cnt = 0;	}

}

我明天一定搞定它 ,,,,被折磨了

void Timer1Init(void)		//
{
     
	AUXR |= 0xBF;		//这里改成0xbf,12分频模式就行了	
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x00;		//设置定时初值
	TH1 = 0x00;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	//TR1 = 1;这句话在这里先不写,当我们需要获取发送超声波到接收超声波之间时间的时候让TR1=1,
	//接收完之后再设为0,这之间的时间就是发送到接受的时间了
}

改成0xBF,12分频就行了,如果还想精进的话就用if语句判断是两位,三位还是四位数,在第二位上加0x80,点上小数点就行了

擦,就一个分频疯狂折磨,用了一下午的时间,,,,抠脚了蓝桥杯超声波模块_第1张图片

大佬的博客
需要自取!!

你可能感兴趣的:(单片机,蓝桥杯,单片机)