线阵LED图文显示装置.docx
- 文档编号:17025496
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:21
- 大小:360.60KB
线阵LED图文显示装置.docx
《线阵LED图文显示装置.docx》由会员分享,可在线阅读,更多相关《线阵LED图文显示装置.docx(21页珍藏版)》请在冰点文库上搜索。
线阵LED图文显示装置
·1系统方案论证与比较
·1.1单片机G2553控制选择
采用TI公司的MSP430G2553,该单片机具有超低功耗及强大的处理能力,并有高性能模拟技术及丰富的片上外围模块,其构成系统工作稳定,具有方便高效的开发环境,因此在性价比、功耗、速度都优越于其他控制器。
·1.2电机的比较与选择
方案一:
采用步进电机来带动旋转平台,步进电机是将电脉冲信号转变为角位移或线位移的控制元件,使得在速度、位置等控制领域用步进电机变的非常简单。
故不选择。
方案二:
运用直流电机带动旋转平台,直流动机具有调速性能好、起动容易、能够载重起动等优点,所以目前直流电动机的应用仍然很广泛。
因为步进电机转速不易调整,而直流电机机械特性和调节特性的线性度好,调速范围广、维护方便,满足题目要求,所以我们选择直流电机带动旋转平台。
·1.3电机驱动电路比较与选择
方案一:
中功率三级管直接搭建。
在电机驱动要求不高的地方可以由三极管直接搭建一个驱动电路,使用三级关搭建的电机驱动电路电路简单,但功率和性能一般。
对输入信号要求较高,输出性能只能满足一般要求。
方案二:
使用单片机MSP430G2553控制电机驱动芯片L298N。
L298N的驱动能力强,输入电压可变化范围大,是一块专用直流电机驱动芯片。
其各项性能都较好,但价格较高,在电机要求驱动器较高的地方使用较佳。
在该系统中,带动旋转平台的直流电机使用L298N驱动模块,很容易实现对电机较稳的控制,故采用方案二。
·1.4亮度自动调节电路比较与选择
方案一:
采用线性较好的光敏电阻,将光敏电阻串入控制电路的输出端再接入线阵LED灯,当光亮度变化时即可改变电流大小,从而达到亮暗调节。
但是电路不稳定,故不采取此方案。
方案二:
采用光敏电阻与TLC555搭建电路。
用TLC555、电容、电位器组成振荡电路产生稳定的PWM波输出。
而光敏电阻的变化引起输出PWM波占空比的变化,从而改变显示亮度。
电路简单,且易于控制,因此选定此方案作为环境亮度变化调节电路。
·2理论分析与参数计算
·2.1线状点阵LED驱动参数分析与计算
该线状点阵中LED驱动方法为普通的LED与电阻串联的方式来驱动点亮LED,该限流电阻计算公式如下:
根据设计要求,
,
,
可求得限流电阻:
经计算采用
电阻与LED串联即可。
·2.2线阵LED运动参数分析与计算
在电机的带动下,线阵LED依靠旋转平台进行旋转,设电机周期为
,LED完成需要时间为
,软件延时为
,它们之间存在下列关系:
只要保证
,经计算由
,
得
,线阵LED就能很好的地显示图文。
·2.3指针式秒表分析与计算
指针秒表完全通过软件来控制显示,设电机周期为
,LED完成需要时间为
,软件延时为
、
,存在下列关系:
保证
成立,确定LED完成需要时间为
,线阵LED就能很好的地显示秒表计时。
·2.4显示亮度自动调节分析与计算
采用TI的TLC555、电容
,
、电阻
和光敏电阻
等组成振荡电路产生稳定的PWM波输出。
则产生PWM波的周期、高电平及其占空比的计算公式如下:
光敏电阻的变化引起输出PWM波占空比的变化,从而改变显示亮度,即电流控制。
控制电流大小计算如下:
·3电路与程序设计
·3.1电路设计
·3.1.1系统总体方案设计
本系统将外接的12V电源给电机供电,4.2V电源为控制器供电,通过电源调压芯片LP2950-33LPR为系统提供3.3V电压。
单片机按照一定的算法控制电机的转动,使电机转动稳定以完成各种控制动作,总体设计框图如图1。
图1
·3.1.2系统电源设计
系统需要12V、3.3V电源,采用12V开关电源给直流电机供电,需要的3.3V电压则从4.2V锂电池通过TI公司的电源调压芯片LP2950-33LPR位系统提供3.3V电压,系统电源电路图见附图一。
·3.1.3单片机G2553控制电路的设计
控制电路主要有单片机MSP430G2553、串并转换芯片74HC164、16个限流电阻和16个LED组成的。
单片机很好地利用软件程序发送串行数据,通过串并转换芯片把从单片机发出的数据通过限流电阻并行送到16个LED,控制线阵LED显示图文,单片机G2553控制电路图见附图二。
·3.1.4亮度自动调节电路设计
通过采用TI公司的芯片TLC555与光敏电阻搭建电路。
用TLC555、电容、电位器组成振荡电路产生稳定的PWM波输出。
而光敏电阻的变化引起输出PWM波占空比的变化,从而改变显示亮度,实现亮度随外界环境变化而自动调节,亮度自动调节电路图见附图三。
`3.1.5起始标志杆检测电路设计
本电路采用霍尔传感器采集数据并检测标志杆,把霍尔传感器固定到旋转平台,一块小磁铁固定到标志杆上,并与霍尔传感器水平一条线放置。
当旋转平台边缘上网霍尔传感器经过标志位的小磁铁时,传感器感应到磁场发生变化,同时产生输出电压脉冲,并将此脉冲送入单片机。
起始标志杆检测电路图见附图四。
·3.2程序设计
·3.2.1主程序设计
当系统上电后单片机初始化后,先进行LED检测,按键触发计数选择显示不同的图文,程序则按照相应部分的程序算法执行,主程序流程图如图2。
图2
·4测试结果
·4.1测试仪器
示波器DS1302CA、万用表DT-9205
·4.2测试结果完整性
1.完成制作一个由16只LED构成的线状点阵及其控制电路,安装于可旋转的平台上,在平台的中心设置一个按键,用于功能的切换,电机带动平台以合适速度旋转。
2.开机时装置完成显示自检,能对点阵中16只LED逐个点亮,每只LED显示时间约为1秒,此时平台不旋转。
3.通过按键切换,实现16个同心圆图形分别顺序<由大到小)和逆序<由小到大)显示,每个同心圆图形显示时间为0.3秒左右。
4.LED显示亮度能依据环境亮度变化自动调节。
5.通过按键切换,显示字符“TI杯”,要求字符显示较稳定,无明显漂移。
6.通过按键切换,显示一个指针式秒表,该秒表以标志杆为起始标志,秒针随时间动态旋转,旋转一周的时长为60±1秒。
·4.3测试结果分析
经过测试,可以确定系统构架设计比较合理,可以很好确定旋转平台的中心,电路功能实现基本符合设计要求。
·5结束语
经过多日的辛勤努力,系统架构设计合理,功能电路实现较好,系统性能优良、稳定,较好地达到了题目要求的各项指标,在硬件调试的过程中,我们遇到很多问题。
因为时间紧,工作量大,系统还存在许多可以改进的地方。
本次竞赛锻炼了我们各方面的能力,虽然我们遇到了很多困难和障碍,但总体上成功与挫折交替,困难与希望并存,我们将继续努力争取更大的进步。
·参考文献:
[1]秦龙编著.《MSP430单片机常用模块与综合系统实例精讲》.北京:
电子工业出版社,2007.7
[2]沈建华等.《MSP430系列16位超低功耗单片机实践与系统设计》.北京:
清华大学出版社,2005.4
[3]郁有文等.《传感器原理及项目应用》.西安:
西安电子科技大学出版社.2008.6
[4]张剑平编著.《模拟电子技术教程》.北京:
清华大学出版社.2018.3
[5]龙治红、谭本军编著。
《数字电子技术》.北京:
北京理工大学出版社.2018.7
·附录一:
1.系统电源电路图<见附图一)
附图一
2.单片机G2553控制电路图见附图二
附图二
3.亮度自动调节电路图<见附图三)
附录三
4.起始标志杆检测电路图<见附图四)
附图四
5.电机驱动电路图<见附图五)
附图五
·附录二:
#include
#defineCPU_F((double>1000000>
#definedelay_us(x>__delay_cycles((long>(CPU_F*(double>x/1000000.0>>//调用delay_ms(2000>。
延时2000MS
#definedelay_ms(x>__delay_cycles((long>(CPU_F*(double>x/1000.0>>//调用delay_us(x>。
延时Xus
#defineL_WRP1OUT&=~BIT5
#defineH_WRP1OUT|=BIT5
#defineL_CLKP2OUT&=~BIT0
#defineH_CLKP2OUT|=BIT0
#defineL_DAT0P2OUT&=~BIT1
#defineH_DAT0P2OUT|=BIT1
#defineL_DAT1P2OUT&=~BIT2
#defineH_DAT1P2OUT|=BIT2
#defineL_ENP2OUT&=~BIT3
#defineH_ENP2OUT|=BIT3
//#defineKEYP1。
//霍尔传感器A04E设置中断标志位
unsignedcharconstzimu[],aa[]。
unsignedchart=0。
unsignedcharm=0。
unsignedcharx=0,y=0。
/*********************************************************************************************
函数名:
关闭所有LED灯<操作硬件)
结果:
所有LED灯熄灭
**********************************************************************************************/
voidDISPLAY_OFF(void>
{
delay_us(50>。
//显示停留
L_WR。
H_WR。
}
/**********************************************************************************************/
/*********************************************************************************************
参数:
16位显示数据<下高位) 上面8位,e: 下面8位) **********************************************************************************************/ voiddisplay(unsignedcharconstd,unsignedcharconste>//第1列横向显示程序 { unsignedchari,a,b。 L_EN。 a=d。 b=e。 for(i=0。 i<8。 i++> { L_CLK。 if((a&0x80>==0x80> H_DAT0。 else L_DAT0。 if((b&0x80>==0x80> H_DAT1。 else L_DAT1。 H_CLK。 a<<=1。 b<<=1。 } H_EN。 DISPLAY_OFF(>。 } voiddisplay1(unsignedcharconstd,unsignedcharconste>//第1列横向显示程序 { unsignedchari,a,b。 L_EN。 a=e。 b=d。 for(i=0。 i<8。 i++> { L_CLK。 if((a&0x80>==0x80> H_DAT0。 else L_DAT0。 if((b&0x80>==0x80> H_DAT1。 else L_DAT1。 H_CLK。 a<<=1。 b<<=1。 } H_EN。 } /**************************************************************************** 时钟初始化 ***************************************************************************/ voidOSCILLATOR_Init(void> { if(CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF> {while(1>。 }//Ifcalibrationconstantserased,trapCPU! ! BCSCTL1=CALBC1_1MHZ。 //Setrange DCOCTL=CALDCO_1MHZ。 //SetDCOstep+modulation BCSCTL3|=LFXT1S_2。 //SetLFXT1 IFG1&=~OFIFG。 //ClearOSCFaultflag BCSCTL2|=SELM_1+SELS+DIVM_0。 //SetMCLK } /********************************************************************************************* 函数名: IO初始化程序 **********************************************************************************************/ voidinit(void>//初始IO接口状态 { P1DIR=0xff。 P2DIR=0xff。 P1OUT=0xff。 P2OUT=0xff。 } /***************************************************************************** 定时器初始化 *************************************************************************/ voidTIMER(> { TACTL=TASSEL_2+MC_1。 //SMCLK,Contmode使计数模式为增计数 CCTL0=CCIE。 //CCR0interruptenabled CCR0=14000。 //初始值为14000相当于1s } /************************************************************************* 扫描中断初始化函数 ******************************************************************************/ voidZ_init(> { P1DIR&=~BIT4。 P1DIR&=~BIT0。 P1SEL&=~BIT4。 P1SEL&=~BIT0。 P1IFG&=~BIT4。 P1IFG&=~BIT0。 P1IE|=BIT4。 P1IE|=BIT0。 P1IES&=~BIT4。 P1IES|=BIT0。 } /******************************************************************************/ voidLDE_0(>//16个LED逐个亮1S { unsignedchari=0。 for(i=0。 i<32。 i+=2> { display1(aa[i],aa[i+1]>。 delay_ms(1000>。 } //P2OUT|=BIT2。 //启动电机 delay_ms(10>。 _EINT(>。 //开中断 } /***************************************************************************/ voidLED_1(>//同心圆从大到小0.3S { unsignedchari=0。 for(i=0。 i<32。 i+=2> { display1(aa[i],aa[i+1]>。 delay_ms(300>。 } } /***************************************************************************/ voidLED_2(>//同心圆从小到大0.3S { unsignedchari。 for(i=32。 i>0。 i-=2> { display1(aa[i-2],aa[i-1]>。 delay_ms(300>。 } } /*****************************************************************************/ voidLED_3(>//TI杯显示 { unsignedchara。 unsignedintc=0。 //数据指针 for(a=0。 a<55。 a++> { display(zimu[c],zimu[c+1]>。 c=c+2。 //产生显示一列移位 } delay_ms(25>。 delay_us(700>。 } /****************************************************************************/ voidLED_4(>//指针式秒表 { unsignedchari。 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(>。 } /***************************************************************************** 函数名: 主函数 ******************************************************************************/ voidmain(void> { //Stopwatchdogtimertopreventtimeoutreset WDTCTL=WDTPW+WDTHOLD。 OSCILLATOR_Init(>。 //时钟初始化 init(>。 //IO初始程序 Z_init(>。 //中断初始化 LDE_0(>。 //启动自检开中断 while(1> {} } /**************************************************************************/ #pragmavector=PORT1_VECTOR//霍尔中断 __interruptvoidport_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(>。 } } //TimerA0interruptserviceroutine #pragmavector=TIMER0_A0_VECTOR __interruptvoidTimer_A0(void> { m++。 if(m>60>m=0。 } /****************************************************************************** 字幕数组 *******************************************************************************/ unsignedcharconstaa[]={//从外到内,一次点亮 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, }。 unsignedcharconstzimu[]={//(取码: 从上到下从左到右,纵向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, }。 申明: 所
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线阵 LED 图文 显示装置