5.1 视觉实验 LED流水灯
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目
录
引
言 单个灯闪烁
LED流水灯 户外广告灯
流水灯现象分析
人们时常看到户外动画广告,一会儿从左到右地显示,一会儿又从右到左地显
示,这就是流水灯效果,其特征是将想要显示的画面切割成N份,且每次只让其中
的一个画面显示,让肉眼能够看得清楚。 一个简单的例子:
视觉暂留效应
0.2秒
0.2秒
这个动画就是由右边四个图形每个图 形显示0.2s,循环显示制作而成的。 如果在中间再多加几个中间显示的图 形,并缩短每个图形的显示时间可以使 动画更流畅。
MOV Delay: DJNZ
R7, #0xFF R7, Delay .
No
;1个机器周期 ;2个机器周期 (*) (R7-1)=0?
标号
$表示指令自身的存储地址
R7初值0xFF,
Yes 单片机的时钟晶振为11.0592MHz DJNZ R7, $ 根据汇编语言编译规则约定的正确书写格式 它将循环255次 它的延时时间为:
SJMP
Start
CLR
MOV MOV Delay1: MOV
P1.0
R6, #0x0 R6, #0x0 R7, #0x0 R7, .
Delay:
DJNZ
MOV
R7, #0x0
;1个机器周期 ;2个机器周期
;返回Start,循环执行程序 ;2个机器周期
DJNZ DJNZ
SJMP DJNZ
R7, $ R6, Delay1
(R7-1)=0?
Y
MOV Delay: MOV DJNZ DJNZ
R6, #0x0 R7, #0x0 R7, . R6, Delay
;1个机器周期
;1个机器周期 N (R6-1)=0? ;2个机器周期 下一步:把延时 ;2个机器周期 Y 程序插入程序
单个LED闪烁范例2——程序代码
编程思路2:对P1.0进行置1、延时、清0、延时的反复操作,使LED闪烁。 实现现象: 人眼能观察到LED的闪烁现象。
地址 .AREA HOME(ABS, CODE) 操作码与操作数 助记符
0000 0000 .ORG 0x0000 1011 0010 CPL P1.0
注释
;LED状态取反
0000 0001 SETB 0000 1001 P1.0 CPL ;LED状态取反 Start: ;P1.0=1,点亮LED 该程序巧妙地利用了位操作的“非逻 0000 0010 MOV 1110 #0x0 0111 R6, MOV R6, #0x0 ;延时143ms ;延时143ms 辑”指令,使延时程序的利用率达到 0000 0011 MOV 0000 #0x0 0000 R7, Delay: 了最大,比较一下这两段程序的篇幅, 0000 0100 DJNZ 1111 $ MOV R7,#0x00 0111 R7, 就可以看出程序的思路以及对指令的 0000 0101 DJNZ 0000 Delay 0000 R6, 熟练掌握是多么地重要。 0000 0110 CLR 1101 1111 DJNZ R7, . ;R7≠0,返回指令本身 P1.0 ;P1.0=0,熄灭LED 0000 0111 MOV 1110 #0x0 1111 R6, 0000 1000 MOV 1110 #0x0 1101 R7, DJNZ R6, 0x0004 Delay1: ;延时143ms ;R7≠0,返回地址0x0004 ;程序跳转到0x0000,循环执行程序 ;返回Start,循环执行程序
注释 ;复位向量,程序起始地址 ;P1.0口置1,点亮LED
Байду номын сангаас
.org命令在HOME程序中进 SDCC51编译器仅支持0x0000 0000 0001 1001 0000 行绝对定位,定位复位向量 格式,不支持0000H。
0000 0010 1100 0010 Start: SETB P1.0 0000 0011 1001 0000 0000 0100CLR 1000 P1.0 0000
上升沿:数字电平由0变为1 的那一瞬间,用“↑”表示
286ms
下降沿:数字电平由1变为0 的那一瞬间,用“↓”表示
143ms 用软件来产生“↑”上升沿的代码: CLR NOP SETB P1.0 P1.0
NOP:一条只有一个机 器周期的空操作指令
;产生“那一瞬间”的延时 ;瞬间延时时间
关键知识点
机器周期的频率为(11.0592 ÷12)MHz DJNZ R7, .
一个机器周期耗时为:12 ÷ 11.0592MHz = 1.085µs
511 ×1.085µ s
= 0.5545ms SDCC51不支持$,用句点来代替,否则编译错误
单个LED闪烁范例2——延时程序编写
所谓停顿,就是站在那里不动,但单片机并不会停滞不前,它会一直 解决方法:在程序的外面再套上一层延时循环,以增加时间长度。 以微秒级的速度狂奔。我们并不要求单片机停止运行,而仅仅是让P1.0口 的输出信号维持一段时间即可。
尽管上面的练习很简单,但必须认真实践,搞清楚每一行代 码的来龙去脉。看懂了!仅仅代表你“暂时记住”了而已,但很
快就会忘记。当你将调试中出现的所有“问题(bug)”都找到时,
才会体会更深。无数成功者的经验表明:过程比结果更重要! “延时时间”的计算以及“上升沿与下降沿”是本节至关重 要的知识点。其次,必须学会查阅相关的资料,了解单片机I/O口 和非门集成电路驱动电流的大小,LED的导通电压与回路电流以 及限流电阻的计算。
0.557ms对人眼 来说仍然太快 MOV Delay: DJNZ #0x0 R7, #0xFF R7, . ;1个机器周期 ;2个机器周期 (*)
编程技巧:给R7赋值0xFF并不是最大的延时参数,其最大延时参数 应该是0。对计算机而言,0减1的结果是0xFF,因此用0做延时参数可循环 256次,其延时时间为(1 +2 ×256) × 1.085µs = 556.605µs ≈ 0.557ms。
;执行延时Delay实体代码 ;执行延时Delay实体代码
单个LED闪烁范例2——延时程序编写
所谓停顿,就是站在那里不动,但单片机并不会停滞不前,它会一直 以微秒级的速度狂奔。我们并不要求单片机停止运行,而仅仅是让P1.0口 的输出信号维持一段时间即可。
将立即数0xFF传送到R7中 这段程序共占用机器周期: 1 + 2 ×255 = 511
5.1 视觉实验:LED流水灯
目
录
引
言 单个灯闪烁
LED流水灯 户外广告灯
引
言
小实验:
① 注视右图中心四个黑点15秒 —
30秒钟;
② 然后朝自己身边的墙壁看(白色的 墙或白色的背景)或者看此页面的
白色部分;
③ 看的同时快速眨几下眼睛,看看 您能看到什么?
视觉暂留现象
视觉暂留
物体在快速运动时,当人眼所看到的影象消失后,人眼仍能继续保持 其影象0.1~0.4秒左右的图象,这种现象被称为视觉暂留现象。
单个LED闪烁范例2——编程思路
编程思路2:对P1.0进行置1、延时、清0、延时的反复操作,使LED闪烁。
.AREA HOME(ABS, CODE) .ORG 0x0000 ;复位向量,程序起始地址
Start:
SETB CLR SJMP
P1.0 P1.0 Start
;P1.0=1,点亮LED ;P1.0=0,熄灭LED ;返回Start重复执行
电影 户外动画广告
电视
目
录
引
言 单个灯闪烁
LED流水灯 户外广告灯
LED驱动电路工作原理
编程思路1:对P1.0进行反复置1、清0操作,以实现引脚上的LED闪烁。
74HC04非门 与单片机的P1口 相连
1 0
1 0 1 0
P1.0 = 1 P1.0 = 0 P1 = 0XFF 0X00
00 11
1 0 1 0 1 0 1 0 1 0 1 0 1 0
MOV R6, #0x0 ;执行延时Delay实体代码
;延时143ms
CLR MOV
DJNZ
P1.0 R7, #0x0
R6, Delay
;P1.0=0,熄灭LED
;返回Start重复执行
能否使程序变 得简单一些 ;P1.0=0,熄灭LED
;延时143ms ;1个机器周期
;执行延时Delay实体代码 DJNZ R7, .
0000 1001 DJNZ 1010 $ 1111 R7,
0000 1010 DJNZ 0000 Delay1 1000 R6, SJMP 0x0000 0000 1010 SJMP 0100 1111 Start
上升沿与下降沿
LED点亮的过程就是在I/O口上产生了高电平“1”,并持续延时 143ms;LED熄灭就是在I/O上产生了低电平“0”,并持续延时143ms。 如此周而复始,LED既闪烁。
CLR
P1.0
;P1.0口清0,熄灭LED ;P1.0=1,点亮LED
SJMP 0x0000 ;P1.0=0,熄灭LED ;跳转到程序头,重复执行 ;返回Start重复执行
0000 0101SJMP 1010 1111 Start
“Start”为程序的标号。在二进制层面,标号的值就是存储器的地址,而标号又 机器语言 汇编语言 每一个汇编程序必须要有一个以HOME命名的段,否则编译时会出现警告。 是引用存储器的值的别名,因此在语言层面 标号的值就是程序的地址。
1 0
1 0 1 0
1 0
1 0
单个LED闪烁范例1——程序代码
编程思路1:对P1.0进行反复置1、清0操作,以实现引脚上的LED闪烁。 实验现象: LED不闪烁,不太亮又有点亮。 .AREA命令定义了一个 以句点开头的命
绝对定位段——HOME 令为汇编命令
.AREA HOME(ABS,助记符 CODE) 操作码与操作数 0000 0000.ORG 0x0000 1101 0010 SETB P1.0 地址
0.2秒
0.2秒
LED流水灯范例1——现象实现
观察分析:LED从右向左移动的过程中,每次只点亮一个LED,即数据0x01、 编程思路1:将0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80依次送往单片
0x02、0x04、0x08、0x10、0x20、0x40、0x80中的“1”是一个不断地 机P1口,即将“MOV direct, #data”指令使用8次,并加上合适的延时
Delay: =DJNZ R7, .143ms 143047ms ≈
第3级延时时间又是第2级延时的256倍,即:
;2个机器周期 (*)
给R7赋初值0
143ms × 256=36608ms ≈36.6s 如果延时还不够,可以再加第三级延时, 如果再给程序加上2级延时,则它的最大延时时间将超过3个星期。 这样就需要再增加一个工作寄存器。 N
单个LED闪烁范例1——问题分析
编程思路1:对P1.0进行反复置1、清0操作,以实现引脚上的LED闪烁。 实验现象: LED不闪烁,不太亮又有点亮。 问题解决: 在置1/清0操作之后,增加零点几秒或几秒的延时。
计算机指令的执行速度非常快,其执行时间是微秒级的
人眼的反应时间:毫秒级
因此,如果要让人眼看到LED闪烁,我们必须将 LED点亮和熄灭的停顿时间扩大接近秒的级别
单个LED闪烁范例2——延时程序编写
解决方法:在程序的外面再套上一层延时循环,以增加时间长度。 进行简单估算: 它的延时时间为:
流程图:
对于闪烁现象的观察,143ms 是一个比较理想的参数
给R6赋初值0 如果第一级延时时间为0.557ms,则第2级最大延时是它的256倍,即: MOV R7, #0x0 ;1个机器周期 (1+(1+2×256+2)×256) ×1.085µs 0.557ms ×256 =142.592ms ≈ 143ms
Start R6, Delay
单个LED闪烁范例3——程序代码 单个LED闪烁范例2——程序代码
编程思路2:对P1.0进行置1、延时、清0、延时的反复操作,使LED闪烁。 编程思路3:程序优化,用CPL P1.0替代SETB P1.0和CLR P1.0。 实现现象: 人眼能观察到LED的闪烁现象。
.AREA .AREA .ORG .ORG Start: Start: Delay: SETB SETB HOME(ABS, CODE) HOME(ABS, CODE) 0x0000 0x0000 P1.0 P1.0 这两条程序实现的功能 ;复位向量,程序起始地址 等价于CPL P1.0 ;P1.0=1,点亮LED ;P1.0=1,点亮LED 两者的作用和功能一样,却 占用2个程序空间