先上两个图:
单片机A:
单片机B:
现在实现的功能的是:
单片机A控制单片机B完成一定的任务,包括以下几点:
- 单片机A作为遥控器,数据的发送端
- 单片机A有单片机和红外线模块组成,完成的功能是:单片机控制红外模块,使得红外模块向外发送控制数据
- 单片机B作为操作设备,数据的接收端
- 单片机B有单片机、红外模块、电机组成,完成的功能是:单片机根据红外模块接收到的数据进行控制小车的电机(前进,倒退,左拐弯,右拐弯,还是停止)
那如何完成这样的功能呢?
因为红外模块之前已经讲到过,也有相应的代码实现。现在我们直接贴代码,大家可以自己研究研究,代码实现并不是很难,主要是注意两个点:
- 单片机的串行通信的实现
- 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的代码就粘贴完成了,下面我们看一下效果吧,如下: