PWM --真正的流水灯

发布者:BoldDreamer最新更新时间:2018-05-07 来源: eefocus关键字:PWM  流水灯 手机看文章 扫描二维码
随时随地手机看文章

很早以前,在某个论坛上就看到下面的题目:


用单片机的 I/O 口控制 8 个 LED,要求编写程序,实现下面的功能。

1.第 1、3、5、7 个灯半亮,其余的全亮。

2.第1个亮1/8、第2个亮2/8、第3个亮3/8、第4个亮4/8、第5个亮5/8、第6个亮6/8、第7个亮7/8、第8个全亮。

3.所有的灯逐渐从暗到全亮,再由全亮到暗。

4.8 个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环。


好像是用来搞竞赛的,只是没有看到像样的结果。


这些个要求,都是要使用 PWM 来解决。下面,做而论道依次写出程序,大家看看是否能够满足题目的要求。


------------------------------------------


1.第 1、3、5、7 个灯半亮,其余的全亮。


这就太简单了。就是要求 LED 如下显示:


PWM --真正的流水灯 - 非著名博主 - 电子信息角落


程序,都没有什么好编的,就是下面的几行就行。

;-----------------------------------------

    ORG   0000H

START:

    MOV   P0, #0

    XRL   P0, #55H     ;第 1、3、5、7 取反

    DJNZ  R7, $        ;延时

    SJMP  $ - 5        ;再去取反

END

;-----------------------------------------


------------------------------------------


2.第1个亮1/8、第2个亮2/8、第3个亮3/8、第4个亮4/8、第5个亮5/8、第6个亮6/8、第7个亮7/8、第8个全亮。


这个小题,要求 LED 的显示如下:


PWM --真正的流水灯 - 非著名博主 - 电子信息角落


程序的思路也不难,只要按照下面的形式,输出数据到接口就行了。


○○○○○○○○  全亮

○○○○○○○●  D0灭

○○○○○○●●    D1又灭了

○○○○○●●●

○○○○●●●●

○○○●●●●●

○○●●●●●●

○●●●●●●●  D6~D0都灭了


反复循环的输出上述 8 个数据,那么 D7 就永远是亮的,D6 有 7/8 的时间是亮的,... D0 只亮了 1/8 的时间。


程序如下:

;-----------------------------------------

    ORG   0000H


    JMP   START

    ORG   000BH

    JMP   T0_INT


    ORG   0030H

START:

    MOV   TH0, #220    ;1250us@11.0592MHz, T0定时方式0

    SETB  TR0

    MOV   IE, #82H


    MOV   30H, #00H    ;准备数据

    MOV   31H, #03H

    MOV   32H, #0FH    ;这些数据是交错存放的

    MOV   33H, #3FH    ;类似“隔行扫描”

    MOV   34H, #01H    ;显示起来就显得平滑、稳定

    MOV   35H, #07H

    MOV   36H, #1FH

    MOV   37H, #7FH

/*

○○○○○○○○

○○○○○○●●

○○○○●●●●

○○●●●●●●

○○○○○○○●

○○○○○●●●

○○○●●●●●

○●●●●●●●

*/

    MOV   R0, #30H     ;设定指针

    SJMP  $

;-----------------------------------------

T0_INT:                ;1.25ms中断一次

    MOV   TH0, #220    ;220: 1250us@11.0592MHz

    MOV   P0, @R0      ;输出一个数据

    INC   R0           ;修改指针

    CJNE  R0, #38H, $ + 5

    MOV   R0, #30H

    RETI

;-----------------------------------------

END

;-----------------------------------------


------------------------------------------


3.所有的灯逐渐从暗到全亮,再由全亮到暗。


这个就是呼吸灯,看看做而论道的前一篇博文吧,这里就不重复了。


------------------------------------------


4.8 个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环。


这个才是真正的流水灯。LED 显示的一部分截图如下:


PWM --真正的流水灯 - 非著名博主 - 电子信息角落


程序也不长,全部的代码,都在下面:

;-----------------------------------------

    ORG   0000H

    JMP   START

    ORG   000BH

    JMP   T0_INT

    ORG   0030H

START:

    MOV   TH0, #220    ;1250us@11.0592MHz, T0定时方式0

    SETB  TR0

    MOV   IE, #82H


    MOV   R2, #100

    MOV   R3, #0

    MOV   R4, #0


    SJMP  $            ;此处可以编写主程序

;-----------------------------------------

T0_INT:                ;1.25ms中断一次

    MOV   TH0, #220    ;220: 1250us@11.0592MHz

    DJNZ  R2, T0_2

    MOV   R2, #100

    INC   R3

    CJNE  R3, #33, T0_2

    MOV   R3, #0

T0_2: 

    MOV   A, R3        ;R3:0~32

    ADD   A, R4        ;R4:0~7

    ADD   A, #TAB - $ - 3

    MOVC  A, @A + PC

    MOV   P0, A

    INC   R4

    CJNE  R4, #08H, $ + 5

    MOV   R4, #0

    RETI               ;本程序用不上 15us

;-----------------------------------------

TAB: DB   255,255,255,255,255,255,255,255

    DB    127, 63, 31, 15,  7,  3,  1,  0

    DB      0,  0,  0,  0,  0,  0,  0,  0

    DB      0,  1,  3,  7, 15, 31, 63,127

    DB    255,255,255,255,255,255,255,255

;-----------------------------------------

END

;-----------------------------------------


这个小题,做而论道是用查表的方法解决的,程序相当的简短,而且还比较通用,改成别的花样也很容易。


也有另外的方法,毕竟 LED 变化还是有明显的规律的,所以也可以用计算的方法来解决。

有网友确实是这样弄的,可以参考:http://www.eehome.cn/read-htm-tid-5208.html

他这种编程的思路,编写起来就难多了,恐怕,几天也弄不出来。

------------------------------------------

上述各个程序,都在硬件系统中,通过了验证。图中的 8 个电容,做硬件试验时,就不用了。


关键字:PWM  流水灯 引用地址:PWM --真正的流水灯

上一篇:51 单片机扩充外部中断
下一篇:用 74HC595 把 LCD1602 改成串行数据接口

推荐阅读最新更新时间:2024-03-16 16:01

ATmega128(PWM—time 0)
//atmega128的定时器实现快速PWM输出示例程序,定时器0溢出中断的方式 //输出PWM波形驱动发光二极管,亮度由暗到灭,呈闪烁状态 //样值采取正弦波公式,示例如下 //正弦波采样值计算公式 // f(x)=128+127*sin(2*3.1415*x/127) x= //PWM输出也可通过控制LED发光来直观的看到效果,亮度持续的变化 //可以通过选跳线帽选择是通过LED直接查看还是通过滤波器查看实际波形 //编译环境 AVR Studio 4.17/AVR GCC //系统时钟7.3728MHZ,设置熔丝位为外部高频石英晶体振荡,启动时间4.1ms //***********************
[单片机]
直流电机驱动PWM频率
1、没有统一的标准,其实PWM的频率和你的电机感抗和你需要的速度响应时间有很大的关系。一般的电机用14K就足够了。当然自需要简单的调速可以随便选。 如果电机转速比较高,感抗比较小,可以使用比较高的频率。一般最好不要超过20K 因为一般IGBT最高20K的开关频率。 而MOS 的开关频率比较高,, 但是过高的F 需要专用的驱动电路,不然MOS工作在放大区的时间比较长。 如果电机转速比较低,感抗比较大, 而且又是在做伺服, 那开关频率就需要低一点。 2、对于电机应用,功率越大,PWM频率越低,最低有500Hz或者1KHz的,在兆瓦级的应用中。普通中小功率的,5K到20K常见,功率越低,电压等级越低,你所能使用的PWM频率越高。因为低
[单片机]
基于DSP的PWM型开关电源的设计
摘要:介绍了基于DSP的PWM型开关电源的原理及设计方法,以DSP芯片TMS320LF2407产生SPWM为例阐述了开关电源中PWM波形的实现方法。仿具结果表明,基于DSP的开关电源具有稳定快、失真小、负载对系统影响小的特点。 关键词:数字信号处理 脉宽调制 正弦脉宽调 目前,开关电源以具有小型、轻量和高效的特点而被广泛应用于以电子计算机为主异的各种终端设备和通信设备中,是当今电子信息产业飞速发展不可缺少的一种电源方式。与之相应,在微电子技术发展的带动下,DSP芯片的发展日新月异,功能日益强大,性价比不断上升,开发手段不断改进,其处理速度比CPU快10~15倍,因此基于DSP芯片的开关电源可以说是天作之保,拥有着广阔的前景,可
[嵌入式]
STM32的PWM产生主要工作
PWM信号的模式,主要做了如下工作 1.设定TIM信号周期,该周期就是PWM的周期,后期比较输出在占空比上会有变化 2.设定TIM预分频值,分频系数,计数模式 3.根据TIM_TimeBaseInitStrcut这个结构体里面的值初始化TIM 4.设定TIM的OC模式 5.TIM输出使能 6.设定电平跳变值 7.设定PWM信号的极性 8.使能TIM信号通道 9.使能TIM重载寄存器CCRX 10.使能TIM重载寄存器ARR 11.使能TIM计数器
[单片机]
花样流水灯的设计3(单片机-汇编)
;This program will show you cycle glitter between 8 led lamps ; maker:Chen Weiwu ; date:2012-11-08 ; version:1.0.0 ;------------------------------------------------------------- ;Define Ledprt equ p0 SegDisplay equ p2 Button equ p1 ;---------------------- ;Set the initiation address which the pro
[单片机]
基于PWM模式输出的TMP04型数字式温度传感器的测温系统
  1 引言   数字式温度 传感器 主要的输出模式有PWM、SPI、I2C、SMBus等,当今主流的单片机几乎都支持这种接口方式,文中以PWM输出模式为例,讨论了PIC单片机对于这种输出模式的测温方案。PWM模式输出的数字温度 传感器 如TMP03/04、TPM05/06等,都是将 传感器 件测得的温度信息数字化后,经过一定的输出编码,调制成占空比与温度成正比的数字脉冲信号单线输出。输出信号接入微处理器后,只需测得数字脉冲信号的占空比就可由软件运算得到相应的温度信息。而对于微处理器来说,输入信号占空比的计算方式多种多样以PCI系列单片机为例,在PIC16、PIC17、PIC18中均可由CCP模块的捕捉功能、RB端口电平变化中断
[单片机]
基于<font color='red'>PWM</font>模式输出的TMP04型数字式温度传感器的测温系统
STM32单片机(6) PWM输出实验
/******************************************************************************* * * 软件功能: PWM输出实验 * *******************************************************************************/ #include stm32f10x.h #include delay.h void RCC_Configuration(void); void GPIO_Configuration(void); void NVIC_
[单片机]
51单片机学习笔记1.流水灯实现与蜂鸣器
原理图(此次用到的部分) P2中的某个口为1(高电平)时,无电流流过,对应的二极管不会被点亮 代码 #include reg52.h void delay(unsigned int k) { int i,j; while(k--) { for(i = 1000;i 0;--i) for(j = 110;j 0;--j); } } void main() { unsigned char i = 0; P2 = ~0x01; while(1) { if(i==7) i=0; else i+=1; P2 = ~(0x01 i); delay(1); } } #include re
[单片机]
51单片机学习笔记1.<font color='red'>流水灯</font>实现与蜂鸣器
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved