⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fix.c

📁 基于MCS-51的超声定位系统的c程序包。。。。
💻 C
字号:
#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int
#define Bodrate 0xFF6A // FF6A相对于11.0592M晶振下2400波特率,
#define SLAVE 'A' 

sbit CarryWave = P3^4;		//红外载波发射控制端

uchar disbuf[4];			/*显示数据缓冲区*/
uchar Counter_H,Counter_L;			/*计数高低8位TH1,TL1*/
uint Distance;
uchar Test_ok;			/*收到超声波标识符*/
uchar ready;
uchar sum;
uchar i;
uchar AB;
uchar temp0,temp1,temp[4];

void Count_Init(void);
void Caculate( uchar Timer_High,uchar Timer_Low);
void Hexbcd( uint span);

void Serial_Usdata(void);
void Serial_Init(void);

/*----------------------主函数--------------------------------*/

void main(void)
{	
	//P2=0XFF;
	CarryWave=1;
	Count_Init();		//计数器初始化
	Serial_Init();		//串口初始化
	Test_ok=0;
	while(1)
	{				
		if(Test_ok==1)		//收到超声波
		{
			Caculate(Counter_H,Counter_L);
			Hexbcd(Distance);
			TR0 = 0;
			EX0 = 0;
			EX1 = 0;
			ready = 0;
			Test_ok=0;
		}
	}
}

/*----------------------计时器--------------------------------*/

void Count_Init(void)
{
	TMOD = ( TMOD & 0xF0 ) | 0x01;		/*定时器0,方式1,16位*/
	TH0 = 0;
	TL0 = 0;
	TR0 = 0;
	ET0	= 0;
	EX0 = 0;
	EX1 = 0;
	IT0 = 0;
	IT1 = 0;

}

/*---------------超声波接收程序(外部中断0)-----------------------*/

void Ura_Interrupt (void) interrupt 0 using 0 
{
	TR0 = 0;	
	EX0 = 0;
	Counter_H = TH0;
	Counter_L = TL0;
	TH0 = 0;
	TL0 = 0;
	AB=0;
	Test_ok = 1;	
}
/*---------------超声波接收程序(外部中断1)-----------------------*/

void Urb_Interrupt( void ) interrupt 2 using 2 
{
	TR0 = 0;	
	EX1 = 0;
	Counter_H = TH0;
	Counter_L = TL0;
	TH0 = 0;
	TL0 = 0;
	AB=1;
	Test_ok = 1;	
}
/*-------------------------------修正声速,计算距离-----------------------------------*/

void Caculate( uchar Timer_High,uchar Timer_Low)
{
	unsigned long int TimeSpan,Sound_Speed;
	unsigned char correct_x,correct_y;
	Sound_Speed = 33140+61*(10*temp1+temp0);
	TimeSpan = Timer_High * 256 + Timer_Low;
	if(AB==0) 			//数据校正
	{
		correct_x=50;
		correct_y=102;
	}
	else 
	{
		correct_x=40;
		correct_y=101;
	}
	Distance =(TimeSpan*Sound_Speed/100000+correct_x)*correct_y/100;
}

/*数据转换函数:	将转换后的数据存入显示缓冲区以供发送*/

void Hexbcd( uint span)
{
	uchar m,n;
	disbuf[3] = (span/1000)|0XD0;
	span = span%1000;
	disbuf[2] = (span/100)|0XC0;
	span = span%100;
	disbuf[1] = (span/10)|0XB0;
	span = span%10;
	disbuf[0] = (span/1)|0XA0;
	if( (disbuf[3]|disbuf[2]|disbuf[1]) != 0XF0 )	//当距离值前三位数中不全为时发送数据
	{
		ES=0;
		for(m=0;m<2;m++)
		{
			SBUF = disbuf[0];
			while(!TI);
			TI = 0;
			for(n=0;n<50;n++)
			{
				_nop_();
			}
		}	
		for(m=0;m<2;m++)
		{	
			SBUF = disbuf[1];
			while(!TI);
			TI = 0;	
			for(n=0;n<50;n++)
			{
				_nop_();
			}
		}
		for(m=0;m<2;m++)
		{
			SBUF = disbuf[2];
			while(!TI);
			TI = 0;
			for(n=0;n<50;n++)
			{
				_nop_();
			}
		}
		for(m=0;m<2;m++)
		{
			SBUF = disbuf[3];
			while(!TI);
			TI = 0;
			for(n=0;n<50;n++)
			{
				_nop_();
			}
		}
		ES=1;
	}	
}

void Serial_Init(void)				//串口初始化 
{
	T2CON = 0x35; // 0b0011 0101 16位串行波特率
	// 发生器,自动重装
	TH2 = (unsigned char )(Bodrate>>8) ;
	TL2 = (unsigned char )(Bodrate & 0xff);
	RCAP2H = (unsigned char )(Bodrate>>8) ;
	RCAP2L = (unsigned char )(Bodrate & 0xff);
	TR2 = 1; // 启动时钟
	SCON = 0x50; // 0b0111 1010 第一种工作方式
	// 8位单机通信
	ES = 1; // 允许通信中断
	EA = 1; // 中断打开
}

void Serial_Interrupt(void) interrupt 4 using 1
{
	if(RI)
	{
		uchar i,rdata,addrdata,numdata;	
		RI=0;
		rdata=SBUF;
		if(rdata==SLAVE)		//收到查询信号
		{				
			Test_ok = 0;
		//	CarryWave=1;		//回应
			ES=0;
			SM2=0;
			SBUF=SLAVE;
			while(!TI);
			TI=0;
			ES=1;
			i=0;			
		//	CarryWave=0;
			goto recdata;
		}
		if(rdata>=0XE0)			//接收温度数据
		{
			addrdata=rdata&0XF0;
			numdata=rdata&0X0F0;
			if( (numdata>=0X00)&&(numdata<=0X09) )
			{
				addrdata-=0XE0;
				if(addrdata==0) temp[i]=numdata;
				if(addrdata==1) temp[i+2]=numdata;
				if(++i>=2) i=0;
				if(i==0) 
				{
					if(temp[0]==temp[1]) temp0=temp[0];
					if(temp[2]==temp[3]) temp1=temp[2];	
				}
			}
			goto recdata;
		}		
		if(rdata=='S')		//收到开计时信号
		{
			TR0=1;
			EX0=1;
			goto recdata;					
		}
		if(rdata=='s')
		{
			TR0=1;
			EX1=1;
			goto recdata;					
		}
		if(rdata=='0')  		//出错重传
		{
		//	CarryWave=1;
			ES=0;
			SBUF = disbuf[0];
			while(!TI);
			TI = 0;			
			ES=1;
		//	CarryWave=0;
		}
		if(rdata=='1')
		{
		//	CarryWave=1;
			ES=0;
			SBUF = disbuf[1];
			while(!TI);
			TI = 0;
			ES=1;
		//	CarryWave=0;
		}
		if(rdata=='2')
		{
		//	CarryWave=1;
			ES=0;
			SBUF = disbuf[2];
			while(!TI);
			TI = 0;
			ES=1;
		//	CarryWave=0;
		}
		if(rdata=='3')
		{
		//	CarryWave=1;
			ES=0;
			SBUF = disbuf[3];
			while(!TI);
			TI = 0;	
			ES=1;
		//	CarryWave=0;
		}
		recdata:;
	}	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -