用c语言写一个单片机控制小车走直线的程序,小车一共3个轮子,一个万向轮,另两个是电机驱动的,用51单片

用c语言写一个单片机控制小车走直线的程序,小车一共3个轮子,一个万向轮,另两个是电机驱动的,用51单片,第1张

自己看注释改一下就行 函数都写好了了 没用的删掉就可以了

#include<reg52h>

#include<mathh>

#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;

}

}

本文中关于LIN报文帧结构的5个部分,及部分文字参考公众号“汽车ECU设计”的相关内容,只是对其部分描述进行了简化和补充。

LIN的全称为LocalInterconnect Network。LIN主要功能是为CAN总线网络提供辅助功能,在传统车上应用最多的场合就是自动车窗、车灯、后视镜这些节点。LIN的一大优点是成本低,而且走线也更简单,只是一根线就好了,而不用像CAN总线一样需要双绞线。但其最大传输速率为20Kbps。

在说LIN总线之前,先把物理层的东西搬出来,下图就是目前应用最为广泛的LIN总线的应用电路,是从TJA1021的规格书中截图出来的。

作为主节点的LIN收发器电路是有一个1K上拉到Vbat的电阻,而如何改变LIN总线上的电位,也就是通过LIN收发器内部的MOSFET的拉低来实现的。因此,LIN总线实际上是一个12V电平的方波信号,之前我用示波器录过一段LIN总线上的波形,可惜找不到了,只能抄网络上别人的图来写了。

LIN总线的特点

1采用单主多从的组网方式,无CAN总线那样的仲裁机制,最多可连接16个节点(1主15从)。2对硬件要求简单,仅需UART/SCI接口,辅以简单驱动程序便可实现 LIN 协议。故几乎所有的MCU均支持LIN。3不需要单独的晶振,便能完成主、从节点的同步,硬件成本大幅降低。4仅使用一根信号线便可完成信息的传输,即所谓的单总线设备。5传输速率最高可达20Kbps,符合A类网络标准,满足车身控制需要。6LIN 网络中新节点的加入,对网络中其他原有节点的软硬件设计不会造成影

前后台程序不是楼上说的那个意思

前后台程序一般指着是没有 *** 作系统的 程序,,

所谓的前台就是主动去判断某个事务这个是主循环里面要干的

也你就是代码主要要写的,

后台指的是,中断,也就是不需要你的cpu去判别他会自动进入某一种状态

你在这个状态下干什么你要干事就可以了

至于架构如果是小系统的话其实也没有什么架构可以说的

能完成任务就好了

主要代码写的规范一点

稍微大一点的系统

分好模块一步一步做然后弄个大循环组合一下

单片机毕竟不是pc ,所拥有的资源比较有限没有一种通用的方法

毕竟要根据你项目的大小,,mcu本身的ram rom等资源,,

有时候明知道这样写代码结构不好,,但是rom或ram或时间有限

只好如此写了

51的IO很特别,属于SFR,不能直接或者间接寻址,所以不能像寄存器那样随意调换顺序。要么在定义的时候修改,要么使用以个接口函数,在接口函数中实现IO的兑换,这个函数可以接受参数什么的,可以做的比较人性化。

最近我的一位搞工控的哥们做了套设备,是针对汽车换挡器的自动检查设备,其中涉及到了LIN通讯,因为要检测的换挡器是带LIN通讯功能的,要让换挡器执行一些 *** 作(例如要让档位指示灯点亮与熄灭)必须通过LIN通讯发送指令,

虽然RS232是可以转换成LIN总线的,可LIN总线通讯与RS232的协议还是有一些不同,PLC无法直接进行LIN通讯。因为PLC的自带232口的可 *** 控性比较差,用户是不能进行更深层的设置的。软件的编程相对于单片机也比较困难。

为了让PLC可以控制换挡器的动作,我的哥们先用PC机+232转LIN模块,使用专门的LIN通讯控件来进行LIN通讯,PC机再与PLC连接接受PLC的指令,实践证明这种设计可靠性不好,设备运行一直不太顺畅,于是请我帮忙开发一个专门负责LIN通讯的单片机控制器。接受PLC的I/O指令,自动转换成相应的LIN通讯指令从而 *** 控换挡器完成相应的动作。

LIN通讯是汽车总线系统中相对CAN总线来说成本较低,速度较慢的一种通讯协议。是种一主多从结构的网络,网速最高为20K波特率,适合较低速率数据的传输,为了节省成本,单片机的UART接口可以很容易地转换成LIN总线接口。以我的感觉LIN通讯更适合单片机实现,因为LIN通讯中要求能够对发送信道进行超波特率设置,例如发送HEADER串时要求连续发送13个显性位,以及10毫秒级的定时,因而PLC实现起来比较麻烦。

我开发的LIN总线通讯控制器是在我公司原有的运动控制器的基础上开发的。带有电气隔离的LIN通讯接口,适合工业现场的应用。LIN总线控制器有自动手动两种工作模式:手动状态下,按下键盘按钮可完成相应的LIN指令的发送及接受,接收的信息以汉字方式实时显示在LCD屏幕上,可做汉字人工 *** 作或调试使用。自动状态下,LIN控制器接受来自PLC的I/O口指令,完成相应的LIN指令的发送任务后,通过I/O口将LIN通讯回复指令的状态回复给PLC。

本LIN总线通讯控制器为面板安装方式,模块化设计,标配有LCD液晶显示,键盘,一定数量的I/O输入,选配有CAN总线通讯接口,LIN总线通讯接口,RS485总线通讯接口,无线通讯模块,还有隔离的A/D,D/A模块,继电器输出模块,等等。

以上就是关于用c语言写一个单片机控制小车走直线的程序,小车一共3个轮子,一个万向轮,另两个是电机驱动的,用51单片全部的内容,包括:用c语言写一个单片机控制小车走直线的程序,小车一共3个轮子,一个万向轮,另两个是电机驱动的,用51单片、如何采集LIN报文、谁能帮我讲解单片机前后台系统设计的一般流程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10040317.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存