/* 晶振采用11.0592M,产生的PWM的频率约为91Hz */
#include<reg51.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
sbit en1=P1^0/* L298的Enable A */
sbit s1=P1^2/* L298的Input 1 */
sbit s2=P1^3/* L298的Input 2 */
uchar t=0/* 中断计数器 */
uchar m1=0/* 电机1速度值 */
uchar tmp1,tmp2/* 电机当前速度值 */袭并孝
/* 电机控制函数 index-电机号(1,2)speed-电机速度(-100—100) */
void motor(uchar index, char speed)
{
if(speed>=-100 &&speed<=100)
{
if(index==1) /* 电机1的处理 */
{
m1=abs(speed)/* 取速度的绝对值 */
if(speed<0) /* 速度值为负则反转 */
{
s1=0
s2=1
}
else /* 不为负数则正转 */
{
s1=1
s2=0
}
}
}
}
void delay(uint j) /* 简易延时函数 */蔽汪
{
for(jj>0j--)
}
void main()
{
uchar i
TMOD=0x02/* 设定T0的工作模式为2 */
TH0=0x9B/* 装入定时器的初值 */ 定拍稿时101us
TL0=0x9B
EA=1/* 开中断 */
ET0=1/* 定时器0允许中断 */
TR0=1/* 启动定时器0 */
while(1) /* 电机实际控制演示 */
{
for(i=0i<=100i++) /* 正转加速 */
{
motor(1,i)
delay(5000)
}
for(i=100i>0i--) /* 正转减速 */
{
motor(1,i)
delay(5000)
}
for(i=0i<=100i++) /* 反转加速 */
{
motor(1,-i)
delay(5000)
}
for(i=100i>0i--) /* 反转减速 */
{
motor(1,-i)
delay(5000)
}
}
}
void timer0() interrupt 1 /* T0中断服务程序 */
{
if(t==0) /* 1个PWM周期完成后才会接受新数值 */
{
tmp1=m1
tmp2=m2
}
if(t<tmp1) en1=1else en1=0/* 产生电机1的PWM信号 */
t++
if(t>=100) t=0/* 1个PWM信号由100次中断产生 */
}
主程序和中断程序入口 ***
*************************************
ORG 0000H程序执行起始地址
LJMP START 跳至START
ORG 0003H外中断0入口
LJMP INTEX0 跳至INTEX0中断服务程序
ORG 000BH定时器T0中断入口
RETI 中断返回
ORG 0013H外中断1入口
LJMP INTEX1 跳至INTEX1中断服务昌毁程序
ORG 001BH定时器T1中断入口
LJMP INTT1 跳至INTT1中断服务程序
ORG 0023H串口锋迅毁中断入口
RETI 中断返回
ORG 002BH定时器T2中断入口
RETI 中断返回
***************************
* *
*初始化程序 *
* *
****************************
CLEARMEMIO: MOVR0, #70H 清70H-76H显示单元
MOVR7, #07H 循环次数
ML0: MOV@R0, #00H 清0
INCR0 下一地址
DJNZ R7, ML0未完再循环
MOVTMOD,#10H T1为16位定时器
MOVR4,#14H1秒定时用(50毫秒20次)
MOVTL1,#0B0H 50毫秒定时用初值
MOVTH1,#3CH
MOV 20H,#00H 清0 *** 作
MOV 21H,#00H
MOV 22H,#00H
MOV 23H,#00H
MOV 24H,#00H
CLR 30H 清停车标志
SETB ET1 开银备T1中断
SETB EX1 开外中断1
SETB IT1 外中断1采用边沿触发
SETB IT0 外中断0优先级为1(最高)
SETB EX0 开外中断0
SETBEA 开总中断允许
SETBTR1 开启定时器T1
RET 子程序返回
*************************************
**
*主 程 序*
**
*************************************
START: LCALLCLEARMEMIO 上电初始化
SETB P1.6 选择7.5V输出
CLR P1.7 选择7.5V输出
SETB P3.7 前进状态
CLR P3.6 前进状态
CLR P1.0 电机供电开始
;MAIN:LCALLDISP LED显示一次
LJMP MAIN 转MAIN循环
NOP PC值出错处理
NOP
LJMP START 重新初始化
*************************************
**
*外中断0服务程序,用作跑道位置处理 *
*23H作跑道计数器 *
*************************************
INTEX0:PUSH ACC 堆栈保护
PUSH PSW
CLR EX0 关中断
LCALLDISP LED显示一次(延时抗干扰)
JB P3.2,IN0RET P3.2为1退出(干扰)
INC 23H 跑道计数器加1
MOV A,23H 数据入A
CJNE A,#06H,JUDGE1 不是第6道转JUDGE1
LCALLSTOP 是第6道,停车
LJMP IN0RET 转中断退出
JUDGE1:CJNE A,#03H,JUDGE2 不是第3道转JUDGE2
LCALLSTOPSLOW 是第3道,变慢车
LJMP IN0RET 转中断退出
JUDGE2:CJNE A,#04H,JUDGE3 不是第4道转JUDGE3
LCALLFAST 是第4道,变快车
LJMP IN0RET 转中断退出
JUDGE3:CJNE A,#05H,IN0RET 不是第5道转INORET退出
LCALLSTOPSLOW 是第5道,变慢车
IN0RET:CLR IE0 清外中断0中断标志
POP PSW 恢复现场
POP ACC
LCALLDL7MS 延时7毫秒(抗干扰)
SETB EX0 开外中断0
RETI 中断返回
************************************
* 慢车控制子程序 *
************************************
STOPSLOW: CLR P1.6 关7.5V电源
CPL P3.6 反向驱动(刹车)
CPL P3.7 反向驱动
LCALLDS50MS 刹车时间(可根据试车情况调整)
LCALLDS50MS
LCALLDS50MS
CPL P3.6 正向驱动
CPL P3.7 正向驱动
SETB P1.7 开4.3V电源
RET 返回
************************************
* 快车控制子程序*
************************************
FAST: CLR P1.7 关4.3V电源
SETB P1.6 开7.5V电源
RET 返回
************************************
* 停车控制程序 *
************************************
STOP: MOV 23H,#00H 跑道计数单元清0
CPL P3.6 反向驱动(刹车)
CPL P3.7 反向驱动(刹车)
LCALLDS50MS 刹车时间
LCALLDS50MS 刹车时间(可调整)
SETBP1.0 关电机电源
SETBPT1 定时器T1为高优先级
LCALLDS10S 停车10秒
CLR PT1 恢复T1为低优先级
SETB P1.6 开7.5V电源(高速)
CLR P1.7 关4.3V
CLR P1.0 电机电源开
CPL 30H 停车点位置判断标志取反
JB 30H,STREN 为1(中途停车)转STREN
LCALLCLR00 是终点,调复0程序
STREN:RET 返回
可以在小车上搭载一个变速装置。可以在各大浏览器上搜索速度更改程序,先用低速让小车跑一段距离,再用高速让小车跑。用同样的方法在ev3里写程序态乎宏就可以了,先用移动转向模块控制小车低速跑,再用另一个移动转向模块控制小车高速跑。
将马达模块放在循环模块之内,用等待模块控制单次循环时间,电机模块设为开启模式顷链,帆册每次循环功率值均固定增加一个值。然后在程序上实现提速,提速之后小车的车速会明显提高,但不会特别特别快。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)