旋转LED显示屏.docx
《旋转LED显示屏.docx》由会员分享,可在线阅读,更多相关《旋转LED显示屏.docx(60页珍藏版)》请在冰豆网上搜索。
旋转LED显示屏
课程设计论文
基于单片机的旋转LED显示屏
系别:
电子信息系
专业名称:
测控技术与仪器
学生姓名:
吴聪
学号:
03121520
指导教师姓名、职称:
刘梦亭孙颖讲师
完成日期2015年5月21日
基于单片机的旋转LED显示屏
摘要
旋转LED显示屏是利用机械转动动态扫描代替传统逐行扫描方式,是一种新型的显示屏,具有成本低,可视范围大的特点,是LED显示屏的一个新的发展方向。
其实质就是与机械转动配合起来的动态扫描显示技术。
主控芯片为STC12C5A32S2以及电机模块,时间模块,显示模块等辅助组件而成。
本次“旋转LED显示屏”的制作用于我的课程设计论文,它提高我的实践能力和钻研能力,激发我的学习兴趣,引导自主学习及培养创新能力、协助能力、工程实践素质。
这次的设计利用高速旋转中控制LED的亮灭,进行字符的显示,简单图形的显示和时钟显示,并用单片机作为控制器,完成显示内容的传输、字库的转换、显示等功能。
关键词:
LED;单片机;动态扫描
RotatingLEDDisplaybasedonsinglechipmicrocomputer
Abstract
RotatingLEDdisplayistheuseofdynamicscanningtoreplacethetraditionalmechanicalrotatingprogressivescanning,isanewdisplay,lowcost,thecharacteristicsofvisualrange,LEDdisplayisanewdevelopmentdirection.Itsessenceismatchupwiththemechanicalrotationofdynamicscanningdisplaytechnology.MasterchipSTC12C5A32S2,andmotormodule,thetimemodule,displaymoduleandotherauxiliarycomponentstogether.The“rotatingLEDdisplayproductionformyCurriculumdesignpapers,whichimprovedmyabilitytopracticeresearchskillsandexpertisetostimulatemyinterestinlearning,guidedself-learningandfosterinnovation,teamspirit,qualityofengineeringpractice.Thedesignofthecontrolhigh-speedrotatingbrightLEDoff,thecharactersdisplay,asimplegraphicaldisplay,andcontrollerusessinglechip,completethetransmissiondisplay,fontconversion,display.
Keywords:
LEDSingleChip-MicrocomputerDynamicScanning
绪论
现在可以说单片机是百花齐放,百家争鸣的时期,世界上各大芯片制造公司都推出了自己的单片机,从8位、16位到32位,数不胜数,应有尽有,有与主流C51系列兼容的,也有不兼容的,但它们各具特色,互成互补,为单片机的应用提供广阔的天地。
LED显示屏的发光器件主要采用LED平板模块,大型的LED点阵的显示屏。
它给我们日常生活带来了方便和快捷,但是这种类型的显示屏有很大的弊病。
新型的旋转式显示屏,克服了以上两个不足,以单排LED或双排LED转动的方式代替逐行扫描,成本大大降低,采用以少显多的方案来组成大型虚拟的LED点阵显示,其内容紧凑有条理,并且容易查找出LED失真的具体原因,很快捷的加以维修处理以及它可以和点阵一样显示原理。
如果你在网上用google搜索“POVLED”一词(POV即persistanceofvision),会找到世界各地的各种LED选择屏的制作介绍。
那些摇晃出的空中图案,漂浮在车轮上的动画,以及形态各异的时钟,一定给你留下深刻印象。
一.旋转LED时钟系统
1.1旋转LED时钟功能说明
旋转LED时钟是使用一系列LED灯排成一列,取中间一点为圆心,电机带动一系列发光二极管绕轴旋转,单片机控制发光二极管在旋转过程中的相应位置上点亮以指示时间和刻度,与此同时,单片机内部进行时钟的计时操作,以控制旋转时钟显示正确的走时。
最外侧的发光二极管显示时间刻度,当时针在12点时我们假设角度为0º,则每个小时时针之间的角度为360º/12=30º.于是当这一列发光二极管每旋转30º,最外侧的发光二极管就点亮一个瞬间一呈现时间刻度。
这样,如果在0.1s内这列发光二极管能旋转完一圈,把先后产生的时间刻度连成12个完整的时间刻度。
1.2旋转LED时钟功能原理
旋转LED时钟利用了视觉暂留原理,通过LED灯的机械扫描方式来显示各种字符和图像,单片机控制各个LED灯在旋转平面上相应的位置上点亮,但由于人的视觉暂留,会误认为每个点都是同时点亮的。
LED旋转时钟正是基于机械转动动态扫描技术,以及人的视觉暂留效果做成的。
二.旋转LED时钟模块设计
2.1无线供电模块
无线供电模块采用了自激振荡电路,把5V直流电压转换为交流电压(图中虚线处)。
2.2LED显示模块
LED具有低功耗,接口控制方便等优点,而且与模块的接口信号和操作指令具有广泛的兼容性,能直接与单片机接口,方便实现各种不同的操作。
旋转LED是一种通过同步控制发光二极管的位置和点亮状态来实现图文显示,可视角能达360度,此次设计采用33个发光二级管,利用人眼的“视觉暂留效应”显示文字和图像。
三.系统硬件结构设计
3.1STC12C5A32S2芯片介绍
STC12C5A32S2单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超抗干扰的新一代8051单片机.内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换。
3.2时钟芯片DS1302
DS1302是一种高性能、低功耗的实时时钟芯片。
实时时钟可以提供秒分时日星期月和年,一个月小与31天可以自动调整,且具有闰年补偿功能。
采用双电源供电。
各引脚功能为:
VCC2:
主电源;VCC1备份电源;当vcc1>vcc2+0.2时,由vcc1向DS1302供电,当vcc1SCLK:
串行时钟,输入,控制数据的输入与输出;
I/O:
三线接口的双向数据线;DS1302是一种高性能、低功耗的实时时钟芯片。
实时时钟可以提供秒分时日星期月和年,一个月小于31天可以自动调整,且具有闰年补偿功能。
采用双电源供电。
CE:
输入信号,在读、写数据期间,必须为高。
该引脚有两个功能:
1CE开始控制字访问移位寄存器的控制逻辑;2CE提供结束字节或多字节的传输方法。
3.374HC595锁存器
74HC59574HC595是硅结构的CMOS器件,兼容低电压TTL电路,遵守JEDEC标准。
74HC595是具有8位移位寄存器和一个存储器,三态输出功能。
移位寄存器和存储器是分别的时钟。
数据在SHcp的上升沿输入,在STcp的上升沿进入的存储寄存器中去。
如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。
移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
8位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。
三态。
74HC595的管脚功能描述:
管脚号 管脚名称 管脚功能描述
1 QB 锁存器输出,三态
2 QC 锁存器输出,三态
3 QD 锁存器输出,三态
4 QE 锁存器输出,三态
5 QF 锁存器输出,三态
6 QG 锁存器输出,三态
7 QH 锁存器输出,三态
8 GND 电源地
9 SQH 串行输出,用于级联。
无三态输出功能
10 Reset 低电平有效,当此管脚上出现低电平时,将复位内部的移位寄存器,但不影响8位锁存器的值
11 Shift Clk 移位寄存器时钟输入,上升沿将把A脚上的数据移入内部寄存器
12 Latch Clk 锁存时钟输入,上升沿将把内部移位寄存器的值锁存起来
13 Output Enable 低电平有效,将锁存器的输出映射到输出并行口(QA-QH)上。
当输入高电平时,高阻态,同时本芯片的串行输出无效
14 A 串行数据输入,数据从这个管脚移进内部的8位串行移位寄存器
15 QA 锁存器输出,三态
16 VCC 电源正,2-6V DC
3.4HX1838一体化红外接收管
红外遥控系统主要分为调制、发射和接收三部分,如图所示:
1.调制
红外遥控发射数据时采用调制的方式,即把数据和一定频率的载波进行“与”操作,这样可以提高发射效率和降低电源 功耗。
调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz,占空比1/3的方波,这是由发射端所使用的455kHz晶振决定的。
在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9kHz≈38kHz。
2.发射系统
目前有很多种芯片可以实现红外发射,可以根据选择发出不同种类的编码。
由于发射系统一般用电池供电,这就要求芯片 的功耗要很低,芯片大多都设计成可以处于休眠状态,当有按键按下时才工作,这样可以降低功耗芯片所用的晶振应该有足够的耐物理撞击能力,不能选用普通的石英晶体,一般是选用陶瓷共鸣器,陶瓷共鸣器准确性没有石英晶体高,但通常一点误差可以忽略不计。
红外线通过红外发光二极管(LED)发射出去,红外发光二极管内部材料和普通发光二极管不同,在其两端施加一定电压时, 它发出的是红外线而不是可见光。
3.红外接收
红外接收器内部电路包括红外监测二极管,放大器,限幅器,带通滤波器,积分电路,比较器等。
红外监测二极管监测到红外信号,然后把信号送到放大器和限幅器,限幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。
交流信号进入带通滤波器,带通滤波器可以通过30khz到60khz的负载波,通过解调电路和积分电路进入比较器,比较器输出高低电平,还原出发射端的信号波形。
四.系统测试与分析
4.1旋转LED时钟总原理图
4.2程序流程图
4.2.1时钟芯片控制程序DS1302.C
#include"STC12C5A.H"
#include"task.h"
sbitT_CLK=P3^5;//DS1302引脚连接
sbitT_IO=P3^6;
sbitT_RST=P3^7;
sbitACC0=ACC^0;//1bit数据存储位
sbitACC7=ACC^7;
ucharstarts_time[7]={0x00,0x10,0x22,0x20,0x05,0x04,0x10};//初始化后设置
ucharSec;
ucharCent;
ucharHour;
ucharYear;
ucharDay;
ucharWeek;
ucharMonth;
/******************************************************************/
//根据选择调整相应项目
voidSet(ucharsel,ucharsel_1)
{
ucharaddress,time;
ucharmax,min;
if(sel==1){address=0x84;max=23;min=0;}//小时
if(sel==2){address=0x82;max=59;min=0;}//分钟
if(sel==3){address=0x88;max=12;min=1;}//月
if(sel==4){address=0x86;max=31;min=1;}//日
if(sel==5){address=0x8a;max=7;min=1;}//星期
time=R1302(address+1)/16*10+R1302(address+1)%16;//变成BCD码
if(sel_1==1)time++;elsetime--;
if(time>max)time=min;
if(timeW1302(0x8e,0x00);
W1302(address,time/10*16+time%10);
W1302(0x8e,0x80);
}
//********DS1302读写程序***************//
/********************************************************************
函数名:
RTInputByte()
功能:
实时时钟写入一字节
说明:
往DS1302写入1Byte数据(内部函数)
入口参数:
d写入的数据
返回值:
无
***********************************************************************/
voidRTInputByte(uchard)
{
ucharh;
ACC=d;
for(h=8;h>0;h--)
{
T_IO=ACC0;/*相当于汇编中的RRC*/
T_CLK=1;
T_CLK=0;
ACC=ACC>>1;
}
}
/********************************************************************
函数名:
RTOutputByte()
功能:
实时时钟读取一字节
说明:
从DS1302读取1Byte数据(内部函数)
入口参数:
无
返回值:
ACC
***********************************************************************/
ucharRTOutputByte(void)
{
ucharh;
for(h=8;h>0;h--)
{
ACC=ACC>>1;/*相当于汇编中的RRC*/
ACC7=T_IO;
T_CLK=1;
T_CLK=0;
}
return(ACC);
}
/********************************************************************
函数名:
W1302()
功能:
往DS1302写入数据
说明:
先写地址,后写命令/数据(内部函数)
调用:
RTInputByte(),RTOutputByte()
入口参数:
ucAddr:
DS1302地址,ucData:
要写的数据
返回值:
无
***********************************************************************/
voidW1302(ucharucAddr,ucharucDa)
{
T_RST=0;
T_CLK=0;
T_RST=1;
RTInputByte(ucAddr);/*地址,命令*/
RTInputByte(ucDa);/*写1Byte数据*/
T_CLK=1;
T_RST=0;
}
/********************************************************************
函数名:
R1302()
功能:
读取DS1302某地址的数据
说明:
先写地址,后读命令/数据(内部函数)
调用:
RTInputByte(),RTOutputByte()
入口参数:
ucAddr:
DS1302地址
返回值:
ucData:
读取的数据
***********************************************************************/
ucharR1302(ucharucAddr)
{
ucharucData;
T_RST=0;
T_CLK=0;
T_RST=1;
RTInputByte(ucAddr);/*地址,命令*/
ucData=RTOutputByte();/*读1Byte数据*/
T_CLK=1;
T_RST=0;
return(ucData);
}
/******************************************************/
voidAuto_Set1302(uchar*pClock)
{
ucharh;
ucharucAddr=0x80;
if(((R1302(0x81))&0x80)==0x80)
{
W1302(0x8e,0x00);/*控制命令,WP=0,写操作?
*/
for(h=7;h>0;h--)
{
W1302(ucAddr,*pClock);/*秒分时日月星期年*/
pClock++;
ucAddr+=2;
}
//W1302(ucNumRows_adder,0);
//W1302(ucNumRows_p_adder,0);
//W1302(DISP_TIME_adder,170);
W1302(Auto_adder,0x00);
//W1302(0XC2,0X03);//初始自动转换显示时间为3秒。
W1302(0x8e,0x80);/*控制命令,WP=1,写保护?
*/
}
}
/********************************************************************
函数名:
Set1302()
功能:
设置初始时间
说明:
先写地址,后读命令/数据(寄存器多字节方式)
调用:
W1302()
入口参数:
pClock:
设置时钟数据地址格式为:
秒分时日月星期年
7Byte(BCD码)1B1B1B1B1B1B1B
返回值:
无
***********************************************************************/
voidSet1302(uchar*pClock)
{
ucharh;
ucharucAddr=0x80;
W1302(0x8e,0x00);/*控制命令,WP=0,写操作?
*/
for(h=7;h>0;h--)
{
W1302(ucAddr,*pClock);/*秒分时日月星期年*/
pClock++;
ucAddr+=2;
}
//W1302(0xc0,0x01);
//W1302(0XC2,0X03);//初始自动转换显示时间为3秒。
W1302(0x8e,0x80);/*控制命令,WP=1,写保护?
*/
}
/******************读取DS1302中的时间****************/
voiddu1302()
{
Sec=R1302(0x81);//对取秒分时日月星期年
Cent=R1302(0x83);
Hour=R1302(0x85);
Day=R1302(0x87);
Month=R1302(0x89);
//Week=R1302(0x8b);
//Year=R1302(0x8d);
//b=R1302(0xc1);
//a=R1302(0xc3);
//a=a/16*10+a%16;
}
/*********************************************************************************************
函数名:
1302直接写数据程序
调用:
write_1302Data
参数:
无
返回值:
无
结果:
时钟芯片直接写数据,自动打开写保护程序
备注:
适用于DS1302芯片+32.768KHz6pF晶体
/**********************************************************************************************/
voidwrite_1302Data(ucharucAddr,ucharValue)
{
W1302(0x8e,0x00);/*控制命令,WP=0,写操作?
*/
W1302(ucAddr,Value);//地址和数据
W1302(0x8e,0x80);/*控制命令,WP=1,写保护?
*/
}
4.2.2掉电保持程序EEPROM.C
#include"STC12C5A.H"
#include"task.h"
#include
typedefunsignedcharINT8U;
typedefunsignedintINT16U;
/*
sfrIAP_DATA=0xC2;
sfrIAP_ADDRH=0xC3;
sfrIAP_ADDRL=0xC4;
sfrIAP_CMD=0xC5;
sfrIAP_TRIG=0xC6;
sfrIAP_CONTR=0xC7;
*/
//定义Flash操作等待时间及允许IAP/ISP/EEPROM操作的常数
//#defineENABLE_ISP0x80//系统工作时钟<30MHz时,对IAP_CONTR寄存器设置此值
//#defineENABLE_ISP0x81//系统工作时钟<24MHz时,对IAP_CONTR寄存器设置此值
#defineENABLE_ISP0x82//系统工作时钟<20MHz时,对IAP_CONTR寄存器设置此值
//#defineENABLE_ISP0x83//系统工作时钟<12MHz时,对IAP_CONTR寄存器设置此值
//#defineENABLE_ISP0x84//系统工作时钟<6MHz