找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2324|回复: 1
打印 上一主题 下一主题
收起左侧

单片机PWM波驱动直流电机-汇编语言程序

[复制链接]
跳转到指定楼层
楼主
ID:301181 发表于 2018-7-22 09:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、P1.0 控制 A 端,B 端接 Vcc,利用定时器在 P1.0 口产生占空比固定(自定)的 PWM 波形来驱动直流电机
2、利用 KEY1 和 KEY2,两个按键来动态调整 PWM 的占空比,控制直流电机转速

/* 直流电机固定占空比 50%
ORG 0000H;  方波
LJMP START;
ORG 0100H;
START:CLR P1.0; 初始化频 P1.0=0
MOV TMOD,#00H; T0 工作于定时方式 0
MOV TH0,0FFH; 设置初值
MOV TL0,0D2H;
SETB TR0; 启动 T0 工作
BACK: JBC TF0,BACK1; 50us 到,转到 BACK1
SJMP BACK; 不到,继续查询
BACK1:NOP; 微调时间
CPL P1.0; 取反 P1.0
SJMP BACK;
END;

直流电机改变 PWM
PWMH DATA  30H ;高电平脉冲的个数
PWM  DATA  31H ;PWM 周期
COUNTER  DATA  32H ;计数器计数
TEMP DATA  33H ;暂存
ORG 0000H
LJMP MAIN
ORG  000BH
LJMP  INTT0
ORG  0100H
MAIN:
MOV  SP,#60H  ;给堆栈指针赋初值
MOV  PWMH,#02H  ;高电平脉冲数赋
初值
MOV  COUNTER,#01H ;计数器赋初值
MOV PWM,#15H  ;周期赋初值
MOV  TMOD,#00H  ;定时器 0 在模式
0 下工作
MOV  TL0,#0FFH ;定时器每200us产生一
次溢出
MOV  TH0,#0EFH ;自动重装的值
SETB  ET0 ;使能定时器 0 中断
SETB  EA ;使能总中断
SETB  TR0 ;开始计时
KSCAN:
JNB P1.1,K1CHECK  ;扫描 KEY1,
JNB P1.2,K2CHECK  ;扫描 KEY2,如果按下 KEY2,
跳转到 KEY2 处理程序
SJMP  KSCAN
K1CHECK:
LCALL DELAY
JB  P1.1,KSCAN ;延时去抖动
BACK0:
JNB P1.1,BACK0;确认是否闭合
;LCALL DELAY; 延时
;JNB P1.1,BACK0;
SJMP K1HANDLE;确认按下,转去处理程序
K1HANDLE:
MOV  A,PWMH
CJNE  A,PWM,K1H0 ;判断是否到达上边界
SJMP  KSCAN ;是,则不进行任何操作
K1H0:
MOV  A,PWMH
INC A
CJNE  A,PWM,K1H1 ;如果在加 1 后到达最大值
CLR TR0 ;定时器停止
SETB  P1.0 ;P1.0 为高电平
SJMP  K1H2
K1H1:
CJNE  A,#02H,K1H2 ;如果加 1 后到达下边界
SETB  TR0 ;重开定时器
K1H2:
INC PWMH ;增加占空比
SJMP  KSCAN
K2CHECK:
LCALL DELAY
JB  P1.2,KSCAN ;延时去抖动
BACK1:
JNB P1.2,BACK1;确认是否闭合
;LCALL DELAY; 延时
;JNB P1.2,BACK1; 按下,松开两个抖动
SJMP K2HANDLE;确认按下,转去处理程序
K2HANDLE:
MOV  A,PWMH
CJNE  A,#01H,K2H0 ;判断是否到达下边界
SJMP  KSCAN ;是,则不进行任何操作
K2H0:
MOV  A,PWMH
MOV  TEMP,PWM
DEC A
CJNE  A,#01H,K2H1 ;如果在减 1 后到达下边界
CLR TR0 ;定时器停止
CLR P1.0 ;P1.0 为低电平
SJMP  K2H2
K2H1:
DEC TEMP
CJNE  A,TEMP,K2H2 ;如果到达上边界
SETB  TR0 ;启动定时器
K2H2:
DEC PWMH ;降低占空比
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
INC COUNTER  ;计数值加 1
MOV  A,COUNTER
CJNE  A,PWMH,INTT01 ;如果等于高电平脉冲数
CLR P1.0 ;P1.0 变为低电平
INTT01:
CJNE  A,PWM,INTT02 ;如果等于周期数
MOV  COUNTER,#01H ;计数器复位
SETB  P1.0 ;P1.0 为高电平
INTT02:
POP ACC ;出栈
POP PSW
RETI
END;


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:301181 发表于 2018-7-22 09:21 | 只看该作者
经过实践确实可行,但是我用的单片机型号STC15F2K60S2
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表