
自己看注释改一下就行 函数都写好了了 没用的删掉就可以了
#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报文、谁能帮我讲解单片机前后台系统设计的一般流程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)