旋转LED制作立体和平面一体板.docx
《旋转LED制作立体和平面一体板.docx》由会员分享,可在线阅读,更多相关《旋转LED制作立体和平面一体板.docx(14页珍藏版)》请在冰豆网上搜索。
旋转LED制作立体和平面一体板
立体&平面旋转式LED制作
由6V变压器驱动电机自动旋转,显字宽度能自适应转速的快慢自动调节,采用无线供电方式为显示部分供电,采用STC12C5A32S2单片机控制,频率特性及稳定性比普通单片机更好,有显字和时钟功能,硬件电路图绘制和软件编程都由本店工程制作并调试成功,主要针对电子爱好者需要进行设计,并能为顾客提供硬件和软件的技术支持。
本站视频地址:
优酷视频
本店出售的是旋转LED套件,提供电路板所需的所有元件和焊接电路图,各元件参数都是自己通过多次验证调试出来,能使产品发挥最优的性能。
如果你是电子DIY爱好者,学会焊接是相当重要的,电路板元件大多数都是贴片元件,体积很小,所以对焊接贴片元件还不熟的朋友,建议有摄子辅助焊接,由于单片机引脚较密,焊接有难度,如果初学者有要求本店工程师帮忙焊接的,请拍下产品后与店主联系。
旋转LED能实现的功能:
1.平面显字功能。
2.平面显示数字时钟功能。
3.平面显示指针式时钟功能。
4.立体显字功能。
5.红外遥控功能,能实现立体和平面切换显示,字体宽度和显字宽度调节,时钟较准,复位等功能。
6.能一定范围自适应旋转速度
7.直流电供给电机自动旋转,无需人工操作。
。
遥控器使用说明:
按键7是立体显示字模式
按键8是平面旋转时钟模式此模式下按OK键开始进行调时间,秒不可调。
年,月,日,星期,时分都可调,其中“#”号键是时钟初始化用的。
按键9是模拟指针表盘模式效果比较一般后续会继续改进。
原理图:
单片机使用资源情况:
40个IO口全用上了,其中P3.5P3.6P3.7用于DS1302的通信
外部中断0(P3.2)用于旋转起点检测,外部中断1(P3.3)用于红外接收。
其他35个IO全都独立控制LED,使得旋转的时候字体上下不会有偏差的现象。
程序下载:
下载软件用STC-ISP软件,高点的版本都有STC12C5A32S2的型号,选择好型号后,就可以通过P3.0P3.1下载程序了板上已引出4P线了,只需把实验班上的P3.0P3.1电源和地接上就可以下载,跟普通的89C51一样。
程序:
程序比较长就不全放上来了,部分说明如下:
红外接收处理:
这里笔者用了很多方式去解红外遥控器的码,但是发现前几个版本都不太稳定,关键是旋转LED用的中断比较多,对红外接收有一定影响,所以通过努力看红外码的原理,选择一种更好的方式去解码,由于解码时通过外面中断1触发,定时器计时来完成解码的。
为了提高稳定性,这里让定时器在外部中断1触发后才开始计时,而且计时到定时器1溢出计数变量加1,当然定时器1是用重装模式的。
算算18.432M的晶振定时器1溢出时间是160US所以根据这个时间来算1还是0比较容易成功,遥控器也灵敏多了。
具体实现可以看程序部分店里有详细注视的程序,如果需要可到程序如下:
#include"NEW_8051.H"
#include"task.h"
ucharirtime;//红外用全局变量
bitnew_code;
ucharIRcord[2];
ucharirdata[17];
ucharkey_code;
/************************************************/
voidtim1_isr(void)interrupt3using1//定时器1中断服务函数
{
irtime++;
}
/*************************************************************/
//外部中断1解码程序
voidex1_isr(void)interrupt2using2//外部中断1服务函数
{
staticuchari,p,z;
staticbitstartflag;
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;
}
}
/************************************************/
voidIrcordpro(void)//红外码值处理函数
{
uchari,j,k;
ucharcord,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];
//if(((IRcord[2])==~IRcord[3])&&(IRcord[0])==~IRcord[1])
//{
//IrOK=1;//处理完毕标志位置1
//}
//else
//IrOK=0;
}