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