找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 458|回复: 1
打印 上一主题 下一主题
收起左侧

Proteus 模拟呼吸灯

[复制链接]
跳转到指定楼层
楼主

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:342822 发表于 2023-12-23 23:48 | 只看该作者
; ledpwm.asm --- drive a blue LED with PWM                     21/04/2006
; Copyright (c) 2006 John Honniball

.include "m8def.inc"

            .org 0x0000

; 端口 B 位 2 上的LED
            .equ LED_PORT = PortB
            .equ LED_BIT = 2

; 该程序驱动连接到 AVR 的 I/O 端口的单个 LED。 它将 LED 的阴极连接到 AVR 引脚,
;LED 的阳极通过电阻器。 该电阻的值取决于 LED 的颜色,但通常为几百欧姆。
;我们通过脉宽调制 (PWM) 控制 LED 的亮度,
; 就像脉动那样地周期运动或变化 从未完全“熄灭昏暗状态”到全亮度再调至昏暗状态,然后再变回来。
;为此,设置最小亮度、最大亮度值。
            .equ MIN_BRIGHT = 15 ;最小亮度
            .equ MAX_BRIGHT = 255 ;最大亮度

; 此值控制 LED 从亮到暗的循环速度。 是的我们为亮度的每一步生成的PWM周期数
;坡道,上坡和坡道。 数字越大,脉动越慢。
            .equ N_CYCLES = 6                      ;周期数

; 重置后开始执行程序
            ldi r16,low(RAMEND)                     ; 初始化堆栈到RAM顶部
            out SPL,r16
            ldi r16,high(RAMEND)
            out SPH,r16

; 初始化硬件
            ldi r16,0xff                            ; 将端口B设置为所有输出
            out DDRB,r16

            sbi LED_PORT,LED_BIT                      ;通过将输出引脚设置为高电平关闭蓝色LED

; 从LED处于最低水平开始,然后上升到最大水平
dopwm:      ldi r17,MIN_BRIGHT                       ; R17保持当前亮度水平
adjust_1:         ldi r18,N_CYCLES                         ; R18计算PWM周期,从而计算脉动速度
adjust_2:         cbi LED_PORT,LED_BIT                      ; 输出引脚低,LED亮起
            mov r16,r17                             ;R16控制延迟长度(=R17)
            rcall delayn4us                         ;调用延迟子程序
            sbi LED_PORT,LED_BIT                      ; 输出引脚高,LED熄灭
            ldi r16,255
            sub r16,r17                             ; R16控制延迟长度(=255-R17)
            rcall delayn4us                         ; 调用延迟子程序
            dec r18                                 ;递减PWM周期计数器
            brne adjust_2
            inc r17                                 ; 亮度增加一步
            brne adjust_1

; 现在逐渐降低到最小亮度
            ldi r17,MAX_BRIGHT                       ;R17 保持当前亮度水平
adjust_3: ldi r18,N_CYCLES ;R18 计算 PWM 周期,从而计算脉动速度
adjust_4: cbi LED_PORT,LED_BIT ;输出引脚低电平,LED 亮起
            MOV R16,R17 ;R16 控制延迟长度 (= R17)
            rcall delayn4us ;呼叫延迟子例程
            sbi LED_PORT,LED_BIT ;输出引脚高电平,LED 熄灭
             ldi R16,255
            sub R16,R17 ;R16 控制延迟长度 (= 255 - R17)
            rcall delayn4us ;呼叫延迟子例程
            dec R18 ;递减PWM周期计数器
            brne adjust_4
             dec R17 ;亮度降低一级
            CPI r17,MIN_BRIGHT ;我们达到最低限度了吗?
            brne adjust_3

            rjmp dopwm                              ; 循环回到开始

; delayn 4US
;延迟 (R16 * 4) 微秒
delayn4us:  tst r16                                 ; R16 = 0?(无延迟)
            breq dly4
dly2:       ldi r24,low(16)
            ldi r25,high(16)
dly3:       sbiw r24,1                              ; 2 个周期
            brne dly3                               ; 2 个周期
            dec r16
            brne dly2
dly4:       ret                                     ;返回
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表