
既然是技巧的话那就不提供详细的代码了,首先要看你这个小车是几轮几驱动的,首先假设你只用一个L298n驱动板的话,那么再假设只含左右两个轮,只对左右两个轮进行控制的话,那么就简单了,首先你要知道L298N驱动板怎么用,不同的驱动板功能都不一定相同,不过控制引脚一般来说都是4根,可以控制两个直流电机的正反转,同时还有两个PWM接口,可以控制两个电机的转速。
假设4个控制引脚分为A1、A2和B1、B2,A1、A2控制第一个直流电机,B1、B2控制第二个直流电机,当A1和A2接不同方向的电流后直流电机会正转或反转,同理B1和B2也是一样。PWM是通过控制占有率来控制电机速度的,即控制高电平和低电平的时间的,不同,这样在规定时间内,如果高电平的时间占有比例越高则电机转速越快,输出功率越高。
知道以上内容了那么之后的内容就更容易理解了
前进:两个直流电机朝正方向同时转动即可
后退:两个直流电机朝反方向同时转动即可
原地左转:类似原地打转,只需让两个电机一个正转一个反转即可,即左转为左边电机反转,右边电机正转
原地右转:与原地左转相反即可
固定轮转:固定左边令右侧轮前进即可实现固定轮转向的目的,例如左转的话令左边电机停止,右侧电机正向转动即可,向右转的话与左转相反。
至于keil程序,这个要根据具体的硬件来写,别人的无法通用,不过这些都不难,只要原理弄懂了,稍微花一点儿时间还是能很容易写出来的,先从控制电机的转向开始。别人的程序的话可能会越看越难理解,还是自己动手比较好,先不考虑调速的情况下完成了之后再去看看有关PWM调速的内容。
例如,把单片机的P10和P11分别接在直流电机的两个电极上。
汇编程序:
ORG 0000H
LJMP MAIN
MAIN :
SETB P10 //反转改为:CLR P10
CLR P11 //SETB P11
SJMP $
END
C51程序:
#include"reg51h"
#define uint unsigned int
#define uchar unsigned char
sbit P10=P1^0;
sbit P11=P1^1;
void delay()
{
uint i,j;
for(i=0;i<1000;i++)
for(j=0;j<500;j++);
}
main()
{
while(1)
{
P10=1;
P11=0;
delay();
P10=0;
P11=1;
delay();
}
}
用的那块芯片 管线的地址 这些都没有,怎么改成汇编?而且分好少
这个是以前我写的
不记得是那块试验板了 只要知道管线地址 很好写的
model small
data
delaytime db 0
nums db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,98h
level db 0ffh,0d0h,0a5h,75h,45h,15h
code
startup
mov dx,0c803h
mov al,10001000b
out dx,al
;
p5:mov dx,0c860h
in al,dx
mov dl,al
and al,2
cmp al,0
je exit
;
mov al,dl
and al,1
cmp al,0
je p2
mov dx,0c802h
mov al,00000001b
p3:out dx,al
call delay
rol al,1
cmp al,10h
jne p3
jmp p5
;
p2:mov dx,0c802h
mov al,00001000b
p1:out dx,al
call delay
ror al,1
cmp al,80h
jne p1
jmp p5
;
exit:mov ax,4c00h
int 21h
;
delay proc near
push ax
push cx
push dx
con1:call gettime
;
mov al,delaytime
mov ah,0
mov bx,50
mov dx,0
div bx
mov bh,al
cmp bh,0
je con1
mov si,offset level
add si,ax
mov al,[si]
mov ah,0
;
l5:dec ax
mov bx,09000h
l6:dec bx
cmp bx,0
jne l6
cmp ax,0
jne l5
pop dx
pop cx
pop ax
ret
delay endp
;
gettime proc near
push ax
push bx
push cx
push dx
mov dx,0c880h
mov al,0
out dx,al
l2:mov dx,0c802h
in al,dx
and al,10000000b
cmp al,0
je l2
mov dx,0c880h
in al,dx
;将延时时间放入delaytime
mov delaytime,al
;mov al,delaytime
mov ah,0
mov bx,10
mov cx,0
l3:mov dx,0
div bx
push dx
inc cx
cmp ax,0
jne l3
mov ah,11110111b
l4:pop dx
;
mov bh,0
mov di,offset nums
mov bx,dx
add di,bx
mov dx,0c800h
mov al,[di]
out dx,al
mov dx,0c801h
mov al,ah
out dx,al
rol ah,1
call delay1;
;
add bx,30h
mov dx,bx
mov bh,ah
mov ah,2
int 21h
mov ah,bh
loop l4
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
pop dx
pop cx
pop bx
pop ax
ret
gettime endp
delay1 proc near
push ax
push dx
push bx
mov ax,08fh
t2:dec ax
mov bx,03fffh
t1: dec bx
jnz t1
or ax,ax
jne t2
pop bx
pop dx
pop ax
ret
delay1 endp
end
以上就是关于51单片机控制两路直流电机转速的c程序技巧全部的内容,包括:51单片机控制两路直流电机转速的c程序技巧、c51单片机直流电机正反转程序、谁帮忙把步进电机正反转C语言程序转翻译出汇编语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)