PWM技术实现灯光的无极调节(代码+详细注释)

这篇博客主要介绍如何使用51单片机通过PWM技术实现灯光亮度的无级调节。博主分享了一段包含详细注释的代码,该代码经过修改,适合初学者理解。虽然博主对汇编不熟悉,但已亲测代码有效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

课程设计,我只放代码,代码借鉴网上某位师兄的,其中有些错误,做了修改,并自己写了很多注释,适合小白阅读。不熟悉汇编,可能有纰漏,不过代码亲测可用,在学校机房试过了。注释只供借鉴,请禁止抄袭,代码请随便用。为51单片机的

DIRLOP  EQU     38H                //显示字节数
DISP0   EQU     39H                //串行显示寄存器0
DISP1   EQU     3AH                //串行显示寄存器1
DISP2   EQU     3BH                //串行显示寄存器2
LDAN    EQU     58H                //电灯亮度档值
T2H     EQU     59H                //T1高8位定时值存储器
T2D     EQU     5AH                //T1低8位定时值存储器
LAMP    EQU     P1.2               //电灯控制位

ORG 0000H
; 复位
; ORG 是汇编的伪指令 告诉编译器我的代码放在什么位置
; 在单片机复位的时候 在你没有做任何改变的时候 程序指针会是指向00000H的地址
; 所以我们把 START 卸载地址00H 让单片机复位后直接跳转到 START的程序段去执行
AJMP START
ORG 000BH
; 000BH是定时器T0中断源入口地址
LJMP TIME1                         //T0中断程序(产生PWM基频)

ORG 001BH
; 001BH是定时器T1中断源入口地址
LJMP TIME2                         //T1中断程序(控制脉冲宽度)
ORG 0030H
; ORG 30H 是你程序的代码开始地址,由于30H以前有中断向量入口和寄存器的地址,所以一般用户程序都是从30H开始的。
START:SETB LAMP                    //程序初始化
      MOV A,#0
      MOV LDAN,A
      MOV DISP0,A
      MOV DISP1,A
      MOV DISP2,A
    ;   将电灯亮度档值、串行显示寄存器0、1、2的初始值都设置为0
      MOV TMOD,#11H                //设定两定时器为16位定时器
    ;   11H --> 0001 0001 TMOD,设置两个定时器,
    ; GATE为0,表示“或门”输出恒为1,“与门”的输出信号K由TRx决定(即此时K=TRx),定时器不受INTx输入电平的影响,由TRx直接控制定时器的启动和停止。
    ; C/T为0,为定时功能
    ; M1 M0 --> 0 1 ,为方式1,16位定时器/计数器
      MOV IE,#10001010B            //开启两定时器的中断请求
    ;   51单片机中断允许寄存器IE
    ; 设置为1,为开,设置为0,为关;
    ; D7:全局中断位,1,开;        1
    ; D6:无效位;                  0
    ; D5:定时/计数2(52单片机)    0
    ; D4:串行口中断,0,关         0
    ; D3:定时/计数1,1,开         1
    ; D2:外部中断1,0,关      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值