资源描述
一、设计题目:直流电机调速
二、设计思路
1. 问题的提出
能否以单片机现有资源模拟调整直流电动机的转速。
2. 分析问题的功能
(1) .在P1.0引脚输出低频脉宽调制信号(PWM),PWM信号的脉冲占空比(脉 动电压的高电平时间占周期比)可以通过和P1 连接的按键设定,从而调整直 流电动机的转速。
(2) .软件设计:按问题功能分模块,简述各模块功能。
根据实际构思程序分为两个模块
模块1为通过计数来控制对P1.0的置1和清0;
模块2为根据按键设置改变输出脉冲的占空比。
三、详细设计:
1. 硬件详细设计:
(1).电路图:
JK6I
JK17I ©Mu-
GND
(2).进行硬件资源分配
P1.0连ZDJ-A,输出PWM波,实现电动机调速;
P1.1连KEY1,增加占空比,使电机加速;
P1.2连KEY2,减小占空比,使电机减速;
P3.0连蜂鸣器,当加速到最大值或减速到最小值蜂鸣器会报警;
INT0连KEY3,使直流电机停机。
2. 软件详细设计:
(1)地址模块
设定主程序和中断服务程序初始地址
ORG 80H
AJMP MAIN
ORG83H
AJMPSTOP
ORG 8BH
AJMP INTT0
ORG 81H
(2)主程序准备模块
为定时器、堆栈栈底地址、软件计数值、赋初值,选择定时器2工作方
式,允许定时器0、外部中断,打开总中断、定时器0中断和外部中断。
MAIN:
MOV
SP,#60H
;给堆栈指针赋初值
MOV
PWMH,#03H
;给定初始高电平脉冲个数
MOV
COUNTER,#01H
MOV
PWM,#0AH
MOV
TMOD,#02H
;定时器0在模式2下工作
MOV
TL0,#48H
;定时器每2us产生一次溢出
MOV
TH0,#48H
;自动重装的值
SETB
ET0
;使能定时器0中断
SETB
EA
;使能总中断
SETB
PX0
;使外部中断0为最高优先中断
SETB
TR0
;开始计时
(3)定时器中断模块
实现方法:使用定时器产生定时每2us产生一次溢出中断,在中断服务中
通过计数来控制对P1.0的置1和清0,
输出PWM波。
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
(4)调速模块
实现方法:在程序执行过程中,读取按键设置,根据按键设置改变输出脉 冲的占空比,按KEY1时可以加速,按KEY2时可以减速。
KSCAN:
JNB P1.1,K1CHECK;扫描 KEY1,
JNB P1.2,K2CHECK;扫描 KEY2,如果按下 KEY2,跳转到 KEY2
处理程序
SJMP KSCAN
K1CHECK:
JB P1.1,K1HANDLE;去抖动,如果按下KEY1,跳转到KEY1处理
程序
SJMP K1CHECK
K1HANDLE:
MOV A,PWMH
CJNE A,PWM,K1H0
;判断是否到达上边界
SJMP MAIN
;返回到主程序
K1H0:
MOV A,PWMH
INC A
CJNE A,PWM,K1H1
;如果在加1后到达最大值
CLR TR0
;定时器停止
SETB P1.0
SJMP K1H2
;P1.0为高电平
K1H1:
CJNE A,#02H,K1H2
;如果加1后到达下边界
SETB TR0
;重开定时器
K1H2:
INCPWMH
SJMP KSCAN
;增加占空比
K2CHECK:
JBP1.2,K2HANDLE
;去抖动,如果按下KEY2,跳转到KEY2处理
程序
SJMP K2CHECK
K2HANDLE:
MOVA,PWMH
CJNEA,#01H,K2H0;判断是否到达下边界
SJMPMAIN
;返回到主程序
K2H0:
MOV A,PWMH
MOV TEMP,PWM
DEC A
CJNE A,#01H,K2H1
;如果在减1后到达下边界
CLR TR0
;定时器停止
CLR P1.0
SJMP K2H2
;P1.0为低电平
K2H1:
DEC TEMP
CJNE A,TEMP,K2H2
;如果到达上边界
SETB TR0
;启动定时器
K2H2:
DEC PWMH
SJMP KSCAN
;降低占空比
(5)报警模块
<1> CJNE A,PWM,K1H0
;判断是否到达最大速度
MOV R7,#
LOOP: MOV R6,#80
DJNZ R6,$
CPL P3.0
DJNZ R7,LOOP
<2> CJNE A,#01H,K2H0
MOVR5,#
LOOP1:MOV R4,#80
DJNZR4,$
CPL P3.0
DJNZ R5,LOOP1
(6 )停机模块
STOP:
MOV PWMH,#01H
MOV COUNTER,#0
RETI
END
;是,则蜂鸣器响
;判断是否到达最小速度
;是,则蜂鸣器响
3.设计中的主要困难及解决方案
(1)困难1:直流电机转速的调节
解决方案:调整其脉冲占空比改变其正脉冲长度进而调节器转速。
(2)困难2:电机转速的精确分档和调节
解决方案:通过对占空比的精确分档,使电机转速按按键分档执行,达到电 机转速的分档及精确调节,使电机的调速过程平滑进行,并用指示灯显示速度 极限。
(3)困难3:外部中断
解决方案:设计外部中断按钮和外部中断程序
四、程序清单
PWMH
PWM COUNTER TEMP
ORG
AJMP ORG AJMP
DATA 30H
DATA 31H
DATA 32H
DATA 33H
80H
MAIN
83H
STOP
;高电平脉冲的个数
;PWM周期
ORG 8BH
AJMP INTT0
ORG 81H
MAIN:
MOV SP,#60H
;给堆栈指针赋初值
MOVPWMH,#03H
MOVCOUNTER,#01H
MOVPWM,#0AH
;给定初始高电平脉冲个数
MOV TMOD,#02H
;定时器0在模式2下工作
MOV TL0,#48H
;定时器每2us产生一次溢出
MOV TH0,#48H
;自动重装的值
SETB ET0
;使能定时器0中断
SETB EA
;使能总中断
SETBPX0
;使外部中断0为最高优先中断
SETB TR0
;开始计时
KSCAN:
JNBP1.1,K1CHECK ;扫描 KEY1,
JNBP1.2,K2CHECK ;扫描KEY2,如果按下KEY2,跳转到KEY2处理
程序
SJMP KSCAN
K1CHECK:
JBP1.1,K1HANDLE
SJMP K1CHECK
K1HANDLE:
MOV A,PWMH
;去抖动,如果按下KEY1,跳转到KEY1处理程序
CJNE A,PWM,K1H0
MOV R7,#
LOOP: MOV R6,#80
DJNZ R6,$
CPL P3.0
;判断是否到达上边界
DJNZ R7,LOOP
;是,则蜂鸣器响
SJMP MAIN
;返回到主程序
K1H0:
MOV A,PWMH
INCA
CJNE A,PWM,K1H1
;如果在加1后到达最大值
CLR TR0
;定时器停止
SETB P1.0
SJMP K1H2
;P1.0为高电平
K1H1:
CJNE A,#02H,K1H2
;如果加1后到达下边界
SETB
TR0
;重开定时器
K1H2:
INC
PWMH
;增加占空比
SJMP
KSCAN
K2CHECK:
JB
P1.2,K2HANDLE
;去抖动,如果按下KEY2,跳转到KEY2
SJMP
K2CHECK
K2HANDLE:
MOV
A,PWMH
CJNE
A,#01H,K2H0
;判断是否到达下边界
MOVR5,#
LOOP1:
MOV R4,#80
DJNZ R4,$
CPL P3.0
DJNZ R5,LOOP1 ;是,则蜂鸣器响
SJMP
MAIN
;返回到主程序
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
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
处理程序
STOP:
MOV PWMH,#01H
MOV COUNTER,#0
RETI
END
五.心、得体会
通过一周的单片机设计实习,使我学到了更多了单片机硬件和软件知识,帮 助我提高了动手能力、综合运用能力、实践能力和创新能力。虽然在设计过程中 遇到了许多困难,但通过老师和同学的帮助,以及自己的摸索,我弄懂了单片机 的知识,我做的程序也已经调试成功了,我很高兴经过这次设计,自己的各方面 能力均得到了提高,相信在以后的学习工作中,遇到类似的问题,一定能够更加 完善的解决。
展开阅读全文