
效果图:
(一)汇编:
ORG 0000H
MOV R0,#0
MOV DPTR,#TAB
//-------主函数-------
MAIN:
SETB P3.0
MOV C,P3.0
JNC F
Z: //正转
CJNE R0,#8,Z1 //比较
MOV R0,#0 //重新回到开头计数
Z1:
MOV A,R0 //赋值
MOVC A,@A+DPTR //查表
MOV P2,A //赋值
INC R0 //加一
MOV A,#5 //用于调速
CALL DELAY//调用延时
SJMP MAIN //返回主函数
F: //反转
CJNE R0,#0,F1//比较
MOV R0,#7//重新回到末尾计数
F1:
MOV A,R0 //赋值
MOVC A,@A+DPTR //查表
MOV P2,A //赋值
DEC R0 //减一
MOV A,#1 //用于调速
CALL DELAY //调用延时函数
SJMP MAIN //返回主函数
//-------延时子函数--------
//延时越短,电机转速越快
DELAY:
MOV R2,A //(大调)修改A值,改变延时长短
D2:
MOV R3,#30 //中等
D3:
MOV R4,#0 //微调延时大小
D4:
NOP
DJNZ R4,D4
DJNZ R3,D3
DJNZ R2,D2
RET
TAB:DB 4,12,14,10,2,3,1,5 //正转模型
END
(二)C编程:
/*在本例中,正转慢,
反转快,与延时成反比*/
#include sbit sw=P3^0; //延时 void delay(int i) { int j; for(;i>0;i--) for(j=50;j>0;j--) ; } //--主程序-- void main() { int step[]= {4,12,14,10,2,3,1,5}; //正转模型 int i=0; //计数 while(1) { sw=1; //读引脚前拉高 if(sw) {P2=step[i++];if(i==8)i=0;delay(1000);}//正转 else {if(i==0) i=7;P2=step[i--];delay(100);} //反转 } }
