本帖最后由 11hyliang1 于 2014-9-23 17:01 编辑
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit D1=P1^1;
sbit D2=P1^2;
sbit D3=P1^3;
sbit D4=P1^4;
sbit ENA=P1^5;
sbit ENB=P1^6;
uchar c,a,b,temp,flag,flag1;
void rec_data();
void delay(uint);void qianjin();
void main()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0X50;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
PCON=0x00;
P1=0XFF;
flag=0;
while(1)
{
if(flag1==1)
{
switch(a)
{
case 0x11: qianjin();break;
// case 0x22: D1=1;D2=0;D3=0;D4=1;break;
// case 0x33: D1=0;D2=1;D3=0;D4=1;break;
// case 0x44: D1=1;D2=0;D3=1;D4=0;break;
// case 0x00: D1=0;D2=0;D3=0;D4=0;break;
default: break;
}
flag1=0;
}
}
}
void rec_data()
{
uchar c;
c=SBUF;
switch(flag)
{
case 0:if(c==0xfc){flag=1;} else flag=0;break;
case 1:if(c!=0xff){flag=2;a=SBUF;} else flag=0;break;
case 2:if(c==0xfc||c==0x0d||c==0x1e||c==0x2f||c==0x41){flag=3;flag1=1;flag=0;} else flag=0;break;
default: break;
}
}
void serial() interrupt 4
{
ES=0;
if(RI==1)
{
RI=0;
rec_data();
}
ES=1;
}
void qianjin()
{
uint cycle=0,T=500;
D1=1;
D2=0;
while(cycle!=T)
{
ENA=1;
delay(cycle++);
ENA=0;
delay(T-cycle);
}
}
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
如何才能控制电机处于一个较慢的速度转动,太快了,不需要精确具体速度是多少,就尽量减慢转速就行,像我那样写不太理想,因为好像慢慢加速完了就会停止了,我希望进入qianjin函数后,如果我没有发送任何信号,电机能一直恒速、低速前进,另外在不大改动我的代码的情况下,应该怎么写代码
忘记说了,是用的L298驱动模块驱动的
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
aa=1;
n=30;
.....
void timer0() interrupt 1
{
if(aa==1)
{
TH0=(65535-(100-n)*50)/256;
TL0=(65535-(100-n)*50)%256;
ENA=0;
ENB=0;
}
else
{
TH0=(65535-n*50)/256;
TL0=(65535-n*50)%256;
ENA=1;
ENB=1;
}
aa=~aa;
}
这相当于一个周期,高电平只占周期的n/100,也就是想要占多少,n就等多少,等于原来给一1秒的高电平现在只给1/3秒,这样电机就会大大减速,这是我的理解,也不知对不对,实测,程序可行,很好的减速效果,希望大家一起学习交流~~
延长可以,不过转弯就不知怎么弄了,电机一个正,一个反,只会在原地打圈,还是说转太快了就会原地打圈,想用两个定时器,但上面波特率设置已经用了定时器了,而且有时开着开着就停了,发送什么指令都没用,去手动弄一下轮子又可以跑,不知是摩擦太大还是怎么回事,电池我测了一下,电力很足
自己做的最小系统,没办法,只能用PWM,现在是前进后退都慢下来了,但转弯还是很快,直接就在原地打圈了,现在一个定时器设置波特率了,一个定时器控制前进后退,如果转弯也用,就显得特别快,不知怎么处理
一周热门 更多>