初学单片机,在做循迹小车,程序有些地方不懂,求大神指点一下。留下邮箱给你发程序。

初学单片机,在做循迹小车,程序有些地方不懂,求大神指点一下。留下邮箱给你发程序。,第1张

给你一条明路,你现在从流水灯开始看,基础看,在这之前,c语言当然要掌握好,一步一个脚印,基础永远是最重要的,等你从led到按键,到中断,到液晶,最后到时钟,寻迹车这些,就会得心应手

懂了寻迹车的原理,代码只需要10行,你不信吧,核心就那么几句,看比较器的输出,来确定,是否左转,右转,前进,那么只需要三次if就行了,再加上l298n的驱动模块, 控制电平方向控制马达转向,差速旋转,或者一个轮子动,一个轮子不动

不要浪费时间去焊太多的电路,更不要浪费时间一步就想学懂单片机,刚开始就去做寻迹车,学stm32就想做四轴飞行器,学了c和汇编,也不一定马上就去写 *** 作系统

#include<reg52h>

#define uchar unsigned char; //char单字节整型数据或字符型数据

#define uint unsigned int; //int声明基本整型数据

#define PON 0

#define POFF 1

#define ON 1

#define OFF 0

#define SPEED2 100

#define SPEED1 50

uchar ito=0;

uchar m=0;

uchar time=0;

uchar PWM1=0;

uchar PWM2=0;

sbit p=P2^0; //控制左轮

sbit q=P2^1; //控制右轮

sbit p_green=P2^2;

sbit p_red=P2^3;

sbit TCRD1=P2^4;//此处是传感器RPR220管脚位声明

sbit TCRD2=P2^5;

sbit TCRD3=P2^6;

sbit TCRD4=P2^7;

int count1=0;//用于定时计数的两个全局变量位声明

int count2=0;

int x[4];

uchar table1[]={ 0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60,0xff};//0,1,2,3,4,5,6,7,8,9,关显示,数码管码表,高电平有效

unsigned char code table2[]=

{0xfe,0xfd,0xfb, //11111110,11111101,11111011

0xf7,0xef,0xdf,0xbf,0x7f,}; //11110111,11101111,11011111,10111111,01111111

unsigned char dp=0x7f; //Use AND to add the decimal point/clock point

unsigned char cp;

int s=0;

int sec=0; //定义路程,时间

char a;

int idi=0;

int j=0;

bit rup3=0;

int GAO=4000;

int T=0;//处理时间中断3

int timeCount;//计时标志

int wheelCount;//测距标志

//int white=0;//测交叉线

void delay(int x)

{

int a;

int b;

for(a=x;a>0;a--)

for(b=125;b>0;b--);

}

void display()//显示时间和路程

{

//显示时间

P0=table1[x[idi]];

P1=table2[idi];

idi++;

if(idi==4)

idi=0;

delay(1);

}

void forward_turn1()//电机1前进

{

if(PWM1)

p=PON;

else

p=POFF;

}

void forward_turn2()//电机2前进

{

if(PWM2)

q=PON;

else

q=POFF;

}

void stop_turn1()//电机停止

{

P=POFF;

q=POFF;

}

void speed1(int ct,int sd)//电机1速度控制函数,其中参数 sd为生成 PWM 波

{

if(ct>=sd)

PWM1=0;

else

PWM1=1;

}

void speed2(int ct,int sd)//电机2速度控制函数,其中参数 sd为生成 PWM 波

{

if(ct>=sd)

PWM2=0;

else

PWM2=1;

}

void advance(int ct1,int sd1,int ct2,int sd2)//小车直线前进函数

{

forward_turn1();

forward_turn2();

speed1(ct1,sd1);

speed2(ct2,sd2);

}

//以下是方案1, 通过使两轮一快一慢来实现转向

void left_turn1(int ct1,int sd1,int ct2,int sd2)//小车左转

{

forward_turn1();

forward_turn2();

speed1(ct1,sd1);

speed2(ct2,sd2);

}

void right_turn1(int ct1,int sd1,int ct2,int sd2)//小车右转

{

forward_turn1();

forward_turn2();

speed1(ct1,sd1);

speed2(ct2,sd2);

}

//以下是方案2, 通过使两轮一慢传,一停转来实现转向

void left_turn2(int ct1,int sd1,int ct2,int sd2)//小车左转

{

forward_turn1();

forward_turn2();

speed1(ct1,sd1);

speed2(ct2,sd2);

}

void right_turn2(int ct1,int sd1,int ct2,int sd2)//小车右转

{

forward_turn1();

stop_turn1();

speed1(ct1,sd1);

speed2(ct2,sd2);

}

void main()

{

p=1;

q=1;

TMOD=0x11;//中断模式设置

TH0=(65536-1000)/256;//定时器1初始化

TL0=(65536-1000)%256;

EA=1;

ET0=1;

TR0=1;

TH1=(65536-1000)/256;//定时器2初始化

TL1=(65536-1000)%256;

EA=1;

ET1=1;

TR1=1;

while(1)

{

}

}

void time0()interrupt 1

{

TH0=(65536-5000)/256;//定时 5ms

TL0=(65536-5000)%256;

count1++;

ito++;

if(ito==200)

{

ito=0;

s++;

if(s==60)

{

s=0;

m++;

if(m==60)

{

m=0;

}

x[0]=m/10;

x[1]=m%10;

}

x[2] =s/10;

x[3] =s%10;

}

display();

if(count1==SPEED2)//周期是1s

count1=0;

count2++;

if(count2==SPEED2)//周期是1s

count2=0;

}

控制不了速度就是PWM信号没起作用,确定接线没错误么?端口需不需要上拉电阻?引脚方向需要配置不,看你这程序应该是51单片机,两个车轮速度如果一样的话可以连在一起,定时器中断标志位也没清零。有示波器最好直接看引脚波形。

以上就是关于初学单片机,在做循迹小车,程序有些地方不懂,求大神指点一下。留下邮箱给你发程序。全部的内容,包括:初学单片机,在做循迹小车,程序有些地方不懂,求大神指点一下。留下邮箱给你发程序。、求高手给一份c程序,用rpr220黑白循迹模块进行小车黑白循迹,有急用的!!!~~~谢谢了啊、单片机循迹小车,帮忙看下这个单片机程序 程序控制不了电机的转速 PS:感应部分正常工作等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存