湖南涉外经济学院课程设计报告课程名称:LED摇摇棒设计报告题目:LED摇摇棒设计学生姓名:所在学院:专业班级:学生学号:指导教师:2016 年6 月 19 日摘要本设计以AT89S52单片机为中央控制器,显示棒摇动时显现的字符或图形由LED 灯显示,LED 灯成线状排列,每个瞬间线阵只能显示数字编码后的文字或图形的一列,利用人眼的视觉暂留原理,将需要显示的字符或图形分成64 列(,一般人手左右摆动的频率为几赫兹到十几赫兹,因此,通过单片机控制LED 线阵以一较低频率扫描显示字符或图形的每一列,摆动显示棒时即可因视觉暂留看出显示的字符或图形;左右摆动一次通过端口电平变化,调用相应的显示子程序,字符切换通过外部中断实现,该系统设计对程序设计的要求较硬件电路要高。
整套系统由中央控制模块、LED显示模块、供电模块等部分构成。
关键词:LED;AT89S52;视觉暂留;图案目录1. 系统概述 (5)2、硬件设计 (6)2.1 单片机选择 (6)2.2 外部中断信号产生方式 (6)2.3 LED显示模块 (8)2.4 单片机最小系统的设计 (9)3、软件设计 (10)3.1.1 软件设计思路 (10)4、系统调试 (16)5、结束语 (17)6、参考文献 (17)1.系统概述本系统要求设计一个LED显示棒,它主要是由中央控制部分、LED 显示部分以及电源部分组成,如图1-1所示,图1-1 系统组成部分单片机提取的字模进行存储,当接收到指令时单片机就讲字模代码通过I/O口输出,使LED点亮,利用视觉停留原理最终使图案显示在摆动的显示屏中。
2、硬件设计2.1 单片机选择选用单片机AT89S51 作为扫描显示控制核心,由其直接控制LED 线阵的显示,并外加扫描控制开关控制字符或图形的扫描显示。
该方案线路简单,扫描控制开关可选择机械开关或编码开关或滚珠开关,在基于单片机的LED 显示摇摇棒的设计,显示棒摇摆时接通线路控制单片机扫描输出字符或图形的列编码信号;单片机外另接有中断控制按钮用以切换不同字符或图形的显示,LED 线阵采用普通三极管驱动。
此方案的优点是:单片机C51 的端口较多,可实现显示数据并行传输,速度较快,且外围电路简单,调试较方便。
缺点是:单片机使用的晶振频率较大,软件不易实现对计数的控制。
2.2 外部中断信号产生方式通过外部中断可以控制数据开始传输的时刻。
选择好外部中断来源是本次制作的难点和重点。
方案一:使用滚珠开关。
通过摇摆使得滚珠开关中的滚珠与两个触点接触,利用这种接触产生的电平变化来触发中断,结合软件控制显示,制作简单,使用方便。
方案二:使用遮光器。
在摆棒上安装一个可以摆动的用来遮挡光遮断器光线的细杆,细杆每左右摇摆一次这个杆就会通过遮光器,发生电平变化。
同样通过这种电平变化,结合软件控制显示。
本次设计的中断时为了实现数据的单程传输。
如果使用遮光器,其触发单片机的时刻处于正中央,不能解决图片因为返回与原来图片重叠的现象。
而使用滚珠开关因为在左右都有触点,所以很容易在往返途中产生中断,从而选择方案一经过分析论证,我们决定了系统各模块的方案,流程图如3-1图3-1 系统流程图整体系统以AT89S51单片机为中央控制器使用16只LED等作为显示屏。
当滚珠开关触发中断时,单片机向16只LED传送数据,依据人体额视觉暂留原理,随着显示棒的摆动前进,输出数据的列是不会立刻消失而是随着摆动逐渐显示在形成的扇形区域。
整体电路如图3-2所示,图3-2 整体电路图2.3 LED显示模块首先我们根据LED点阵屏的显示原理:点阵屏的显示分为行扫描与列扫描两种,列扫描是将字模数组通过点阵屏的行驱动进行输入,然后通过列队每一行进行扫描,当列为低(高)电平,行为高(低)电平时,则表示该点为图案的一部分,将其读出、显示。
它们的顺序可以总结为:行不断的送数据,没送完设置的信息后,列进行读取,然后行再次送数据------一次循环下去,一幅完整的图案就显示在显示屏上了[2]。
本次设计的LED显示屏数据传输原理与LED点阵屏相似。
可以把LED显示棒看做是LED点阵中的一列。
我使用的是16只LED管将它们排成一列,整个屏静止时也就相当于16*1。
数据传输时使用行送数据,列扫描2.4 单片机最小系统的设计由于本次设计的显示棒,基本要求就是要小巧、轻便,所以要将单片机的系统板简化设计。
它的最小系统包括晶体振荡电路和电源部分。
图3-3为单片机的最小系统[3]。
图3.33、软件设计3.1.1 软件设计思路在摇动LED棒的时候单片机必须单程传送数据否则显示的图形会产生重影,影响视觉效果。
因此当系统开始通过滚珠开关中滚珠的位置来使单片机实现单程送数据给LED。
在送数据时,数据送完后应该延时一段时间来使摇摇棒显示的每个字不会太拥挤。
之后再立刻熄灭LED 并开始重新判断滚珠的位置(整体流程图见图3-4)图3-4源程序:#include <AT89X52.h>#define uchar unsigned char#define uint unsigned int#define KEY P3_7uchar KY;uchar disp;uchar pic=0,num=0; //pic为按键次数;num为中断次数uchar code love[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x20,0x00,0x20,0 x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0 xF8,0x0F,0x04,0x10,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x04,0x10,0xF8,0x0F,0 x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x20,0 x00,0x10,0x00,0x08,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x82,0x20,0 x82,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,/*LOVE*/};uchar code loveyou[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x78,0x00,0xFC,0x00,0xFE,0x01,0xFE,0x03,0xFE,0x07,0xFE,0x0F,0xFE,0x1F,0 xFC,0x3F,0xF8,0x7F,0xFC,0x3F,0xFE,0x1F,0xFE,0x0F,0xFE,0x07,0xFE,0x03,0xFE,0x01,0 xFC,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,/*心形图案*/};uchar code hehe[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x40,0x01,0xC0,0x01,0x00,0x00,0 x00,0x00,0xF0,0x0F,0x08,0x10,0x04,0x20,0x00,0x00,0x00,0x00,0xF0,0x3F,0x08,0x00,0 x04,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0xF0,0x3F,0x00,0x00,0x00,0x00,0x00,0x20,0 x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0xF0,0x3F,0x08,0x00,0 x04,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0xF0,0x3F,0x00,0x00,0x00,0x00,0x04,0x20,0 x08,0x10,0xF0,0x0F,0x00,0x00,0x00,0x00,0xC0,0x01,0x40,0x01,0xC0,0x01,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,/*呵呵o(∩_∩)o图案*/};unsigned char code hanzi[] = {0x00,0x01,0x80,0x40,0x60,0x40,0x1E,0x41,0x10,0x41,0x10,0x41,0x10,0x41,0x10,0x41,0xFF,0x7F,0x12,0x41,0x10,0x41,0x10,0x41,0x98,0x41,0x10,0x61,0x00,0x40,0x00,0x00,/*"生",0*/0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"日",1*/0x70,0x00,0x00,0x00,0xFF,0xFF,0x08,0x00,0xB0,0x80,0x88,0x40,0x88,0x30,0x88,0x0E,0xFF,0x01,0x88,0x06,0x88,0x08,0x88,0x30,0xF8,0x60,0x80,0xC0,0x80,0x40,0x00,0x00,/*"快",2*/0x00,0x00,0x00,0x20,0x40,0x18,0xFC,0x0C,0x44,0x07,0x44,0x12,0x44,0x20,0x46,0x40,0xFA,0x3F,0x42,0x00,0x43,0x00,0x43,0x02,0x42,0x0C,0x40,0x38,0x00,0x10,0x00,0x00,/*"乐",3*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",4*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",5*/ 0x10,0x20,0x08,0x38,0x08,0x26,0x08,0x21,0xC8,0x20,0x38,0x20,0x08,0x18,0x00,0x00,/*"Z",6*/ 0x08,0x20,0xF8,0x3F,0x08,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x30,0x00,0x00,/*"L",7*/ 0x08,0x20,0x18,0x30,0x68,0x2C,0x80,0x03,0x80,0x03,0x68,0x2C,0x18,0x30,0x08,0x20,/*"X",8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",9*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",10*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",11*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",10*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",11*/ 0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,/*"1",12*/ 0x00,0x00,0x30,0x18,0x08,0x20,0x88,0x20,0x88,0x20,0x48,0x11,0x30,0x0E,0x00,0x00,/*"3",13*/ 0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,/*"1",14*/ 0x00,0x00,0x00,0x07,0xC0,0x04,0x20,0x24,0x10,0x24,0xF8,0x3F,0x00,0x24,0x00,0x00,/*"4",15*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",10*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",11*/ };/*****函数声明*****/void display1_ltor(void);void display2_ltor(void);void display2_rtol(void);void display3(void);void display4(void);/*****n(us)延时子程序*****/void DelayUs(uint N){uint x;for(x=0; x<=N;x++);}/*****中断服务程序*****/void intersvr0(void) interrupt 0{;KY=~KY;if(KY==0){num++;{case 0:{display1_ltor();}break; case 1:{display2_ltor();}break;case 2:{display3();}break;case 3:{display4();}break;default:{display1_ltor();}}}}void display1_ltor(void){uchar i;if(num>10){disp++;num=0;}if(disp>2)disp=0;DelayUs(5200);for(i=0;i<64;i++){P0=~hanzi[disp*128+i*2];P2=~hanzi[disp*128+i*2+1];DelayUs(100);}}/*****显示子程序2(LOVE)*****/void display2_ltor(void){uchar i;DelayUs(4000);for(i=0;i<64;i++){P0=~love[i*2];P2=~love[i*2+1];DelayUs(140);}}/*****显示子程序3(心形图案)*****/void display3(void){uchar i;DelayUs(4000);for(i=0;i<64;i++){P0=~loveyou[i*2];P2=~loveyou[i*2+1];DelayUs(120);}}/*****显示子程序4(呵呵o(∩_∩)o图案)*****/ void display4(void){uchar i;DelayUs(4000);for(i=0;i<64;i++){P0=~hehe[i*2];P2=~hehe[i*2+1];DelayUs(120);}}/*****主函数*****/void main(void){IT0=1;EX0=1;EA=1; //开中断,下降沿中断KY=0;KEY=1;while(1){if(KEY==0) //画面切换键按下{DelayUs(10000); //按键去抖if(KEY==0);pic++;while(KEY==0);}if(pic>3)pic=0;}}/*****END*****/4、系统调试制作的摇摇棒能够清楚显示预先设置的画面图像以及汉字。