试题2.docx
《试题2.docx》由会员分享,可在线阅读,更多相关《试题2.docx(11页珍藏版)》请在冰豆网上搜索。
试题2
二,LED显示棒
本作品主要利用人眼的视觉暂留效应,使手在摆动到不同位置的时候,让位于一条直线上的LED显示二维图像的不同的列,实现图形扫描显示。
当我们在摆动手臂的时候,短时间内摆动位置和左右幅度不会有太大变化,利用我们手臂的这个运动规律,只要能得到棒从一侧摆动到另一侧的时间,然后把这个时间分成N份,然后在每一份的时间里显示不同的花样就能实现图形的显示。
本文介绍的作品就是利用LED而制成的手摇棒。
它可以替代舞台下的荧光棒,不但能够发光,还可以扫描出一些简单的字,起到娱乐作用。
高亮的5mm的LED。
采取并口输出。
采用AT89S52来作为摇摇棒的控制核心;
字模的取模方式
从上到下,从右到左一列一列依次取模,每一列16个点占用2个字节;把生成的每个字节代码低位在上。
至于是由1还是0来表示亮点是无所谓的,可以通过取反输出来调整。
总体设计
设计总体框图如图1:
单元模块设计
AT89S52单片机最小系统:
最小系统包括晶体振荡电路、复位开关和电源部分。
图2为AT89S52单片机的最小系统。
图二最小系统电路图
LED显示模块
本模块选用16个5mm的高亮LED灯排成一列,并加上一个IN4007保护二极管构成。
电路图如图三。
图三LED显示电路
按键切换模块
由于本实验有多种显示效果,所以按键切换必不可少。
为了节省空间,只用了一个按键来切换。
下图是按键电路图。
图四按键切换电路
5软件设计
主程序流程图如下:
图五主程序流程图
系统测试
接上电源,通过开关K1的不断切换,就能显示不同的效果图。
效果一:
效果二:
效果三:
元器件明细表:
AT89S52一个,16个高亮5mmLED,IN4007一个,锁紧夹一个,排针若干,按键2个,10K电阻2个,12M晶振一个,220欧一个,30pf的电容2个,一个3mm的LED。
系统整体电路图如下:
附录
程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitkey=P3^0;
ucharnum,keynum=0;
ucharcodewelcome1[]={0x07,0xF7,0xFF,0x07,0xFF,0xF7,0x07,0xFF,
0xFF,0xFF,0x7F,0x7F,0x7F,0x7F,0xFF,0xFF,
0xFF,0xF7,0xF7,0x07,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0x7F,0x7F,0x7F,0xFF,0xFF,
0xFF,0xFF,0x7F,0x7F,0x7F,0x7F,0xFF,0xFF,
0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0xFF,
0xFF,0xFF,0x7F,0x7F,0x7F,0x7F,0xFF,0xFF
};
ucharcodewelcome2[]={0xFC,0xC3,0xF8,0xFF,0xF8,0xC3,0xFC,0xFF,
0xFF,0xE0,0xDD,0xDD,0xDD,0xDD,0xEC,0xFF,
0xFF,0xDF,0xDF,0xC0,0xDF,0xDF,0xFF,0xFF,
0xFF,0xF1,0xEE,0xDF,0xDF,0xDF,0xEE,0xFF,
0xFF,0xE0,0xDF,0xDF,0xDF,0xDF,0xE0,0xFF,
0xDF,0xC0,0xDF,0xFF,0xC0,0xDF,0xFF,0xC0,
0xFF,0xE0,0xDD,0xDD,0xDD,0xDD,0xEC,0xFF,
};
ucharcodedianzixi1[]={0xFF,0xFF,0x03,0x03,0xB3,0xB3,0x00,0x00,0xB3,0xB3,0xB3,0x03,0x03,0xFF,0xFF,0xFF,0x3F,0x3F,0x3C,0x3C,0x3C,0x3C,0x3C,0x0C,0x0C,0x24,0x30,0x38,0x3C,0x3F,0x3F,0xFF,0xFF,0xFF,0xF9,0xD9,0xC9,0x41,0x11,0x99,0xD9,0xC9,0xE4,0x34,0x7C,0xFC,0xFF,0xFF
};
ucharcodedianzixi2[]={0xFF,0xFF,0xF0,0xF0,0xF9,0xF9,0xC0,0x80,0x99,0x99,0x99,0x98,0x98,0x87,0xC7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x9F,0x80,0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xCC,0xE4,0xF4,0xFC,0x9C,0x80,0xC0,0xFE,0xFE,0xF6,0xE6,0xCC,0xFF,0xFF
};
ucharcodewuhuan1[]={0xFF,0xFF,0xFF,0x0F,0xF7,0xFB,0xFD,0xFD,0xFD,0xFD,0x7B,0xB7,0x0F,0xB7,0xBB,0x7D,0xFD,0xFD,0xFD,0x7B,0xB7,0x0F,0xB7,0xBB,0x7D,0xFD,0xFD,0xFD,0xFB,0xF7,0x0F,0xFF};
ucharcodewuhuan2[]={0xFF,0xFF,0xFF,0xFF,0xFE,0xFD,0xFB,0xFB,0xE1,0xDA,0xBD,0x7E,0x7F,0x7E,0x7D,0xBB,0xDA,0xE1,0xDA,0xBD,0x7E,0x7F,0x7E,0x7D,0xBB,0xDA,0xE1,0xFB,0xFD,0xFE,0xFF,0xFF};
ucharcodedianji1[]={0xDD,0x99,0x33,0x01,0x01,0x99,0x21,0xCF,0x47,0x43,0x10,0x10,0x43,0x47,0xCF,0xFF,
0x7F,0x0F,0xFF,0x00,0x00,0x9F,0x7F,0x01,0x01,0x9F,0x7F,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xC7,0xC6,0x24,0x21,0x27,0x26,0x24,0x21,0x27,0x23,0x20,0xC4,0xC7,0xFF,0xFF,0x01,0x01,0x99,0x01,0x71,0xE3,0xE3,0x93,0x92,0x90,0x91,0x93,0x93,0xE3,0xE3,0xFF,0xFF,0x1F,0xEF,0xF7,0xF7,0xF7,0xEF,0x1F,0xFF,0x07,0xB7,0xB7,0xB7,0xB7,0x77,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0xE7,0xFB,0xFF,0x9F,0xEF,0xF7,0xF7,0xEF,0x1F,0xFF,0xFF,0xCF,0xF7,0xF7,0xF7,0xF7,0x0F,0xFF};
ucharcodedianji2[]={0xCF,0x81,0xF9,0x80,0x80,0xFB,0xF8,0xE7,0xE2,0x92,0x80,0xC0,0xF2,0xE2,0xE7,0xFF,
0xFC,0x9F,0x87,0xE0,0xF8,0xFF,0xFE,0xC0,0xC0,0xFF,0xFE,0xFF,0x80,0x80,0xFF,0xFF,
0xFF,0xF9,0xF9,0xF9,0xF9,0xD9,0x99,0x81,0xC0,0xF8,0xF9,0xF9,0xF9,0xF9,0xFF,0xFF,
0x80,0x80,0xF3,0xF0,0xB8,0x9F,0xCC,0xE0,0xF0,0xFC,0xC0,0x80,0x9C,0x9C,0x8F,0xFF,
0xFF,0xF0,0xEF,0xDF,0xDF,0xDF,0xEF,0xF0,0xFF,0xE7,0xDF,0xDF,0xDF,0xDF,0xE0,0xFF,
0xFF,0xBF,0xCF,0xF3,0xFC,0xFF,0xFF,0xFF,0xFF,0xCF,0xD7,0xDB,0xDD,0xDE,0xDF,0xFF,
0xFF,0xE7,0xDF,0xDF,0xDE,0xDE,0xE1,0xFF
};
voiddelay(ucharz)
{uchari,j;
for(i=0;ifor(j=0;j<180;j++);
}
voidwelcome()
{
delay
(2);
for(num=56;num>0;num++)
{
P0=welcome1[num];
delay
(2);
P2=welcome2[num];
delay
(2);
}
}
voiddianzixi()
{
delay
(2);
for(num=48;num>0;num--)
{
P0=dianzixi1[num];
delay
(2);
P2=dianzixi2[num];
delay
(2);
}
}
voidwuhuan()
{
delay
(2);
for(num=32;num>0;num--)
{
P0=wuhuan1[num];
delay
(2);
P2=wuhuan2[num];
delay
(2);
}
}
voiddianji()
{
delay
(2);
for(num=0;num<104;num--)
{
P0=dianji1[num];
delay
(2);
P2=dianji2[num];
delay
(2);
}
}
voidpresskey()
{
if(key==0)
{
delay(10);
if(key==0)
{
keynum++;
while(!
key);
}
}
}
voidmain()
{
while
(1)
{
presskey();
switch(keynum)
{
case1:
welcome();break;
case2:
dianzixi();break;
case3:
wuhuan();break;
case4:
dianji();break;
case5:
P0=0xff;P2=0xff;break;
case6:
keynum=1;break;
default:
break;
}
}
}