原理+程序·LED摇摇棒

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

}

相关文档
最新文档