📄 wifi+̤
字号:
//Wifi 智能小车 第二版
//小车增加调速功能
//Wonder Technology
//单片机采用22.1184M晶振
//加入控制摄像头的直流驱动
//加入红外避障传感器
#include <STC12C5A.h> //包含STC12C5A系列单片机的头文件
#include"1602.h"
#include"eeprom.h"
sbit LED1=P3^0; //定义两只LED到P3^0,P3^1
sbit LED2=P3^1;
sbit Light_cam=P3^2;
sbit Light_B=P2^3; //控制车身的LED
sbit beed=P2^7;
sbit KEY1=P3^6;
sbit KEY2=P3^7;
//电机控制端
sbit EN1=P2^0;
sbit IN1=P2^1;
sbit IN2=P2^2;
sbit EN2=P2^4;
sbit IN3=P2^5;
sbit IN4=P2^6;
// 驱动其它设备,如激光,
sbit EN1_S=P1^0;
sbit IN1_S=P1^1;
sbit IN2_S=P1^2;
sbit EN2_S=P1^3;
sbit IN3_S=P1^4;
sbit IN4_S=P1^5;
//红外避障传感器
sbit IROA_R=P3^3;
sbit IROA_M=P3^4;
sbit IROA_L=P3^5;
#define sensor_IROA P3 //跟上面定义一样,取P3^3-P3^5
//PWM 控制云台
sbit SPWM1=P1^6; //控制摄像头左右活动
sbit SPWM2=P1^7; //控制摄像头上下活动
unsigned long PWM_cnt=0;//
unsigned int PWM_G1=33; //初始化中心值
unsigned int PWM_G2=33; //
int speed_R=0; //定义两个电机的速度,有正负之分,为正是,正转。(范围-100~100)
int speed_L=0;
int pre_RS=0;
int pre_LS=0;
int set_RS=0;
int set_LS=0;
int speed_A=0;
unsigned int cnt_s=0; //用于计数PWM的点空比0=100;
unsigned long cnt_b=0;
unsigned long cnt_beed=0; //用于控制蜂鸣器
unsigned int flag_beed=1;
unsigned int B_counter=0;
unsigned char R_date[3]={0};
unsigned char RBuff_date[4]={0};
unsigned char pattern=0; //0:stop 1:start
unsigned long cnt_ser=0; //用于舵机直流电机控制
unsigned char flag_ser=0;
unsigned char flag_phone=0; //用于手机控制标记
unsigned char check_phone=0;
unsigned char flag_PC=0;
void delay(unsigned long t) //软件延时带参数t
{
unsigned int j,k;
for(t;t>0;t--)
for(j=20;j>0;j--)
for(k=100;k>0;k--);
}
unsigned char sen_inp_IROA()
{
unsigned IROA_date;
IROA_date=sensor_IROA;
IROA_date=~IROA_date;
IROA_date &=0x38;
IROA_date>>=3;
return(IROA_date);
}
void beed_ctrl(unsigned long time , unsigned int num)
{
beed=0;
cnt_beed=2*time;
B_counter=2*num;
beed=1;
cnt_b=0;
}
void display_1602(unsigned int addr,unsigned char temp)
{
unsigned int i,w[2];
w[0]=temp/16;
w[1]=temp%16;
for(i=0;i<2;i++)
{
switch(w[i])
{
case 0: print(addr+i,"0"); break;
case 1: print(addr+i,"1"); break;
case 2: print(addr+i,"2"); break;
case 3: print(addr+i,"3"); break;
case 4: print(addr+i,"4"); break;
case 5: print(addr+i,"5"); break;
case 6: print(addr+i,"6"); break;
case 7: print(addr+i,"7"); break;
case 8: print(addr+i,"8"); break;
case 9: print(addr+i,"9"); break;
case 10: print(addr+i,"A"); break;
case 11: print(addr+i,"B"); break;
case 12: print(addr+i,"C"); break;
case 13: print(addr+i,"D"); break;
case 14: print(addr+i,"E"); break;
case 15: print(addr+i,"F"); break;
default: break;
}
}
}
void display_1602_10(unsigned int addr,unsigned char temp)
{
unsigned int i,w[3];
w[0]=temp/100;
w[1]=temp/10%10;
w[2]=temp%10;
for(i=0;i<3;i++)
{
print2(addr+i,w[i]);
}
}
/****************采用直流电机控制摄像头上下活动***********/
void ser_up()
{
EN1_S=1;
IN1_S=0;
IN2_S=1;
flag_ser=1;
}
void ser_down()
{
EN1_S=1;
IN1_S=1;
IN2_S=0;
flag_ser=1;
}
/****************采用舵机控制摄像头上下左右活动***********/
void cam_left()
{
PWM_G1++;
if(PWM_G1>53)
{
PWM_G1=53;
}
}
void cam_right()
{
PWM_G1--;
if(PWM_G1<13)
{
PWM_G1=13;
}
}
void cam_up()
{
PWM_G2--;
if(PWM_G2<13)
{
PWM_G2=13;
}
}
void cam_down()
{
PWM_G2++;
if(PWM_G2>53)
{
PWM_G2=53;
}
}
void cam_mid()
{
PWM_G1=Byte_Read(0x00);;
PWM_G2=Byte_Read(0x01);;
}
/*************采用L293驱动前车灯**************/
void LED_F_on()
{
EN2_S=1;
IN4_S=1;
}
void LED_F_off()
{
EN2_S=1;
IN4_S=0;
}
/*************采用L293驱动激光灯**************/
void Laser_on()
{
EN2_S=1;
IN3_S=1;
}
void Laser_off()
{
EN2_S=1;
IN3_S=0;
}
/*************采用继电器驱动水泵**************/
/*************init To************/
void init_T0(void)
{
TMOD|=0x01; //定时器工作在模式1
TH0=0xff; //定时初值TH0=0xff TL0=0x49 定时100uS
TL0=0x49;
TR0=1;
ET0=1;
}
/************TO interrupt********/
void timer0(void) interrupt 1
{
TH0=0xff;
TL0=0x49;
cnt_s++; //PWM占空比计数 0-100
if(cnt_s>=speed_R)
{
EN1=0;
}
if(cnt_s>=speed_L)
{
EN2=0;
}
if(cnt_s>=100)
{
EN1=1;
EN2=1;
cnt_s=0;
}
}
/*************motor control***************/
void motor( int m_R, m_L)
{
pre_RS=m_R;
pre_LS=m_L;
//right motor
if(m_R>0)
{
IN1=0;
IN2=1;
speed_R=m_R;
}
else if (m_R<0)
{
IN1=1;
IN2=0;
m_R=-m_R;
speed_R=m_R;
}
else
{
IN1=0;
IN2=0;
}
//left motor
if(m_L>0)
{
IN3=0;
IN4=1;
speed_L=m_L;
}
else if(m_L<0)
{
IN3=1;
IN4=0;
m_L=-m_L;
speed_L=m_L;
}
else
{
IN3=0;
IN4=0;
}
}
/***********初始化系统所有的参数********************/
void init_system()
{
unsigned int i;
motor(0,0);
LED_F_off();
Laser_off();
beed=1;
speed_A=0;
for(i=0;i<3;i++)
{
R_date[i]=0;
RBuff_date[i]=0;
}
}
/****************速度记录****************************/
int Mark_Speed(int set)
{
int s_temp;
if(set==0)
{
s_temp=0;
}
else if(set<0)
{
s_temp=-speed_A;
}
else
{
s_temp=speed_A;
}
return s_temp;
}
/**********UART***************采用独立波特率发生器******/
void initUart(void) //4800 波特率
{
SCON=0x50;
PCON=0xB0;
BRT=0xfa;
AUXR=0x11;
ES=1;
}
void SCI_TX(unsigned char date)
{
SBUF=date;
while(!TI);
TI=0;
}
void uart(void) interrupt 4
{
if(RI)
{
RI=0;
//add your code here.
if(flag_phone==0)
{
check_phone= RBuff_date[0];
RBuff_date[0]= RBuff_date[1];
RBuff_date[1]= RBuff_date[2];
RBuff_date[2]=SBUF;
//判断是否是手机连接
if(check_phone==0x44 && RBuff_date[0]==0x44 && RBuff_date[1]==0x31 && RBuff_date[2]==0x0a)
{
flag_phone=1;
pattern=1;
// print(0x03,"A");
beed_ctrl(1500,1);
speed_A=100;
}
//PC控制
if(RBuff_date[0]==0x3C && RBuff_date[1]==0x31 && RBuff_date[2]==0x3E)
{
pattern=2;
print(0x4f,"2");
beed_ctrl(500,4);
}
if(RBuff_date[0]==0x3C && RBuff_date[1]==0x30 && RBuff_date[2]==0x3E)
{
pattern=1;
print(0x4f,"1");
beed_ctrl(1500,1);
}
if(RBuff_date[0]==0x7B && RBuff_date[1]==0x31 && RBuff_date[2]==0x7D)
{
pattern=1;
print(0x4f,"1");
print(0xe3," ");
beed_ctrl(1500,1);
}
else if(RBuff_date[0]==0x7B && RBuff_date[1]==0x30 && RBuff_date[2]==0x7D)
{
pattern=0;
print(0x4f,"0");
init_system();
beed_ctrl(500,2);
}
else if( RBuff_date[0]==0x50 && RBuff_date[2]==0x00 )
{
speed_A=RBuff_date[1];
set_RS=Mark_Speed(pre_RS);
set_LS=Mark_Speed(pre_LS);
motor( set_LS, set_RS);
}
else
{
R_date[0]=RBuff_date[0];
R_date[1]=RBuff_date[1];
R_date[2]=RBuff_date[2];
}
}
else
{
RBuff_date[0]= RBuff_date[1];
RBuff_date[1]= RBuff_date[2];
RBuff_date[2]= RBuff_date[3];
RBuff_date[3]=SBUF;
R_date[0]=RBuff_date[0];
R_date[1]=RBuff_date[1];
R_date[2]=RBuff_date[2];
}
}
else
TI=0;
}
/**************interrupt T1***********/
void timer1(void) interrupt 3
{
TH1=0xff;
TL1=0xdc; //49:100us a5:50us dc:20us ee:10us
//add your code here.
PWM_cnt++;
if(PWM_cnt >=PWM_G1 )
{
SPWM1=0;
}
if(PWM_cnt >=PWM_G2 )
{
SPWM2=0;
}
if(PWM_cnt >= 500)
{
PWM_cnt=0;
SPWM1=1;
SPWM2=1;
}
cnt_b++;
if(flag_beed==1)
{
if(B_counter>0)
{
if(cnt_b>cnt_beed)
{
beed=!beed;
cnt_b=0;
B_counter--;
}
}
}
/*
if(flag_ser==1)
{
cnt_ser++;
if(cnt_ser>100)
{
EN1_S=0;
flag_ser=0;
cnt_ser=0;
}
}
*/
}
/**************init T1****************/
void init_T1(void)
{
TMOD|=0x10;
TH1=0xff;
TL1=0x49;
TR1=1;
ET1=1;
}
/*************initServo****************/
void initServo()
{
PWM_G1=Byte_Read(0x00);
PWM_G2=Byte_Read(0x01);
}
/************setServo*******************/
void setServo()
{
Sector_Erase(0x00);
Byte_Program(0x00,PWM_G1) ;
Byte_Program(0x01,PWM_G2) ;
}
main(void)
{
LED1=1; //高电平LED不亮
LED2=1; //
P4SW=0xff; //定义ALE PSEN 。。三个引脚为P4.4 P4.5 P4.6 用于控制1602显示屏
P1M0=0xC0;
P1M1=0x00;
init_T0(); //初始化定时器。
init_T1();
CLK_DIV=0x01; //系统分频工作,速度太快,1602控制不了。
LCM2402_Init(); // 初如化1602显示屏
initUart();
initServo();
init_system();
EA=1;
beed_ctrl(800,3);
print(0x00,"WT"); //在第一行第一位处从左向右打印"WonderTechnology" 字符串
print(0x40,"RX:");
print(0x0B,"S:");
print(0x4f,"0");
while(1)
{
if(KEY1==0) //按下第一按键发送“0x55“
{
while(!KEY1);
SCI_TX(0x55);
ser_up();
PWM_G1++;
}
if(KEY2==0) //按下第二按键发送“0xf0“
{
while(!KEY2);
SCI_TX(0xf0);
ser_down();
PWM_G1--;
}
display_1602_10(0x05,PWM_G1);
display_1602_10(0x0D,speed_A);
display_1602(0x43,RBuff_date[0]);
display_1602(0x46,RBuff_date[1]);
display_1602(0x49,RBuff_date[2]);
display_1602(0x4c,sen_inp_IROA());
if(pattern==1)
{
switch(R_date[0])
{
case 0x44:
switch(R_date[1])
{
case 0x4c:
switch(R_date[2])
{
case 0x31: motor(0,speed_A); break;
case 0x32: motor(-speed_A,speed_A); break;
case 0x33: motor(0,-speed_A); break;
default:
break;
}
break;
case 0x44:
switch(R_date[2])
{
case 0x31: motor(speed_A,speed_A); break;
case 0x32: motor(0,0); break;
case 0x33: motor(-speed_A,-speed_A); break;
default:
break;
}
break;
case 0x52:
switch(R_date[2])
{
case 0x31: motor(speed_A,0); break;
case 0x32: motor(speed_A,-speed_A); break;
case 0x33: motor(-speed_A,0); break;
default:
break;
}
break;
default:
break;
}
break;
case 0x46:
switch(R_date[1])
{
case 0x4c:
switch(R_date[2])
{
case 0x31:LED_F_on(); Light_cam=0; break; //控制前车灯
case 0x32:LED_F_off();Light_cam=1; break;
case 0x33:Light_B=0; break; //控制车前灯
case 0x34:Light_B=1; break;
default:
break;
}
break;
case 0x42: //控制蜂鸣器
switch(R_date[2])
{
case 0x31: beed=0; break;
case 0x30: beed=1; break;
default:
break;
}
break;
case 0x53: //控制激光
switch(R_date[2])
{
case 0x31: Laser_on(); break;
case 0x30: Laser_off(); break;
default:
break;
}
break;
case 0x50: //控制水泵
switch(R_date[2])
{
case 0x31: break;
case 0x30: break;
default:
break;
}
break;
default:
break;
}
break;
default:
break;
}
}
else if(pattern==2)
{
//红外避障传感器
switch( sen_inp_IROA() )
{
case 0x01:
case 0x03:motor(-100,100);
beed_ctrl(100,2);
delay(20);
break;
// case 0x02:motor(-100,-100);delay(20); motor(100,0); break;
case 0x04:
case 0x06:motor(100,-100);
beed_ctrl(100,2);
delay(20);
break;
case 0x07:motor(-100,-100);
beed_ctrl(100,3);
delay(100);
motor(-100,100);
delay(150);
motor(100,100);
break;
default:
motor(100,100);
break;
}
}
else
{
;
}
if(pattern!=0)
{
switch(R_date[0])
{
case 0x53:
switch(R_date[1])
{
case 0x53:
switch(R_date[2])
{
case 0x31: cam_up(); R_date[2]=0; break;
case 0x32: cam_down(); R_date[2]=0; break;
case 0x33: cam_left(); R_date[2]=0; break;
case 0x34: cam_right(); R_date[2]=0; break;
//增加四个边动方向
case 0x35: cam_up(); cam_left(); R_date[2]=0; break;
case 0x36: cam_up(); cam_right(); R_date[2]=0; break;
case 0x37: cam_down(); cam_left(); R_date[2]=0; break;
case 0x38: cam_down(); cam_right(); R_date[2]=0; break;
default:
break;
}
break;
case 0x4d:
if(R_date[2]==0x30)
{
cam_mid();
R_date[2]=0;
}
if(R_date[2]==0x31)
{
setServo();
beed_ctrl(500,4);
R_date[2]=0;
}
break;
default:
break;
}
break;
default:
break;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -