本文共 5367 字,大约阅读时间需要 17 分钟。
先上两个图:
单片机A:
单片机B:
现在实现的功能的是:
单片机A控制单片机B完成一定的任务,包括以下几点:
那如何完成这样的功能呢?
因为红外模块之前已经讲到过,也有相应的代码实现。现在我们直接贴代码,大家可以自己研究研究,代码实现并不是很难,主要是注意两个点:
掌握这两点,基本上就可以实现了。
先给出单片机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,2sbit IN1 = P1^1; // 输入1sbit IN2 = P1^2; // 输入2sbit EN1 = P1^3; // 电机输入输出3,4sbit IN3 = P1^4; // 输入3sbit IN4 = P1^5; // 输入4void 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的代码就粘贴完成了,下面我们看一下效果吧,如下:
转载地址:http://eonj.baihongyu.com/