89C51 单片机调速 可执行代码 c+汇编

 89C51 2.0版本套装中的电机是直流电机,所以代码也是对直流电机而言。

学校课设必须使用汇编语言,虽然c比较方便。

 然而很多人做电机,但是课程没有教电机,hhhh(然后三个班做电机的代码都是我给的?

主要原理就是你设定一个周期,在这个周期中有多少时间给低电平,其他时间给高电平,这就是调节PWM占空比

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是网上的代码,电机控制都差不多

​
#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)%256; //定时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)%256;//定时1mS 
if (count==PWM_ON)
{PWM = 1; 
 //直流电机转 
}
count++;
if(count == CYCLE)
{count=0;if(PWM_ON!=0)   //如果左右时间是0 保持原来状态
{PWM = 0;    //直流电机不转
}}
}

​

猜你喜欢

转载自blog.csdn.net/qq_41603898/article/details/93710354