LED旋转灯

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

线阵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和单片机。

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

综合以2
2、处理器选取方案
方案一:采用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 ,该限流电阻计算公式如下:
IF
VF Vcc LED LED -=-=工作电流正向稳定电压电源电压限流电阻 根据设计要求,V Vcc 3.3=,V VF 2.1=,mA IF 20=可求得限流电阻:
Ω=-=
105202.13.3mA
V 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 波的周期、高电平及其占空比的计算公式如下:
23
2321)2(7.0C R R R R R T ∙+∙+∙=周期: 2)(23
23211Ln C R R R R R T ∙∙++=高电平时间: 2
1: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;
else
L_DA T0;
if((b&0x80)==0x80)
H_DA T1;
else
L_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;
else
L_DA T0;
if((b&0x80)==0x80)
H_DA T1;
else
L_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 range
DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation
BCSCTL3 |= LFXT1S_2; // Set LFXT1
IFG1 &= ~OFIFG; // Clear OSCFault flag
BCSCTL2 |=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 enabled
CCR0 = 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 reset
WDTCTL = 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,
};。

相关文档
最新文档