|
- /******************************************
- *******************************************
- 程序名称:蓝牙无线遥控避障
- ******************************************
- *******************************************/
- #include <at89x51.h>
- #include <stdio.h>
- #include <PWM.h> //包含前面讲到的PWM头文件,此头文件导入后能产生1KHZ的PWM信号
- #include <intrins.h>
- #define Forward_L_DATA 200
- #define Forward_R_DATA 200
- #define Back_L_DATA 190
- #define Back_R_DATA 190
- #define Turn_Left_L_DATA 230
- #define Turn_Left_R_DATA 230
- #define Turn_Right_L_DATA 230
- #define Turn_Right_R_DATA 230
- /***自定义一些数据,这些数据对应软件上的数据设置**/
- #define leftdata 0x11
- #define rightdata 0x22
- #define forwarddata 0x33
- #define backdata 0x44
- /*******L293D逻辑电平口定义******/
- sbit L293D_IN1=P1^5;
- sbit L293D_IN2=P1^6;
- sbit L293D_IN3=P1^1;
- sbit L293D_IN4=P1^0;
- sbit L293D_EN1=P1^3;
- sbit L293D_EN2=P1^4;
- /*****左传感器和右传感器接线定义***/
- sbit Left_InSen=P2^3;
- sbit Right_InSen=P2^0;
- /******寄存器地址赋值******/
- sfr AUXR=0x8e;
- sfr BRT=0x9c;
- /******全局变量定义******/
- unsigned char SBUF_DATA,flag1,flag2,flag3,flag4,Last_SBUF_DATA;
- unsigned int count1=0;
- unsigned int speed;
- char s[10]; //存放速度值的缓冲区
- /*******函数声明*******/
- void SendString(unsigned char *pt);
- void Send_Char(unsigned char DATA);
- //—————————————延时1ms函数————————————
- void Delay1ms(unsigned int i)
- {
- unsigned char j,k;
- do{
- j = 44;
- do{
- k = 100;
- do{ _nop_(); }while(--k);
- }while(--j);
- }while(--i);
- }
- /*************************电机控制函数******************/
- void Forward(unsigned char Speed_Right,unsigned char Speed_Left)//前进
- {
- L293D_IN1=1;
- L293D_IN2=0;
- L293D_IN3=1;
- L293D_IN4=0;
- PWM_Set(255-Speed_Right,255-Speed_Left);
- }
- void Back(unsigned char Speed_Right,unsigned char Speed_Left)//后退
- {
- L293D_IN1=0;
- L293D_IN2=1;
- L293D_IN3=0;
- L293D_IN4=1;
- PWM_Set(255-Speed_Right,255-Speed_Left);
- }
- void Turn_Left(unsigned char Speed_Right,unsigned char Speed_Left)//左转
- {
- L293D_IN1=1;
- L293D_IN2=0;
- L293D_IN3=0;
- L293D_IN4=1;
- PWM_Set(255-Speed_Right,255-Speed_Left);
- }
- void Turn_Right(unsigned char Speed_Right,unsigned char Speed_Left)//右转
- {
- L293D_IN1=0;
- L293D_IN2=1;
- L293D_IN3=1;
- L293D_IN4=0;
- PWM_Set(255-Speed_Right,255-Speed_Left);
- }
- void Stop(void) //停止
- {
- L293D_IN1=0;
- L293D_IN2=0;
- L293D_IN3=0;
- L293D_IN4=0;
- PWM_Set(0,0);
- }
- /****************发送字符串函数****************/
- void SendString(unsigned char *pt)
- {
- while(*pt)
- Send_Char(*(pt++));
- }
- /****************发送字符函数****************/
- void Send_Char(unsigned char DATA)
- {
- ES=0;//关闭串口中断
- flag1=0;
- SBUF=DATA; //将数据发送出去,可以在电脑串口工具的接收区观察
- while(!TI);//数据发送完毕之后,T1会置1
- TI=0;
- ES=1;//重新允许串口中断
- }
- /****************************串口中断函数****************************/
- void serial() interrupt 4
- {
- flag1=1;//如果产生了中断,说明单片机串口接收到数据,串口中断标志置1
- SBUF_DATA=SBUF; //存放接收到的数据
- RI=0;//中断标志
- }
- /****************************障碍检测函数**************************/
- void jiance(void)
- {
- if(Left_InSen==0&& Right_InSen==1) //如果左边传感器检测到物体,提示左边有障碍物
- {
- if(flag2!=1)
- {
- Delay1ms(500);
- flag2=1;
- SendString("\r\n左方有障碍物...\r\n\r\n");
- }
- }
- else
- {
- flag2=0;
- }
- if(Left_InSen==1&& Right_InSen==0) //如果右边传感器检测到物体,提示右边有障碍物
- {
- if(flag3!=1)
- {
- Delay1ms(500);
- flag3=1;
- SendString("\r\n右方有障碍物...\r\n\r\n");
- }
- }
- else
- {
- flag3=0;
- }
- if(Left_InSen==0&& Right_InSen==0) //如果前方传感器检测到物体,提示前方有障碍物
- {
- if(flag4!=1)
- {
- Delay1ms(500);
- flag4=1;
- SendString("\r\n前方有障碍物...\r\n\r\n");
- }
- }
- else
- {
- flag4=0;
- }
- }
复制代码
/****************************主函数***********************/
void main(void)
{
PWM_ini();
TMOD|=0x10;
TMOD&=0x1F;
TH1=(65536-36815)/256;
TL1=(65536-36815)%256; // 20ms
TR1=1;
ET1=1;
EX0=1;
IT0=1; //
SCON=0x50;//设置串口工作在方式1,允许串口接收数据
BRT=0xff;
AUXR=0x11;
ES=1; //允许串行中断
EA=1; //开总中断
SendString("已经进入蓝牙无线控制模式,\r\n\r\n请按下对应的键盘按键,无线遥控小车。\r\n");
while(1)
{
jiance();
if(flag1==1) //如果产生过中断,证明串口接收到了数据
{
flag1=0;
if(SBUF_DATA!=Last_SBUF_DATA)
{
switch(SBUF_DATA)
{
case leftdata: SendString("小车正在左转...\r\n\r\n");break;
case rightdata: SendString("小车正在右转...\r\n\r\n");break;
default: break;
}
}
switch(SBUF_DATA)
{
case leftdata: Turn_Left(Turn_Left_R_DATA,Turn_Left_L_DATA);break;
case rightdata: Turn_Right(Turn_Right_R_DATA,Turn_Right_L_DATA);break;
case forwarddata: Forward(Forward_R_DATA,Forward_L_DATA);SendString("小车正在前进...\r\n\r\n");SendString(s); break;
case backdata: Back(Back_R_DATA,Back_L_DATA);SendString("小车正在后退...\r\n\r\n");SendString(s);break;
default: break;
}
Last_SBUF_DATA = SBUF_DATA;
Delay1ms(30);
}
else Stop();
}
}
void int0() interrupt 0
{
count1++;
}
void timer1() interrupt 3
{
static unsigned char n=0;
TH1=(65536-36815)/256;
TL1=(65536-36815)%256; // 20ms
n++;
if(n>=50)
{
n=0;
speed=(float)count1*1.0053096;
count1=0;
sprintf(s,"speed:%3dcm/s\r\n\r\n",(unsigned short)speed);//将速度转化为字符串送到S数组中
}
}
|
|