用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轮平衡车,电机驱动已经写好,姿态控制难点