飞道的博客

LED 线阵

272人阅读  评论(0)

线阵是啥?你是否有很多问号?

点阵是啥?

这就是点阵。

那么线阵到底是啥?

一条线的点阵就可以变成线阵,那么线阵到底是啥?
那就是让他转起来。。。

开始制作

  1. 先准备一些硬件设备: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);
	}
}

编译之后生成十六进制、就可以考代码了

其实肉眼看着效果要好一点,可能是该换手机了。

在这里插入图片描述

这个项目需要注意的地方:

  1. 结构的设计,一定要保持平衡,后果就是手上好多小洞(虽然在去医务室的路上已经愈合了/xk)

  2. 选择共阴还是共阳

  3. 单片机的选择、电机转速的选择、卡扣的大小要对应

  4. 还有就是电机驱动和电机连接要看教程,不要瞎连

  5. 电机驱动和电池连接时,正负极一定不要接反,爆炸一点也不好玩(实验室的钱不是大风吹来的)

  6. 单片机在焊接是不要短路,这是基础

  7. 学会看教程,看教程是最关键的,尤其是学习新的单片机

  8. keil的使用,stc与keil库的绑定

  9. 理解线阵显示的原理,其实在转起来,他是没转一次都会直接显示完毕,关键是延时时间要调好。

资料分享

还有很多相关STC15系列单片机的资料和教程,可以关注下面公众号


后台回复:【线阵资料】、即可下载、当然CSDN也上传了:线阵资料

当然有需要可以直接私信Q:2659098658,或者 下方 / 站点 / 公众号 留言。都可以!

转载请注明出处


转载:https://blog.csdn.net/qq_44009311/article/details/116668233
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场