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

📄 us100test.c

📁 避障模块
💻 C
字号:

#include "US100Test.h"

void Delay1Ms(void);
void Delay5Ms(void);
void Delay400Ms(void);

void UART_ISR(void);
void UARTSnd(unsigned char dat);
void UART_init();
void init(void);

sbit RCK_STMM = P2^7;
sbit DIO_DS	  = P2^6;
sbit SCK_SHBit = P2^5;

sbit Trig_Mode = P2^0;
sbit UART_Mode = P2^1;
sbit UART_TEMP  = P2^2;

sbit Trig_Pin = P1^7;
sbit Echo_Pin = P1^6;

unsigned char LastRcvData;
unsigned char GLengthHigh, GLengthLow, GTempera;
unsigned char RcvIndex;

void UART_ISR(void) interrupt 4
{
	RI = 0;							// clear receive interrupt flag
	LastRcvData=SBUF;						// copy input bufffer to ch
	if(RcvIndex == 0)
	{
		GLengthHigh = LastRcvData;
		RcvIndex++;
	}
	else if(RcvIndex == 1)
	{
		GLengthLow = LastRcvData;
		RcvIndex = 150;
	}
	else if(RcvIndex == 100)
	{
		GTempera = LastRcvData;
		RcvIndex++;
	}
}

void UARTSnd(unsigned char dat)
{

	TI=0;						// clear transmit interrupt flag
	SBUF=dat;				// start sending one byte
	while (!TI);				// wait until sent

}

 
void UART_init()
{	
	SCON=0x50;				// select BRG as UART Baud Rate Gen
	SSTAT=0x60;				// separate Rx / Tx interrupts
	BRGR0=0xF0;				// setup BRG for 9600 baud @ 7.373MHz internal RC oscillator
	BRGR1=0x02;
	//BRGR0=0x70;				// setup BRG for 9600 baud @ 12MHz external Crystal
//	BRGR1=0x04;
	BRGCON = 0x03;     		// enable BRG

	P1M1 = 0x00;     //push pull except RX
	P1M2 = 0xFD;
	ES = 1;			// enable UART interrupt
	EA = 1;

	RcvIndex = 0;
}

unsigned char GetPreMode()//1: Trig mode, 2:UART Length, 3:UART Temperature
{
	P2M1 |= 0X07;
	P2M2 &= 0XF8;

	Delay1Ms();//UARTSnd(tempa);

	if(Trig_Mode == 0)
		return 1;
	if(UART_Mode == 0)
		return 2;
	if(UART_TEMP == 0)
		return 3;
	return 0;
}



void InitIOPort()
{	
//	P0M1 = 0XFF //p0口设为输入。
	P0M1 = 0;//P0口设为双向口,可输入输出
	P0M2 = 0;//P0口设为双向口,可输入输出

	P2M1 &= 0X0F;//P2口的P2.5,P2.6,P2.7设为双向口,可输入输出
	P2M2 &= 0X0F;//P2口的P2.5,P2.6,P2.7设为双向口,可输入输出
}


void DisplayLED(unsigned char LEDid, unsigned char Value, unsigned char Isdot)
{
	unsigned char tempa, tempb;
	unsigned char tempc, tempd;
	const unsigned char NumValue[11] = {0X40, 0X79, 0X24, 0X30, 0X19, 0X12, 0X02, 0X78, 0X00, 0X10, 0X3F};//0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -.
	
	tempa = 1;
	tempa <<= (LEDid-1);
	if(Value >= 11)//value should little than 10
		Value = 0;
	tempb = NumValue[Value];
	if(Isdot == 0)
		tempb += 0X80;

	//begin output
	tempd = 0X80;
	for(tempc = 0; tempc < 8; tempc++)
	{
		SCK_SHBit = 0;
		SCK_SHBit = 0;
		DIO_DS  = (tempa&tempd);
		SCK_SHBit = 1;
		SCK_SHBit = 1;
		tempd >>= 1;
	}

	tempd = 0X80;
	for(tempc = 0; tempc < 8; tempc++)
	{
		SCK_SHBit = 0;
		SCK_SHBit = 0;
		DIO_DS  = (tempb&tempd);
		SCK_SHBit = 1;
		SCK_SHBit = 1;
		tempd >>= 1;
	}

	RCK_STMM = 0;
	RCK_STMM = 0;
	RCK_STMM = 0;
	RCK_STMM = 0;
	RCK_STMM = 1;
	RCK_STMM = 1;
	RCK_STMM = 1;
	RCK_STMM = 1;
	//Delay1Ms();
}

void DisplayLength(unsigned long number)
{
	unsigned char Thousand, Hundred, Decade, Unit;
	if(number > 9999)
		number = 0;
	Thousand = number/1000;

	number = number%1000;
	Hundred = number/100;

	number = number%100;
	Decade = number/10;

	Unit = number%10;

	DisplayLED(1, Thousand, 0);
	DisplayLED(2, Hundred, 0);
	DisplayLED(3, Decade, 0);
	DisplayLED(4, Unit, 0);
}

void DisplayTemperature(unsigned char tempa)
{
	unsigned char Decade, Unit;
	unsigned char FlagPosi;
	if(tempa >= 45)
	{
		tempa -= 45;
		FlagPosi = 1;
	}
	else
	{
		tempa = 45-tempa;
		FlagPosi = 0;
	}

	if(tempa > 99)
		tempa = 0;

	Decade = tempa/10;
	Unit = tempa%10;

	if(FlagPosi == 0)
		DisplayLED(6, 10, 0);
	DisplayLED(7, Decade, 0);
	DisplayLED(8, Unit, 0);
}


unsigned long MeterByTrig()
{
	unsigned char tempa;
	unsigned char IsOverFlow;
	unsigned long PresentTime, tempb;
	IsOverFlow = 0;

	//Delay1Ms();

	P1M1 &= 0X7F;
	P1M2 &= 0X7F;

	P1M1 |= 0X40;
	P1M2 &= 0XBF;


	//Timer Init
	TMOD = 0X11;
	TAMOD = 0X00;
	TCON = 0X00;
	TH1 = 0;
	TL1 = 0;

	Trig_Pin = 0;
	for(tempa = 0; tempa < 10; tempa++)
	{
		Trig_Pin = 1;
	}
	Trig_Pin = 0;

	while(1)
	{
		if(Echo_Pin == 1)
		{//Start Timer;
			TCON = 0X40;//start timer
			break;
		}
		if(TCON&0X80)
		{
			IsOverFlow = 1;
			break;//overflow;
		}
	}

	while(1)
	{
		if(Echo_Pin == 0)
		{//Stop Timer;
			TCON = 0X00;
			break;
		}
		if(TCON&0X80)
		{
			IsOverFlow = 1;
			break;//overflow;
		}
	}

//	unsigned long PresentTime, tempb;
	PresentTime = TH1;
	PresentTime <<= 0X08;
	PresentTime += TL1;

	tempb = PresentTime/137;
	PresentTime /= 7;//*3

	PresentTime -= tempb;//time, us

	tempb = PresentTime/150;
	PresentTime /= 3;
	PresentTime += tempb;
	//Delay1Ms();
	return PresentTime;
}

//MeterByTrig()

void MeterLenByUART()
{
	RcvIndex = 0;
	UARTSnd(0X55);
}

void MeterTempByUART()
{
	RcvIndex = 100;
	UARTSnd(0X50);
}

void main(void)
{
	unsigned char TestMode, tempa;
	unsigned long PreLength;

	InitIOPort();
	UART_init();
	TestMode = GetPreMode();

	if(TestMode == 1)//Trig mode
	{
		while(1)
		{
			PreLength = MeterByTrig();
			for(tempa = 0; tempa < 200; tempa++)
			{
				DisplayLength(PreLength);
			}
		}
	}
	if(TestMode == 2)//UART Length
	{	
		GLengthHigh = 0;
		GLengthLow = 0;
		while(1)
		{
			MeterLenByUART();// meter length, and set PreLength.
			for(tempa = 0; tempa < 100; tempa++)//display Length
			{
				PreLength = GLengthHigh;
				PreLength <<= 8;
				PreLength += GLengthLow;
				DisplayLength(PreLength);
			}
		}
	}
	if(TestMode == 3)//UART Temperature
	{
		while(1)
		{
			MeterTempByUART();// meter Temperatur, and set GTempera.
			for(tempa = 0; tempa < 100; tempa++)//display temperatur
			{
				DisplayTemperature(GTempera);
			}
		}
	}



	while(1);


}


//1ms延时
void Delay1Ms(void)
{
 unsigned long TempCyc = 90;//36865;//5552;
 while(TempCyc--);
}
//5ms延时
void Delay5Ms(void)
{
 unsigned long TempCyc = 460;//36865;//5552;
 while(TempCyc--);
}

//400ms延时
void Delay400Ms(void)
{
 unsigned char TempCycA = 80;//5;
 unsigned long TempCycB;
 while(TempCycA--)
 {
  TempCycB=460;//50000; //7269;
  while(TempCycB--);
 };

}


⌨️ 快捷键说明

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