摇棒

[复制链接]
2043|1
 楼主| royi265 发表于 2008-9-21 11:29 | 显示全部楼层 |阅读模式
大家好     能告诉我汇编语言的摇棒程序和电路  急用  可显示20个字就可以了  谢谢!!!!!
tyw 发表于 2008-9-21 12:44 | 显示全部楼层

这个较完整

<table class=ubb cellspacing=0><TR><td class=ubb>LED&nbsp;显示摇棒全套方案及源程序</td></TR><TR><td class=ubb>发布者:</td><td class=ubb>匿名</td><td class=ubb>点击次数:</td><td class=ubb>53</td><td class=ubb>发布时间:</td><td class=ubb>2008-4-20</td></TR><TR><td class=ubb>&nbsp;</td></TR><TR><td class=ubb><br />情人节我们做电的兄弟们送什么礼物给心仪已久的MM?在离情人节还有一个月的时间,给大家提供一个适合作为礼物的简单电路,自己动手做的漂亮玩具一定会是送给MM的最好的礼物。<br />显示效果图片:&nbsp;<br /><img src="http://www.bluepw.com/htmanage/ljf_WebEditor/UploadFile/2007111617429567.jpg"><br />以下是详细说明:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图形显示的原理:<br /><img src="http://www.bluepw.com/htmanage/ljf_WebEditor/UploadFile/20071116165847530.jpg"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;利用人眼的视觉暂留效应,使手在摆动到不同位置的时候,让位于一条直线上的LED显示二维图像的不同的列,实现图形扫描显示。<br />物理机制:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当我们在摆动手臂的时候,短时间内摆动位置和左右幅度不会有太大变化,利用我们手臂的这个运动规律,只要能得到棒从一侧摆动到另一侧的时间,然后把这个时间分成N份,然后在每一份的时间里显示不同的花样就能实现图形的显示。当我们在摆动手臂的时候,并不能预先得知此次摆动需要的时间,怎样得到从一侧摆动到另一侧的时间呢?再想想,短时间内我们手臂的摆动频率也不会有特别大的变化,我们只要能得到前一次摆动所用的时间,然后用这个时间近似得到下一次摆动所需要的时间,然后分N&nbsp;份就可以了。得到一次摆动所需的时间的任务由光遮断器完成,在棒上装一个可以摆动的用来遮挡光遮断器光线的细杆,粗细比光遮断器的狭缝稍宽,我用的是整流桥焊后剪下的一段管脚。每左右摆动一次这个杆就会通过一次光遮断器,使单片机产生一次中断,两次中断之间的时间就是想要得到的时间,实现这个功能用掉2051&nbsp;的一个定时器T0&nbsp;和外部中断INT0。然后用2051&nbsp;的另一个定时器T1,其定时时间是T0&nbsp;的N&nbsp;分之一,每次中断依次显示一列,就是照片上的效果。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;再细想一下,手臂摆动的频率大于2Hz&nbsp;的时候才大概能由视觉暂留看出图形,再快也不过十几Hz,由T0&nbsp;为16&nbsp;位定时器的最长计时时间得到2051&nbsp;的时钟频率1MHz&nbsp;最合适,还有遮挡用的细杆的粗细也可以大概估算,使其不会对计时精度产生太大影响。<br />所用元件:<br />AT89C2051&nbsp;8&nbsp;元<br />高亮LED&nbsp;共8&nbsp;个&nbsp;3.6&nbsp;元<br />电池盒&nbsp;0.5&nbsp;元<br />单面万用板&nbsp;8&nbsp;元&nbsp;可以裁成3&nbsp;块,做3&nbsp;个摇棒<br />陶瓷谐振器&nbsp;1&nbsp;元<br />光遮断器&nbsp;2&nbsp;元<br />电阻电容导线&nbsp;2&nbsp;元<br />外壳*&nbsp;0.7&nbsp;元&nbsp;可以裁成2&nbsp;块<br />可选元件:<br />电源开关&nbsp;1&nbsp;元<br />总成本不超过20&nbsp;元<br />*外壳我用在家乐福买的半透明文件夹卷成的<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此电路电路非常简单,代码短,但是用到了2051&nbsp;的外部中断编程和T0、T1&nbsp;定时器编程,非常适合初学者练习。我制作这个玩具花费了两个晚上的时间。此电路和程序还有扩展改进的空间,如在长时间不摆动的情况下可以使单片机进入省电模式,显示不仅限于对称图片等,大家可以试试。<br />以下是源程序:<br />/********************************************************/<br />//&nbsp;---------------<br />//&nbsp;LED&nbsp;显示摇棒<br />//&nbsp;---------------<br />//&nbsp;作者:nim&nbsp;于&nbsp;http://www.21icbbs.com&nbsp;2005-1-7<br />//<br />//&nbsp;email:&nbsp;linyige@yahoo.com<br />//<br />//&nbsp;本设计版权归作者所有,请勿擅自用于商业目的,转载请注明作者及出处<br />/*******************************************************/<br />#include<br />#define&nbsp;SEG&nbsp;17&nbsp;//每帧图片分成17&nbsp;列来显示<br />#define&nbsp;INTERVAL&nbsp;20&nbsp;//每幅图片在左右摇摆20&nbsp;次后换下一幅<br />typedef&nbsp;unsigned&nbsp;char&nbsp;uchar;<br />typedef&nbsp;unsigned&nbsp;int&nbsp;uint;<br />code&nbsp;char&nbsp;pattern[17][3]={&nbsp;//3&nbsp;幅图片的字模<br />{0xff,0xff,0xff},<br />{0xff,0xff,0xff},<br />{0xff,0xff,0xff},<br />{0xff,0x9f,0xff},<br />{0xff,0x6f,0xf9},<br />{0xff,0x77,0x65},<br />{0xfe,0xbb,0x1e},<br />{0x7e,0xdd,0xfe},<br />{0x00,0xee,0xfe},<br />{0x7e,0xdd,0xfe},<br />{0xfe,0xbb,0x1e},<br />{0xff,0x77,0x65},<br />{0xff,0x6f,0xf9},<br />{0xff,0x9f,0xff},<br />{0xff,0xff,0xff},<br />{0xff,0xff,0xff},<br />{0xff,0xff,0xff},<br />};<br />uchar&nbsp;phase,th1,tl1,index,count;<br />main()<br />{<br />EA=0;<br />EX0=1;<br />ET1=1;<br />PX0=1;<br />IT0=1;<br />TMOD=0x11;<br />index=0;<br />EA=1;<br />while(1)<br />{<br />}<br />}<br />void&nbsp;Int0_Handle(void)&nbsp;interrupt&nbsp;0&nbsp;using&nbsp;2<br />{<br />uint&nbsp;t0_time;<br />TR0=0;<br />TR1=0;<br />TF1=0;<br />t0_time=TH0&lt&lt8|TL0;<br />TL0=0;<br />TH0=0;<br />TR0=1;<br />t0_time=65535-t0_time/SEG;<br />th1=t0_time/256;<br />TH1=th1;<br />tl1=t0_time&nbsp;%&nbsp;256;<br />TL1=tl1;<br />if&nbsp;(count&lt3*INTERVAL){&nbsp;//3&nbsp;幅图片循环<br />count++;<br />}<br />else{<br />count=0;<br />}<br />index=count/INTERVAL;<br />if&nbsp;(th1!=0xff&nbsp;||&nbsp;tl1!=0xff){&nbsp;//如果摆动特别慢,定时器溢出就不显示<br />phase=0;<br />TR1=1;<br />}<br />else{<br />TR1=0;<br />}<br />}<br />void&nbsp;Timer1(void)&nbsp;interrupt&nbsp;3&nbsp;using&nbsp;3<br />{<br />if<br />(phase&ltSEG)&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&N<br />BSP;&NBSP;&NBSP;&nbsp;17&nbsp;段依次显示<br />{<br />P1=pattern[phase][index];<br />phase++;<br />TH1=th1;<br />TL1=tl1;<br />}<br />}<br /></td></TR></table>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部