协议内容:
自定协议:该协议分为头部、数据部、尾部三个部分,默认状态为高电平,协议头部为持续4ms低电平,数据部为1-12ms的高电平(分别对应不12个挡位),尾部为持续4ms的低电平。
接收:识别头部、数据部分、尾部,并通过识别到的协议选择挡位。
示意图
代码
发送(CW32单片机)
只是把关键函数写出来供大家学习,并没有把整套代码copy过来。
void Send_Protocol()
{
if(Protocol_Status)
{
if(Time_Send_Protocol >=1){
Protocol_cnt++;
Time_Send_Protocol = 0;
}
if(Protocol_cnt <= FIXED_4MS){ //4ms
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_5,GPIO_PIN_RESET);
}
else if(Protocol_cnt <= Protocol_time + FIXED_4MS){ //4ms + N ms
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_5,GPIO_PIN_SET);
}
else if(Protocol_cnt <= (Protocol_time + 2 * FIXED_4MS)){ //4ms + N ms +4ms
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_5,GPIO_PIN_RESET);
}
else{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_5,GPIO_PIN_SET);
Protocol_Status = 0;
Protocol_time = 0;
}
}
}
接收(九齐单片机)
//直接全程用延时
void Check_Protocol(void){
if(PORTBbits.PB2 == RESET)
{
delay_time = 0;
recv_num = 0;
delay_500us();
while(PORTBbits.PB2 != SET)
{
delay_time++;
delay_1ms();
if(delay_time >= 20){
return;
}
}
if(delay_time<2|| delay_time>5)
{
return;
}
while(PORTBbits.PB2 == SET)
{
recv_num++;
delay_1ms();
if(recv_num >= 50){
return;
}
}
delay_time =0;
while(PORTBbits.PB2 != SET)
{
delay_time++;
delay_1ms();
if(delay_time >= 20){
return;
}
}
if(delay_time<2 || delay_time>5)
{
return;
}
}
if(PORTBbits.PB3 == RESET)
{
delay_time = 0;
recv_num = 0;
delay_500us();
while(PORTBbits.PB3 != SET)
{
delay_time++;
delay_1ms();
if(delay_time >= 20){
return;
}
}
if(delay_time<2|| delay_time>5)
{
return;
}
while(PORTBbits.PB3 == SET)
{
recv_num++;
delay_1ms();
if(recv_num >= 50){
return;
}
}
delay_time =0;
while(PORTBbits.PB3 != SET)
{
delay_time++;
delay_1ms();
if(delay_time >= 20){
return;
}
}
if(delay_time<2 || delay_time>5)
{
return;
}
}
//exc
if(recv_num != 0){
iic_SwitchSend(recv_num);
recv_num = 0;
}
else{
return;
}
}
数据选挡
#define Gear0 (10)
#define Gear1 (20)
#define Gear2 (30)
#define Gear3 (40)
#define Gear4 (60)
#define Gear5 (80)
#define Gear6 (100)
#define Gear7 (120)
#define Gear8 (140)
#define Gear9 (160)
#define Gear10 (180)
#define Gear11 (250)
void iic_SwitchSend(uint8_t recv){
iic_init(); //重新初始化
iic_sdin_set();
iic_sclk_set(); //先拉高,准备发送
delay_1ms();
switch(recv){
case 1:
//Gear0
break;
case 2:
//Gear1
break;
case 3:
//Gear2
break;
case 4:
//Gear3
break;
case 5:
//Gear4
break;
case 6:
//Gear5
break;
case 7:
//Gear6
break;
case 8:
//Gear7
break;
case 9:
//Gear8
break;
case 10:
//Gear9
break;
case 11:
//Gear10
break;
case 12:
//Gear11
break;
default:
break;
}
}
该协议已经上两个单片机验证过,没有问题。
非常感谢各位的观看!