浅尝辄止——雪花板
本次项目以马骥老师提供的C语言代码为程序基础,以硬禾学堂提供的雪花板为硬件基础。在点亮LED灯的前提下,本次项目力求实现有规律的多彩变化和绚烂的颜色搭配。目标任务实现后,此类雪花板可用于庆祝场合的装饰品,亦可用于初学者对单片机的尝试和掌握。
标签
嵌入式系统
显示
ICISTRUE
更新2021-01-06
793

背景介绍:

圣诞将至,形如雪花板的单片机给予硬禾学堂的学习增添了不少乐趣。然而对于初学者而言,本次项目依旧困难重重,如硬件结构尚未清晰,嵌入式编程知识尚存缺漏等等。当然,本次项目的意义就在于掌握对单片机的结构和理论知识,尝试嵌入式编程。

原理讲解:

从硬件层面上看,本次项目雪花板主要采用STC15W204S单片机作为控制器,CH340作为USB转串口芯片,外加37个WS2812型号的LED灯。从软件角度来说,本次项目利用C语言实现主要的嵌入式编程,在一定程度上采用汇编语言实现硬件的调用和调试。

在讲述详细代码之前,理解和掌握WS2812型号LED灯的传输方式是必要前提。FkLQTT_jykBrJJhjmiJpYQ4Cn_rd

如上图所示,本款三色LED灯采用单线归零的通讯方式,当连续输入数据的时候,第一个WS2812会清除24Bit的数据,后面以此类推,从而实现了每一个WS2812闪烁不同颜色的灯光。

在本次项目中,由于学生尚处初学者状态,纵使对相关性能和知识有所了解,但是实在难以实现完全创新的编程,因此本人在本次项目中的代码以调用马骥老师原创代码为主,在此基础上结合个人想法和思路,修改部分数据。

本人的构想是将由外到内流水点亮,并实现颜色变化。由于马骥老师颜色变化的函数中的延时是固定的,效果差强人意,所以我采用重复流水变化时,改变颜色的方式。

 

代码展示:

include "STC15W.h"
#include "ws2812.h" //包含LED驱动程序
#include "delay.h" //包含延时程序
#include "uart.h" void LED_Water(unsigned char *p);//由外而内流水点亮 

unsigned char green[3]={25,0,0};//绿
unsigned char red[3]={0,25,0};//红
unsigned char blue[3]={0,0,25};//蓝
unsigned char white[3]={10,10,10};//白
unsigned char org[3]={25,2,20};//橘
unsigned char close[3]={0,0,0};
xdata unsigned char buffer[64];

unsigned char buf_data=0x00;

void main()
{
  DelayMs(1000); //上电延时
  UartInit();
  UART1_SendString("STC15W204S\r\nUart is ok !\r\n");//发送字符串检测是否初始化成功
  DelayMs(1000);
  ResetDataFlow();
  WS2812_Close();

//主循环
  while(1)
  {
    LED_Water(red);
    WS2812_Close();
    LED_Water(org);
    WS2812_Close();
    LED_Water(white);
    WS2812_Close();
    LED_Water(green);
    WS2812_Close();
    LED_Water(blue);
    WS2812_Close();
  }
} 

void LED_Water(unsigned char *p)//由外而内流水点亮
{
  WS2812_1_5Line_Single(p,5);//37点不给新的数据,所以一直保持之前的状态
  WS2812_1_5Line_Single(p,4);
  // LED_3count(p);
  // LED_4count(p);
  // LED_5count(p);
  WS2812_LineIn_Single(p,3);
  WS2812_LineIn_Single(p,2);
  WS2812_LineIn_Single(p,1);
}

void WS2812_Close(void)
{
  unsigned char count_sum;
  for(count_sum=0;count_sum<37;count_sum++)
  {
    SendOnePix(close);
  }
  ResetDataFlow();
}

void DelayMs(unsigned char m)
{
  unsigned char i,j,k;
  for(k=0;k<m;k++)
  {
    for(i=0;i<60;i++)
    {
      for(j=0;j<78;j++)
      {
        ;
      }
    }
  }
} 

void UartInit(void) //9600bps@33MHz
{
  SCON = 0x50;
  AUXR |= 0x01;
  AUXR |= 0x04;
  T2L = 0xA5;
  T2H = 0xFC;
  AUXR |= 0x10;
  ES=1;
  EA=1;
} 

void UART1_SendString(unsigned char *s)
{
  while(*s != 0)
  {
    UART1_SendData(*s++);
  }
} 

void ResetDataFlow(void)
{
  unsigned char i,j;
  DI=0; //DI置为0后,延时50us以上,实现帧复位
  for(i=0;i<50;i++) //此处33Mhz时延时65us
  {
    for(j=0;j<20;j++)
    {
      ;
    }
  }
}
附件下载
带单片机8位全彩流水灯程序模板V1.0.rar
团队介绍
个人尝试
团队成员
宋昀泽
西交利物浦大学学生
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号