99网
您的当前位置:首页原理程序LED摇摇棒样稿

原理程序LED摇摇棒样稿

来源:99网



16LED摇摇棒

摘要:大家知道,人眼睛存在视觉暂留现象,正因为眼睛反应迟钝,才丰富了人

视觉感受。LED摇摇棒很好地利用了人眼视觉暂留特征。本设计是基于ATS51单片机控制、16只高亮度LED发光二极管组成摇摇棒,配合手左右摇摆就可展现一幅完整画面,能够显示字符、图片等。

1.设计任务:

制作一摇摇棒,其效果满足设计要求。

1.1要求
基础要求:

黑暗条件下左右摇摆摇摇棒,能够清楚显示所要字符或画面。

发挥部分:

制作一简易按钮,当按下按钮后能够切换显示内容。

2.方案比较和确定

2.1MCU选择
方案一:采取传统51单片机(ATS51),硬件廉价,程序下载方便。不过51单片机灌、拉电流全部不是很大,设计时需要尤其注意,假如16LED要采取共阴接法,IO口需要上拉。

方案二:采取AVR单片机(ATmega16),其内部资源丰富,且拉电流较大,能够直接驱动LED灯,不过价格较贵。

考虑到本设计产品外围电路简单,LED采取共阳接法,传统51单片机完全能够满足需要,故采取方案一。



2.2震动开关选择
方案一:采取水银开关,其结构简单,接触可靠,不过水银是有毒物质,使用不妥会造成危险。

方案二:采取滚珠开关,优点是安全无毒,不过轻易接触不良,需要软件克服,无形中增加程序复杂性。

考虑本设计产品只是一演示产品,出现水银泄露概率很小,故采取方案一。

3.程序框图(略)

4.系统设计和实现
4.1水银开关模块
水银开关一端接地,一端接到单片机外部中止0,外部中止采取边缘触发,当左右摇摆时就会出现一个下降沿,触发外部中止,在中止服务程序中调用显示函数。

因为是单方向显示,所以不会出现字符重合现象。电气连接图所表示:



4.2单片机复位模块
为了简化电路,单片机复位采取手动复位,所以每次上电需手动复位一下。

电气连接图所表示:

5.系统原理图



6.系统程序

/********************************************************************/10/15 Author:xuepengju
circuitconnect:
1~16LED-------------------------P0-P1
Mercuryswitch------------------P3.2
********************************************************************/#include<reg52.h>
unsignedchar code table[]={



0x00,0x00,0x00,0x00,0xF8,0x0F,0x48,0x04,0x48,0x04,0x48,0x04,0x48,0x04,0xFF,0x3F,
0x48,0x44,0x48,0x44,0x48,0x44,0x48,0x44,0xF8,0x4F,0x00,0x40,0x00,0x70,0x00,0x00,/*"",0*/

0x00,0x01,0x00,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x41,0x02,0x81,0xE2,0x7F,
0x12,0x01,0x0A,0x01,0x06,0x01,0x02,0x01,0x00,0x01,0x80,0x01,0x00,0x01,0x00,0x00,/*"",1*/

0x00,0x20,0x00,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0xFE,0x3F,
0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x20,0x00,0x00,/*"",2*/

0x10,0x04,0x12,0x03,0xD2,0x00,0xFE,0xFF,0x91,0x00,0x11,0x41,0x80,0x44,0xBF,0x44,
0xA1,0x44,0xA1,0x7F,0xA1,0x44,0xA1,0x44,0xBF,0x44,0x80,0x44,0x00,0x40,0x00,0x00/*"",3*/
};
/*延时函数*/
voiddelay370us()
{
unsignedchar i=80;
while(i--);
}
/*'嵌入式系统工程'显示112*16像素*/



/*voiddisplay()
{
unsignedchar i;
for(i=0;i<112;i++)
{
P0=~Embed[i*2];
P1=~Embed[i*2+1];
delay370us();
}
}*/
voiddisplay()
{
unsignedchar i;
for(i=0;i<;i++)
{
P0=~table[i*2];
P1=~table[i*2+1];
delay370us(); //延时时间自己能够调,最好让画面显示在中间}
}
voidint0(void) interrupt 0
{
display();
}
voidmain(void)



{
EA=1;//开总中止
IT0=1;//下降沿中止
EX0=1;//开启外部中止0
while(1);
}

因篇幅问题不能全部显示,请点此查看更多更全内容