原理+程序·LED摇摇棒
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
16位LED摇摇棒
摘要:大家知道,人的眼睛存在视觉暂留现象,正因为眼睛的反应迟钝,才丰富了人的视觉感受。LED摇摇棒很好地利用了人眼的视觉暂留特性。本设计是基于AT89S51单片机控制、16只高亮度LED发光二极管构成的摇摇棒,配合手的左右摇晃就可呈现一幅完整的画面,可以显示字符、图片等。
1.设计任务:
制作一摇摇棒,其效果满足设计要求。
1.1要求
基本要求:
黑暗条件下左右摇晃摇摇棒,能够清晰显示所要的字符或画面。
发挥部分:
制作一简易按钮,当按下按钮后可以切换显示的内容。
2.方案比较与确定
2.1MCU的选择
方案一:采用传统的51单片机(AT89S51),硬件便宜,程序下载方便。但是51单片机的灌、拉电流都不是很大,设计时需要特别注意,如果16位LED要采用共阴接法,IO口需要上拉。
方案二:采用AVR单片机(ATmega16),其内部资源丰富,且拉电流较大,可以直接驱动LED灯,但是价格较贵。
考虑到本设计产品外围电路简单,LED采用共阳接法,传统的51单片机完全可以满足需要,故采用方案一。
2.2震动开关的选择
方案一:采用水银开关,其结构简单,接触可靠,但是水银是有毒物质,使用不当会造成危险。
方案二:采用滚珠开关,优点是安全无毒,但是容易接触不良,需要软件克服,无形中增加程序的复杂性。
考虑本设计产品只是一演示产品,出现水银泄露的概率很小,故采用方案一。3.程序框图(略)
4.系统设计与实现
4.1水银开关模块
水银开关一端接地,一端接到单片机外部中断0,外部中断采用边沿触发,当左右摇晃时就会出现一个下降沿,触发外部中断,在中断服务程序中调用显示函数。因为是单方向显示,所以不会出现字符重叠现象。电气连接如图所示:
4.2单片机复位模块
为了简化电路,单片机复位采用手动复位,所以每次上电需手动复位一下。
电气连接如图所示:
5.系统原理图
6.系统程序
/******************************************************************** 2010/10/15 Author:xuepengju
circuit connect:
1~16LED-------------------------P0-P1
Mercury switch------------------P3.2
********************************************************************/ #include
unsigned char code table[]={
0x00,0x00,0x00,0x00,0xF8,0x0F,0x48,0x04,0x48,0x04,0x48,0x04,0x48,0x04,0xFF,0 x3F,
0x48,0x44,0x48,0x44,0x48,0x44,0x48,0x44,0xF8,0x4F,0x00,0x40,0x00,0x70,0x00,0 x00,/*"电",0*/
0x00,0x01,0x00,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x41,0x02,0x81,0xE2,0 x7F,
0x12,0x01,0x0A,0x01,0x06,0x01,0x02,0x01,0x00,0x01,0x80,0x01,0x00,0x01,0x00,0 x00,/*"子",1*/
0x00,0x20,0x00,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0xFE,0 x3F,
0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x20,0x00,0 x00,/*"工",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*/
};
/*延时函数*/
void delay370us()
{
unsigned char i=80;
while(i--);
}
/* '嵌入式系统工程'显示112*16像素*/
/*void display()
{
unsigned char i;
for(i=0;i<112;i++)
{
P0=~Embed[i*2];
P1=~Embed[i*2+1];
delay370us();
}
}*/
void display()
{
unsigned char i;
for(i=0;i<64;i++)
{
P0=~table[i*2];
P1=~table[i*2+1];
delay370us(); //延时时间自己可以调,最好让画面显示在中间}
}
void int0(void) interrupt 0
{
display();
}
void main(void)
{
EA=1;//开总中断
IT0=1;//下降沿中断
EX0=1;//启动外部中断0
while(1);
}