当前位置:文档之家› LED旋转灯

LED旋转灯

线阵LED图文显示装置摘要:本设计采用自顶向下的设计方法。

首先明确这个题目要实现的功能,再将该系统分成LED 阵列控制、电机测速和标杆定位等3个模块。

用手机电池给LED和单片机供电,单片机工作电压为3.3V,LED用NPN三极管8050驱动。

采用霍尔传感器实现标杆定位功能,采用光敏二极管控制LED亮度。

旋转平台的平衡调节、采用手机可充电电池供电。

一、本设计的亮点和创新点1.采用手机充电电池作为LED阵列和处理器的电源。

手机电池容量、体积轻、可充电循环利用。

充电时不需要拆下电池。

2.通过光敏二极管和一个2.7K的电阻一起控制NPN型三极管基极的电流,从而控制加在LED上面的电流,这样不需要在每个LED前面加限流电阻。

只需要用一个限流电阻,电路简单。

光敏二极管暗电流较小,有光时光电流较大。

3.LED阵列采用共阳极的接法,防止因为单片机高电平电压不足导致LED不亮。

二、方案论证与设计1、整体结构方案方案一:LED阵列的供电电源安装在下面木板上,然后采用电刷与上面连接给上面的单片机和其他元器件供电。

但是由于转速比较快电刷很可能因发热刷坏,工作寿命不长,故舍去该方案。

方案二:将LED阵列的供电电源安装在旋转平台上。

旋转平台一端安装电池和单片机,另一端安装LED和单片机。

再用螺钉、螺帽增减配重的方式调节平衡。

综合以22、处理器选取方案方案一:采用ARM 处理器进行数据处理,ARM处理器处理数据比较高,而且端口比较多,可以处理多个任务。

但是ARM价格高,且本任务数据处理比较简单。

故舍去该方案。

方案二:采用比较普及的STC89C51处理器,价格低廉,易于控制。

但我们在面包板上做实验时发现用51功耗太大,工作电压范围为3.4~~5.5V电源电压不足驱动不了。

手机电池要给LED阵列、单片机、霍尔传感器、光敏二极管等器件供电,我们在面包板上实验发现他们工作时单片机分得的电压只有3.3V无法使单片机工作,故舍去该方案方案三:使用MSP430单片机,该单片机功耗小,重量较轻,很适合做这个LED线阵的控制器。

故选择该方案。

4.LED线阵供电方案方案一:采用9V电池供电,9V电池电压比较足,储电量较大,能给LED和单片机提供很充足的电量。

但是它体积比较大,当电机转速很快时离心力很大,若电池甩出很易伤人,故舍去该方案方案二:采用两节3V纽扣电池供电,我们在面包板上实验发现用纽扣电池供电,电压足够,可以正常工作。

但是纽扣电池储电量很小,工作一个小时左右电池就没电了。

工作不持久,故舍去该方案。

方案三:采用废手机的电池供电。

手机电池上面有三个端口,有两个两端电压为 3.7V,另两端电压为4.2V,我们使用4.2V的电压供电。

手机电池重量轻,容量大,可充电长时间、多次使用。

并且在面包板经过实验,可以稳定使用。

比较这三种方案,我们采用了方案三。

5.电机选择方案方案一:采用步进电机,步进电机具有精确定位,速度易控制,但速度较低,不能达到显示字符的速度要求。

方案二:采用直流电机,转速高,价格低廉,有些直流电机速度也较稳定。

我们在实验室找到了一个旧直流电机,通过测试转速,发现还算稳定,所以我们就采用了直流电机作为动力装置三、理论分析计算与硬件电路图1.LED阵列模块1.1 系统框图·2 理论分析与参数计算·2.1 线状点阵LED 驱动参数分析与计算该线状点阵中LED 驱动方法为普通的LED 与电阻串联的方式来驱动点亮LED ,该限流电阻计算公式如下:IFVF Vcc LED LED -=-=工作电流正向稳定电压电源电压限流电阻 根据设计要求,V Vcc 3.3=,V VF 2.1=,mA IF 20=可求得限流电阻:Ω=-=105202.13.3mAV V R 经计算采用Ω100电阻与LED 串联即可。

·2.2 线阵LED 运动参数分析与计算 在电机的带动下,线阵LED 依靠旋转平台进行旋转,设电机周期为t ,LED 完成需要时间为1t ,软件延时为2t ,它们之间存在下列关系:21t t t +=只要保证21t t t +=,经计算由ms t 40=,ms t 352=得ms t 51=,线阵LED 就能很好的地显示图文。

·2.3 指针式秒表分析与计算指针秒表完全通过软件来控制显示,设电机周期为t ,LED 完成需要时间为1t ,软件延时为3t 、4t ,存在下列关系:431t t t t ++=保证431t t t t ++=成立,确定LED 完成需要时间为ms t 51=,线阵LED 就能很好的地显示秒表计时。

·2.4 显示亮度自动调节分析与计算采用TI 的TLC555、电容1C ,2C 、电阻1R ,2R 和光敏电阻3R 等组成振荡电路产生稳定的PWM 波输出。

则产生PWM 波的周期、高电平及其占空比的计算公式如下:232321)2(7.0C R R R R R T ∙+∙+∙=周期: 2)(2323211Ln C R R R R R T ∙∙++=高电平时间: 21:T T q =占空比 光敏电阻的变化引起输出PWM 波占空比的变化,从而改变显示亮度,即电流控制。

控制电流大小计算如下:mA V V V R U U Vcc I LED 151003.0*22.13.3*28050=Ω--=--=3硬件系统·3.1 单片机G2553控制电路的设计控制电路主要有单片机MSP430G2553、串并转换芯片74HC164、16个限流电阻和16个LED 组成的。

单片机很好地利用软件程序发送串行数据,通过串并转换芯片把从单片机发出的数据通过限流电阻并行送到16个LED ,控制线阵LED 显示图文,单片机G2553控制电路图见附图。

4.起始标志杆检测电路图四.软件程序#include<msp430g2553.h> //单片机头文件#define CPU_F ((double)1000000)#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) // 调用delay_ms(2000);延时2000MS #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) // 调用delay_us(x); 延时X us#define L_WR P1OUT &= ~BIT5#define H_WR P1OUT |= BIT5#define L_CLK P2OUT &= ~BIT0#define H_CLK P2OUT |= BIT0#define L_DAT0 P2OUT &= ~BIT1#define H_DA T0 P2OUT |= BIT1#define L_DAT1 P2OUT &= ~BIT2#define H_DA T1 P2OUT |= BIT2#define L_EN P2OUT &= ~BIT3#define H_EN P2OUT |= BIT3//#define KEY P1; //霍尔传感器A04E 设置中断标志位unsigned char const zimu[],aa[];unsigned char t=0;unsigned char m=0;unsigned char x=0,y=0;/******************************************************************************************* **函数名:关闭所有LED灯(操作硬件)结果:所有LED灯熄灭******************************************************************************************** **/void DISPLAY_OFF (void){delay_us(50);//显示停留L_WR;H_WR;}/******************************************************************************************* ***//******************************************************************************************* **参数:16位显示数据(下高位)(d:上面8位,e:下面8位)******************************************************************************************** **/void display(unsigned char const d,unsigned char const e) //第1列横向显示程序{unsigned char i,a,b;L_EN;a=d; b=e;for(i=0;i<8;i++){L_CLK;if((a&0x80)==0x80)H_DA T0;elseL_DA T0;if((b&0x80)==0x80)H_DA T1;elseL_DA T1;H_CLK;a<<=1; b<<=1;}H_EN;DISPLAY_OFF();}void display1(unsigned char const d,unsigned char const e) //第1列横向显示程序{unsigned char i,a,b;L_EN;a=e; b=d;for(i=0;i<8;i++){L_CLK;if((a&0x80)==0x80)H_DA T0;elseL_DA T0;if((b&0x80)==0x80)H_DA T1;elseL_DA T1;H_CLK;a<<=1; b<<=1;}H_EN;}/**************************************************************************** 时钟初始化***************************************************************************/void OSCILLATOR_Init(void){if (CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF){while(1);} // If calibration constants erased, trap CPU!!BCSCTL1 = CALBC1_1MHZ; // Set rangeDCOCTL = CALDCO_1MHZ; // Set DCO step + modulationBCSCTL3 |= LFXT1S_2; // Set LFXT1IFG1 &= ~OFIFG; // Clear OSCFault flagBCSCTL2 |=SELM_1 + SELS + DIVM_0; // Set MCLK}/******************************************************************************************* **函数名:IO初始化程序******************************************************************************************** **/void init (void) //初始IO接口状态{P1DIR = 0xff;P2DIR = 0xff;P1OUT = 0xff;P2OUT = 0xff;}/***************************************************************************** 定时器初始化*************************************************************************/void TIMER(){TACTL = TASSEL_2 + MC_1 ; // SMCLK, Contmode 使计数模式为增计数CCTL0 = CCIE; // CCR0 interrupt enabledCCR0 = 14000; //初始值为14000相当于1s}/************************************************************************* 扫描中断初始化函数******************************************************************************/ void Z_init(){P1DIR &= ~BIT4;P1DIR &= ~BIT0;P1SEL &= ~BIT4;P1SEL &= ~BIT0;P1IFG &= ~BIT4;P1IFG &= ~BIT0;P1IE |= BIT4;P1IE |= BIT0;P1IES &= ~BIT4;P1IES |= BIT0;}/******************************************************************************/ void LDE_0() //16个LED逐个亮1S{unsigned char i=0;for(i=0;i<32;i+=2){display1(aa[i],aa[i+1]);delay_ms(1000);}// P2OUT |= BIT2; //启动电机delay_ms(10);_EINT(); //开中断}/***************************************************************************/ void LED_1() //同心圆从大到小0.3S{unsigned char i=0;for(i=0;i<32;i+=2){display1(aa[i],aa[i+1]);delay_ms(300);}}/***************************************************************************/ void LED_2() //同心圆从小到大0.3S{unsigned char i;for(i=32;i>0;i-=2){display1(aa[i-2],aa[i-1]);delay_ms(300);}}/*****************************************************************************/ void LED_3() //TI杯显示{unsigned char a;unsigned int c=0; //数据指针for(a=0;a<55;a++){display(zimu[c],zimu[c+1]);c=c+2; //产生显示一列移位}delay_ms(25);delay_us(700);}/****************************************************************************/ void LED_4() //指针式秒表{unsigned char i;y++;if(y==30){y=0;x++;}if(x==60)x=0,y=0;for(i=61-x;i>1;i--){delay_us(1000);}display(0xff,0xff);//TIMER();}/***************************************************************************** 函数名:主函数******************************************************************************/ void main (void){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;OSCILLATOR_Init(); //时钟初始化init(); //IO初始程序Z_init(); //中断初始化LDE_0(); //启动自检开中断while(1){}}/**************************************************************************/#pragma vector=PORT1_VECTOR //霍尔中断__interrupt void port_1(void){if(P1IFG&BIT0){delay_ms(1);if(P1IFG&BIT0){t++;if(t==5)t=1;P1IFG &=~(BIT0);}}if(P1IFG&BIT4){// delay_ms(1);P1IFG &=~(BIT4);if(t==1)LED_1();if(t==2)LED_2();if(t==3)LED_3();if(t==4)LED_4();}}//Timer A0 interrupt service routine#pragma vector=TIMER0_A0_VECTOR__interrupt void Timer_A0 (void){m++;if(m>60)m=0;}/****************************************************************************** 字幕数组*******************************************************************************/ unsigned char const aa[] = { //从外到内,一次点亮0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,};unsigned char const zimu[] = {// (取码:从上到下从左到右,纵向8位下高位)//TI杯0x04,0x02,0x04,0x01,0x84,0x00,0xE4,0x0F,//不0x1C,0x00,0x84,0x00,0x04,0x01,0x04,0x06,0x04,0x00,0x00,0x00,0x00,0x00,0x10,0x04,0x10,0x03,0xd0,0x00,0xFe,0x0F,//木0x50,0x00,0x90,0x00,0x10,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: I --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F,0x08,0x08,0x08,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: T --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x08,0x00,0x08,0x00,0x08,0x00,0xF8,0x0F,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};。

相关主题