线阵是啥?你是否有很多问号?
点阵是啥?
这就是点阵。
那么线阵到底是啥?
一条线的点阵就可以变成线阵,那么线阵到底是啥?
那就是让他转起来。。。
开始制作
- 先准备一些硬件设备:16个led(单色双色都可以)、杜邦线若干(一公一母、两公、两母)、三节1.5V干电池、一个大电池(带电机的)、面包板大点、锯条、电钻、小钻笔、电焊笔、一个电机(5500rpm左右的都可以)、电机驱动、电机纽扣、螺丝螺母若干、亚克力板若干、热熔胶、关键的是单片机(IAP 15W4K61S4),单片机是用得STC15系列的一种。
下面是一些图片:
电机+纽扣
电机驱动
大电池
电钻,用来打洞
还需要享受每次的消费
工具
下面是自己写的一个接口:
图片或者字符转二进制
源码:
首先导入STC15系列的头文件
#include "stc15f2k60s2.h"
宏定义几个常用的
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
#define f(i,a,b) for((i)=(a);(i)<(b);(i)++)
写两个常用的延时函数
//4微秒 延时
void delay4us(u16 us)
{
u16 i;
u8 m;
for(i=0;i<us;i++)
for(m=0;m<5;m++);
}
//1毫秒 延时
//ms 1ms的倍数
void delay1ms(u16 ms)
{
u16 m;
for(m=0;m<ms;m++)
delay4us(250);
}
真对 IAP15W4K61S4 STC15W4K56S4 系列 IO口初始化
io口初始化 P0 P1 P2 P3 P4 为准双向IO口
注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
void IO_init(void)
{
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
}
我这里用的是双色的,确定一下引脚的控制
左:绿
上:P47-P40 下:P37-P30
右:红
上:P17-P10 下:P27-P20
#define sgreen P4
#define xgreen P3
#define sred P1
#define xred P2
写两个函数分别控制红绿灯的亮灭
原理是通过高低8位来控制
void greenLed(u16 index){
sgreen = index>>8;
xgreen = index;
}
void redLed(u16 index){
sred = index>>8;
xred = index;
}
接下来就是主函数了
main()
{
u16 len = 40; // 定义显示的长度
char GledStr[16][40] = {
// 这个数组可以通过上面说到的那个我自己写的 转 二进制一个网址来生成,这里显示的是“牛B”
{
"0000000110000000000000000"},
{
"0000110110000000000000000"},
{
"0000110110000000111111000"},
{
"0001111111111000111111100"},
{
"0001111111111000110001100"},
{
"0001100110000000110001100"},
{
"0011000110000000110011100"},
{
"0001000110000000111111000"},
{
"0011111111111110110011100"},
{
"0011111111111110110000110"},
{
"0000000110000000110000110"},
{
"0000000110000000110011110"},
{
"0000000110000000111111100"},
{
"0000000110000000000000000"},
{
"0000000110000000000000000"},
{
"0000000110000000000000000"},
};
u16 i,j;
u16 msg;
IO_init(); // IO初始化
while(1)
{
greenLed(0x0000); // 红绿灭,需要产生电平的减压,不然会影响视觉效果
redLed(0x0000);
f(i,0,len){
// 将需要显示的16进制二维数组,一列一列的显示出来
// 灭灯
delay4us(360);
greenLed(0x0000);
redLed(0x0000);
msg = 0x0000;
// 初始化 16 进制
f(j,1,16+1){
// ledStr 列转16进制, 其实这里就是关键代码,看着就这几行,他确实很简单
if(GledStr[j][i]=='1') msg |= 1<<(16-j); // 将数组二进制存到 msg,用16进制理解
}
// 亮灯
redLed(msg);
greenLed(msg);
delay4us(60);
}
delay1ms(10);
}
}
编译之后生成十六进制、就可以考代码了
其实肉眼看着效果要好一点,可能是该换手机了。
这个项目需要注意的地方:
-
结构的设计,一定要保持平衡,后果就是手上好多小洞(虽然在去医务室的路上已经愈合了/xk)
-
选择共阴还是共阳
-
单片机的选择、电机转速的选择、卡扣的大小要对应
-
还有就是电机驱动和电机连接要看教程,不要瞎连
-
电机驱动和电池连接时,正负极一定不要接反,爆炸一点也不好玩(实验室的钱不是大风吹来的)
-
单片机在焊接是不要短路,这是基础
-
学会看教程,看教程是最关键的,尤其是学习新的单片机
-
keil的使用,stc与keil库的绑定
-
理解线阵显示的原理,其实在转起来,他是没转一次都会直接显示完毕,关键是延时时间要调好。
资料分享
还有很多相关STC15系列单片机的资料和教程,可以关注下面公众号
后台回复:【线阵资料】、即可下载、当然CSDN也上传了:线阵资料
当然有需要可以直接私信Q:2659098658,或者 下方 / 站点 / 公众号 留言。都可以!
转载请注明出处
转载:https://blog.csdn.net/qq_44009311/article/details/116668233