找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 814|回复: 0
打印 上一主题 下一主题
收起左侧

单片机旋转LED

[复制链接]
跳转到指定楼层
楼主
ID:1049009 发表于 2022-10-24 17:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一章 绪言
随着科学技术的发展,LED显示屏得到广泛的应用,但大部分的显示屏只能在平面显示,不能满足人们的需求,所以LED旋转屏的想法正好能填补这个空缺。LED旋转屏利用人的视,觉暂留效应,通过高速旋转的LED灯阵列,形成一个360环形画面,创造立体效果,不管人站在那个角度都能看到显示的内容。该应用实用性好,制作相对简单,而且能节省LED灯的使用。
本设计以STC89C52单片机为核心最大限度的利用单片机的资源LED驱动芯片紧密。系统以STC89C52单片机作为核心,控制器件通过控制电机保持一定的速度稳定旋转带动单排LED旋转形成扫描显示屏,单片机根据LED旋转的速度控制LED发光或熄灭,在视觉上形成平面图形点阵的显示效果。


第二章 方案设计第一节 设计任务与要求
一、设计任务
基于视觉暂留原理,利用了POV“视觉暂留”原理,在这短暂的时间段里,当前面的视觉形象还没有完全消退,新的视觉形象又继续产生时,就会在人的大脑里形成连贯的视觉错觉。利用高速旋转中控制LED亮灭,设计一种旋转式LED显示屏。在稳定旋转地载体上安装16个贴片发光二极管。静止时,各个发光二极管等间距排布,随着扫描速度的加快,不断扫描出预设的文字。
二、设计要求
1、底座供电部分,底座为主板供电;
2、主板旋转部分,主板负责文字旋转。
3、制作完成后,载入程序,调试并分析结果。
第二节 任务分析
一、LED 旋转控制
用电动机带动LED转动,用单片机控制LED点亮和熄灭来形成文字的,这些文字一看也去,就象悬浮在空中的。
旋转LED旋转起来是一个圆,那么就需要有一个传感器来判断起点位置,这个起点检测非常重要,单片机就是根据这个起点来判断是否要开始显示数据的。如果起点检测不到单片机就不开始显示。我选用红外对管,单片机控制LED灯使用红外发射,在底座上有一个红外发射管,这个红外发射管不断地向旋转的主电路板发射红外线。
二、底座供电部分
供电模块电路设计的完善,采用无线输电技术,利用电磁转换原理,先将电流变成磁场,然后再将磁场变成电流给电路供电。
三、主板旋转部分
主板电路设计的完善,核心系统的选择,用于旋转起点检测的传感器选用。
第三节 方案框图
基于以上设计方案与要求所设计方案框图如下:主控电路,电源部分,程序端口,稳压滤波电路,红外接收管,LED显示部分。
图 2-1  方案框图


第三章 硬件电路设计第一节 主控电路设计
一、STC89C52简介
单片机是指一个集成在一块芯片上的完整计算机系统。尽管他的大部分功能集在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件: CPU、内存、内部和外部总线系统,目前大部分还会具有外存。同时集成诸如通讯接口、定时器,实时时钟等外围设备而STC89C52是一种可编程可檫除只读存储器的低电压,高性能的微处理器,俗称单片机。
二、单片机最小系统
用单片机控制LED点亮和熄灭来形成文字。如图3-1所示:
图 3-1  主控电路
第二节 电源电路设计
无线供电方式,经过实践论证,功率很有限,需要改进的地方还很多,电路原理是把直流转成交流,然后经过初级线圈 ,最后次级线圈感应得电,经过整流滤波后给旋转部分供电,直流转交流部分电路是一个自激震荡电路。将直流电转化成高频交流信号,通过线圈将交流信号输送到旋转的主电路板上,主电路板上利用5.1v的稳压二极管,将接收到的交流信号变成5.1v直流电,通过220uF的电解电容滤波,供给单片机,使单片机能正常工作。如图3-2所示:
图 3-2  无线供电小板
第三节 LED显示电路设计
一、字幕显示设置
如何让一列灯不断的送数据实现一个文字的显示呢?这个我们就要了解文字取模的原理了,这里以PC2002字幕软件为例,取一个16*16的中文字,见字幕选项设置:
图 3-3  文字取模设置图
二、LED显示电路
电动机带动LED转动,用单片机控制LED点亮和熄灭来形成文字;一个红外发射管,一个红外接收管,板上的红外接受管每转动一圈就会导通一次,让单片机知道从哪一点开始播放字符;无线供电部分通过线圈向主板供电,相当于变压器的工作原理。
图 3-4  LED显示屏原理图
第四节 稳压滤波电路设计
由于电源是从电机中引出来的所以需要通过整流滤波才能为系统供电。如图3-5所示:
图 3-5  稳压整流滤波电路
第五节 其它部分电路设计
一、程序端口
下载程序,通过程序来来实现想要达到的效果。如图3-6所示:
图 3-6  程序端口
二、红外接收电路部分
判断起点位置,起点检测,根据红外接收管电路来判断是否要开始显示。如图3-7所示:
图 3-7  红外接收管电路


第四章 软件设计
当程序开始运行的时候,首先就是要对程序进行初始化,主要作用就是让程序按照我们所设计的初始值去运行。初始化之后,让单片机知道从哪一点开始播放字符,让LED点亮和熄灭来形成文字;一个红外发射管,一个红外接收管,板上的红外接受管每转动一圈就会导通一次,对数据进行校对,执行完成后返回到初始化操作之后重复以上的操作。
图4-1 软件设计流程图


第五章 系统调试第一节 问题及解决方法
一、旋转 LED 上电后,电机旋转,但是无任何反应。
解决方法:
1、检查了供电板上元件的位置以及正负极性。
2、检查元件有无虚焊现象。
3、连接电源后,测量初级线圈电压。用万用表交流档 20V 测试,有 6-9V 的交流电压输出是正常。如不正常,检查输入电源是否是 5V。
    4、检查旋转主板 4 个 4148 焊接位置以及正负极性是否正确。
二、部分灯不亮
解决方法:
1、利用提供的“流水灯测试程序”,测试 LED 是否有虚焊以及损坏的问题,下载好程序,通过程序下载口供电,可以看到每个灯都会流水点亮。如果发现不亮的灯,检测 LED 正负极性有无焊接错,有无虚焊现象,对应的限流电阻是否损坏或者焊接良好。
2、排除以上问题后,检查该 IO 口到单片机管脚的线是否连接完好。如果是断路,就应该是单片机控制该LED的IO口虚焊,补焊单片机即可。
三、旋转 LED 旋转时抖动大
解决方法:
1、确定铜柱固定是否和制作说明中的一样。
2、底盒通过加沙石加重重量。
结论
在焊接之前先看原理图以便理解电路工作原理,然后进行电路焊接。由于焊接的器件都比较小,所以焊接过程比较麻烦,经常会出现虚焊等情况,所以经常进行反复检查。且这次设计存在不足的地方,比如重心偏移,电机旋转时产生抖动,应该在设计时对电路布局进行科学的分析,调整重心。
刚开始会遇到很多挫折,并不是说按照原理图焊接出来,就直接可以正常使用,在这几日里,我经历了阶段性成功的喜悦,测试失败后的沮丧,陷入困境的急噪,重新投入的振作,这样的心路历程是非常宝贵的体会,正是有了大家的帮助终于成功了。同学们在设计的过程中互相帮助让我深刻的体会出团结就是力量的含义。

                                 部分代码



#include "NEW_8051.H"
#include "task.h"
#include <intrins.h>        
void delay_300ms(void);
bit BIT_timeout=0;
uint i=0,j=0;
uchar Data_L=0xff;
uchar Data_H=0xff;
uchar time_delay=0;
uchar k;
bit Scan_bit=0;
uint uiFontNumber=0;
#define ucNumRows 176
uchar code liushui[1]={0x01};
void DelayUs(uint N)
{
    uint x ;
    for(x=0;x<=N;x++);
}
void int0() interrupt 0      
{
        BIT_timeout=1;
}
void start(void)
{
        P1=0XFF;
        P2=0XFF;
        P0=0XFF;
        P3=0XFF;
        uiFontNumber=((byte_read(0x2000)<<8)+byte_read(0x2001))*16;
        Send_data(0X55);
}
void OS_ALLRun(void)
{
        if(BIT_timeout)      
        {                       
                BIT_timeout=0;
                Scan_bit=1;
                j++;                                    
        if( j>uiFontNumber )
        {
            j=0 ;
        }                              
        for(i=j;i<ucNumRows+j;i++)  
        {                              
           
                        P2=Data_L;      
                        P0=Data_H;
                           time_delay=1;
                        while(time_delay)
                        {
                                        Data_L=byte_read(i*2+0x2002);      
                                        Data_H=byte_read(i*2+1+0x2002);
                                        DelayUs(3);
                                        time_delay=0;      
                        }
                        P0=P2=0XFF;                                                      
           if(BIT_timeout)
                                 
                   {
                                   return;
                   }
                }   
        }
        if(Scan_bit==0)      
        {
                for(k=0;k<1;k++)
                        {                              
                                P0=~liushui[k];
                                P2=~liushui[k];
                                delay_300ms();
                        }      
        }
}
void delay_300ms(void)   
{
    unsigned char a,b,c;
    for(c=98;c>0;c--)
        for(b=127;b>0;b--)
            for(a=17;a>0;a--);
}
#ifdef EN_OS_INT0
    IT0 = 1;   
    EX0 = 1;  
#endif
  #ifdef EN_OS_INT1   
    IT1 = 1;   
    EX1 = 1;   
  #endif              
#ifdef EN_OS_SERIAL
    SCON = 0x50;
    TMOD|= 0x20;
    TH1  = 0xFB;
    TL1  = 0xFB;
    TR1  = 1;
    ES   = 1;      
    PS = 1;         
    PSH;
#endif
#ifdef EN_OS_TIMER0
    TMOD|=0X01;
          ET0=1;
        TH0=0x0FF;      
        TL0=0x0F1;
        TR0=1;         
#endif
#ifdef EN_OS_TIMER1
     TMOD|=0X20;
           ET1=1;  
     TH1=0x00;
     TL1=0x00;
#endif
#ifdef EN_OS_UART2         
        S2CON  = 0x50;  
        BRT           = 0xfb;  
        AUXR   |= 0x11;  
        IE2            = 0x01;      
#endif
#ifdef EN_OS_PCA0  
    CMOD = 0x80;         
    CCON = 0x00;   
    CL = 0;
    CH = 0;
        CCAP0H = 0xEF;
    CCAP0L = 0xD8;  
#endif
#ifdef EN_OS_PCA1         
    CMOD = 0x80;            
        CCON = 0x00;   
    CL = 0;
    CH = 0;  
    CCAP1H =0x01;
    CCAP1L =0x68;      
#endif
}
void main(void)
{
    init();
        start();                           
        while(1)
        {
       OS_ALLRun();
    }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表