旋转LED制作(立体和平面一体板)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
立体&平面旋转式LED 制作
由6V变压器驱动电机自动旋转,显字宽度能自适应转速的快慢自动调节,采用无线供电方式为显示部分供电,采用STC12C5A32S2单片机控制,频率特性及稳定性比普通单片机更好,有显字和时钟功能,硬件电路图绘制和软件编程都由本店工程制作并调试成功,主要针对电子爱好者需要进行设计,并能为顾客提供硬件和软件的技术支持。
/v_show/id_XMzI3MjA3NzEy.html优酷视频
本店出售的是旋转LED套件,提供电路板所需的所有元件和焊接电路图,各元件参数都是自己通过多次验证调试出来,能使产品发挥
最优的性能。如果你是电子DIY爱好者,学会焊接是相当重要的,
电路板元件大多数都是贴片元件,体积很小,所以对焊接贴片元件还不熟的朋友,建议有摄子辅助焊接,由于单片机引脚较密,焊接有难度,如果初学者有要求本店工程师帮忙焊接的,请拍下产品后与店主联系。/
旋转LED能实现的功能:
1. 平面显字功能。
2. 平面显示数字时钟功能。
3. 平面显示指针式时钟功能。
4. 立体显字功能。
5. 红外遥控功能,能实现立体和平面切换显示,字体宽度和显字宽度调节,时钟较准,复位等功能。
6.能一定范围自适应旋转速度
7. 直流电供给电机自动旋转,无需人工操作。
。
遥控器使用说明:按键7是立体显示字模式
按键8是平面旋转时钟模式此模式下按OK键开始进行调时间,秒不可调。年,月,日,星期,时分都可调,其中“#”号键是时钟初始化用的。
按键9是模拟指针表盘模式效果比较一般后续会继续改进。
原理图:
单片机使用资源情况:40个IO口全用上了,其中P3.5 P3.6 P3.7用于DS1302的通信外部中断0 ( P3.2 )用于旋转起点检测,外部中断1 (P3.3) 用于红外接收。其他35个IO全都独立控制LED,使得旋转的时候字体上下不会有偏差的现象。
程序下载:下载软件用STC-ISP软件,高点的版本都有STC12C5A32S2的型号,选择好型号后,就可以通过P3.0 P3.1下载程序了板上已引出4P线了,只需把实验班上的P3.0 P3.1电源和地接上就可以下载,跟普通的89C51一样。
程序:程序比较长就不全放上来了,部分说明如下:
红外接收处理:
这里笔者用了很多方式去解红外遥控器的码,但是发现前几个版本都不太稳定,关键是旋转LED用的中断比较多,对红外接收有一定影响,所以通过努力看红外码的原理,选择一种更好的方式去解码,由于解码时通过外面中断1触发,定时器计时来完成解码的。为了提高稳定性,这里让定时器在外部中断1触发后才开始计时,而且计时到
定时器1溢出计数变量加1,当然定时器1是用重装模式的。算算18.432M的晶振定时器1溢出时间是160US 所以根据这个时间来算1还是0比较容易成功,遥控器也灵敏多了。具体实现可以看程序部分店里有详细注视的程序,如果需要可到/购买技术支持程序如下:
#include "NEW_8051.H"
#include "task.h"
uchar irtime;//红外用全局变量
bit new_code;
uchar IRcord[2];
uchar irdata[17];
uchar key_code;
/************************************************/
void tim1_isr (void) interrupt 3 using 1//定时器1中断服务函数
{
irtime++;
}
/********************************************************** ***/
//外部中断1解码程序
void ex1_isr (void) interrupt 2 using 2//外部中断1服务函数
{
static uchar i,p,z;
static bit startflag;
TR1=1;
if(startflag)
{
if(irtime<100&&irtime>=53)//引导码TC9012的头码{
i=0;
p=1;
z=0;
irdata[i]=irtime;
irtime=0;
}
z++;
if(z>=18)
{
irdata[p]=irtime;
irtime=0;
p++;
if(p==17)
{
new_code=1;
p=0;
TR1=0;
}
}
else
irtime=0;
}
else
{
irtime=0;
startflag=1;
}
}
/************************************************/ void Ircordpro(void)//红外码值处理函数
{
uchar i, j, k;
uchar cord,value;
k=1;
for(i=0;i<2;i++)//处理4个字节
{
for(j=1;j<=8;j++) //处理1个字节8位{
cord=irdata[k];
if(cord>11)//大于某值为1
{
value=value|0x80;
}
else
{
value=value;
}
if(j<8)
{
value=value>>1;
}
k++;
}
IRcord[i]=value;
value=0;
}
key_code=IRcord[0];