#1楼主:[转帖] 出个题目,别以为流水灯实验简单!想挑战的请进!
文章发表于:2007-12-13 02:41
这个是在51c51上看到的,觉得不错,转帖过来看看谁有兴趣做,我准备下周下一下看看,呵呵
原帖网址: http://www.51c51.com/bbs/dispbbs.asp?boardID=6&ID=21466&page=1
这个题目由热心会员daron同学提出, 很有新意! 特别设立一个奖项, 对于第一个全部做出的朋友,请把源程序发到斑竹信箱sxj1974@163.com 本站奖励ep51编程器全套散件一套。
要求:1,程序必须调试通过!2 有注释。3 汇编,c不限,4先到先得!
单片机初学者几乎都做的一个实验就是流水灯实验,因为大家都做,所以就觉得很简单,很多人对这个实验几乎不屑。其实要彻底的玩转这个实验也是很不简单的事情,不信看看你能不能应付我下面的实验题:
硬件前提:用51的P1口控制8个LED,1 点亮,0 熄灭。
(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个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环往复。这才是真正的流水灯。
^_^,反响还挺好的!
昨天才上传的东东,没想到大家的反响还挺好的。在这里首先要谢谢斑竹了。
首先解释一下,这个题目呢实际中是常用到的。最早我在念书的时候做过,不过当时也是菜鸟一个,怎么也没搞明白是怎么一回事。后来工作后,有个客户要做LED七彩显示的灯,他要求搞各种各样乱七八糟的花样,其中就有这个个渐亮渐灭的功能,我就帮他写了一下,做好之后发现,如果灯用各种颜色的来显示,那效果是相当的漂亮的。当时我用的是Sonix的一款单片机写的,没办法,人家说51太贵了,一片要5、6块钱,Sonix的才1块3左右,我就花了半个月时间把人家的仿真器来过来做了这个项目。(现在最便宜的单片机据说台湾有个十速的,一片才8、9毛钱,不知是真是假)
做这个题目,首先要理一下思路,单片机是只能输出数字信号的,没有半高不低的电平的,所以应采用脉宽调制的办法来实现,即PWM控制。PWM即固定周期,改变占空比,英文叫做:Pulse width modulate。
其次,大家可以做一下实验。输入下面的一段程序:
ORG 000H
Ajmp Main
ORG 0030H
Main: Mov SP,#07H ;Init system stack
Clr P1.0
MainLp: CPL P1.0
Sjmp MainLp
END
问题是,用万用表的直流电压档测量P1.0口的电平,会显示多少?
答案是2.5V左右,因为P1.0口输出的是高低各一半的脉冲,在频率够高的情况下,万用表直流档测出的应当是平均的电压。回过头来,对于这个题目,要想得到LED各种不同的亮度,也只要在一定的频率范围内调整高电平的宽度就可以了。高电平的宽度不同,即相当于得到的平均电压就不同,平均电压不同,LED的亮度自然也就不同了。频率太低和太高都不好,太低了灯闪的厉害,太高了可供调整的高电平的范围就小了,实际的效果就不好,可能忽的一下就全亮了,再忽的一下就全暗了,渐亮的效果就不明显了。以前我做的频率大概在150Hz左右,大家可以参考一下。
编程的时候,可以用定时器T0或者T1来做,先固定好频率,然后每隔一段时间调整占空比。如果调整的次数和总时间合适的话,你就可以看到很漂亮的LED的渐亮和渐暗了。
真正想学单片机的朋友,强烈建议动动手和动动脑做一下这个实验,思路已经都提供了,还等什么呢?而且斑竹的悬赏令都出了,大家加油啊!