
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) 微秒 | 104 | 258 | 410 |
| 低电平 | (2+2(255-A)) 微秒 | 410 | 256 | 104 |
| 周期 | 约512微秒 | 514 | 514 | 514 |
| 频率 | ≈2kHz | 1.95kHz | 1.95kHz | 1.95kHz |
| 占空比 | A÷255 | 20% | 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带不动,必须加三极管和续流二极管。
四、日期修改
资料中提供修改日期的小工具,购买资料赠送修改文件创建日期的小工具,三个下载地址都在文章最后。
五、资料下载
付费后获取下载链接,直接下载到电脑上,然后解压即可!每个链接前面都配了二维码,手机扫码可以直接跳转。
/

