微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 用C51做一个玩具小车

用C51做一个玩具小车

时间:10-02 整理:3721RD 点击:

最近这两个学习了一下STM32,学到ADC,pwm,没有实验板后面的SPI,CAN等就得等到了,所以打算复习一下51,没有实际工程做,想想有个最小系统板,也就可以做个玩具车,实物还没做,这两天写了个程序,让大家指导一下,看看和实际工程应用有哪些差距。
     程序刚刚用PORTUES仿真了一下,能跑,但是很慢,当然仿真肯定是很慢的,程序比较粗糙,PWM肯定还要根据电源、电机做计算调整,显示部分也是,这里的程序只是我现在能想到的一种实现方法,具体数据都还待调整。希望大家指教一下种实现方法在实际应用时是否可行。    下面是程序,目前只有前进、后退、显示速度3个功能,大家看看还叫些什么功能呢?转弯可以但是我硬件上不好弄,暂时没加,障碍停止或者后退比较好实现也没写,
     程序的显示没有修改,每次都会全部刷新,这个后面再改。主要还是看这种方法符合实际工程应用不。
#include<reg52.h>
#define uchar unsigned char
void zfzhuan();                 //PWM产生
int seper();                 //速度检测
int num,num2,num3,velocity;
int a;
sbit lcden=P3^6;
sbit lcdr=P3^5;
uchar code one[]="V:";
uchar code two[]="m/s";
uchar xian[]={0,0,0};
uchar data_v[]="    ";
unsigned char num4;
int j,k;
sbit SPr1=P0^0;         //正转、前进驱动脚          ,        4个引脚接4个三极管作正反转选择
sbit SPr1_2=P0^1;         //接电源端三极管
sbit SPr2=P0^2;    //反转、后退
sbit SPr2_2=P0^3;        //接电源
sbit key1=P2^0;  //正 反转按键
void time1()
{;;}
void init_T1() interrupt 3                  //pwm定时器
{
   num++;
   num3++;
   zfzhuan();                 //PWM产生
   seper();                 //速度检测
}
void zfzhuan()
{         if(key1==0)                                //前进
       {
              time1();
                  if(key1==0);
                     {
                             SPr2_2=0;                        //关闭反转
                                 SPr2=0;                        //关闭反转
                                 SPr1_2=1;
                                 if(num==200)           //PWM高电平--硬件上高电平小车运动
                                    {
                                          SPr1=1;
                                        }
                                 if(num==1000)          //PWM低电平
                                    {
                                          SPr1=0;
                                          num=0;
                                        }
                                }
                }
        if(key1==1)                                //后退
       {
              time1();
                  if(key1==1);
                     {
                             SPr1_2=0;
                                 SPr1=0;
                                 SPr2_2=1;
                                 if(num==200)
                                    {
                                          SPr2=1;
                                        }
                                 if(num>=1000)
                                    {
                                          SPr2=0;
                                          num=0;
                                        }
                                }
                }
}                                                                          
void init_T0() interrupt 1                  //转速计数器
{
   TH0=(65536-100)/256;
   TL0=(65536-100)%256;
   num2++;                                //100圈+1,轮子一圈10cm
          
}
int seper()
{
    if(num3==400)                   //100ms
       {
               a++;
                   num3=0;
           }
        if(a==30)                  //3s
           {
               velocity=(10*num2*0.1/3)*100;         // m/s,为了方便小数处理整体*100(精确到小数点后2位,ve真实速度预设值(10*num2*0.1/3)不能大于9.99m/s)
                                                      //显示处理:velocity/100个位,v%100/10小数第一位,v%100%10,小二位
                   num2=0x00;
                   a=0;
           }
        return velocity;
}                                                                          
                                                                                   /*lcd显示速度*/
void time(int a)
{
   int i;
   while(a--)
   {
      for(i=0;i<75;i++);
        }
}
void write_com(unsigned char b)
{
    lcdr=0;
        P1=b;
//        led5=0;
        time(5);
        lcden=1;
        time(5);
        lcden=0;
}
void write_data(unsigned char date)
{
    lcdr=1;
        P1=date;
        time(5);
        lcden=1;
        time(5);
        lcden=0;
}
void init()
{
    lcden=0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
}
void lcd_ply()
{
// while(1)
//  {
    init();
        xian[0]=velocity/100;                        //个位                 ,将速度放到此数组中
        xian[1]=velocity%100/10;           //小数第一位
        xian[2]=velocity%100%10;           //小数第二位
        data_v[0]=xian[0]+'0';                   //将数组中的速度值 赋给显示的字符串组
        data_v[1]='.';                                   //小数点
        data_v[2]=xian[1]+'0';
        data_v[3]=xian[2]+'0';
                                                                                         
        write_com(0x80+0x40);
          for(num4=0;num4<2;num4++)
            {
                        write_data(one[num4]);           //显示V:
                        time(50);
                }
        for(num4=0;num4<4;num4++)
            {
                    write_data(data_v[num4]);
                       
                        time(50);
//                        led5=0;
                }
         for(num4=0;num4<3;num4++)
            {
                        write_data(two[num4]);                //显示单位M/S
                }                                                                          
}
                                                          
void main()
{
   TMOD=0X25;         //定时器0为速度的计数器,定时器1位PWM产生定时器
   TH0=(65536-100)/256;
   TL0=(65536-100)%256;
   TH1=6;
   TL1=6;                 //250us溢出一次
   EA=1;
   ET0=1;
   TR0=1;
   ET1=1;
   TR1=1;

   P0=0;
   while(1)
   {
                lcd_ply();                 //速度显示
   }
}

好资料 如果再有硬件图纸更好

好东西啊

硬件应该很容易啊,用不了几个元件。后面打算用以前的一个实验板飞线,把儿子的玩具车用来改装

能实用才是好东西

发个仿真图,比较乱,学51的仿真都在里面,主要就看程序能不能跑,电路也是最简的,不考虑参数,实物的话肯定不能这么简单,元件选型、滤波、EMC、保护、稳压、布局

不错,谢谢分享

我想是不是可以做成自平衡小车了,如果用双轮,有了前进后退,然后用传感器获得的数据来控制前进后退,不就可以自平衡了吗?难点是数据的处理,首先要弄懂数据的含义,然后是处理算法,最后是控制。这需要好好找资料学习一下,要做的话就用STM32了

小编所说即是咋                 

这个程序的电机驱动部分已经测试了,还可以,PWM频率要调整一下,可以调TH1=6;TL1=6;这个和num自加值,电机工作比较连续,否则会易一跳一跳的,我最后调到了400HZ,频率还可以提高。
显示没有试,当时没去找1602,测速的部分也得调整,实际速度0.1m/s左右,我用的3.6V电池,和碳刷电机。这周末有空再试试。
现在要准备做STM32的2轮平衡车,电机驱动已经写好,姿态控制难点

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top