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

📄 urm37_wr.c

📁 一个超声波传感器与51单片机的通信程序,实现了距离的测量
💻 C
字号:
#include"URM37_51demo.H"

extern void LCD_ClearLin2(void);
extern void LCD_WRITE_COMM(uchar);
extern void LCD_WRITE_DATA(uchar);
/******************************************************************** 
* 名称: Delay_us
* 说明: 
* 功能: 延时量 = DelayTime(us)  MAX = 65536MS
* 调用: 无
* 输入: DelayTime
* 返回值: 无
***********************************************************************/
/*
void Delay_us(uint DelayTime)
{	
	uchar *p;
	p = &DelayTime;
	DelayTime = 65535-DelayTime;
	TR0 = 0;
	TF0 = 0;
	TH0 = *p++;
	TL0 = *p;
	TR0 = 1;
	while(TF0 == 0);
}
*/
/******************************************************************** 
* 名称: HEX_TO_DEC
* 说明: 
* 功能: 将一个16BIT的16进制数转换为10进制数
* 调用: 无
* 输入: uint source,uchar * object
* 返回值: 无
***********************************************************************/
void HEX_TO_DEC(uint source,uchar * object)
{
	uchar i;
	for(i=0;i<5;i++)
	{
		*(object+i) = source % 10;
		source/=10;
	}
	return;
}
/******************************************************************** 
* 名称: IIC_START
* 说明: 
* 功能: IIC启动信号
* 调用: Delay_us
* 输入: 无
* 返回值: 无
***********************************************************************/
void  IIC_START(void)//启动信号
{
	uchar i;
	IIC_SCL = 0;
	for(i=0;i<7;i++);
	IIC_SDA = 1;
	for(i=0;i<7;i++);	
	IIC_SCL = 1;
	for(i=0;i<7;i++);
	IIC_SDA = 0;	
	for(i=0;i<7;i++);
	IIC_SCL = 0;	
}
/******************************************************************** 
* 名称: IIC_ACK
* 说明: 
* 功能: 读取返回应答信号
* 调用: Delay_us
* 输入: 无
* 返回值: 操作标志
***********************************************************************/
uchar	IIC_ACK(void)	//读取返回应答信号
{
	uchar i;
	TR0 = 0;
	TF0 = 0;	
	TL0 = 0;
	TH0 = 0;
	TR0 = 1;
	
	
	while(IIC_SDA)
	{
		if(TF0 == 1) return ERROR;	
	}
	TR0 = 0;
	TF0 = 0;	
	TL0 = 0;
	TH0 = 0;
	TR0 = 1;
	while(IIC_SDA==0)
	{
		if(TF0 == 1) return ERROR;	
	}
	for(i=0;i<7;i++);
	return OK;
	
}
/******************************************************************** 
* 名称: SendByte
* 说明: 
* 功能: 发送1 Byte 数据
* 调用: Delay_us
* 输入: uchar Byte
* 返回值: 无
***********************************************************************/
void	SendByte(uchar Byte)	//发送1 Byte 数据
{
	uchar	i;
	uchar	j;
	for(j=0;j<8;j++)
	{
		IIC_SCL = 0;
		for(i=0;i<7;i++);
		IIC_SDA = (bit)(Byte & 0x80);
		Byte <<= 1;	
		for(i=0;i<7;i++);
		IIC_SCL = 1;
		for(i=0;i<7;i++);
	}
	IIC_SCL = 0;
			
}
/******************************************************************** 
* 名称: Send_BIT9RW
* 说明: 
* 功能: 发送第9位的R/W_N
* 调用: Delay_us
* 输入: uchar RW
* 返回值: 无
***********************************************************************/
void	Send_BIT9RW(uchar RW)	//发送第9位的R/W_N 
{
	uchar i;
	IIC_SCL = 0;
	for(i=0;i<7;i++);
	if(RW == W)
		IIC_SDA = W;
	else
		IIC_SDA = R;	
		
	for(i=0;i<7;i++);
	IIC_SCL = 1;
	for(i=0;i<7;i++);
	IIC_SCL = 0;
	IIC_SDA = 1;
	for(i=0;i<7;i++);
	
}

/******************************************************************** 
* 名称: ReceiveTowByte
* 说明: 
* 功能: 接收 2 Byte数据
* 调用: Delay_us
* 输入: uint *p
* 返回值: 无
***********************************************************************/
void	ReceiveTowByte(uint *p)		//接收 2 Byte数据
{
	uchar i;
	uchar j;
	uint	TempInt;
	*p = 0;
	TempInt = 0x8000;
	for(j=0;j<16;j++)
	{
		IIC_SCL = 1;
		for(i=0;i<7;i++);
		if(IIC_SDA == 1)
			*p = *p + TempInt;
		CY = 0;	
		TempInt = TempInt>>1;
		for(i=0;i<7;i++);
		IIC_SCL = 0;
		for(i=0;i<7;i++);	
	}
	
}
/******************************************************************** 
* 名称: Read_Temper
* 说明: 
* 功能: 读取温度的低层驱动模块
* 调用: IIC_START,SendByte,Send_BIT9RW,IIC_ACK,ReceiveTowByte
* 输入: uint *p
* 返回值: 操作标志
***********************************************************************/ 
uchar	Read_Temper(uint *p)
{
	uchar	Temp;
	
	IIC_START();	//启动信号
	SendByte(140);
	Send_BIT9RW(R);	//读		
	Temp = IIC_ACK();
	if(Temp == OK)
	{
		ReceiveTowByte(p);
		return OK;
	}
	else
		return ERROR;		
}

/******************************************************************** 
* 名称: Read_EEPROM
* 说明: 
* 功能: 读模块内部的EEPROM 
* 调用: IIC_START,SendByte,Send_BIT9RW,IIC_ACK,ReceiveTowByte
* 输入: uchar Addr,uchar *p
* 返回值: 操作标志
***********************************************************************/
uchar	Read_EEPROM(uchar Addr,uchar *p)//读EEPROM
{
	uchar	Temp;
	uint	DataInt;
	
	IIC_START();	//启动信号
	SendByte(Addr);
	Send_BIT9RW(R);	//读
		
	Temp = IIC_ACK();
	if(Temp == OK)	
	{
		ReceiveTowByte(&DataInt);
		*p = (uchar)(DataInt&0x00ff);
		return OK;
	}	
	else
		return ERROR;
}
/******************************************************************** 
* 名称: Write_EEPROM
* 说明: 
* 功能: 写模块内部的EEPROM
* 调用: IIC_START,SendByte,Send_BIT9RW,IIC_ACK
* 输入: uchar Addr,uchar Data
* 返回值: 操作标志
***********************************************************************/
uchar	Write_EEPROM(uchar Addr,uchar Data)
{
	uchar	Temp;
	IIC_START();	//启动信号
	SendByte(Addr);
	Send_BIT9RW(W);	//写
	SendByte(Data);
	Temp = IIC_ACK();
	if(Temp == OK)	
		return 	OK;
	else
		return	ERROR;	

}
/******************************************************************** 
* 名称: Read_Ultra
* 说明: 
* 功能: 读超声波测量到的距离数据
* 调用: IIC_START,SendByte,Send_BIT9RW,IIC_ACK,ReceiveTowByte
* 输入: uuint *p
* 返回值: 操作标志
***********************************************************************/
uchar	Read_Ultra(uint *p)//读超声波测量到的距离数据
{
	uchar	Temp;
	
	IIC_START();	//启动信号
	SendByte(150);
	Send_BIT9RW(R);	//读		
	Temp = IIC_ACK();
	if(Temp == OK)
	{
		ReceiveTowByte(p);
		return OK;
	}
	else
		return ERROR;		
}

/******************************************************************** 
* 名称: Read_AD
* 说明: 
* 功能: 读AD转换数据
* 调用: IIC_START,SendByte,Send_BIT9RW,IIC_ACK,ReceiveTowByte
* 输入: uchar Channel(通道选择1 - 4) ,uint *p
* 返回值: 操作标志
***********************************************************************/
uchar	Read_AD(uchar Channel ,uint *p)
{
	uchar	Temp;
	
	IIC_START();	//启动信号
	SendByte(130+(Channel&0x07));
	Send_BIT9RW(R);	//读		
	Temp = IIC_ACK();
	if(Temp == OK)
	{
		ReceiveTowByte(p);
		return OK;
	}
	else
		return ERROR;	
}

/******************************************************************** 
* 名称: DisplayTemper
* 说明: 
* 功能: 显示温度
* 调用: Read_Temper,WR_DATA10
* 输入: 无
* 返回值: 无
***********************************************************************/
void	DisplayTemper(void)//显示温度
{
	uchar	i;
	uchar	Temp;
	uchar	TemperData;
	uint	DataInt;
	uchar	array[]="Temperature: ";	
	
	Temp = Read_Temper(&DataInt);
	if(Temp == OK)
	{
		i = 0;
		//LCD_ClearLin2();
		LCD_WRITE_COMM(0xc0);	//
		while(array[i]!='\0')
		{
			LCD_WRITE_DATA(array[i]);
			i++;	
		}
		
		TemperData = (uchar)(DataInt>>4)&0x00ff;
		Temp = TemperData/10;
		LCD_WRITE_DATA(0x30+Temp);
		Temp= TemperData%10;
		LCD_WRITE_DATA(0x30+Temp);
		LCD_WRITE_DATA('C');
	}	
}

/******************************************************************** 
* 名称: DisplayUltra
* 说明: 
* 功能: 显示超声波测量距离
* 调用: Read_Ultra,HEX_TO_DEC,WR_DATA10
* 输入: 无
* 返回值: 无
***********************************************************************/
void	DisplayUltra(void)//显示超声波测量距离
{
	uchar	i;
	uchar	Temp;
	uint	DataInt;
	uchar	Data[5];
	uchar	array[]="Distance:  ";
	Temp = Read_Ultra(&DataInt);
	if(Temp == OK)
	{
		i = 0;
		//LCD_ClearLin2();
		LCD_WRITE_COMM(0xc0);	//
		while(array[i]!='\0')
		{
			LCD_WRITE_DATA(array[i]);
			i++;	
		}
		HEX_TO_DEC(DataInt,Data);
		LCD_WRITE_DATA(0x30+Data[2]);
		LCD_WRITE_DATA('.');
		LCD_WRITE_DATA(0x30+Data[1]);
		LCD_WRITE_DATA(0x30+Data[0]);
		LCD_WRITE_DATA('m');
		
	}	
}
/******************************************************************** 
* 名称: EEPROM_Test
* 说明: 
* 功能: 写EEPROM测试
* 调用: Write_EEPROM,Read_EEPROM,WR_DATA10
* 输入: 无
* 返回值: 无
***********************************************************************/
void   EEPROM_Test(void) //写EEPROM测试
{
	uchar Temp;
	uchar Temp2;
	uchar i;
	uchar array[]="EEPROM Test:  ";
	Write_EEPROM(0,0x51);
	Temp = Read_EEPROM(0,&Temp2);
	if(Temp == OK)
	{
		i = 0;
		//LCD_ClearLin2();
		LCD_WRITE_COMM(0xc0);	//
		while(array[i]!='\0')
		{
			LCD_WRITE_DATA(array[i]);
			i++;	
		}
		Temp = (Temp2>>4)&0x0f;
		LCD_WRITE_DATA(0x30+Temp);
		Temp = Temp2&0x0f;
		LCD_WRITE_DATA(0x30+Temp);
	}
}
/******************************************************************** 
* 名称: AD_Test
* 说明: 
* 功能: 读内部AD测试
* 调用: Read_AD,HEX_TO_DEC,WR_DATA10
* 输入: uchar Channel:通道选择(1 - 4)
* 返回值: 无
***********************************************************************/
void	AD_Test(uchar Channel)//读内部AD测试
{
	uchar Temp;
	uchar i;
	uint  DataInt;	
	uchar	Data[5];
	uchar array[]="AD CH";
	Temp = Read_AD(Channel,&DataInt);//读AD输入
	if(Temp == OK)
	{
		i = 0;
		//LCD_ClearLin2();
		LCD_WRITE_COMM(0xc0);	//
		while(array[i]!='\0')
		{
			LCD_WRITE_DATA(array[i]);
			i++;	
		}
		LCD_WRITE_DATA(0x30+Channel);
		LCD_WRITE_DATA(':');
		LCD_WRITE_DATA(' ');
		LCD_WRITE_DATA(' ');
		LCD_WRITE_DATA(' ');
		LCD_WRITE_DATA(' ');
		LCD_WRITE_DATA(' ');
		HEX_TO_DEC(DataInt,Data);
		LCD_WRITE_DATA(0x30+Data[3]);
		LCD_WRITE_DATA(0x30+Data[2]);
		LCD_WRITE_DATA(0x30+Data[1]);
		LCD_WRITE_DATA(0x30+Data[0]);
		
	}
			
}	

⌨️ 快捷键说明

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