MS51FB9AE驱动WS2812
新塘单片机MS51FB9AE驱动WS2812
文章目录
- 新塘单片机MS51FB9AE驱动WS2812
- 一、原理图
- 二、代码讲解
- 三、资料整理
这个模块可以和所有单片机进行通讯,既可以用iic也可以用串口进行通讯。最多可以控制255个彩灯。测试过好几个厂家的彩灯,均能正常显示。资料已归档。感兴趣可以私聊。下面仅做下笔记,提示我自己,防止我忘记。
一、原理图
使用MS51FB9AE驱动ws2812,最多可支持255个彩灯。
这里设计的初衷是将这款单片机做成模块,让用户可以通过串口或者IIC协议控制WS2812彩灯。省却用户自己编写驱动的烦恼。毕竟ws2812对于一些基础比较薄弱的新手来说,驱动起来还是比较麻烦的。
代码使用新唐isp下载烧录器进行下载,P3为下载接口。
Q1主要为防止P1处电源反接!
二、代码讲解
main.c代码
#include "MS51.h"void main()
{MODIFY_HIRC();//24MhzLed_Init();Enable_WDT_Reset_Config();Timer0_Init();Ws2812b_Init(RGB_Group,RGB_GPIO);get_I2C_Address_From_Flash();get_UART0_Baudrate_From_Flash();//get_Leds_Count_From_Flash();while(1){if(IIC_Flag==1) //IIC接收到数据{process_Cmd(data_received);IIC_Flag=0;}if(receiveFlag==1) //串口接收到数据{receiveFlag=0;clr_IE_ES;processUartCmd(uart_buffer);set_IE_ES;}}
}
user.h文件
#ifndef _USER_H_
#define _USER_H_#include "MS51.h"#define REG_LEDS_COUNT 0x00 //设置LED个数
#define REG_LED_SPECIFIED_DATA 0x01 //设置指定ID的LED的颜色数据
#define REG_LED_SPECIFIED 0x02 //设置指定ID的LED的颜色数据,并立即显示
#define REG_LED_ALL_DATA 0x03 //设置所有LED的颜色数据
#define REG_LED_ALL 0x04 //设置所有LED的颜色数据,并立即显示
#define REG_TRANS_DATA_TO_LED 0x05 //使已经传输的颜色数据生效#define REG_LEDS_COUNT_READ 0xfa //获取LED的个数
#define REG_I2C_ADDR_UART_BD_READ 0xfb //获取IIC/串口波特率
#define REG_UART_BAUDRATE 0xfc //设置串口波特率
#define REG_I2C_ADDRESS 0xfd //设置IIC地址
#define REG_BRAND 0xfe //获取商标
#define REG_VERSION 0xff //获取版本#define UART_ACK (0x06)
#define FIRMWARE_BRAND ("linzhentao")
#define FIRMWARE_VERSION ("20210401-V02.03")extern unsigned char SLAVE_ADDRESS; //IIC地址
extern unsigned long xdata BAUDRATE[13]; //串口波特率数据
extern unsigned char UART_BAUDRATE_INDEX; //串口波特率选择索引号
extern unsigned char _LedsCount; //临时彩灯数目存储变量
extern char I2C_Cmd_In_Processed; //IIC-看门狗喂狗操作变量
extern char Uart_Cmd_In_Processed; //Uart-看门狗喂狗操作变量void process_Cmd(unsigned char *rxData); //IIC接收到数据时触发执行函数
void processUartCmd(unsigned char *rxData); //Uart接收到数据时触发执行函数void setAllLedsColorData(unsigned char r,unsigned char g,unsigned char b); //设置所有彩灯颜色数据
void setAllLedsColor(unsigned char r,unsigned char g,unsigned char b); //设置所有彩灯颜色数据并立即显示void set_Leds_Count_To_Flash(unsigned char count); //向Flash中写入彩灯的数目
void set_I2C_New_Address(unsigned char address); //设置IIC地址函数void get_Leds_Count_From_Flash(void); //从Flash中获取彩灯的数目
void get_I2C_Address_From_Flash(void); //从Flash中获取IIC的地址
void get_UART0_Baudrate_From_Flash(void); //从Flash中获取串口波特率数据
led.h文件
#ifndef _LED_H
#define _LED_H#define LED P05 //定义指示灯引脚
#define LED_MODE P05_PUSHPULL_MODE //设置指示灯引脚模式为强推挽模式
void Led_Init(void); //指示灯初始化函数
#endif
flash_data.h文件
#ifndef _FLASH_DATA_H
#define _FLASH_DATA_H#include "MS51.h"#define DATA_SIZE 128 //APROM-Flash空间大小
#define I2C_ADDRESS_IN_FALSH 0x3C01 //IIC地址在Flash中的地址
#define UART_BAUDRATE_IN_FALSH 0x3C02 //串口波特率在Flash中的地址(3个字节)
#define LEDS_COUNT_IN_FALSH 0x3C03 //彩灯的数目在Flash中的地址
unsigned char FLASH_ReadByte(unsigned int addr); //往特定地址读一个字节的数据
void FLASH_ProgramByte(unsigned int addr,unsigned char value);//往特定地址写一个字节
#endif
my_IIC.h文件
#ifndef _MY_IIC_H
#define _MY_IIC_H#include "MS51.h"
#define EEPROM_SLA 0x40 //设置从机地址
#ifdef HIRC_16MHz#define I2C_CLOCK 9//设置I2C时钟为400K(16000000/4/(I2C_CLOCK+1))
#else#define I2C_CLOCK 14//设置I2C时钟为400K(24000000/4/(I2C_CLOCK+1))
#endif
#define IIC_Buffer_Size 16
extern bit IIC_Flag; //IIC接收到数据标志位
extern unsigned char xdata data_received[IIC_Buffer_Size]; //临时接收IIC数据空间
extern unsigned char xdata data_send[IIC_Buffer_Size]; //临时发送IIC数据空间
extern unsigned char data_rece_num; //接收数据计数
extern unsigned char data_send_num; //发送数据计数
extern unsigned char iic_end_send_flag; //发送停止数据计数
void Init_I2C(unsigned char address); //IIC初始化
void my_I2C_SendData(unsigned char *Data,char number); //IIC发送数据函数
#endif
my_uart.h文件
#ifndef _MY_UART_H
#define _MY_UART_H#include "MS51.h"#define Uart_Buffer_Size 9
#define UART_CMD_MAXED_LENGHT 8
#define UART_CMD_START_BYTE 0xcc //串口数据起始命令
#define UART_CMD_END_BYTE 0xdd //串口数据结束命令
#define UART0_Timer1 0
#define UART0_Timer3 1
#define UART1_Timer3 2
#define UART0 0
#define UART1 1
extern bit receiveFlag; //串口接收标志位,如果标志位置位,说明使用了串口中断接收到数据
extern unsigned char xdata uart_buffer[Uart_Buffer_Size]; //临时存储串口数据空间
void UART_Open(unsigned long u32SysClock, unsigned char u8UARTPort,unsigned long u32Baudrate);
void UART_Init(unsigned long baudRate); //串口初始化函数
void UART0_SendData8( char dat); //串口发送一个字节
void UART0_Send_Strings(char *dat,unsigned int num);//串口发送一串字符串
#endif
WS2812.h文件
#ifndef _WS2812_H
#define _WS2812_H#include "MS51.h"#define MAX_LEDS 255 //定义led最大个数
#define WS2812_NUMBERS 8 //定义默认led个数
#define RGB_Group 0 //定义RGB灯控制引脚在第几组
#define RGB_GPIO 4 //定义RGB灯控制引脚在第几组
#define RGB_PIN P04 //定义RGB灯引脚#define RGB_PIN_H() RGB_PIN = 1 //设置引脚输出高电平
#define RGB_PIN_L() RGB_PIN = 0 //设置引脚输出低电平#define RED 0xff0000 //红色
#define GREEN 0x00ff00 //绿色
#define BLUE 0x0000ff //蓝色
#define BLACK 0x000000 //熄灭
#define WHITE 0xffffff //白色void Ws2812b_Init(int Px,int Pxx);//彩灯控制引脚模式设置
void setLedCount(unsigned char count);//设置彩灯数目
unsigned char getLedCount();//获取彩灯数目
void rgb_SetColor( unsigned char LedId, unsigned long color);//设置指定ID的彩灯颜色
void rgb_SetRGB(unsigned char LedId, unsigned long red, unsigned long green, unsigned long blue); //设置指定ID的彩灯颜色
void rgb_SendArray();//发送所有彩灯的颜色数据
#endif
ws2812可以参考我的另一篇文章了解开发的过程。
最近有点穷,如果各位路过的大佬觉得对您有帮助,跪求各位大佬赏口饭吃,点个关注。
如果您对于这个模块感兴趣,您可以联系本人或者留言。欢迎一起探讨进步。资料不挂积分了,挂积分亏的太多。模块资料包括PCB工程,模块代码。
三、资料整理
MS51FB9AE驱动WS2812相关推荐
- ESP32Arduino学习(三).ESP32驱动WS2812第一个灯绿色问题的解决(Adafruit_NeoPixel库)
问题 在使用ESP驱动WS2812灯带时存在的问题 1,连续刷新闪烁 2.开机第一个灯亮绿色(使用过少的灯数时会出现这个情况) 解决方法 1,连续刷新闪烁 你可能使用的是比较旧的Adafruit_Ne ...
- 08.ESP8266驱动WS2812彩灯
本篇介绍ESP8266使用NeoPixel库来驱动IOT Kit板载WS2812彩灯. 1. WS2812彩灯介绍 WS2812是一个集控制电路与发光电路于一体的智能外控LED光源,外型与5050LE ...
- 树莓派驱动 WS2812 灯珠 不亮的问题
前言 树莓派在控制某些硬件外设上坑还真不少,今天就又踩了一个(其实有两天了).其实越复杂的问题往往是有越简单的解决办法. 树莓派驱动ws2812 网上一搜几乎都是 用的 rpi-ws281x 这个库 ...
- ESP32学习】驱动ws2812
[ESP32学习]驱动ws2812 说明 先介绍WS2812b RTOS理解学习 ESP32驱动WS2812代码 说明 本片文章不做详细介绍,博主本身学习程度不高,没有系统学过FreeRtos操作系统 ...
- 如何使用STM32F103C8T6驱动WS2812(PWM+DMA)
一.WS2812概述: WS2812 内部集成了处理芯片和3颗不同颜色的led灯(红,绿,蓝),通过单总线协议分别控制三个灯的亮度强弱,达到全彩的效果. 数据传输时间: T0H 0码,高电平时间 22 ...
- STC15F104W驱动WS2812
STC15F104W驱动WS2812 提示:学习目标:了解WS2812的驱动原理,写出驱动代码. 内容: 提示:这里可以添加要学的内容 例如: 1. 连接WS2812时序: 2. 基于STC15F10 ...
- 51系列驱动WS2812
51驱动WS2812B三色流水灯 WS2812简介 模组选型 关于WS2812的时序解析 发送数据格式解析 部分代码 功能现象 总结 原文链接:https://www.yourcee.com/news ...
- ② ESP8266 开发学习笔记_By_GYC 【ESP8266 驱动 ws2812 三原色灯(spi方式 稳定灯光)】
目录 ② ESP8266 开发学习笔记_By_GYC [ESP8266 驱动 ws2812 三原色灯(spi方式 稳定灯光)] 一.驱动ws2812遇到的问题 二.可能的方案 三.具体实现 四.测试程 ...
- STC单片机驱动WS2812不同颜色变化显示
STC单片机驱动WS2812不同颜色变化显示
最新文章
- JB的测试之旅-上传的mp3文件播放不了
- win服务器系统程序原因分析
- android打开视频噔_android: 播放视频
- RocketMQ 报 invokeSync call timeout
- render与render_to_response的区别
- 和SAP Sales Organization相关的一些有用函数
- (第2篇)一篇文章教你轻松安装hadoop
- Java基础入门笔记-链表与容器
- mybatis学习笔记(1)-对原生jdbc程序中的问题总结
- SLAM--深度滤波器
- 对主机或 Docker 镜像进行漏洞扫描
- 伺服驱动器需要什么样的脉冲?
- vue.js 获取当前屏幕的宽度_js获取浏览器和屏幕的各种宽度高度
- ICP许可证申办常见问题答疑
- 阿里 达摩院 cv 算法 面经
- java蓝桥杯练习 学做菜
- 一文看完计算机基础知识总结
- vim 打开文件乱码
- 11 月中国手游海外收入排行:米哈游《原神》第一,《使命召唤手游》第二
- Python将url转换作为合法文件名
热门文章
- 华为荣耀10体验android9,荣耀10 P 版本(EMUI 9.0+Android 9.0) 体验版 9.0.0.120发布说明...
- AI 大师云集!2017 中国人工智能大会在杭州盛大开幕
- matlab 坐标轴刻度朝外_Matlab中将坐标轴放在原点位置
- O2O到家业务:如何从线下拉流量,盘活新老客户?
- Excel如何隔空行输入连续序号
- 出口合规证明信息,苹果提交审核的时候弹出的是否加密
- html页面设定为连接的方法,html代码运用
- IntelliJ IDEA for Mac如何添加jar包/如何导入jar包/导包
- idea往项目中添加jar包
- 华为手机鸿蒙系统哪个牌子,华为正式发布鸿蒙手机操作系统