制作旋转led_单片机入门-旋转屏,用16个LED灯显示16个汉字

所谓的旋转显示屏,是在电路中只有一列发光二极管,通过电动机带动发光二极管转动,当这列发光二极管转到不同位置,用单片机控制相应的发光二极管点亮和熄灭,由于人眼的视觉暂留现象形成图形或文字,达到悬浮在空中神奇梦幻般的效果。

7121d2124907e74ae0cf30cb3e00e2d6.png

神奇梦幻般的效果

下面本文就带您一起DIY一个属于自己的LED旋转显示屏。

由于显示屏是靠转动的发光二极管的残留影像显示信息的,整个电路所需的发光二极管的数量很少,本电路共使用16只发光二极管,所以电路原理图非常简单,几乎和流水灯电路无异,很适合手工制作。

2618837a405126889cc9ab4315b4924a.png

旋转屏仿真原理图

原理图为:单片机最小系统-供电电路、复位电路、振荡电路,16个发光二极管接到P1口和P3口,霍尔接到P2.0。单片机P1、P3为推挽输出,驱动发光二极管;P2.0为上拉输入,用来测速。

ede342113d47889d2299f6528a8c41a4.png

旋转屏实物图

但由于整个电路板处于高速旋转状态,所以我们首先要解决两问题:一是如何给运动的系统供电、二是如何保证显示信息稳定显示;给运动的系统供电,常用的供电方式有三种:电池供电、电刷供电、无线感应供电。

55855dfa6c6f1edf82a00f28523187b2.png

旋转屏拆分图

高速旋转电机选用电磁炉散热风扇电机,这个电机转速快、稳定、静音、控制简单。

dc8de11bf3240f554d20029d8042cf9f.png

旋转电机——电磁炉散热风扇

搭好硬件电路,就可以搞软件了,软件定义P2.0为霍尔输入。

f127f8e438b0c03e920a9450c6b44a61.png

霍尔检测I/O定义P2.0

由霍尔测得速度来调整扫描速度,到达显示宽度不变的效果,霍尔也起到检测起点的作用,当检测到起点是发光二极管就开始扫描,这样就能在固定位置显示内容。下面的延时函数是用来控制扫描速度的,在电机转速不变的情况下,延时越大字体越宽,反之亦然。

e82b5460618c750f45c9c69d70969e97.png

很简单的程序

字体取模时要根据电路连接、发光二极管的布置选择取模方式:横向取模、纵向取模、字节倒序等一系列选项。

d501441121010e1e41b88544cb5e122f.png

字体取模软件——取模

把取模好的数据表导入程序,编译,烧录就完成了。就是这么简单!!!

230d87630865830be629191fa6a16581.png

字体的数据

经验分享:确定二极管位置时,电机轴心位置到板子最下边缘的距离不要超过电机轴心到最近一个发光二极管的距离,不然转起来板子会和发光二极管有重合,影响亮度;要用同种颜色发光二极管,那样效果会更好,显示内容清晰。二极管尽量离电机轴心远一些,可以做成发光二极管在两侧,竖着排放效果更好。要尽量降低成品重量,二极管什么的能用贴片的就用贴片。

b010bb6f44e5b40fef254b9dcb9d3508.png

旋转屏效果图

  • 12
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于51单片机的程序模板,用于控制16LED显示16汉字: ```C #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit LATCH = P1^0; // 控制锁存器 sbit CLK = P1^1; // 控制时钟 sbit DATA = P1^2; // 控制数据 uchar code LED_Disp[] = { // 16汉字的字模数据,此处为示例数据 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 第一个汉字的字模数据 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 第二个汉字的字模数据 // ... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // 第十六个汉字的字模数据 }; void delay(uint t) { // 延时函数,单位为毫秒 uint i, j; for (i = 0; i < t; i++) { for (j = 0; j < 1000; j++); } } void SendData(uchar dat) { // 发送数据到锁存器 uchar i; for (i = 0; i < 8; i++) { DATA = dat & 0x80; // 取出最高位 dat <<= 1; // 左移一位,准备发送下一个位 CLK = 0; // 时钟线拉低 _nop_(); // 空操作,延时一段时间 CLK = 1; // 时钟线拉高,数据被锁存 } } void main() { uchar i; while (1) { // 循环显示 for (i = 0; i < 16; i++) { // 依次显示16汉字 LATCH = 0; // 锁存器拉低 SendData(LED_Disp[i * 8]); // 发送字模数据的第一个字节 SendData(LED_Disp[i * 8 + 1]); // 发送字模数据的第二个字节 SendData(LED_Disp[i * 8 + 2]); // 发送字模数据的第三个字节 SendData(LED_Disp[i * 8 + 3]); // 发送字模数据的第四个字节 SendData(LED_Disp[i * 8 + 4]); // 发送字模数据的第五个字节 SendData(LED_Disp[i * 8 + 5]); // 发送字模数据的第六个字节 SendData(LED_Disp[i * 8 + 6]); // 发送字模数据的第七个字节 SendData(LED_Disp[i * 8 + 7]); // 发送字模数据的第八个字节 LATCH = 1; // 锁存器拉高,数据被显示 delay(100); // 显示时间,单位为毫秒 } } } ``` 注意:以上代码仅为示例,具体实现需要根据具体硬件平台和字模数据格式进行调整。同时,16LED的控制方式也可以有多种选择,比如使用移位寄存器、LED驱动芯片等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值