给你一条明路,你现在从流水灯开始看,基础看,在这之前,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:感应部分正常工作等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)