A42基于51单片机汇编语言PWM占空比输出Proteus设计
作者:单片机仿真   类别:51单片机仿真    日期:2026-10-23 09:02:41    阅读:10 次   消耗积分:10 分

image.png

A42基于51单片机汇编语言PWM占空比输出Proteus设计

用51单片机汇编语言做一个"ADC控制PWM"的实验:电位器转多少,P3.7输出的方波占空比就跟着变,0%到100%连续可调,周期固定约512微秒。用示波器能看到脉宽随电位器伸缩,接LED能看到亮度渐变,接电机就是调速。

一、设计实现功能

本设计功能简介:使用51单片机和汇编语言设计一个ADC采集控制PWM占空比的proteus仿真,要求以下功能:

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

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

3、该数字量直接作为PWM高电平时间,占空比 = AD值 ÷ 255。

4、P3.7输出频率约2kHz、占空比可调的方波。

二、资源汇总

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

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

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

三、设计介绍

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

图1 Proteus仿真总览

仿真原理图

主循环一共六句,读一次AD就更新一次占空比:

`asm
WAIT: CLR ST
SETB ST
CLR ST ;启动AD转换
JNB EOC,$ ;等转换结束
SETB OE
MOV ADC,P1 ;读回8位结果
CLR OE
SETB PWM ;高电平段开始
MOV A,ADC
LCALL DELAY
CLR PWM ;低电平段开始
MOV A,#255
SUBB A,ADC
LCALL DELAY
SJMP WAIT
`

延时子程序用累加器当计数器,进来多少就循环多少次,这是"一个子程序同时干高电平延时和低电平延时"的关键:

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

于是脉宽和周期的关系可以精确算出来:

项目公式A=51(20%)A=128(50%)A=204(80%)
高电平(2+2A) 微秒104258410
低电平(2+2(255-A)) 微秒410256104
周期约512微秒514514514
频率≈2kHz1.95kHz1.95kHz1.95kHz
占空比A÷25520%50.2%80%

占空比和AD值严格线性,所以电位器转一半,示波器上的方波就是标准方波;转到最左,P3.7几乎一直是低;转到最右,几乎一直是高。

调试这个程序最直观的办法是挂示波器:Proteus里放一个OSCILLOSCOPE,A通道接P3.7,时间轴打到200微秒/格,一个周期占两格半左右。拧电位器,脉宽肉眼可见地变宽变窄,这就是占空比。

不想挂示波器也行,把P3.7接一个LED串330欧电阻到地:占空比20%时灯偏暗,80%时接近全亮,中间是渐变的。因为PWM频率2kHz远高于人眼视觉暂留,看到的是平均亮度,不会闪。

这套代码和A34直流电机调速是同一个程序,区别只在负载和观察点:A34把P3.7经三极管接电机,看的是转速;本设计看的是波形和占空比本身。两个工程可以互相替换验证。

特别注意: 示波器上看不到波形,先确认P3.7真的在翻转——SETB PWM和CLR PWM之间如果A=0,高电平段几乎没有宽度,看起来就像一条低电平直线;占空比始终100%,是SUBB A,ADC没执行到,或者CY被前面的指令置了1(带借位减法前应CLR C);亮度有轻微抖动,是AD末位跳变,属于正常现象,要稳就做4次采样取平均;频率不是2kHz,检查晶振和DELAY里的MOV R6,#1有没有被改;驱动电机时电机不转,P3.7带不动,必须加三极管和续流二极管。

四、日期修改

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

五、资料下载

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

/

版权所有,转载本站文章请注明出处:proteus单片机
上一篇:A41基于51单片机汇编语言汽车转向灯Proteus设计
下一篇:A36基于51单片机汇编语言六位数码管时钟Proteus设计
${comment['nickname']}   ${comment['createtime']}
  
       
${comment.content}
${reply.nickname} 回复 ${comment.nickname}    ${reply.createtime}
     
  
回复内容:${reply.content}