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

📄 remove.c

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

#define uchar unsigned char
#define Bodrate 0xFF6A// FF6A相对于11.0592M晶振下2400波特率,
/*----------------------LCD函数----------------------*/
sbit RS = P2^7;
sbit RW = P2^6;
sbit EN = P2^5;
sbit Us_t1=P1^0;
sbit Us_t2=P3^7;
sbit CarryWave = P3^4;		//红外载波发射控制端
							
#define DATAPORT P0		// 数据端口
#define busy 0x80 		//用于检查写忙信号
 
void Delayms(uchar x);
void InitLcd(void);
void WriteCommand(uchar cmd,uchar wc);
void WriteData(uchar dat);
void WriteChar(uchar Xpos,uchar Ypos,uchar ch);
void Busy_Wait(void);

/*-------------------------温度传感器驱动--------------------------*/
sbit temp_data = P1^7;
uchar temp1,temp2,temptxd0,temptxd1,temp[2];

void Delay15( void );
void Delay60( void );
void Delay100ms( void );
void Write0TS( void );
void Write1TS( void );
bit  ReadTS( void );
void ResetTS( void );
void WriteBTS( unsigned char byte ) ;
unsigned char ReadBTS( void );
void InitTS( void );
void GetTempTS( void );
/*------------------------公共函数-----------------------*/
uchar idata disbuf[32];
uchar Test;
uchar test_ok;

uchar x;
uchar ready;
uchar AB;
uchar LR;
uchar LR_EN;

void Timer50ms_Init(void);
void NoReceive50ms_Init(void);
/*------------------------串口函数---------------------*/

uchar over;
void Serial_Init(void);
void Serial_usdata(void);

/**********************主程序****************************/							
void main(void) 
{
	uchar k;
	CarryWave=1;
	P1 = 0xff;
 	InitTS();		//温度传感器初始化
	Serial_Init();	//串口初始化
	InitLcd();		//液晶初始化
	Timer50ms_Init();	//定时器初始化
	ready=0;	
	Test=0;
 	WriteChar(0,0,'A');	
	WriteChar(2,0,'L');
	WriteChar(8,0,'R');
	WriteChar(14,0,'T');	
	WriteChar(15,0,'=');	
	WriteChar(0,1,'B');
	WriteChar(2,1,'L');	
	WriteChar(8,1,'R');						
	temptxd1 =0; //为温度传输取参考值
	temptxd0 =0; 
	while(1) 
	{					
		k=49;
		while(!ready)	
		{
			if(++k>=50) 
			{
				k=0;
				GetTempTS();	//测温
				temp[1] = temp1 / 10;
				temp[0] = temp1 % 10;
				WriteChar(14,1,temp[1]+48);
				WriteChar(15,1,temp[0]+48);
			}
			//CarryWave=1;
			ES=0;				//查询固定端
			SBUF = 'A';
			while(!TI);
			TI=0;
			ES=1;
			//CarryWave=0;
			Delayms(45);
		}
		while(!Test);	//测量成功或超时则退出循环
		TR1=0;
		if(test_ok==1)		//测量成功
		{	
			if(AB==0&&LR==0)	
			{
				WriteChar(3,0,disbuf[3]);
				WriteChar(4,0,disbuf[2]);
				WriteChar(5,0,disbuf[1]);
				WriteChar(6,0,disbuf[0]);
			}
			if(AB==0&&LR==1)
			{
				WriteChar(9,0,disbuf[11]);
				WriteChar(10,0,disbuf[10]);
				WriteChar(11,0,disbuf[9]);
				WriteChar(12,0,disbuf[8]);
			}
			if(AB==1&&LR==0)				
			{
				WriteChar(3,1,disbuf[19]);
				WriteChar(4,1,disbuf[18]);
				WriteChar(5,1,disbuf[17]);
				WriteChar(6,1,disbuf[16]);
			}
			if(AB==1&&LR==1)
			{
				WriteChar(9,1,disbuf[27]);
				WriteChar(10,1,disbuf[26]);
				WriteChar(11,1,disbuf[25]);
				WriteChar(12,1,disbuf[24]);
			}
		}
		Test=0;
		test_ok = 0;
		ready = 0;			
	}	
}

/*****************定时50ms发送一次超声波***********************/

void Timer50ms_Init(void)
{
	TMOD = ( TMOD & 0xf0 ) | 0x01;		/*定时器0,方式1,16位*/
	TH0	 = ( -10000 ) >> 8;
	TL0  = -10000;
	TR0	 = 0;
	ET0	 = 1;
	
}

void Timer1_Interrupt( void ) interrupt 1 using 1
{	
	uchar a;
	TL0=-10000;	
	TH0=(-10000)>>8;
	//CarryWave=1;			//发载波
	ES=0;
	if(AB==0) SBUF = 'S';		//发开计时信号
	else SBUF = 's';		
	while(!TI);
	TI = 0;
	ES=1;
	//CarryWave=0;
	if(LR==0) 		//使用左边的超声头发射超声波
	{
		Us_t1=1;
		for(a=0;a<30;a++);
		Us_t1=0;
	}
	if(LR==1)		//使用右边的超声头发射超声波
	{
		Us_t2=1;
		for(a=0;a<30;a++);
		Us_t2=0;
	}
	TR0=0;
	NoReceive50ms_Init();		//无响应定时
	TR1=1;		
}

/*---------------------无响应定时------------------------------*/

void NoReceive50ms_Init(void)
{
	TMOD = ( TMOD & 0x0f ) | 0x10;		/*定时器1,方式1,16位*/
	TH1	 = ( -50000 ) >> 8;
	TL1  = -50000;
	TR1	 = 0;
	ET1	 = 1;
	x=0;
}

void NoReceive50ms_Interrupt(void) interrupt 3 using 3
{

	TH1	 = ( -50000 ) >> 8;
	TL1  = -50000;
	TR1	 = 0;
	Test = 1;
}
	
/****************串口函数*******************/
 //T2CON的定义如下,通信波特率发生器方式 //
// 用作波特率发生器 //
// 0x35...... TR2 = 1,开始计数;CP/RL2=1,不自动重装,但被CRLK和//
// CTLK/CRLK的设立而忽略 //
// C/T2 = 0,使用内部时钟 //
// EXEN2 = 0,忽略外部T2EX(P1.1) //
// EXF2受控于EXEN2的状态,置1时一个外部T2EX的负脉冲//
// 将引发T2中断。不刷新备用寄存器 //
// CTLK = 1,引用为发送时钟源(波特率发生器) //
// CRLK = 1,引用为接收时钟源,强制自动重装初值。 //
// 当计数器溢出时并不设立标志TF2,所以不引发中断 //
// 如果设定了允许CT2中断视作无效 //
//--------------------------------------------------------------//
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 k,turn,addrdata,numdata;
		uchar a,b,c,d;
		RI=0;
		if(SBUF=='A')			//固定端A回应
		{			
			if(turn==0) 		//左发射头到A接收头的距离的测量
			{
				LR=0;			
				AB=0;
			}
			if(turn==1)			//右发射头到A接收头的距离的测量
			{
				LR=1;
				AB=0;
			}
			if(turn==2) 		//左发射头到B接收头的距离的测量
			{
				LR=0;
				AB=1;
			}
			if(turn==3)		//右发射头到B接收头的距离的测量
			{
				LR=1;
				AB=1;
			}
			if(++turn>=4) turn=0;
			a=0;
			b=0;
			c=0;
			d=0;
			LR_EN=0;
			ready=1;
			TR0=1;
			ES=0;
			if(temptxd0!=temp[0])	//当温度发生改变时,将温度值发给固定端
			{	
				for(k=0;k<2;k++)
				{
					SBUF=temp[0]|0XE0;
					while(!TI);	
					TI = 0;
					for(k=0;k<20;k++)
					{
						_nop_();
					}
				}
				temptxd0 = temp[0];
			
			}
			if(temptxd1!=temp[1])
			{
				for(k=0;k<2;k++)
				{
					SBUF=temp[1]|0XF0;
					while(!TI);	
					TI = 0;
					for(k=0;k<20;k++)
					{
						_nop_();
					}
				}
				temptxd1 = temp[1];
			}
			ES=1;
			over=0;
			goto recdata;	
		}		
		addrdata=SBUF&0XF0;			//取出地址,0XA0为个位数,0XB0为十位数,0XC0为百位数,0XD0为千位数
		numdata=SBUF&0X0F;			//取出数据;
		if( (addrdata>=0XA0)&&(addrdata<=0XD0)&&(numdata>=0X00)&&(numdata<=0X09) )
		{			
			addrdata-=0XA0;
			addrdata>>=4;
			if(AB==0&&LR==0)
			{			
				if(a==0) disbuf[addrdata] = numdata+48;
				if(a==1) disbuf[addrdata+4]=numdata+48;
				if(++a>=2) a=0;
				if(addrdata==3&&a==0) over=1;
			}
			if(AB==0&&LR==1)
			{			
				if(b==0) disbuf[addrdata+8] = numdata+48;
				if(b==1) disbuf[addrdata+12]=numdata+48;
				if(++b>=2) b=0;
				if(addrdata==3&&b==0) over=1;
			}
			if(AB==1&&LR==0)
			{			
				if(c==0) disbuf[addrdata+16] = numdata+48;
				if(c==1) disbuf[addrdata+20]=numdata+48;
				if(++c>=2) c=0;
				if(addrdata==3&&c==0) over=1;
			}
			if(AB==1&&LR==1) 
			{
				if(d==0) disbuf[addrdata+24] = numdata+48;
				if(d==1) disbuf[addrdata+28]=numdata+48;	
				if(++d>=2) d=0;
				if(addrdata==3&&d==0) over=1;
	
			}
		}	
		if(over==1)		//接收完数据则进行校错
		{			
			if(AB==0&&LR==0)
			{
				if(disbuf[0]!=disbuf[4])//个位错则要求固定端重传个位数
				{
					ES=0;
					SBUF='0';
					while(!TI);	
					TI = 0;
					ES=1;
				}	
				if( disbuf[1]!=disbuf[5] )//十位错则要求固定端重传十位数
				{
					ES=0;
					SBUF='1';
					while(!TI);	
					TI = 0;
					ES=1;
				}	
				if( disbuf[2]!=disbuf[6] )//百位错则要求固定端重传百位数
				{
					ES=0;
					SBUF='2';
					while(!TI);	
					TI = 0;
					ES=1;
				}
				if( disbuf[3]!=disbuf[7] ) //千位错则要求固定端重传千位数
				{
					ES=0;
					SBUF='3';
					while(!TI);	
					TI = 0;
					ES=1;
				}
	
				if( (disbuf[0]==disbuf[4])&&(disbuf[1]==disbuf[5])
				&&(disbuf[2]==disbuf[6])&&(disbuf[3]==disbuf[7]) )
				{	
					TR0=0;
					Test = 1;
					test_ok=1;	
					over=0;
				}
			}	
			if(AB==0&&LR==1)
			{
				if(disbuf[8]!=disbuf[12])
				{
					ES=0;
					SBUF='0';
					while(!TI);	
					TI = 0;
					ES=1;
				}	
				if(disbuf[9]!=disbuf[13])
				{
					ES=0;
					SBUF='1';
					while(!TI);	
					TI = 0;
					ES=1;
				}	
				if( disbuf[10]!=disbuf[14] )
				{
					ES=0;
					SBUF='2';
					while(!TI);	
					TI = 0;
					ES=1;
				}
				if(disbuf[11]!=disbuf[15])
				{
					ES=0;
					SBUF='3';
					while(!TI);	
					TI = 0;
					ES=1;
				}
				if( (disbuf[8]==disbuf[12])&&(disbuf[9]==disbuf[13])
					&&(disbuf[10]==disbuf[14])&&(disbuf[11]==disbuf[15]) )
				{	
					TR0=0;
					Test = 1;
					test_ok=1;
					over=0;
				}
			}
			if(AB==1&LR==0)
			{
				if(disbuf[16]!=disbuf[20])
				{
					ES=0;
					SBUF='0';
					while(!TI);	
					TI = 0;
					ES=1;
				}	
				if(disbuf[17]!=disbuf[21])
				{
					ES=0;
					SBUF='1';
					while(!TI);	
					TI = 0;
					ES=1;
				}	
				if( disbuf[18]!=disbuf[22] )
				{
					ES=0;
					SBUF='2';
					while(!TI);	
					TI = 0;
					ES=1;
				}
				if(disbuf[19]!=disbuf[23])
				{
					ES=0;
					SBUF='3';
					while(!TI);	
					TI = 0;
					ES=1;
				}
				if( (disbuf[16]==disbuf[20])&&(disbuf[17]==disbuf[21])
				&&(disbuf[18]==disbuf[22])&&(disbuf[19]==disbuf[23]) )
				{	
					TR0=0;
					Test = 1;
					test_ok=1;
					over=0;
				}
			}
			if(AB==1&LR==1)
			{
				if(disbuf[24]!=disbuf[28])
				{
					ES=0;
					SBUF='0';
					while(!TI);	
					TI = 0;
					ES=1;
				}	
				if(disbuf[25]!=disbuf[29])
				{
					ES=0;
					SBUF='1';
					while(!TI);	
					TI = 0;
					ES=1;
				}	
				if( disbuf[26]!=disbuf[30] )
				{
					ES=0;
					SBUF='2';
					while(!TI);	
					TI = 0;
					ES=1;
				}
				if(disbuf[27]!=disbuf[31])
				{
					ES=0;
					SBUF='3';
					while(!TI);	
					TI = 0;
					ES=1;
				}
				if( (disbuf[24]==disbuf[28])&&(disbuf[25]==disbuf[29])
				&&(disbuf[26]==disbuf[30])&&(disbuf[27]==disbuf[31]) )
				{	
					TR0=0;
					TR1=0;
					Test = 1;
					test_ok=1;
					over=0;
				}
			}
		}
		recdata:;
	}
}
				
/****************温度传感器子程序******************/
void delay15( void )
{
	unsigned char i;
	for ( i=0; i<8; i++ );
}

void delay60( void )
{
	unsigned char i;
	for ( i=0; i<30; i++ );
}

void delay100ms( void )
{
	unsigned char a,b,c;
	for( a=0; a<8; a++ )
		for( b=0; b<25; b++ )
			for( c=0; c<250; c++ );
}

void Write0TS( void )
{
	temp_data = 1;
	temp_data = 0;
	Delay15();
	Delay15();
	Delay15();
	Delay15();
	temp_data = 1;
	_nop_();
	_nop_();
}

void Write1TS( void )
{
	temp_data = 1;
	temp_data = 0;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	temp_data = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	Delay15();
	Delay15();
	Delay15();	
}

bit  ReadTS( void )
{
	bit b;
	temp_data = 1;
	temp_data = 0;
	_nop_();
	_nop_();
	_nop_();
	_nop_();	
	_nop_();
	temp_data = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	b = temp_data;
	Delay15();
	Delay15();
	Delay15();	
	_nop_();
	_nop_();
	return b;
}

void ResetTS( void )
{
	unsigned char i;
	temp_data = 1;
	temp_data = 0;
	for( i=0; i<8; i++ )
		Delay60();
	temp_data = 1;
	while( temp_data );
	for( i=0; i<8; i++ )
		Delay60();
}

void WriteBTS( unsigned char byte )
{
	unsigned char i;
	
	for( i=0; i<8; i++ )
	{
		if( byte & 0x01)  Write1TS();
			else Write0TS();
		byte = byte >> 1;
	}
}

unsigned char ReadBTS( void )
{	
	unsigned char i,j;
	bit b;
	j = 0;
	for( i=0; i<8; i++ )
	{
		b = ReadTS();
		if( b ) j+=1;
		j = _cror_(j,1);
	}
	return j;
}

void InitTS( void )
{
	ResetTS();
	WriteBTS(0xcc);
	WriteBTS(0x4e);
	WriteBTS(0x64);
	WriteBTS(0x8a);
	WriteBTS(0x1f);
}

void GetTempTS( void )
{
	ResetTS();
	WriteBTS(0xcc);
	WriteBTS(0x44);	
	Delay100ms();
	ResetTS();
	WriteBTS(0xcc);
	WriteBTS(0xbe);
	temp2 = ReadBTS();
	temp1 = ReadBTS();
	ReadBTS();
	ReadBTS();
	ReadBTS();
	ReadBTS();
	ReadBTS();
	ReadBTS();
	ReadBTS();
	temp1 <<= 4;
	temp1 += ( temp2 & 0xf0 )>>4;	
} 
								

		
/****************LCD函数***************/

void WriteCommand(uchar cmd,uchar wc)
{
	if(wc==1) Busy_Wait();
	DATAPORT=cmd;
	RS=0;
	RW=0;
	EN=0;
	_nop_();
	EN=1;
}

void WriteData(uchar dat)
{
	Busy_Wait();	
	DATAPORT=dat;
	RS=1;
	RW=0;
	EN=0;
	_nop_();
	EN=1;	
}	

void WriteChar(uchar Xpos,uchar Ypos,uchar ch) 
{
	uchar tmp;
	Xpos&=0x0f;
	Ypos&=0x01;
	tmp=Xpos;
	if(Ypos==1) tmp+=0x40;
	tmp|=0x80;
	WriteCommand(tmp,1);
	WriteData(ch);
}

void Busy_Wait(void)
{
	
	DATAPORT=0XFF;
	RS=0;
	RW=1;
	EN=0;
	_nop_();
	EN=1;
	while(DATAPORT&busy);
}

void InitLcd(void)
{
	Delayms(15);				//延时15ms
	WriteCommand(0x38,0);
	Delayms(5);
	WriteCommand(0x38,0);	
	Delayms(5);
	
	WriteCommand(0x38,1);
	WriteCommand(0x06,1);
	WriteCommand(0x0c,1);
	WriteCommand(0x01,1);
}

void Delayms(uchar x)		//延时Xms
{
	uchar i,j,k;
	for(i=0;i<x;i++)
		for(j=0;j<2;j++)
			for(k=0;k<250;k++);
}

⌨️ 快捷键说明

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