89C51 2.0版本套装中的电机是直流电机,所以代码也是对直流电机而言。
学校课设必须使用汇编语言,虽然c比较方便。
然而很多人做电机,但是课程没有教电机,hhhh(然后三个班做电机的代码都是我给的?
主要原理就是你设定一个周期,在这个周期中有多少时间给低电平,其他时间给高电平,这就是调节PWM占空比
代码语言:javascript复制PWM EQU P1.0
ORG 0000H
SJMP MAIN
ORG 000BH
SJMP TFT0
ORG 0030H
MAIN: MOV A,TMOD
ORL A,#01H
MOV TMOD,A
MOV SP,#05FH
MOV TH0,#0FCH;定时1ms
MOV TL0,#018H
SETB RS0
CLR RS1
MOV IE,#082H;打开中断
SETB TR0;定时器打开
CLR PWM
MOV R2,#0;按键次数
MOV R3,#0; R3为等待给电时间
MOV R1,#0;R1为count计数,conunt = R3 就给电
LOOP:
JB P3.2,LOOP
ACALL DELAY
JB P3.2,LOOP
INC R2 ;R2计按键数
CJNE R2,#04,LS ;等于4清零
MOV R2,#0
LS:
MOV DPTR,#CON2
MOV A,R2
MOVC A,@A DPTR;查表控制实际给电时间
MOV R3,A
MOV DPTR,#CON;查表控制档位显示
MOV A,R2
MOVC A,@A DPTR
MOV P0,A
SJMP LOOP
TFT0: PUSH PSW
PUSH ACC
SETB RS0
CLR RS1
MOV TH0,#0FCH;定时1ms
MOV TL0,#018H
MOV A,R1;R1为count
MOV R4,A
MOV A,R3;R3为等待给电时间
CLR C
SUBB A,R4
CJNE A,#0,LS4
SETB PWM
LS4: INC R1 ;count
CJNE R1,#010,LSS
MOV R1,#0H
CJNE R3,#0,LS5
SJMP LSS
LS5: CLR PWM
LSS: POP ACC
POP PSW
RETI
DELAY:
MOV R5,#15
DEL: MOV R6,#055
DJNZ R6,$
DJNZ R5,DEL
RET
CON: DB 0x06,0x5B,0x4F,0x66
CON2: DB 0,2,4,6
END
这份c是网上的代码,电机控制都差不多
代码语言:javascript复制
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1 = P3^2; //定义调速的按键
sbit PWM = P1^0; //定义直流电机的控制端口
uchar CYCLE; //定义周期
uchar PWM_ON ; //定义低电平时间
void Delay(uint i)
{uchar x,j;for(j=0;j<i;j )for(x=0;x<=148;x );
}
void Time0(void)
{
TMOD |=0x01;
//定时器设置 1ms in 12M crystal
TH0=(65536-1000)/256; TL0=(65536-1000)%6; //定时1mS
IE= 0x82;
//打开中断
TR0=1;
//定时器打开
}
main()
{uchar PWM_Num;
//定义档位
Time0();CYCLE = 10;
//时间可以调整 这个是10步调整 周期10ms 8位PWM就是256步
PWM = 0;while(1){if(!KEY1)
{
Delay(15);
if(!KEY1)
{
PWM_Num ;
//按一下P3.2口,就给直流电机换一个档位
if(PWM_Num==4){PWM_Num=0;
}
switch(PWM_Num){
case 0:P0=0x06; PWM_ON=0;break;
//低电平时长 //给P0口赋值,是让P0口显示:1,2,3,4 这四个档位
case 1:P0=0x5B;
PWM_ON=2;break; case 2:P0=0x4F;
PWM_ON=4;break; case 3:P0=0x66;
PWM_ON=6;break; default:break;
}
}
}
}
}
void tim(void) interrupt 1 using 1
{static unsigned char count; TH0=(65536-1000)/256; TL0=(65536-1000)%6;//定时1mS
if (count==PWM_ON)
{PWM = 1;
//直流电机转
}
count ;
if(count == CYCLE)
{count=0;if(PWM_ON!=0) //如果左右时间是0 保持原来状态
{PWM = 0; //直流电机不转
}}
}