本人是51单片机菜鸟,求助各位大神.

本人是51单片机菜鸟,求助各位大神.,第1张

#include<reg52h>

#include<mathh>

#define uint unsigned int

#define uchar unsigned char

uchar i=0,j=0,t=0,k,m1,m2,tmp1,tmp2,temp;

sbit P10=P1^0;//循迹传感器最左有测得信号 低电平有效

sbit P11=P1^1;//循迹传感器次左有测得信号

sbit P12=P1^2;//循迹传感器中有测得信号

sbit P13=P1^3;//循迹传感器次右有测得信号

sbit P14=P1^4;//循迹传感器最右有测得信号

sbit s1=P2^2;//单片机输出到L298N控制电机左后退

sbit s2=P2^3;//单片机输出到L298N控制电机左前进

sbit s3=P2^4;//单片机输出到L298N控制电机右后退

sbit s4=P2^5;//单片机输出到L298N控制电机右前进

sbit en1=P2^0;

sbit en2=P2^1;

sbit qian=P1^6;

sbit ce=P1^7;

sbit beep=P3^0;

sbit choose=P3^1;

sbit zheng=P3^6;

sbit fu=P3^7;

sbit ceshi=P3^5;

sbit ceshi2=P3^4;

void Delay(uint i)

{

uchar j;

while(i--)

{

for(j=0;j<113;j++)

{

;

}

}

}

void init()

{

TMOD=0x02; / 设定T0的工作模式为2 /

TH0=0x9c; / 装入定时器的初值 /

TL0=0x9c;

EA=1; / 开中断 /

ET0=1; / 定时器0允许中断 /

TR0=1; / 启动定时器0 /

}

/ 电机控制函数 index-电机号(1,2); speed-电机速度(-100—100) /

void motor(uchar index, int speed)

{

if(speed>=-100 && speed<=100)

{

if(index==1) / 电机1的处理 /

{

m1=abs(speed); / 取速度的绝对值 /

if(speed>0) / 速度值为正则正转 /

{

s1=1;

s2=0;

}

if(speed<0) / 为负数则反转 /

{

s1=0;

s2=1;

}

}

if(index==2)

{

m2=abs(speed);

if(speed>0)

{

s3=1;

s4=0;

}

if(speed<0)

{

s3=0;

s4=1;

}

}

}

}

void main()

{

init();

zheng=1;

fu=0;

ceshi=0;

ceshi2=1;

P1=0xff;

if(choose==1)

while(1)

{

temp=(P1|0xe0);

switch(temp)

{

case 0xf7:i=1;motor(1,50);motor(2,0);break;

case 0xef:i=2;motor(1,50);motor(2,0);break;

case 0xe7:i=3;motor(1,50);motor(2,0);break;

case 0xe3:i=4;motor(1,50);motor(2,0);break;

case 0xf3:i=5;motor(1,50);motor(2,0);break;

case 0xfe:j=1;motor(1,0);motor(2,50);break;

case 0xfc:j=2;motor(1,0);motor(2,50);break;

case 0xf8:j=3;motor(1,0);motor(2,50);break;

case 0xf9:j=4;motor(1,0);motor(2,50);break;

case 0xfd:j=5;motor(1,0);motor(2,50);break;

case 0xfb:k=1;motor(1,30);motor(2,30);break;

case 0xf1:k=2;motor(1,30);motor(2,30);break;

case 0xe0:motor(1,30);motor(2,30);break;

case 0xff:if(i==1||i==2||i==3||i==4||i==5){i=0;motor(1,50);motor(2,0);}

if(j==1||j==2||j==3||j==4||j==5){j=0;motor(1,0);motor(2,50);}

if(k==1||k==2){k=0;motor(1,30);motor(2,30);}break;

default : break;

}

if(qian==0)

{

beep=0;

TR0=0;en1=0;en2=0;EA=0;ET0=0;

while(!qian);

TR0=1;en1=1;en2=1;EA=1;ET0=1;

beep=1;

}

if(ce==0)

{

beep=0;

TR0=0;en1=0;en2=0;EA=0;ET0=0;

Delay(2000);

TR0=1;en1=1;en2=1;EA=1;ET0=1;

beep=1;

while(ce==0)

{motor(1,15);

motor(2,15);

}

}

}

else

{

P0=0xff;

while(1)

{

switch(P0&0x1f)

{

case 0x11: motor(1,50);motor(2,50);Delay(1000);break;

case 0x12: motor(1,0);motor(2,50);Delay(1000);break;

case 0x14: motor(1,50);motor(2,0);Delay(1000);break;

case 0x18: motor(1,-50);motor(2,-50);Delay(1000);break;

default:motor(1,0);motor(2,0);break;

}

}

}

}

void timer0() interrupt 1 / T0中断服务程序 /

{

if(t==0) / 1个PWM周期完成后才会接受新数值 /

{

tmp1=m1;

tmp2=m2;

}

if(t<tmp1)

en1=1;

else

en1=0; / 产生电机1的PWM信号 /

if(t<tmp2)

en2=1;

else

en2=0; / 产生电机2的PWM信号 /

t++;

if(t>=100)

t=0; / 1个PWM信号由100次中断产生 /

}

这个是可循迹智能小车的程序 你自己研究吧

接循迹用的光电传感器,用单片机判断,驱动电机执行。传感器越多越好。

以比较奇葩的单路传感器为例,0驱动左轮,1驱动右轮,就可以沿黑线一侧摇摆前进。这么简单的判断都可以不用单片机,呵呵。

以上就是关于本人是51单片机菜鸟,求助各位大神.全部的内容,包括:本人是51单片机菜鸟,求助各位大神.、51智能小车寻迹路线,怎么编程让小车按原路返回、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9471658.html

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

发表评论

登录后才能评论

评论列表(0条)

保存