好好学习,天天向上,一流范文网欢迎您!
当前位置:首页 >> 最新范文 内容页

旋转LED设计报告

旋转LED设计报告 本文关键词:旋转,报告,设计,LED

旋转LED设计报告 本文简介:线阵LED图文显示装置设计报告一、任务设计并制作一个线阵LED图文显示装置。图1线阵LED图文显示装置示意图二、要求(1)开机时装置完成显示自检,能对点阵中16只LED逐个点亮,每只LED显示时间约为1秒,此时平台不旋转。(2)通过按键启动,实现16个同心圆图形分别顺序(由大到小)和逆序(由小到大)

旋转LED设计报告 本文内容:

线阵LED图文显示装置设计报告

一、任务

设计并制作一个线阵LED图文显示装置。

图1

线阵LED图文显示装置示意图

二、要求

(1)开机时装置完成显示自检,能对点阵中16只LED逐个点亮,每只LED显示

时间约为1秒,此时平台不旋转。

(2)通过按键启动,实现16个同心圆图形分别顺序(由大到小)和逆序(由小

到大)显示,每个同心圆图形显示时间为0.2秒左右;运行15秒左右自

动停止。

(3)通过按键启动,显示字符“TI杯”,要求字符显示稳定,无明显漂移;运

行20秒左右自动停止。

(4)通过按键启动,显示双渐开线;运行15秒左右自动停止。

(5)通过按键启动,显示一个指针式秒表,该秒表以标志杆为起始标志,秒针

随时间动态旋转,旋转一周的时长为60±1秒;运行70秒左右自动停止。

(6)改变转速,完成(2)的要求。

(7)LED显示亮度能依据环境亮度变化自动调节。

设计报告

摘要

显示装置利用人眼视觉暂留的生理特性,通过LED在旋转运动过程中经过不同位置时,系统点亮相应的LED,实现线阵LED在旋转平面上构成不同的静态或动态图案。

1、

系统方案

l

方案描述:

本系统是利用人眼视觉暂留效应设计出的,该系统主要由电机、标志杆、LED控制电路三部分组成。电机的作用就是带动电路部分进行旋转,这个部分的关键就在于电机的转速要均匀,这样才能保证图像在水平方向不会被局部伸展或者压缩。为了使LED转速保持稳定,我们采用使用匀速的直流电机。LED整列是旋转屏的显示主体,为LED显示控制电路的作用是将存储在芯片内图像或符号,在旋转位置感应信号的同步下,根据旋转的位置按列扫描显示在LED阵列上。这部分是整个系统的核心。

l

装置整体结构图

光照强度感应模块

按键检测模块

MCU

发光二极管显示模块

红外线接收模块

电源模块

电机驱动模块(可调转速)(独立的模块)

红外线发射模块(标志杆)(独立的模块)

l

原件的比较和选择

1.电源的选择

方案一:使用质量较轻的纽扣电池,位置可以随便放置,但是成本较高,使用时间短

方案二:使用废弃手机的手机电池,这种锂电池容量大,使用时间长,缺点是质量较重,在平衡系统时存在困难

方案三:使用三节5号电池,该电池容易购买,但是容量低于手机锂电池,同时质量较重,在平衡系统中存在着困难,

在考虑成本和供电时间时,选择了方案二。在开始焊接电路到调试成功的工程中,该电池依然电力充足,证明我们的选择是正确的

2.标志杆的选择

方案一:选择干簧管作为接收装置,在标志杆处固定一块永久磁铁,缺点是干簧管感应距离有些短

方案二:选择红外发射管和红外接收管作为感应开关,红外线发射管与接收管可以相距较远的距离

在装置旋转时,两者的相对距离可能会发生小幅的变化,在硬件焊接时,由于电机驱动的电路板过小,没有把标志杆和电机电路板固定,因此两者的相对位移会发生改变,两者相离太近,会出现两者碰撞的情况,选择可以相距较远的红外发射接收管可以避免两者的碰撞

3.驱动电机模块

方案一:采用步进电机。步进电机能够准确的定向,但是图像或者文字的分辨率受到步进电机的步进角度的限制。并且步进电机以及控制电路成本较高,并且需要单片机控制,占用CPU的资源。

方案二:采用普通的直流电机。此方案,使用方便,成本较低,通过简单的改装,可以给系统供电。

综合各方面考虑,为了节省成本,简单系统电路,以及更方便的为系统供电,使系统能够长期工作,故采用方案二。

4.

Led的选择

方案一:采用3mm的led,此方案运用方便、焊接简单、成本较低,但缺点是较重、体积较大不利于后期的系统平衡。

方案二:采用贴片的led,此方案质量较轻、体积小。但对焊接技术要求较高。

考虑本人的焊接技术,最终采用方案二。

2、

理论分析与计算

l

线状点阵LED驱动参数分析与计算

考虑到本系统才用手机电池供电最高电压4.2v,系统显示原理为逐列扫描,并且有调节led亮度的装置,最终采用470Ω的贴片电阻和led串联。

I=V/R→I=8mA

l

线阵LED运动参数分析与计算

本系统运用人眼视觉暂留的原理进行逐列扫描,且考虑到后期有秒表这个题目,最终决定每次扫描时的延时时间用软件进行延迟,具体的延时时间用keil

4

内部的程序调试进行计算

l

指针式秒表分析与计算

本题目要求在可以改变转速的情况下显示一个指针是秒表,考虑到电机转速可能随时变化,所以在每次开始扫描前通过测定转过上一圈所需要的时间然后分成60份,每一份的时间就是本次扫描每一秒所需的延时时间,同时用单片机的定时器来定时本次扫描应该扫描那一秒。

提取上次扫描所需的时间

t1=t2;//把上次的t2值赋给t1

t=n;//把定时器中断次数赋给t

n=0;//定时器中断次数清零

t2_1=TH0;//提取定时器中的值

t2_2=TL0;

t2=t2_1*256+t2_2;//计算定时器中的值得大小

s1=(long)(((50000*t)+t2-t1)*0.0004166667);

//计算本次扫描每秒需要的时间

数据说明:

//

n

当转速过高时一次扫描可能小于25ms,因此要分定时器发生中断和不发生中断两种情况

//(50000*t+t2-t1)*0.0004166667=(50000*t+t2-t1)*0.0000005/0.00002/60

//0.0000005计数器加一个数所需要的时间(24MHZ晶振)

//0.00002

x=1时高精度延时函数的延时时间(通过keil

4中的软件调试测量得到)

//60

(把一圈的时间平分为60份)

l

显示亮度自动调节分析与计算

本系统采用光敏电阻驱动一个s8050的三极管来给led供电,发光二极管的亮度可以随着光照强度的变化而变化,在一定范围内发光二极管的亮度随着光照强度的变化而变化,但是这个范围过于狭窄,于是先在光线检测电路中加了一个电位器来调节阻值,通过实验测量其需要的阻值,然后在换成定值电阻。

三、电路与程序设计

l

电路:

单片机模块

电机和红外发射模块

l

程序:

#include

#include

#define

uint

unsigned

int

#define

uchar

unsigned

char

sbit

KEY=P3^7;//按键位定义

uchar

xxx=0,num,pic=0,x123,z1=0,n=0,n1=0;

uint

t1_1=0,t1_2=0,t2_1=0,t2_2=0,t=0;

unsigned

long

s2=0,t1=0,t2=0,s1=0,a=0;

void

delay(uint

x)

{

uint

x1,x2;

for(x1=x;x1>0;x1--)

for(x2=415;x2>0;x2--);

}

void

yanshi(uint

x)

{

uint

x1;

for(x1=x;x1>0;x1--);

}

void

uyanshi(uint

x)

//高精度延时函数

当x=1时,时间为0.000

0027(S)【40MHZ晶振】

{

while(x--);

}

void

jiance()//检测

{uint

a1=1000;

uchar

a2=0xfe;//1111

1110

do

{

P1=a2;

delay(a1);

a2=_crol_(a2,1);

}

while(a2!=0xfe);

P1=0xff;

do

{

P2=a2;

delay(a1);

a2=_crol_(a2,1);

}

while(a2!=0xfe);

P2=0xff;

}

void

txy()//同心圆

{uchar

b1=4,b2=0xfe,b3=200;//1111

1110

while(b1)

{

do

{

P1=b2;

delay(b3);

b2=_crol_(b2,1);

}

while(b2!=0xfe);

P1=0xff;

do

{

P2=b2;

delay(b3);

b2=_crol_(b2,1);

}

while(b2!=0xfe);

b2=0xbf;

if(b1==1)

{P2=0xff;

break;}

do

{

P2=b2;

delay(b3);

b2=_cror_(b2,1);

}

while(b2!=0x7f);

P2=0xff;

do

{

P1=b2;

delay(b3);

b2=_cror_(b2,1);

}

while(b2!=0xfe);

P1=0xff;

b1--;

}

}

uchar

code

sjjx1[]={

0xff,0x7f,0xff,0x3f,0xff,0x1f,0xff,0x0f,0xff,0x07,0xff,0x03,0xff,0x01,0xff,0x00,0x7f,0x00,0x3f,0x00,0x1f,0x00,0x0f,0x00,0x07,0x00,0x03,0x00,0x01,0x00,0x00,0x00};

void

sjjx()//双渐近线

{

if(num>=100)

{

num=0;

x123=x123+2;

}

if(x123>=32)

{

TR0=0;

TH0=(65536-33333)/256;

TL0=(65536-33333)%256;

num=0;

n=0;

x123=0;

pic++;

}

yanshi(2400);

P1=sjjx1[x123];

P2=sjjx1[x123+1];

yanshi(8);

P1=0xff;

P2=0xff;

yanshi(4800);

P1=sjjx1[x123];

P2=sjjx1[x123+1];

yanshi(8);

P1=0xff;

P2=0xff;

}

uchar

code

TIbei1[]={

0xE7,0xFF,0xF7,0xFF,0xF7,0xDF,0x07,0xC0,0xF7,0xDF,0xF7,0xFF,0xE7,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xDF,0xF7,0xDF,0x07,0xC0,0xF7,0xDF,0xF7,0xDF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFB,0xEF,0xFC,0x2F,0xFF,0x00,0x00,0xAF,0xFF,0x6F,0xFB,0xFB,0xFD,0xFB,0xFE,0x7B,0xFF,0x1B,0x00,0xE3,0xFF,0x7B,0xFF,0xFB,0xFE,0xFB,0xF9,0xFB,0xFF,0xFF,0xFF,};

void

TIbei()

//TI杯

{

uint

a;

if(num>=100)

{

num=0;

x123++;

}

if(x123>=20)

{

TR0=0;

x123=0;

num=0;

n=0;

TH0=(65536-33333)/256;

TL0=(65536-33333)%256;

pic++;

}

for(a=0;a=100)

{

num=0;

x123=x123+2;

}

t1=t2;

//把上次的t2值赋给t1

t=n;

//把定时器中断次数赋给t

n=0;

//定时器中断次数清零

t2_1=TH0;

//提取定时器中的值

t2_2=TL0;

//计算定时器中的值得大小

t2=t2_1*256+t2_2;

s1=(uint)(((33333*t+t2-t1)*0.00184)*(x123/2));

//计算本次扫描的延迟时间

//(33333*t+t2-t1)*0.001851852=(33333*t+t2-t1)*0.0000003/0.0000027/60

//0.0000003(计数器加一个数所需要的时间)

//0.0000027(x=1时高精度延时函数的延时时间)

//60

(把一圈的时间平分为60份)

uyanshi(s1);

//延时

P1=0x00;

P2=0x00;

yanshi(10);

P1=0xff;

P2=0xff;

if(x123==120)

{

x123=0;

n1++;

}

if(n1==1

x123=0;

num=0;

n=0;

TH0=(65536-33333)/256;

TL0=(65536-33333)%256;

n1=0;

pic++;

}

}

void

main()//主函数

{

//uyanshi(1000);

//uyanshi(1000);

//delay(1000);

//delay(1000);

jiance();//开机检测

TMOD=0x01;//设置定时器的工作方式

TH0=(65536-33333)/256;//定时器赋初值

TL0=(65536-33333)%256;

EA=1;//开总中断

ET0=1;//开定时器0

EX0=1;//开外部中断0

IT0=1;

//设置外部中断为下降沿触发

PT0=1;//设置定时器为高优先级

P0=0xff;

while(1)

{

if(KEY==0)

{

delay(20);

//按键去抖

if(KEY==0)

pic++;

while(!KEY);

delay(40);

while(!KEY);

}

if(pic>10)

//画面切换置1

pic=1;

if(pic==1)

//同心圆画面判断

{

txy();

//同心圆

pic++;

}

}

}

void

X0_duan()

interrupt

0

//外部中断0程序

{

switch(pic)

//选择画面

{

case

0:break;//空

case

1:break;

//同心圆

case

2:break;//空

case

3:{TR0=1;TIbei();}break;

//TI杯

case

4:{TR0=0;}break;//空

case

5:{TR0=1;sjjx();};break;

//双渐近线

case

6:{TR0=0;}break;//空

case

7:{TR0=1;miao();}break;

//秒表

case

8:{TR0=0;}break;//空

case

9:{TR0=1;miao();}break;

//秒表(改变转速后)

case

10:{TR0=0;}break;//空

default:break;

}

}

void

T0_time()

interrupt

1

//定时0器程序

{

TH0=(65536-33333)/256;

TL0=(65536-33333)%256;

num++;

n++;

}

4、

测试方案与测试结果

1.程序延时时间的测试

高精度延时函数

void

uyanshi(long

x)

{

while(x--);

}

u

测试方法

(1)

设计测试程序为:

#include

void

uyanshi(long

x)

{

while(x--);

}

void

main

{

uyanshi(10000);//此处设置断点

uyanshi(10000);//此处设置断点

}

(2)用keil

4

中的程序调试设置断点,先测x=10000时的延时时间,在除

以10000就是x=1时的延时时间。

u

测试结果

当x=1时,时间为0.000

02(S)【24MHZ晶振】

2.

led亮度的测试

u

测试方法

(1)按右图连接电路。

(2)

在较亮的灯光下,调节电位器R,使led刚好不发光。

(3)

拆下电位器,用万用表的欧姆档测量电位器被接入电路的阻值。

u

测试结果

通过实验测得,在较强光下,恰好使led不发光R阻值为560Ω。

3.

双渐近线平行的测试

u

测试方法

yanshi(x);

P1=sjjx1[x123];

P2=sjjx1[x123+1];

yanshi(8);

P1=0xff;

P2=0xff;

yanshi(2x);

P1=sjjx1[x123];

P2=sjjx1[x123+1];

yanshi(8);

P1=0xff;

P2=0xff;

给x赋值然后下载到单片机来看实际的显示

效果,如果太靠前那么加大x的值,靠后缩小

X,直到两条线平行为止。

u

测试结果

通过测量得到x的值为1500。

4.

程序最终的测试

u

测试方法

此时采用画面模块化测试,这样能够快速的找出程序的那一个画面模块出了问题。

5、

结论与心得

在这次设计的过程中,我们组遇到了很多问题,在我们组三个人的共同努力下,问题才得以解决,此时此刻,我感到了团队合作的重要性。俗话说的好“三个臭皮匠,顶个诸葛亮”,或许就是这个道理。另外,在做此类设计中,团队中的各个成员之间应该多交流,更应该分工明确,但另一方面,我们也应该加强合作,也就是说,在分工的基础上再合作。在今后的学习中,我们应该加强自身品格的修养、以及自身素质的提升,向一个德才兼备的复合型人才靠拢。

TAG标签: