16位LED摇摇棒
摘要:大家知道,人眼睛存在视觉暂留现象,正因为眼睛反应迟钝,才丰富了人
视觉感受。LED摇摇棒很好地利用了人眼视觉暂留特征。本设计是基于ATS51单片机控制、16只高亮度LED发光二极管组成摇摇棒,配合手左右摇摆就可展现一幅完整画面,能够显示字符、图片等。
1.设计任务:
制作一摇摇棒,其效果满足设计要求。
1.1要求
基础要求:
黑暗条件下左右摇摆摇摇棒,能够清楚显示所要字符或画面。
发挥部分:
制作一简易按钮,当按下按钮后能够切换显示内容。
2.方案比较和确定
2.1MCU选择
方案一:采取传统51单片机(ATS51),硬件廉价,程序下载方便。不过51单片机灌、拉电流全部不是很大,设计时需要尤其注意,假如16位LED要采取共阴接法,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);
}