当前位置:文档之家› LED书写点阵论文

LED书写点阵论文

LED书写点阵论文
LED书写点阵论文

题目名称:LED点阵书写显示屏

广东工业大学自动化学院参赛队员:杨健锐杨浩罗明枝

摘要:LED点阵书写显示屏由主要核心控制模块、LED点阵屏模块、光笔检测电路、光敏电阻检测电路、继电器控制模块、键盘模块、液晶显示模块和开关电源组成。以ATMEGA32作为控制核心,用了八块74HC573、四块ULN2803达林顿阵列驱动芯片和32个9012 PNP三极管为32X32 LED点阵屏的驱动,用键盘控制各个功能的切换并通过液晶显示出来,通过光笔来检测LED点阵屏各个点所处的状态。本系统的硬件功能完善并且实现了点亮、划亮、反显、整屏擦除,笔画擦除、连写多字、对象拖移、屏亮自动调节以及超时自动关闭等基本功能和发挥功能。

关键字: LED点阵光笔检测书写显示屏

Abstract:LED dot matrix display is based on the main core of writing control module, LED dot matrix display modules, Electronic Stylus detection circuit, LDR detection circuit, relay control module, the keyboard module, LCD modules and switching power supply component. To ATMEGA32 as the control, with the eight pieces of 74HC573, four pieces of ULN2803 Darlington array driver IC and 32 9012 PNP transistors as the 32 * 32LED dot matrix display driver, uses the keyboard to switch the various functions and display on the liquid crystal display, through the Electronic Stylus to detect the LED dot matrix display and check the state of each point. The system's hardware has complete-function and achieves the functions such as light, bright program, anti-significant, clear, erase and writing characters, drag objects, automatically adjusts bases on ambient light changes and automatically close.

Keyword: LED Dot Matrix 、 Electronic Stylus Detection 、

Writing Display

一、前言

二、总体方案设计 (3)

2.1主控器选择方案论证 (3)

2.2点阵驱动方案论证 (3)

2.3系统供电模块方案的比较与选择 (3)

2.4点阵数据驱动方案 (4)

2.5点阵电流驱动方案 (4)

三、单元模块设计 (5)

2.1 光笔选取与参数设计 (5)

2.2 LED点阵屏驱动参数设计 (5)

2.3 屏亮自动调节设计 (8)

2.4 超时关显示节电设计 (8)

3.系统电路与程序设计 (8)

3.1 系统工作原理 (8)

3.2 光笔检测电路的设计 (9)

3.3 电源电路的设计 (9)

3.4 整个系统构架 (10)

3.5 系统软件设计流程图 (11)

五、系统功能、指标参数 (12)

4.1 划亮反显擦除拖移的测试和结果 (12)

4.2 屏亮自动调节测试和结果 (12)

4.3 超时关显示节电测试和结果 (12)

4.4 结果汇总 (13)

六、设计总结 (13)

7 参考文献 (15)

8 附录(部分主要程序函数) (15)

一、系统方案比较与选择

1.1主控器选择方案论证

方案一:采用AT89C51作为主控器件,用来实现题目所要求的各种功能。此方案最大的特点是系统成本较低。但是,单片机在处理高速信号时略显吃力,最重要的是要片内RAM不够储存四个汉字的编码,难以实现连写多字。51单片机很难实现这一要求。

方案二:方案二:用 FPGA 作为系统控制器,FPGA可以直接用硬件扫描、编码、解码、纠错,速度快、稳定性高、扩展性能好、体积小,可以提供丰富的逻辑单元和I/O 资源。但是成本高,我们三名队员都没学过,短时间内难以掌握

方案三:采用具有低功耗、速度高、I/O口资源灵活、功能强大和稳定性强的ATMEGA32作为主控器件,可以实现题目所要求的各种功能。ATMEGA32是最新发展的技术,具有很高的速度以及存储空间能够很好的实现题目对扫描速率的要求和连写多字的要求。而且内部集成AD模块,外围电路可以少一点。

经比较:为了能够很好的完成题目的基本要求以及发挥部分,经综合考虑后本系统采用方案三。

1.2、光笔制作方案的比较与选择

方案一:采用光敏电阻完成光笔的制作。采用光敏电阻其性价比高,器件容易寻找,但其灵敏度极低,变换速度慢且其光电特性呈非线性,不适合做多状态的检测器件且其很难满足2秒内能划过并点亮40个点的要求。

方案二:采用光电三极管完成光笔的制作。光电三极管光电流大,响应时间短,且其灵敏度非常高,可以满足题目划亮要求。

经比较,方案三能够很好的满足题目的要求,所以本系统采用方案三

1.3、系统供电模块方案的比较与选择:

方案一:采用集成稳压电路。集成稳压电路,其功能是

稳定直流输出电压,如图所示,用LM7805集成稳压器组成

的稳压电路所用器件较少,性能稳定、价格低廉,适合于普

通的供电系统电路。但是其最大输出电流略显不足,当电路

电流大的时候,电压并不是是那么稳定,而且变压器体积大。

方案二:采用开关电源。开关电源体积小,携带方便,效率高,输出稳定,更适合于较大的负载电路,在大驱动电流的电路中电压的稳定对系统的稳定有很大影响。而其市场上有成品,很容买到。把开关电源并上大电容和滤波电容就可以很好的避开电流大幅度变化时对系统造成的干扰。

经分析,比较其优缺点以及考虑到性能稳定性的参考基准上,更要考虑到能满足点阵屏的工作电流还要有余量,我们选定方案三做系统的供电方案。

1.4、点阵数据驱动方案

方案一:串行方式显示

这种显示方式由数据移位寄存器74HC595和列驱动器组成,点阵显示屏可以用少量I/O口接收控制器传输下来的大量数据,此方案为点阵显示屏系统中比较常用的,所用器件也比较常用,容易买到。但是它存在一个致命的缺点,就是刷新速度不够快,高速度的地址编码信息无法发送。

方案二:并行方式显示

可以通过锁存器芯片来增强ATMEGA32的I/O口的驱动能力,将32位宽的数据同时输入到LED点阵列中,达到并行控制LED点阵的目的。方案中运用8片锁存器74HC573来组成缓冲寄存器,而且刚好占用16个I/O口,驱动LED点阵。由于并行数据传输速度非常快,所以高速度的地址编码信息可以同步发出。

综上所述,本设计最终选择了第二个方案。

1.5、点阵电流驱动方案

方案一:行列都用三极管来驱动,这样可以驱动整个点阵,但最大的亮度稍低,而且当三极管的最大电流不是很高,且只亮一颗灯和亮32个灯的亮度明显不一样,这样当显示字是就会花屏,相当不好看。

方案一:列用ULN2803达林顿阵列驱动芯片来驱动,这样完全可以驱动整个点阵,行用三极管组成32个电流源,这样可以保证每个LED灯亮度一样,这样当显示字的时候亮度均匀,而且亮度高。

二:理论分析与计算:

2.1:光笔选取与参数设计

依据题目要求,光电笔要能够检测到每个行或列,扫描是先执行列扫描确定横坐标,再执行行扫描确定纵坐标,两次扫描执行时间在一毫秒之内,每扫描一行或列的时间是15us左右,故要求光电笔的分辨率要有66KHz以上,而光电三极管(3DU33)能达到一兆以上,满足此要求。

2.2: LED点阵屏驱动参数设计

依据题目要求,本系统采用的是32*32点阵屏,所用的点阵屏由1024个极管组成,每颗二极管全亮需5mA电流,经计算若使点阵屏全亮则需的流5.12A,由于是用扫描的方式来显示的,所以系统每时每刻做多只有一行是亮的,估计大概系统所需的最大电流为0.7A。为了使点阵屏有更大的驱动电流和很好的显示效果,本系采用由ULN2803达林顿阵列驱动芯片来驱动,这样完全可以驱动整个点阵,而点阵显示屏的行用三极管组成32个电流源,基极电阻选用10k电阻,这样每个电流源大概有40mA电流,但并不是每时每刻都供电,平均大概也就3、4毫安。这样可以保证每个LED灯亮度一样,显示的时候亮度均匀,足够驱动起整个显示屏,而且亮度高。

以下是整个点阵以及其驱动电路的电路图:

2.3:屏亮自动调节设计

本设计光敏电阻,利用光敏电阻的光电特性,从亮到暗,阻值大概从100欧上升到1M欧以上,故串联上10k电阻,双端加上5伏电压,这样由暗到亮的电压变化范围为0伏到5伏。由A TMEGA32自带AD读出电压从而实现自动调节亮度。

2.4:超时关显示节电设计

要使能自动关闭屏上显示,并使整个系统进入休眠状态,此时系统工作电流不大于5mA,当系统进入休眠状态,实际上电路还处于微导通状态,故采用继电器给核心系统之外的电路供电,当系统休眠时切断电源,这样就不会有额外耗损。而ATMEGA32在掉电模式状态工作电流在1mA以下。

三、系统电路与程序设计

3.1 系统工作原理

以ATMEGA32为主控,系统包括 LED扫描为主的多功能模块、按键管理模块、LCD控制等,通过微亮扫描来确定光电笔检测来确定点的坐标,通过键盘进行功能切换以实现点亮、划亮、擦除、区域拖拽,反显,用继电器功耗管理模块对各模块时钟的控制可以实现节电的功能。

3.2:光笔检测电路的设计

本模块用3DU系列光电三极管做传感器(笔头),经过电压比较器器对采集,使之成为单片机能够读取的高低电平,本系统通过软件排错,微亮检测到之后再进行编码检验,有效排除外界环境光的干扰,即使光电笔对着强光也不会出现错误。

3.3:电源电路的设计

本系统采用的是体积小,携带方便,效率高,输出稳定的开关电源,开关电源市场上可以很方便买到,因本系统所需电流较大,而且变化很大,故需对之进行进一步稳压和滤波。

3.4 整个系统构架图

3.5系统软件设计流程图

四、系统测试与结果

4.1 划亮反显擦除拖移的测试和结果

各模块均调通,将调好的模块连在一起,加上5v电压源,启动进行系统初始化。按键进入点亮模式,用光电笔在LED点阵书写显示屏上接触,可以看到接触的点点亮,LCD上显示亮点的精确坐标。用光笔快速的在书写显示屏上划过,发现划过的地方变亮,多次操作都能实现。选择功能进入反显模式,这是屏幕上原本亮的地方变暗而暗的地方变亮了,反显测试正常。选择功能进入擦除模式,用光笔在屏幕上划过,显示屏亮的地方变暗了。选择功能进入清屏模式,可以看到整屏由亮变暗,实现了清屏这一功能。选择功能进入多字连写模式,用光笔在LED点阵显示屏上写逐步写上四个字,最后在屏上循环显示。最后对写的字用笔圈起来可以用笔移动。实现了对象拖移功能。经过反复的测试,所有的功能都能很好的实现,系统正常。

4.2屏亮自动调节测试和结果

外部光环境人为地改变后,结果屏亮随外部环境的变化而改变,可以实现随环境无级调亮,系统正常。

4.3 超时关显示节电测试和结果

加5v电压启动系统,对系统初始化,设定待机关显示的时间。不进行任何操作到设定的时间,看显示屏是否自动关闭。结果书写显示屏自动关闭,表明测试正常,但电流稍大了。

五、系统功能、指标参数

本系统结构简单,性能优良,不仅实现了基本功能,而且有很大的发挥为以下是题目要求和我们实际完成情况的对比表:

六、设计总结

我们这个作品系统纯手工打造,每一根线都是手工焊上去的,花了很多不少时间和心血。电路器件分布和布线也比较合理,整体外观也比较精美,电路制作结构简单,性能优良,不仅实现了基本功能,而且发挥功能大部分也实现了。其功能实现可以参照上面表格。

通过整整一个月的努力奋斗,遇到了许许多多的问题,但是在我们几个人的

努力下,很多问题都迎刃而解。刚开始在网上搜索了很多资料,其实我们队都是今年刚学单片机的,没什么把握能做好,我就先在8*8上面实验,结果还可以。所以准备开始,但是在点阵的驱动电路中徘徊了很久。刚开始打算用雕刻机刻电路板,我花了几天学了DXP,画好了电路图和PCB图,去我别的学校的一个同学那刻板,但是电路板太大了,雕刻机出错了,结果迫不得已决定手工焊电路板。

我们三个开始分工了但是电路图是我画的,对电路器件分布和布线会比较熟,所以我焊了显示屏电路,一队友负责写液晶显示模块和读取光敏电阻电压模块的程序,另外队友负责打造单片机最小系统和其外围电路。花了三天时间,跳了500多根线,显示屏做好了。但是出现我一直最担心的问题,led各点亮度不均匀,迫不得已改了电路,终于又解决了。这时队友的单片机最小系统也完成了(队友也辛苦了)。写入了队友的测试显示屏程序,但是又出现了我们先前无法预料的问题。我们卡在那里两天,后来才发现原来是显示屏电流太大,电源供电不稳定,给单片机造成了干扰,于是给电源并上大电容和滤波电容之后,系统终于稳定下来了。

这时开始写程序,因为在8*8先做过,所以写起程序很快,调用了队友写的液晶显示函数和读取光敏电阻电压函数(队友也很辛苦,也写了很多天)之后,基本功能都差不多了。但是时间已经剩下两天,但是还有几个很难的功能没实现。其实队友那时在写一个附加功能,一个贪吃蛇游戏,本来打算合并到里面。但是合并之后发现蛇不会走,而且时间很所剩无几了,无奈之下放弃了。还有最后一个功能对象拖移,我到最后通宵了一个晚上才勉强写出来,但是不是很完善。但是已经到交作品日期了。整个程序还没来得及改得更完善些,还有很多先前想到的附加功能我们不得不放弃,而且犯了一个很大错误,在那个待机功能设置好了掉电模式,却忘了打开,结果电流太大,这是交上作品才发现的。

这次设计受益匪浅,学到了很多东西,也体会到了绝望中见阳光的喜悦,克服了重重困难,终于完成了作品,我们已经很开心了,重要的是获得了很多学不来的经验和对付困难的应有的心态,懂得了以后如果再参加比赛,要好好计划和分工,千万不能再是时间来不及的那种匆匆忙忙。

对设计的建议:程序中把掉电模式打开,电流就可以保持在1mA以下,对程序的对象拖移模块进行优化一下,使拖移速率有所改善,光电笔改用机械开关,

电路外观可以再做得漂亮一些,可以再多添加多一点附加功能。

七、参考文献

[1] 童诗白华成英主编,模拟电子技术基础,高等教育出版社。

[2] 谭浩强,C程序设计,清华大学出版社,2005年7月第3版

八、附录(部分主要程序函数)

/*显示函数*/

void display(uchar liangdu) //点亮度参数的显示函数

{

uchar i,j,k,t,zi,k3;

uint p;

if(wei!=5) //如果少于5个字就显示当前的字

for(k=0;k<4;k++)

{

for(i=0;i<8;i++)

{

for(j=0;j<4;j++) //向列送数据

{

PORTD=d[wei][(32*k+4*i+j)];

PORTC=0x10<

PORTC=0x00;

}

PORTD=0x80>>i; //右移一列

PORTC=0x01<

PORTC=0x00;

for(t=0;t<(liangdu+5);t++);

cls(); //让屏幕一定时间实现亮度控制

for(t=0;t<70-liangdu;t++);

}

}

else

for(zi=1;zi<5;zi++) //如果有5个字循环显示后4个

{

for(p=0;p<350;p++)

{

k3=PINB&0X08;

if(k3==0x00)

{

delay1ms(2);

k3=PINB&0X08;

if(k3==0x00)

{

wei++;

if(wei==6)

{

wei=0;

}

while(k3==0)

k3=PINB&0X08;

return;

}

}

for(k=0;k<4;k++)

{

for(i=0;i<8;i++)

{

for(j=0;j<4;j++)

{

PORTD=d[zi][(32*k+4*i+j)];

PORTC=0x10<

PORTC=0x00;

}

PORTD=0x80>>i;

PORTC=0x01<

PORTC=0x00;

for(t=0;t

cls();

for(t=0;t<70-liangdu;t++);

}

}

}

}

}

//微亮列扫描

uchar lie()

{

uchar i,j,t,k,lie=34;

cls();

PORTD=0x00;

PORTC=0xf0;

PORTC=0x00;

for(i=0;i<4;i++)

{

for(j=0;j<8;j++)

{

PORTD=0x80>>j;

PORTC=0x01<

for(t=0;t<2;t++);

PORTD=0x00;

PORTC=0x00;

for(t=0;t<20;t++);

k=PINB&0X01; //读取光电三极管的返回的电平

if(k==0X01)

{

if(lie==34)

lie=(8*i+j);

}

}

PORTD=0x00;

PORTC=0x01<

PORTC=0x00;

}

cls();

return lie;

}

//微亮行扫描

uchar hang()

{

uchar i,j,t,k,hang=34;

cls();

PORTD=0xff;

PORTC=0x0f;

PORTC=0x00;

for(i=0;i<4;i++)

{

for(j=0;j<8;j++)

{

PORTD=0xfe<>(8-j);

PORTC=0x10<

for(t=0;t<55;t++);

PORTD=0xff;

PORTC=0x00;

for(t=0;t<5;t++);

k=PINB&0X01; //读取光电三极管的返回的电平

if(k==0X01)

{

for(t=0;t<70;t++);

k=PINB&0X01;

if(k==0)

hang=(8*i+j);

}

}

PORTD=0xff;

PORTC=0x10<

PORTC=0x00;

}

cls();

return hang;

}

/*AD读取函数*/

uint ad()

{

if(!sleep) //如果不在休眠模式下酒读取数据

{

uint addata;

DDRA&=~BIT(0);

PORTA&=~BIT(0);

ADMUX=0;

SFIOR=0;

ADCSRA=0X80;

ADCSRA|=BIT(ADSC);

while(!(ADCSRA&(BIT(ADIF))));

addata=ADCL;

addata=addata+ADCH*256; //把读到的高八位和低八位合并成一个数据return addata;

}

}

/*对象拖移的显示函数*/

void disp(uchar liangdu,char dx,char dy)//参数是亮度,和选区位移{

uchar i,j,k,t,h;

for(i=0;i<32;i++)

{

if(i+dx<0)

i=-dx;

for(j=0;j<4;j++)

{

if(dy>=0)

{

if(j==0)

{

//对端口进行数据处理

PORTD=~((~d[6][(4*i)])<<(dy%8));

PORTC=0x10<<(dy/8);

PORTC=0x00;

}

else

{

//对端口进行数据处理

PORTD=(d[6][(4*i+j)]<<(dy%8))|(d[6][(4*i+j-1)]>>(8-dy%8));

PORTC=0x10<<(j+dy/8);

PORTC=0x00;

}

}

{

if(j==0)

{

h=-dy;

PORTD=~((~d[6][(4*i+3)])>>((h)%8));

PORTC=0x80;

PORTC=0x00;

}

if(j<=3-(h)/8)

{

PORTD=(d[6][(4*i+3-j)]>>((h)%8))|((d[6][(4*i+4-j)]<<(8-(h)%8)));

PORTC=0x10<<(3-j-(h)/8);

PORTC=0x00;

}

}

k=(i+dx)/8;

t=(i+dx)%8;

PORTD=0x80>>t;

PORTC=0x01<

PORTC=0x00;

for(t=0;t<(liangdu+5);t++);

cls();

for(t=0;t<70-liangdu;t++);

}

}

}

/*进入休眠函数*/

void shutdown()

{

cls(); //清空锁存器数据,使其暗下来

//处理所有端口

DDRA=0x00;

DDRB=0x02;

DDRC=0x00;

DDRD=0x00;

PORTA=0xFF;

PORTB=0xFF;

PORTC=0xFF;

PORTD=0xFF;

ADCSRA=(0<

ACSR=(1<

MCUCSR=(0<

}

相关主题
文本预览
相关文档 最新文档