❶ 用c语言写一个单片机控制小车走直线的程序,小车一共3个轮子,一个万向轮,另两个是电机驱动的,用51单片
自己看注释改一下就行 函数都写好了了 没用的删掉就可以了
#include<reg52.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
#define L_M 1
#define R_M 2
uchar temp2,temp1,t,m1,m2,redline;
sbit tr=P2^4; //超声波
sbit ec=P2^5; //
sbit en=P2^7; //液晶的EN
sbit rs=P2^6; //液晶RS选择端
//液晶数据口 P0口
sbit Rin_1=P2^0; //寻迹管脚输入
sbit Rin_2=P2^1;
sbit Lin_2=P2^2;
sbit Lin_1=P2^3;
sbit L_EN=P1^0; //左侧电机使能
sbit L_1=P1^1; //左侧电机控制 1
sbit L_2=P1^2; //左侧电机控制 2
sbit R_1=P1^3; //右侧电机控制 1
sbit R_2=P1^4; //右侧电机控制 2
sbit R_EN=P1^5; //右侧电机使能
void delay(uint z) //延时程序1
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay1s(uchar t) //1s延时函数
{
uchar a,h,i,j,k;
for(a=t;a>0;a--)
{
for(h=5;h>0;h--)
for(i=4;i>0;i--)
for(j=116;j>0;j--)
for(k=214;k>0;k--);
}
}
void v_cotrol(uchar number,uchar speed)
{
if(speed<100)
{
if(number==1)
m1=abs(speed);
if(number==2)
m2=abs(speed);
}
}
void turnleft()
{
L_1=1; // left fan zhuan //
L_2=0;
R_1=1; // right fanzhuan
R_2=0;
}
void turnright()
{
L_1=0; // left zheng zhuan
L_2=1;
R_1=0; // right fanzhuan
R_2=1;
}
void gostright()
{
L_1=0; // left zheng zhuan
L_2=1;
R_1=1; // right zhengzhuan
R_2=0;
}
void goback()
{
L_1=1; // left zheng zhuan
L_2=0;
R_1=0; // right zhengzhuan
R_2=1;
}
void stop()
{
L_1=1; // stop
L_2=1;
R_1=1; // stop
R_2=1;
}
void timer0_int()
{
TMOD=0X01;
TH0=-100/256;
TL0=-100%256;
EA=1;
ET0=1;
TR0=1;
}
state_int()
{
Rin_1=1;
Rin_1=1;
Lin_1=1;
Lin_1=1;
t=0;
m1=50;
m2=50;
stop();
}
void main()
{
timer0_int();
state_int();
while(1)
{
//避障程序
if((Lin_1==1)&&(Lin_2==1)&&(Rin_1==1)&&(Rin_2==1))
gostright();
if((Lin_1==1)&&(Lin_2==1)&&(((Rin_1==1)&&(Rin_2==0))||((Rin_1==0)&&(Rin_2==1))||((Rin_1==0)&&(Rin_2==0))))
turnleft();
if((Rin_1==1)&&(Rin_2==1)&&(((Lin_1==1)&&(Lin_2==0))||((Lin_1==0)&&(Lin_2==1))||((Lin_1==0)&&(Lin_2==0))))
turnright();
if((((Lin_1==1)&&(Lin_2==0))||((Lin_1==0)&&(Lin_2==1))||((Lin_1==0)&&(Lin_2==0)))&&(((Rin_1==1)&&(Rin_2==0))||((Rin_1==0)&&(Rin_2==1))||((Rin_1==0)&&(Rin_2==0))))
goback();
if((Lin_1==1)&&(Lin_2==1)&&(Rin_1==1)&&(Rin_2==1))
gostright();
if((Lin_1==1)&&(Lin_2==1)&&(((Rin_1==1)&&(Rin_2==0))||((Rin_1==0)&&(Rin_2==1))||((Rin_1==0)&&(Rin_2==0))))
turnleft();
if((Rin_1==1)&&(Rin_2==1)&&(((Lin_1==1)&&(Lin_2==0))||((Lin_1==0)&&(Lin_2==1))||((Lin_1==0)&&(Lin_2==0))))
turnright();
if((((Lin_1==1)&&(Lin_2==0))||((Lin_1==0)&&(Lin_2==1))||((Lin_1==0)&&(Lin_2==0)))&&(((Rin_1==1)&&(Rin_2==0))||((Rin_1==0)&&(Rin_2==1))||((Rin_1==0)&&(Rin_2==0))))
goback();
}
while(1);
}
timer0() interrupt 1
{
TH0=-100/256;
TL0=-100%256;
if(t==0)
{
temp1=m1;
temp2=m2;
}
if(t==temp1)
L_EN=0;
if(t==temp2)
R_EN=0;
t++;
if(t==50)
{
t=0;
L_EN=1;
R_EN=1;
}
}
❷ 我们做51单片机寻迹小车,走直线的时候小车会左右扭,拐弯的时候有时又拐不过(速度慢时可以 )求指教!
走直线的时候小车会左右扭,可能是因为你循迹路线的宽度与你循迹模块中传感器的宽度不是很适宜,也有可能是你的程序没处理好(如延时),拐弯的时候有时又拐不过(速度慢时可以 )说明你的程序有待修改,没见你的实物与程序,具体情况还得具体分析,我说的仅供参考!
❸ 求51单片机可以用的直线插补的c程序
限于篇幅,程序省去 按键子程序 延时子程序 液晶初始化及相关程序、字符部分
#include<reg52.h>
#include<intrins.h>
#definemode0x81//方式0,A口、B口输出,C口高4位输出,低4位输入
#include"stdio.h"
#include"string.h"
#include"math.h"
xdataunsignedcharPA_at_0x7f00;
xdataunsignedcharPB_at_0x7f01;
xdataunsignedcharPC_at_0x7f02;
xdataunsignedcharcaas_at_0x7f03;//控制字
sbitP32=P3^2;
sbitP33=P3^3;
sbitP35=P3^5;
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharh,Pos;
unsignedintR,NX,NY;
unsignedcharkey;
codeunsignedcharKeyTable[]={//键码定义
0x0f,0x0b,0x07,0x03,
0x0e,0x0a,0x06,0x02,
0x0d,0x09,0x05,0x01,
0x0c,0x08,0x04,0x00
};
codeunsignedcharLEDMAP[]={//八段管显示码
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
unsignedcharCode_;//字符代码寄存器
#definePD161//122/2分成左右两半屏(122x32)
unsignedcharColumn;
unsignedcharPage_;//页地址寄存器D1,DO:页地址
unsignedcharCode_;//字符代码寄存器
unsignedcharCommand;//指令寄存器
unsignedcharLCDData;//数据寄存器
xdataunsignedcharCWADD1_at_0x1cff;//写指令代码地址(E1)
xdataunsignedcharDWADD1_at_0x1eff;//写显示数据地址(E1)
xdataunsignedcharCRADD1_at_0x1dff;//读状态字地址(E1)
xdataunsignedcharDRADD1_at_0x1fff;//读显示数据地址(E1)
xdataunsignedcharCWADD2_at_0x3cff;//写指令代码地址(E2)
xdataunsignedcharDWADD2_at_0x3eff;//写显示数进地址(E2)
xdataunsignedcharCRADD2_at_0x3dff;//读状态字地址(E2)
xdataunsignedcharDRADD2_at_0x3fff;//读显示数据地址(E2)
//----------------------液晶-----------------
//清屏
//************************中文显示程序***********************************/
/*************************直线插补***************************8*/
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=50;y>0;y--);
}
voidzhengx()
{
PA=0x00;
delay(10);
PA=0x01;
delay(10);
}
voidfux()
{
PA=0x02;
delay(10);
PA=0x03;
delay(10);
}
voidzhengy()
{
PB=0x00;
delay(10);
PB=0x10;
delay(10);
}
voidfuy()
{
PB=0x20;
delay(10);
PB=0x30;
delay(10);
}
voidxian(intNX,intNY)
{intFM,NXY,XOY,ZF,z;
FM=0;
{if(NX>0)
if(NY>0)
XOY=1;
else
XOY=4;
else
if(NY>0)
XOY=2;
else
XOY=3;}
for(NXY=fabs(NX)+fabs(NY)-1;NXY>=0&&P32!=0&&P33!=0;NXY--)
{{if(NX>0)
if(NY>0)
XOY=1;
else
XOY=4;
else
if(NY>0)
XOY=2;
else
XOY=3;}
for(NXY=fabs(NX)+fabs(NY)-1;NXY>=0;NXY--)
{if(FM>=0)
{if(XOY==1||XOY==4)
{ZF=1;
zhengx();
}
else
{ZF=2;
fux();
}
FM=FM-fabs(NY);
}
else
{if(XOY==1||XOY==2)
{
ZF=3;
zhengy();
}
else
{ZF=4;
fuy();
}
FM=FM+fabs(NX);
}
}
for(z=0;z<200;z++)
{P35=0;
delay(10);
P35=1;
delay(10);
}
}
}
❹ 单片机最多可以拟合多少个点(拟合成直线方程的)
1.单片机拟合的重点不在于多少个点(一个都没有当然不行,这里是排除极端现象),而在于拟合算法; 2.目前市面上的单片机有8位,16位,32位等等,价格和运算能力都很不错,有些还有自己的支持库,因此,纯粹从单片机考虑不是太大的问题; 3.一般的做法是:先采集这些数据(尽可能多),利用仿真软件如matlab进行算法仿真,根据这个仿真可以直接的了解到需要拟合该直线的最少数据,根据此数据选择或者优化算法,然后根据此算法选择适当价格和运算能力的单片机;根据单片机单位时间(即你需要处理的最小周期)采集数据,由此可以确定下来最终的实现算法 4.一般的方法有:插值法,最小二乘法(用法最为广泛,实现也容易,多用于计算机),方差逼近法等等
❺ 单片机最多可以拟合多少个点(直线方程)
256个吧,单片机的数据一般(51单片机)都是用8个二进制位表示的,8个二进制位可以构成2^8=256种组合,所以可以拟合256个点。
如果有更高位数的单片机,则可以拟合更多的点,这跟单片机的位数有关的。。
❻ 使用单片机如何检测直线位移传感器的信号,用到A/D转换吗能写个大体的程序吗
直线位移传感器 是什么型号 有驱动程序没有,时序图也行 有线的还是无线的 红外还是蓝牙还是射频脉冲的还是超声 数字的还是模拟的 要求精度多高
❼ 怎样用单片机控制步进电动机完成直线运动
使用51单片机加步进电机驱动芯片,如6128,组成步进电机控制电路,再使用齿轮齿条或者丝杠达到运动方式的转化,就可把电机的旋转运动变成齿条或丝杠的直线运动。步进电机的单片机控制可在网上搜索,机械部分参考机械原理。