红外通信模块、NEC红外收发模块(3)——两个单片机交互控制小车

2019-04-15 13:57发布

先上两个图: 单片机A: 单片机B:   现在实现的功能的是: 单片机A控制单片机B完成一定的任务,包括以下几点:
  • 单片机A作为遥控器,数据的发送端
    • 单片机A有单片机和红外线模块组成,完成的功能是:单片机控制红外模块,使得红外模块向外发送控制数据
  • 单片机B作为操作设备,数据的接收端
    • 单片机B有单片机、红外模块、电机组成,完成的功能是:单片机根据红外模块接收到的数据进行控制小车的电机(前进,倒退,左拐弯,右拐弯,还是停止)
那如何完成这样的功能呢? 因为红外模块之前已经讲到过,也有相应的代码实现。现在我们直接贴代码,大家可以自己研究研究,代码实现并不是很难,主要是注意两个点:
  1. 单片机的串行通信的实现
  2. L293D芯片驱动电机的功能实现原理
掌握这两点,基本上就可以实现了。 先给出单片机A中实现的代码: #include /* 单片机A的代码实现 */ /* 按键,上下左右中 */ sbit key_up = P2^0; sbit key_down = P2^1; sbit key_right = P2^2; sbit key_left = P2^3; sbit key_center = P2^4; /* 函数的定义申明 */ void UartInit(void); void delay(); void send_delay(int n); void main() { UartInit(); ES = 1; // 串行口中断允许控制位 EA = 1; // 总中断控制位 while(1) { if(0 == key_up) { delay(); if(0 == key_up) { ES = 0; TI = 1; SBUF = 0XA1; send_delay(10); SBUF = 0XF1; send_delay(10); SBUF = 0X00; send_delay(10); SBUF = 0X00; send_delay(10); SBUF = 0X01; send_delay(10); while(!TI); TI = 0; ES = 1; } while(0 == key_up); } if(0 == key_down) { delay(); if(0 == key_down) { ES = 0; TI = 1; SBUF = 0XA1; send_delay(10); SBUF = 0XF1; send_delay(10); SBUF = 0X00; send_delay(10); SBUF = 0X00; send_delay(10); SBUF = 0X02; send_delay(10); while(!TI); TI = 0; ES = 1; } while(0 == key_down); } if(0 == key_right) { delay(); if(0 == key_right) { ES = 0; TI = 1; SBUF = 0XA1; send_delay(10); SBUF = 0XF1; send_delay(10); SBUF = 0X00; send_delay(10); SBUF = 0X00; send_delay(10); SBUF = 0X03; send_delay(10); while(!TI); TI = 0; ES = 1; } while(0 == key_right); } if(0 == key_left) { delay(); if(0 == key_left) { ES = 0; TI = 1; SBUF = 0XA1; send_delay(10); SBUF = 0XF1; send_delay(10); SBUF = 0X00; send_delay(10); SBUF = 0X00; send_delay(10); SBUF = 0X04; send_delay(10); while(!TI); TI = 0; ES = 1; } while(0 == key_left); } if(0 == key_center) { delay(); if(0 == key_center) { ES = 0; TI = 1; SBUF = 0XA1; send_delay(10); SBUF = 0XF1; send_delay(10); SBUF = 0X00; send_delay(10); SBUF = 0X00; send_delay(10); SBUF = 0X05; send_delay(10); while(!TI); TI = 0; ES = 1; } while(0 == key_center); } } } void delay() // 延时函数 { int i,j; for(i=0;i<200;i++) { for(j=0;j<200;j++); } } void send_delay(int n) // 延时函数 { int i,j; for(i=0;i   单片机B的代码: #include /* 单片机B的代码实现 */ sbit EN = P1^0; // 电机输入输出1,2 sbit IN1 = P1^1; // 输入1 sbit IN2 = P1^2; // 输入2 sbit EN1 = P1^3; // 电机输入输出3,4 sbit IN3 = P1^4; // 输入3 sbit IN4 = P1^5; // 输入4 void delay(); void UartInit(void); void main() { UartInit(); ES = 1; // 串行口中断允许控制位 EA = 1; // 总中断控制位 EN = 1; // L293D芯片1,2输入端使能 EN1 = 1; // L293D芯片3,4输入端使能 IN1 = 0; // 初始化 IN2 = 0; // 初始化 IN3 = 0; // 初始化 IN4 = 0; // 初始化 while(1) { } } void delay() // 延时函数 { int i,j; for(i=0;i<200;i++) { for(j=0;j<200;j++); } } void UartInit(void) //9600bps@11.0592MHz { PCON &= 0x7F; //波特率不倍速 SCON = 0x50; //8位数据,可变波特率 AUXR &= 0xFB; //独立波特率发生器时钟为Fosc/12,即12T BRT = 0xFD; //设定独立波特率发生器重装值 AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器 AUXR |= 0x10; //启动独立波特率发生器 } void Serial() interrupt 4 { unsigned char temp; if(1 == RI) // 等待数据发送成功 { temp = SBUF; if(1 == temp) // 右转 { IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 0; } else if(2 == temp) // 后退 { IN1 = 1; IN2 = 0; IN3 = 1; IN4 = 0; } else if(3 == temp) // 停止 { IN3 = 0; IN4 = 0; IN1 = 0; IN2 = 0; } else if(4 == temp) // 左转 { IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 1; } else if(5 == temp) // 前进 { IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 1; } RI = 0; } } 单片机A和B的代码就粘贴完成了,下面我们看一下效果吧,如下: