这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 基于12单片机的智能车系列

共4条 1/1 1 跳转至

基于12单片机的智能车系列

助工
2014-05-22 16:26:27     打赏

本文源于 百度 单片机吧 楼主洗洗

 

楼主对智能小车情有独钟,当然本人也是小白一个,欢迎大家多提意见~~~

楼主的小车主要有超声波避障两驱车,温湿监控循迹两驱,蓝牙四驱车,彩灯六驱车,欢迎交流~~~

  上图片了先看看我的试验台 小寒酸了

 

  这个是超声波测距避障和点阵结合的一款小车,可以自动避障并且可以在点阵上实现汉字的流水显示

 

  这个就是我忙活了一天半蓝牙温湿检测的小车,,

  可以手机控制小车,并能检测周围的温湿度并实时显示在5110液晶上

 

  接下来就是彩灯的制作了~~

  不过焊工好差。。。。。

  不过名称霸气 叫魔鬼之心

 

  这个是六驱的彩车 也是手机蓝牙遥控的,不过手机还能控制车载彩灯变化花样 和亮闪的频率,,,,,

  由于考虑到场地不是很好和车重设计成了六驱

 

  飞思卡尔 ,,,楼主努力中 不过不简单啊

 

  楼主这里还有公布一些程序~~

  发福利了~~~

  最简单的小车PWM小车调速

  /****************************************************************************

  硬件连接

  P1_6 接驱动模块ENA使能端,输入PWM信号调节速度

  P1_7 接驱动模块ENB使能端,输入PWM信号调节速度

  P3_4 P3_5 接IN1 IN2 当 P3_4=1,P3_5=0; 时左电机正转 驱动蓝色输出端OUT1 OUT2接左电机

  P3_4 P3_5 接IN1 IN2 当 P3_4=0,P3_5=1; 时左电机反转

  P3_6 P3_7 接IN3 IN4 当 P3_6=1,P3_7=0; 时右电机正转 驱动蓝色输出端OUT3 OUT4接右电机

  P3_6 P3_7 接IN3 IN4 当 P3_6=0,P3_7=1; 时右电机反转

  P1_0接四路寻迹模块接口第一路输出信号即中控板上面标记为OUT1

  P1_1接四路寻迹模块接口第二路输出信号即中控板上面标记为OUT2

  P1_2接四路寻迹模块接口第三路输出信号即中控板上面标记为OUT3

  P1_3接四路寻迹模块接口第四路输出信号即中控板上面标记为OUT4

  四路寻迹传感器有信号(白线)为0 没有信号(黑线)为1

  四路寻迹传感器电源+5V GND 取自于单片机板靠近液晶调节对比度的电源输出接口

  关于单片机电源:本店驱动模块内带LDO稳压芯片,当电池输入最低的电压6V时候可以输出稳定的5V

  分别在针脚标+5 与GND 。这个电源可以作为单片机系统的供电电源。

  ****************************************************************************/

  #include

  #define uchar unsigned char

  #define uint unsigned int

  sbit zpwm=P1^0;//接驱动模块ENA使能端,输入PWM信号调节速度

  sbit ypwm=P1^1; //接驱动模块ENB

  sbit dj11=P0^0; //电机

  sbit dj12=P0^1;

  sbit dj21=P0^2;

  sbit dj22=P0^3;

  uchar pwm_val_left =0;//变量定义

  uchar push_val_left =0;// 左电机占空比N/10

  uchar pwm_val_right =0;

  uchar push_val_right=0;// 右电机占空比N/10

  bit Right_moto_stop=1;

  bit Left_moto_stop =1;

  uint time=0;

  void zqj() //左前进

  {

  dj11=0;

  dj12=1;

  }

  void zht() //左后退

  {

  dj11=1;

  dj12=0;

  }

  void yqj() //右前进

  {

  dj21=0;

  dj22=1;

  }

  void yht() //右后退

  {

  dj21=1;

  dj22=0;

  }

  /************************************************************************/

  void qj()//前进函数

  {

  push_val_left =10; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度

  push_val_right =10; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度

  zqj();

  yqj();

  }

  void zz() //左转

  {

  push_val_left =10; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度

  push_val_right =10; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度

  zht(); //执行左后退的函数

  yqj(); //执行右前进的函数 实现左转

  }

  void yz()

  {

  push_val_left =10; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度 push 推动 速度的调节

  push_val_right =10; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度

  yht();

  zqj();

  }

  /************************************************************************/

  /* PWM调制电机转速 //pwm满款调频 */

  /************************************************************************/

  /* 左电机调速 */

  /*调节push_val_left的值改变电机转速,占空比 */

  void pwm_out_left_moto(void)//??????????????????????

  {

  if(Left_moto_stop) //moto 运动的意识

  {

  if(pwm_val_left<=push_val_left)

  zpwm=1;

  else

  zpwm=0;

  if(pwm_val_left>=10)

  pwm_val_left=0;

  }

  else zpwm=0;

  }

  /******************************************************************/

  /* 右电机调速 */

  void pwm_out_right_moto(void)

  {

  if(Right_moto_stop)

  {

  if(pwm_val_right<=push_val_right)

  ypwm=1;

  else

  ypwm=0;

  if(pwm_val_right>=10)

  pwm_val_right=0;

  }

  else ypwm=0;

  }

  /***************************************************/

  ///*TIMER0中断服务子函数产生PWM信号*/

  void timer0()interrupt 1 using 2

  {

  TH0=0XF8; //1Ms定时

  TL0=0X30;

  time++;

  pwm_val_left++;

  pwm_val_right++;

  pwm_out_left_moto();

  pwm_out_right_moto();

  }

  /***************************************************/

  void main(void)

  {

  TMOD=0X01;

  TH0= 0XF8; //1ms定时

  TL0= 0X30;

  TR0= 1;

  ET0= 1;

  EA = 1;

  while(1)/*无限循环*/

  {

  zz();

  }

  }

  ad采集和跟随小车的程序

  /****************************************************************************

  硬件连接

  P1_3 接驱动模块ENA使能端,输入PWM信号调节速度

  P1_4 接驱动模块ENB使能端,输入PWM信号调节速度

  P3_2 P3_3 接IN1 IN2 当 P3_2=1,P3_3=0; 时左电机正转 驱动蓝色输出端OUT1 OUT2接左电机

  P3_2 P3_3 接IN1 IN2 当 P3_2=0,P3_3=1; 时左电机反转

  P3_4 P3_5 接IN3 IN4 当 P3_4=1,P3_4=0; 时右电机正转 驱动蓝色输出端OUT3 OUT4接右电机

  P3_4 P3_5 接IN3 IN4 当 P3_5=0,P3_5=1; 时右电机反转

  四路寻迹传感器电源+5V GND 取自于单片机板靠近液晶调节对比度的电源输出接口

  关于单片机电源:本店驱动模块内带LDO稳压芯片,当电池输入最低的电压6V时候可以输出稳定的5V

  分别在针脚标+5 与GND 。这个电源可以作为单片机系统的供电电源。

  ****************************************************************************/

  #include

  #include

  #define uint unsigned int

  #define uchar unsigned char

  #define Left_moto_pwm P1_5 //接驱动模块ENA使能端,输入PWM信号调节速度

  #define Right_moto_pwm P1_6 //接驱动模块ENB

  /*#define Left_1_led P1_0 //四路寻迹模块接口第一路

  #define Left_2_led P1_1 //四路寻迹模块接口第二路

  #define Right_1_led P1_2 //四路寻迹模块接口第三路

  #define Right_2_led P1_3 //四路寻迹模块接口第四路*/

  #define Left_moto_go {P3_2=0,P3_3=1;} //P3_2 P3_3 接IN1 IN2 当 P3_2=0,P3_3=1; 时左电机前进

  #define Left_moto_back {P3_2=1,P3_3=0;} //P3_2 P3_3 接IN1 IN2 当 P3_2=1,P3_3=0; 时左电机后退

  #define Right_moto_go {P3_4=0,P3_5=1;} //P3_4 P3_5 接IN1 IN2 当 P3_4=0,P3_5=1; 时右电机前转

  #define Right_moto_back {P3_4=1,P3_5=0;} //P3_4 P3_5 接IN1 IN2 当 P3_4=1,P3_5=0; 时右电机后退

  sbit k1=P0^0;

  sbit k2=P0^1;

  sbit k3=P0^2;

  sbit k4=P0^3;

  sbit k5=P0^4;

  unsigned char pwm_val_left =0;//变量定义

  unsigned char push_val_left =0;// 左电机占空比N/100

  unsigned char pwm_val_right =0;

  unsigned char push_val_right=0;// 右电机占空比N/100

  bit Right_moto_stop=1;

  bit Left_moto_stop =1;

  unsigned int time=0;

  int IT=110;

  int Base=100;

  char Pi;

  char Pi1=2.3;

  char Pi2=2;

  #define SI_H P2_7=1 //数据输入为高

  #define SI_L P2_7=0 //数据输入为低

  #define RCK_H P2_6=1 //总控制输入为高

  #define RCK_L P2_6=0 //总控制输入为低

  #define SCK_H P2_5=1 //时钟输入为高

  #define SCK_L P2_5=0 //时钟输入为低

  //uchar code duan1[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共阴极

  uchar code duan1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极

  //uchar code wei1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //共阴极

  uchar code wei1[] ={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //共阳极

  sfr P1ASF = 0X9D; //P1口选择功能寄存器1001 1101

  sfr ADC_CONTR = 0XBC; //ADC控制寄存器1011 1100

  sfr ADC_RES = 0XBD; //ADC转换结果寄存器高 1011 1101

  sfr ADC_RESL = 0XBE; //ADC转换结果寄存器低 1011 1110

  sfr AUXR1 = 0XA2; //ADC转换结果调整位 1010 0010

  //sfr IE = 0XA8; //ADC中断允许寄存器

  //sfr IP = 0XB8; //ADC中断优先级控制寄存器高

  //sfr IPH = 0XB7; //ADC中断优先级控制寄存器低

  uint ADC_Result,ADC_Result1, ADC_Result2,ADC_Result3, ADC_Result11,ADC_Result22;

  uint a, b, c,d,e,f;

  char Motor_R,Motor_L,Mid;

  /************************************************************************/

  void Motor_Control_L(void) //左电机控制

  {

  if(Motor_L>=0)

  {

  if(Motor_L>=100)

  {

  Motor_L=100;

  }

  push_val_left =Motor_L; //? // 正转

  Left_moto_go;

  }

  if(Motor_L<0)

  {

  if(Motor_L<=(-100))

  {

  Motor_L=100;

  }

  push_val_left=-(Motor_L); //反转

  Left_moto_back;

  }

  }

  void Motor_Control_R(void)//右电机控制

  {

  if(Motor_R>=0)

  {

  if(Motor_R>=100)

  {

  Motor_R=100;

  }

  push_val_right=Motor_R; // 正转

  Right_moto_go;

  }

  if(Motor_R<0)

  {

  if(Motor_R<=(-100))

  {

  Motor_R=100;

  }

  push_val_right =-(Motor_R); //反转?

  Right_moto_back ;

  }

  }

  /************************************************************************/

  /* PWM调制电机转速 */

  /************************************************************************/

  /* 左电机调速 */

  /*调节push_val_left的值改变电机转速,占空比 */

  void pwm_out_left_moto(void)

  {

  if(Left_moto_stop) //?

  {

  if(pwm_val_left<=push_val_left)

  Left_moto_pwm=1; //??

  else

  Left_moto_pwm=0;

  if(pwm_val_left>=100)

  pwm_val_left=0;

  }

  else Left_moto_pwm=0;

  }

  /******************************************************************/

  /* 右电机调速 */

  void pwm_out_right_moto(void)

  {

  if(Right_moto_stop)

  {

  if(pwm_val_right<=push_val_right)

  Right_moto_pwm=1;

  else

  Right_moto_pwm=0;

  if(pwm_val_right>=100)

  pwm_val_right=0;

  }

  else Right_moto_pwm=0;

  }

  /***************************************************/

  ///*TIMER0中断服务子函数产生PWM信号*/

  void timer0()interrupt 1 using 2

  {

  TH0=0X0FF; //0.1Ms定时 //?

  TL0=0X0A4; //?

  time++;

  pwm_val_left++;

  pwm_val_right++;

  pwm_out_left_moto();

  pwm_out_right_moto();

  }

  void ADC_init(void) //AD转换初始化

  {

  ADC_CONTR = 0Xf8;

  ADC_Result1 = ADC_RES;//?

  ADC_Result2 = ADC_RESL; //?

  }

  void ADC_init1(void) //AD转换初始化

  {

  ADC_CONTR = 0Xf9;

  ADC_Result1 = ADC_RES;//?

  ADC_Result2 = ADC_RESL;//?

  }

  void ADC_init(void) //AD转换初始化

  {

  ADC_CONTR = 0Xf8;

  ADC_Result1 = ADC_RES;//?

  ADC_Result2 = ADC_RESL; //?

  }

  void ADC_init1(void) //AD转换初始化

  {

  ADC_CONTR = 0Xf9;

  ADC_Result1 = ADC_RES;//?

  ADC_Result2 = ADC_RESL;//?

  }

  void AD_caiji()

  {

  uint i;

  ADC_init();

  ADC_Result11 = ADC_Result2 + ADC_Result1 * 256;

  for(i=0;i<10;i++) //AD采集累加十次

  {

  if(i<10)

  ADC_Result11++; //?

  /*if(ADC_Result11<15)

  { IT=50; }

  else

  { IT=700; } */

  }

  ADC_Result=ADC_Result11/IT;

  a = ADC_Result % 10;

  b = ADC_Result / 10 % 10;

  c = ADC_Result / 100 % 10;

  ADC_init1();

  ADC_Result22 = ADC_Result2 + ADC_Result1 * 256;

  for(i=0;i<10;i++) //AD采集累加十次

  {

  if(i<10)

  ADC_Result22++; //?

  /* if(ADC_Result22<15)

  { IT=50; }

  else

  { IT=700; } */

  }

  ADC_Result3=ADC_Result22/IT;

  d = ADC_Result3 % 10;

  e = ADC_Result3 / 10 % 10;

  f = ADC_Result3/ 100 % 10;

  if(P3_6==0) //P3^6调节Pi值

  {

  Pi=Pi2;

  }

  else

  {

  Pi=Pi1;

  }

  Mid=(int)((ADC_Result-ADC_Result3)*Pi);

  /*if(Mid<-15)

  {

  Mid=-15;

  }

  if(Mid>15)

  {

  Mid=15;

  }*/

  Motor_L=Base-Mid;

  Motor_R=Base+Mid;

  Motor_Control_L();

  Motor_Control_R();

  }

  void senddata_595(uchar wei,uchar duan)

  {

  uchar i;

  RCK_L;

  for(i=1;i<=8;i++)

  {

  SCK_L;

  if((wei&0x80)!=0) //注意优先级

  SI_H;

  else

  SI_L;

  SCK_H;

  wei<<=1;

  }

  for(i=1;i<=8;i++)

  {

  SCK_L;

  if((duan&0x80)!=0) //注意优先级

  SI_H;

  else

  SI_L;

  SCK_H;

  duan<<=1;

  }

  RCK_H;

  }

  void main(void)

  {

  TMOD=0X01; //?

  TH0= 0X0FF;//? //0.1ms定时

  TL0= 0X0A4; //?

  TR0= 1;

  ET0= 1;

  EA = 1;

  while (1)

  {

  if(k5==0)

  {

  if(k3==0&&k1==1&&k2==1)

  {

  Motor_L=20;

  Motor_R=20;

  Motor_Control_L();

  Motor_Control_R();

  }

  if(k3==0&&k1==0)

  {

  Motor_L=0;

  Motor_R=30;

  Motor_Control_L();

  Motor_Control_R();

  }

  if(k3==0&&k2==0)

  {

  Motor_L=30;

  Motor_R=0;

  Motor_Control_L();

  Motor_Control_R();

  }

  if(k1==0)

  {

  Motor_L=-5;

  Motor_R=60;

  Motor_Control_L();

  Motor_Control_R();

  }

  if(k2==0)

  {

  Motor_L=60;

  Motor_R=-5;

  Motor_Control_L();

  Motor_Control_R();

  }

  if(k1==1&&k2==1&&k3==1)

  {

  Motor_L=30;

  Motor_R=30;

  Motor_Control_L();

  Motor_Control_R();

  }

  if(k1==0&&k2==0&&k3==0&&k4==0)

  {

  Motor_L=0;

  Motor_R=0;

  Motor_Control_L();

  Motor_Control_R();

  }

  }

  else

  {

  AD_caiji();

  senddata_595(wei1[3],duan1[a]);//数码管动态显示采集数值

  senddata_595(wei1[2],duan1[b]);

  senddata_595(wei1[1],duan1[c]);

  senddata_595(wei1[7],duan1[d]);//数码管动态显示采集数值

  senddata_595(wei1[6],duan1[e]);

  senddata_595(wei1[5],duan1[f]);

  }

  }

  }




关键词: 单片机     智能车    

专家
2014-05-23 19:06:36     打赏
2楼
好熟悉的环境~!!

工程师
2014-05-23 19:12:15     打赏
3楼
好乱啊 。。。。。。

专家
2014-10-06 16:05:48     打赏
4楼

不错,能把这些东西组合在一起就很不错了



共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]