A34基于51单片机汇编语言直流电机调速Proteus设计
作者:单片机仿真   类别:51单片机仿真    日期:2026-10-23 09:01:58    阅读:8 次   消耗积分:10 分

image.png

A34基于51单片机汇编语言直流电机调速Proteus设计

用51单片机汇编语言做直流电机调速:ADC0809把电位器的位置变成0~255的数字量,程序用这个数当PWM的高电平时间,一个引脚输出占空比可调的方波,经三极管驱动直流电机。拧电位器就是调速,全程软件PWM,不用任何PWM外设。

一、设计实现功能

本设计功能简介:使用51单片机和汇编语言设计一个直流电机调速(ADC+PWM)的proteus仿真,要求以下功能:

1、使用汇编语言编写程序。

2、ADC0809采集IN0的模拟电压,得到0~255的8位数字量。

3、用该数字量控制P3.7输出PWM的占空比,占空比随电位器线性变化。

4、PWM经三极管驱动直流电机,实现无级调速。

二、资源汇总

1、仿真文件:Proteus工程,7.8和8.6两个版本都能直接打开。

2、程序文件:main.asm汇编源码,以及编译好的cx.hex。

3、修改日期小工具:购买资料后赠送,用于修改文件创建日期,下载地址在文章最后。

三、设计介绍

拿到压缩包之后先解压,没有解压软件的直接搜"压缩",下载解压软件后先解压文件,再运行仿真和程序。

图1 Proteus仿真总览

仿真原理图

程序骨架和A31、A42是同一套ADC读取框架:T0方式2给ADC0809供时钟,ST脉冲启动,EOC查询结束,OE打开输出,P1读回结果。区别在读完之后的处理——这里不是显示,而是拿这个数去控制一个引脚的高低电平时间比例:

`asm
WAIT: CLR ST
SETB ST
CLR ST ;启动转换
JNB EOC,$
SETB OE
MOV ADC,P1
CLR OE
SETB PWM ;PWM拉高,开始高电平段
MOV A,ADC
LCALL DELAY ;高电平持续 ADC 个单位
CLR PWM ;拉低,开始低电平段
MOV A,#255
SUBB A,ADC ;低电平持续 255-ADC 个单位
LCALL DELAY
SJMP WAIT
`

关键在那段延时子程序,它用累加器本身当循环次数,这是这个程序最巧的一笔:

`asm
DELAY: MOV R6,#1
D1: DJNZ R6,D1 ;2个机器周期
DJNZ ACC,D1 ;A减到0为止,每次2个机器周期
RET
`

进来时A是多少,这段就循环多少次,延时时间正比于A。所以:

参数表达式数值(12MHz)
高电平时间(2 + 2×A) 微秒A=128时约258微秒
低电平时间(2 + 2×(255-A)) 微秒A=128时约256微秒
PWM周期约512微秒频率约2kHz
占空比A ÷ 255A=64时25%,A=192时75%

2kHz的频率对直流电机刚好:高于人耳听觉下限、低于三极管的开关损耗区,电机转起来听不到啸叫,转速也稳。占空比从0到100%连续可调,电机就从停转到全速。

仿真里P3.7不能直接带电机,中间要过一个NPN三极管(基极串1k电阻),电机接在VCC和集电极之间,再反并一个续流二极管——电机是感性负载,断电瞬间会产生反峰压,没有二极管三极管容易被击穿。

特别注意: MOV A,#255后面的SUBB A,ADC是带借位减法,本程序靠"从头到尾没有指令动CY"才一直正确,如果你在这中间加了ADD、RLC之类的指令,占空比会突然跳到100%——严谨写法是SUBB前面补一句CLR C;电机不转但引脚有波形,检查三极管方向和基极电阻,P3.7直接接电机是带不动的;电机只嗡嗡响不转,是PWM频率太低(延时单位太大),或者占空比没上去,先用示波器看P3.7的波形;调速范围只有两头有反应,是电位器线性度问题,仿真里换个线性电位器;ADC读数跳动导致转速不稳,可以在程序里对连续几次采样求平均再输出。

四、日期修改

资料中提供修改日期的小工具,购买资料赠送修改文件创建日期的小工具,三个下载地址都在文章最后。

五、资料下载

付费后获取下载链接,直接下载到电脑上,然后解压即可!每个链接前面都配了二维码,手机扫码可以直接跳转。

/

版权所有,转载本站文章请注明出处:proteus单片机
上一篇:A33基于51单片机汇编语言步进电机控制Proteus设计
下一篇:A35基于51单片机汇编语言六位密码锁Proteus设计
${comment['nickname']}   ${comment['createtime']}
  
       
${comment.content}
${reply.nickname} 回复 ${comment.nickname}    ${reply.createtime}
     
  
回复内容:${reply.content}