雷达距离命令控制——自定义协议(九齐051f发送、中微5771接收)

控制命令简介

1.雷达IO默认为输入,等待1秒时间接收命令,1秒后自动转换成输出口,做为正常口的感应输出口用。
2.指令为两个字节,两个字节之间的时间间隔要小于 4ms。
3.发高字节的低位,例如 F5 01H,发送时先发 1111 0101 (F5H) 的低位,
4.距离分10档,分别为F500-F509;对应于1挡-10挡,1挡为最近,10档位最远,芯片收到命令后保存好档位,断电要记忆。

时序图

在这里插入图片描述

200us :600us高电 平 :低电 平=1 :3 ,表示 0
600us :200us高电 平 :低电 平=3 :1 ,表示 1
高低电平时序范围:50us:150us~~800us:2.4ms(注: 1 :2< 1 :3< 1 :5 其中的 1 推荐 200us) 说明:1.先发高字节的低位,再发送低字节的低位。例如 F3 01 接收到的数据是这样的:1100 1111 1000 0000 。2.将数据信号拉低 5ms,然后发送数据,每个字节发完后需拉高 2ms再拉低 5ms,然后发送下一个字节。高电平与低电平数据占空比 1 :3 即代表数据位 0 ,高电平于低电平数据位占空比为 3 :1 代表数据位 1。

代码

写入flash部分断电保持并没有上传过来,比较简单。


void delay2ms()
{
	int i = 0;
	for(i=0;i<437;i++)
	{
		NOP();
	}
}

void delay5ms()
{
	int i = 0;
	for(i=0;i<1117;i++)
	{
		NOP();
	}
}

void delay1s()
{
	int i = 0;
	for(i=0;i<200;i++)
	{
		delay5ms();
	}
}

void delay5us()
{
	int i = 0;
	for(i=0;i<1;i++)
	{
		NOP();
	}

	
}

void delay50us()
{
	int i = 0;
	for(i=0;i<10;i++)
	{
		NOP();
	}
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	
}

uint8_t Check_Pin()
{
	int count=0;
	if(RB3 == 1)
	{
		while(RB3==1)
		{
			delay50us();
			count++;
		}
		if(count>=3&&count<=6)
		{
			while(RB3==0)
			{
				delay50us();
				count++;
			}
			
			if(count>=13 && count<=18)
			{
				return 0;
			}
		}
		
		if(count>=10 && count<=13)
		{
			while(RB3==0)
			{
				delay50us();
				count++;
			}
			
			if(count>=13 && count<=18)
			{
				return 1;
			}
		}
		
		count = 0;
	}
}

uint16_t Num_Conversion()
{
	//tranform array to num
	uint16_t num=0,num1=0,num2=0;
	
    for(int i=7;i>=0;i--)
    {
        num1=num1*2+data[0][i];
    }

	for(int i=7;i>=0;i--)
    {
        num2=num2*2+data[1][i];
    }
	num = (num1<<8)|num2;
	return num;
}


void Start_Receive()
{
	if(allow_flag == 0)
		return;
		
	delay50us();
	exit_count++;
	if(exit_count == 60000)
	{
		allow_flag = 0;
		exit_count = 0;
		
		TRISB = 0xf7;
		PORTB = 0x01;
		PORTB = 0x00;
		PORTB = 0x01;
	}
	
	while(RB3 == 1)
	{	
		delay5us();
		if(RB3 == 0)
		{
			//check head
			PORTA = 0x01;
			delay5ms();
			/*
			while(RB3 == 0)
			{
				delay50us();
				head_count++;
			}
			if(head_count < 80||head_count >120)
			{
				head_count=0;
				break;
			}
			*/
			PORTA = 0x00;
			//check first byte
			if(RB3==1)
			{	
				data[0][0] = Check_Pin();
				//PORTA = data[0][0];
				data[0][1] = Check_Pin();
				//PORTA = data[0][1];
				data[0][2] = Check_Pin();
				//PORTA = data[0][2];
				data[0][3] = Check_Pin();
				//PORTA = data[0][3];
				data[0][4] = Check_Pin();
				//PORTA = data[0][4];
				data[0][5] = Check_Pin();
				//PORTA = data[0][5];
				data[0][6] = Check_Pin();
				//PORTA = data[0][6];
				data[0][7] = Check_Pin();
				//PORTA = data[0][7];
			}
			//PORTA = 0x01;
			//PORTA = 0x00;
			//PORTA = 0x01;
			// wait time
			delay2ms();
			delay5ms();
			//PORTA = 0x00;
			//check second byte
			if(RB3==1)
			{
				data[1][0] = Check_Pin();
				//PORTA = data[1][0];
				data[1][1] = Check_Pin();
				//PORTA = data[1][1];
				data[1][2] = Check_Pin();
				//PORTA = data[1][2];
				data[1][3] = Check_Pin();
				//PORTA = data[1][3];
				data[1][4] = Check_Pin();
				//PORTA = data[1][4];
				data[1][5] = Check_Pin();
				//PORTA = data[1][5];
				data[1][6] = Check_Pin();
				//PORTA = data[1][6];
				data[1][7] = Check_Pin();
				//PORTA = data[1][7];
			}
			
			command = Num_Conversion();
			//PORTA = 0x01;
			//PORTA = 0x00;
			//PORTA = 0x01;
			
			int i =0;
			for(i=15;i>=0;i--)
			{
				PORTA = (command >> i)&0x01;
				delay2ms();
			}
			PORTA = 0x01;
			
			iic_init();
			switch(command)
			{
				case 0xF500:
					rad_reg_write_byte(0x10, (threshold0)&0xff);
				break;
				case 0xF501: 
					rad_reg_write_byte(0x10, (threshold1)&0xff);
				break;
				case 0xF502: 
					rad_reg_write_byte(0x10, (threshold2)&0xff);
				break;
				case 0xF503:
					rad_reg_write_byte(0x10, (threshold3)&0xff);
				break;
				case 0xF504:
					rad_reg_write_byte(0x10, (threshold4)&0xff);
				break;
				case 0xF505:
					rad_reg_write_byte(0x10, (threshold5)&0xff);
				break;
				case 0xF506:
					rad_reg_write_byte(0x10, (threshold6)&0xff);
				break;
				case 0xF507:
					rad_reg_write_byte(0x10, (threshold7)&0xff);
				break;
				case 0xF508:
					rad_reg_write_byte(0x10, (threshold8)&0xff);
				break;
				case 0xF509:
					rad_reg_write_byte(0x10, (threshold9)&0xff);
				break;
				default:
					rad_reg_write_byte(0x10, 0x64);
				break;
			}
			iic_deinit();
			
			TRISB = 0xf7;
			
			allow_flag = 0;
			break;
		}
		
		
	};
	
	
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不知何人

万分感谢诸位观看

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值