蓝桥杯模块之超声波源码

超声波的话,是这样的,就是用定时器1用于计数,而定时器0用于定时,每200ms读一下是否接收到超声波
超声波程序在考场上是需要自己写的
以下程序在板子上测试过了,成功运行

#include<stc15f2k60s2.h>
#include<intrins.h>//这个是为了正常使用_nop_();
#define uint unsigned int//为了简化书写
#define uchar unsigned char
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}//十个—_nop_();就够了
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
void display1(uchar yi,uchar er);
void display2(uchar san,uchar si);
void display3(uchar wu,uchar liu);
void display4(uchar qi,uchar ba);
uchar yi,er,san,si,wu,liu,qi,ba;
void delayms(int ms);
void send_wave(void);
void Timer0Init(void);
void Timer1Init(void);
void allinit();
uchar flag;
uint tt;
uint distance;
uint t;
sbit TX=P1^0;
sbit RX=P1^1;
void main()
{
	allinit();
	Timer0Init();
	Timer1Init();
	yi=10;er=10;san=10;si=10;wu=10;liu=10;qi=10;ba=10;
	EA=1;
	ET0=1;//打开定时器中断0
	while(1)
	{
		if(flag)
		{
			flag=0;
			send_wave();//发出探射波
			TR1=1;//打开计时器1
			while((RX==1)&&(TF1==0));//RX在没接收到数据的时候,为1;TF1未溢出的时候为0;此语句为等待
			TR1=0;//有接收到了,就关掉计时器1
			if(TF1==1)
			{
				TF1=0;//为下一次做准备
				distance=999;//就是无限的距离
			}
			else//不然的话,就处理数据
			{
				t=TH1;
				t<<=8;
				t|=TL1;
				distance=(uint)(t*0.017);
				distance=distance/12;	
			}
			TH1=0;
			TL1=0;//清0为下一次准备
		}
		liu=distance/100;
		qi=distance/10%10;
		ba=distance%10;
		display1(yi,er);
		display2(san,si);
		display3(wu,liu);
		display4(qi,ba);
	}
}
void send_wave()
{
	uchar i=8;
	do
	{
	TX=1;
	somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;//10个_nop_();
	TX=0;
	somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;//10个_nop_();
	}while(i--);

}
void timr () interrupt 1//定时器0中断,200ms扫描一次
{
	 TL0=0x9A;
 	 TH0=0xA9;
 	 if(++tt==100)
 	 {
 	 	tt=0;
 	 	flag=1;
 	 }

}
void allinit()
{
	P2=0x80;
	P0=0xff;//初始化LED灯为全灭
	P2=0xa0;
	P0=0x00;//初始化继电器和蜂鸣器全关
	P2=0xc0;
	P0=0xff;
	P2=0xff;
	P0=0xff;//初始化数码管
}
void Timer0Init()
{
	AUXR|=0x80;
	TMOD&=0xF0;
	TL0=0x9A;
	TH0=0xA9;
	TF0=0;
	TR0=1;
}
void Timer1Init(void)
{
	AUXR|=0x40;
	TMOD&=0x0F;
}
void delayms(int ms)
{
	uint i,j;
	for(i=ms;i>0;i--)
	for(j=845;j>0;j--);
}
void display1(uchar yi,uchar er)
{
	P2=0xc0;
	P0=0x01;
	P2=0xff;
	P0=tab[yi];
	delayms(1);
	
 	P2=0xc0;
 	P0=0x01;
 	P2=0xff;
 	P0=tab[er];
	delayms(1);
}
void display2(uchar san,uchar si)
{	
	P2=0xc0;
	P0=0x04;
	P2=0xff;
	P0=tab[san];
	delayms(1);

	P2=0xc0;
	P0=0x08;
	P2=0xff;
	P0=tab[si];
	delayms(1);
}
void display3(uchar wu,uchar liu)
{
	P2=0xc0;
	P0=0x10;
	P2=0xff;
	P0=tab[wu];
	delayms(1);

	P2=0xc0;
	P0=0x20;
	P2=0xff;
	P0=tab[liu];
	delayms(1);
}
void display4(uchar qi,uchar ba)
{
	P2=0xc0;
	P0=0x40;
	P2=0xff;
	P0=tab[qi];
	delayms(1);

	P2=0xc0;
	P0=0x80;
	P2=0xff;
	P0=tab[ba];
	delayms(1);
	}



发布了5 篇原创文章 · 获赞 9 · 访问量 133

猜你喜欢

转载自blog.csdn.net/weixin_41946168/article/details/104545772
今日推荐