使用定时器中断做的简单的pwm电机调速仿真使用l289电机驱动实现
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- PWMH DATA 30H ;占空比
- PWM DATA 31H ;周期长度(pwm*250us)
- COUNTER EQU R0 ;计数器计数
- TEMP DATA 33H ;暂存
- IN1 EQU P1.2
- IN2 EQU P1.3
- ORG 0000H
- LJMP MAIN
- ORG 000BH
- LJMP INTT0
- ORG 0030H
- MAIN:
- MOV SP,#60H
- MOV PWMH,#4 ;占空比初值
- MOV COUNTER,#11;计数器初值
- MOV PWM,#11 ;周期初值
- MOV TMOD,#02H ;定时器0,工作模式2
- MOV TL0,#06H ;定时250us
- MOV TH0,#06H ;自动重装初值
- SETB ET0 ;开定时器中断
- SETB EA ;开总中断
- SETB TR0 ;启动定时器
- CLR IN1
- CLR IN2
- KSCAN:
- JNB P2.0,K1CHECK ;扫描加速键
- JNB P2.1,K2CHECK ;扫描减速键
- JNB P2.2,K3CHECK ;扫描启动键
- JNB P2.3,K4CHECK ;扫描停止键
- SJMP KSCAN
- K1CHECK:
- LCALL DELAY
- JB P2.0,KSCAN ;延时去抖
- BACK1:
- JNB P2.0,BACK1;等待按键松开
- SJMP K1HANDLE;跳转处理子程序
- K1HANDLE:
- MOV A,PWMH
- CJNE A,PWM,K1H0 ;判断是否达到上边界
- SJMP KSCAN ;达到最大,无法增加,不做处理
- K1H0:
- MOV A,PWMH ;未到最大
- INC A
- MOV PWMH,A ;占空比未到最大
- SJMP KSCAN
- K2CHECK:
- LCALL DELAY
- JB P2.1,KSCAN ;延时去抖
- BACK2:
- JNB P2.1,BACK2;等待按键松开
- SJMP K2HANDLE;跳转处理子程序
- K2HANDLE:
- MOV A,PWMH
- CJNE A,#02H,K2H0 ;判断是否达到下边界
- SJMP KSCAN ;达到最小,无法减小,不做处理
- K2H0:
- MOV A,PWMH ;未到最小
- DEC A
- MOV PWMH,A ;
- SJMP KSCAN
- K3CHECK:
- LCALL DELAY
- JB P2.2,KSCAN ;延时去抖
- BACK3:
- JNB P2.2,BACK3;等待按键松开
- SJMP K3HANDLE;跳转处理子程序
- K3HANDLE:
- SETB IN1
- CLR IN2;电机正转
- SJMP KSCAN
- K4CHECK:
- LCALL DELAY
- JB P2.3,KSCAN ;延时去抖
- BACK4:
- JNB P2.3,BACK4;等待按键松开
- SJMP K4HANDLE;跳转处理子程序
- K4HANDLE:
- CLR IN1
- CLR IN2;电机反转
- SJMP KSCAN
- DELAY:
- PUSH PSW;
- MOV R6,#09FH;
- D1: MOV R7,#0F9H;
- D2: DJNZ R7,D2;
- DJNZ R6,D1;
- POP PSW;
- RET
- INTT0: ;定时器中断函数
- PUSH PSW
- PUSH ACC
- DJNZ COUNTER,INTT01 ;达到一个周期
- MOV COUNTER,#10
- INTT01:
- CLR C
- MOV A,COUNTER
- CJNE A,PWMH,INTT02 ;判断pwm条件,counter<pwmh,c=1
- INTT02:
- JC HLEVEL ;counter<pwmh
- CLR P1.0
- SJMP OUT
- HLEVEL:
- SETB P1.0
- OUT:
- POP ACC
- POP PSW
- RETI
- END;
复制代码
.dsn文件是Proteus7.5版本的仿真图,大家要用7.5才能打开哦,,asm是汇编代码,大家自行创建Keil工程然后添加进去
上图资料51hei附件下载:
PWM.rar
(10.74 KB, 下载次数: 45)
|