news 2026/4/23 9:16:57

51单片机TM1804控制RGB灯闪烁的问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
51单片机TM1804控制RGB灯闪烁的问题

今天在调RGB灯带时发现:颜色,数量,都能正常显示
但是就是每隔一会,某颗RGB灯都会闪一下,
正常:

异常:(某个灯闪烁)

最后发现是,是因为中断的影响

因为51单片机没有中断优先级的概念,所以任何意外中断都会打断时序。即使是中断内没有任何代码,进入的过程也会花费几us,导致时序错乱

逻辑分析仪也会抓到了这一点

解决方法:

操作时关闭总中断

GIE=0;// 关闭总中断send_px(10,0,1);// 操控灯GIE=1;// 开启总中断

代码:

TM1804的时序规则(芯片参考手册)

TM1804在8位单片机上的代码(TXD修改成自己的引脚)
当前适配的MCU是16Mhz 2T,单个指令操作是125ns,请修改nop数量来匹配时序

main用法示例:

#include"tm1804.h"//导入RGB灯头文件voidmain(){while(1){delay_ms(200);//间隔200ms切换颜色GIE=0;//关闭总中断send_px_num(3,10,0,1);//点亮3个灯,RGB值10 0 1,满载255GIE=1;//开启总中断}}

TM1804.h

/* * TM1804 RGB灯幻彩变化 */#ifndefTM1804_H#defineTM1804_H#include<sc.h>// 单片机头文件// 自定义参数#defineTXDRA0//LED控制端口#defineIC54//LED灯总个数// 操作一个灯voidsend_px_one(unsignedcharR,unsignedcharG,unsignedcharB);// 操作指定个数灯voidsend_px_num(unsignedintnum,unsignedcharR,unsignedcharG,unsignedcharB);// 操作所有灯voidsend_px_all(unsignedcharR,unsignedcharG,unsignedcharB);//待加入:// 呼吸灯// 彩虹渐变// 流光效果// 等等#endif

TM1084.c

/********************* * TM1804 RGB灯幻彩变化。 ********************/#include"tm1804.h"#definenopasm("nop")// 一个nop大概0.125us(16MHz 2T)unsignedintLED_PX;//像素点数unsignedcharPWM;//TM1804灰度数据unsignedcharRda,Gda,Bda;//R、G、B灰度数据unsignedcharLED_data;//可位操作的数据发送暂存变量声明#definebit0((LED_data)&0x01)#definebit1((LED_data)&0x02)#definebit2((LED_data)&0x04)#definebit3((LED_data)&0x08)#definebit4((LED_data)&0x10)#definebit5((LED_data)&0x20)#definebit6((LED_data)&0x40)#definebit7((LED_data)&0x80)/**********************************延时函数*************************************/voidsend_px_reset()// 总间隔延时 200us以上{unsignedintj;for(j=550;j>0;j--);}// 注意进入信号操作时,要关闭总中断,不然会打乱时序/********************发送0码函数,高电平400ns,周期1.25us************************/inlinevoidsend_data_0(){TXD=1;// 高电平 300nsnop;// 一个nop大概0.125us(16MHz 2T) 300nsTXD=0;// 低电平 900nsnop;nop;nop;//实测://高电平 1个nop 375ns,引脚操作耗费250ns,nop耗费125ns//低电平 3个nop 1125ns//外面if耗费 625ns//切换RGB值耗费 750ns}/*******************发送1码函数,高电平800ns,周期1.25us*************************/inlinevoidsend_data_1(){TXD=1;// 高电平 900nsnop;nop;nop;nop;nop;TXD=0;// 低电平 300ns// 实测:// 高电平 5个nop 875ns// 低电平 0个nop 625ns}/*************发送1个字节数据,8位颜色*******/inlinevoidsend_data(unsignedcharLED_data){if(bit7)send_data_1();elsesend_data_0();if(bit6)send_data_1();elsesend_data_0();if(bit5)send_data_1();elsesend_data_0();if(bit4)send_data_1();elsesend_data_0();if(bit3)send_data_1();elsesend_data_0();if(bit2)send_data_1();elsesend_data_0();if(bit1)send_data_1();elsesend_data_0();if(bit0)send_data_1();elsesend_data_0();}/*********发送1帧数据************/// 操作一个灯 原来颜色顺序是GRBvoidsend_px_one(unsignedcharR,unsignedcharG,unsignedcharB){send_data(G);//发送R灰度数据send_data(R);//发送G灰度数据send_data(B);//发送B灰度数据}// 操作指定数量的灯voidsend_px_num(unsignedintnum,unsignedcharR,unsignedcharG,unsignedcharB)//操作指定个数灯{unsignedinti;for(i=0;i<num;i++){send_data(G);//发送R灰度数据send_data(R);//发送G灰度数据send_data(B);//发送B灰度数据}}// 操作所有灯voidsend_px_all(unsignedcharR,unsignedcharG,unsignedcharB){unsignedinti;for(i=0;i<LED_PX;i++){send_data(G);//发送R灰度数据send_data(R);//发送G灰度数据send_data(B);//发送B灰度数据}}/*===============================主函数=======================================*///void main()//{// unsigned char i;// LED_PX=IC; //像素点数等于TM1804个数// Rda=Gda=Bda=0; //R、G、B灰度数据复位清零// while(1)// {// for(i=0;i<PWM;i++) //红色渐亮// {// Rda=i; //灰度计算// send_px(); //发送灰度数据// delay(10); //复位延时// }// flag=1; //标志位置位// while(flag) //标志位置位后循环函数// {// for(i=0;i<PWM;i++) //红色渐灭,绿色渐亮// {// Gda=i;// Rda=PWM-i; //灰度计算// send_px(); //发送灰度数据// delay(10); //复位延时// }// for(i=0;i<PWM;i++) //绿色渐灭,蓝色渐亮// {// Bda=i;// Gda=PWM-i; //灰度计算// send_px(); //发送灰度数据// delay(10); //复位延时// }// for(i=0;i<PWM;i++) //蓝色渐灭,红色渐亮// {// Rda=i;// Bda=PWM-i; //灰度计算// send_px(); //发送灰度数据// delay(10); //复位延时// }// }// }//}/*================================结束==========================================*/
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 1:23:34

Th17 细胞的分化调控、功能特征

Th17 细胞Th17 细胞&#xff08;T helper cell 17&#xff09;是一类以分泌白介素 17&#xff08;IL-17&#xff09;为核心特征的 CD4⁺辅助性 T 细胞亚群&#xff0c;其在机体防御细胞外细菌、霉菌感染及自身免疫性疾病发生发展中具有关键作用&#xff0c;是免疫学领域的重要研…

作者头像 李华
网站建设 2026/4/23 9:16:27

Git分支管理策略优化Qwen3-VL-30B版本迭代开发流程

Git分支管理策略优化Qwen3-VL-30B版本迭代开发流程 在当前AI研发进入“大模型工业化”阶段的背景下&#xff0c;如何高效管理像Qwen3-VL-30B这样参数量高达300亿、涉及多模态融合与复杂训练流水线的旗舰级视觉语言模型&#xff0c;已成为工程团队面临的核心挑战。传统的Git工作…

作者头像 李华
网站建设 2026/4/18 8:13:41

个人或中小网站有必要做流量区分吗?

在很多站长和中小网站运营者的认知里&#xff0c;“流量区分”似乎是一件只属于大型平台的事情。动辄上亿 PV、复杂的安全体系、专业的运维团队&#xff0c;才需要去区分什么是正常流量、什么是无效流量。相比之下&#xff0c;个人博客、小型项目站、企业展示站访问量不大&…

作者头像 李华
网站建设 2026/4/20 14:09:17

10年测试架构师吐血总结,工作中用到的Linux命令都整理出来了

小李负责测试一款基于Linux系统的服务器管理软件。在测试过程中&#xff0c;他需要通过命令行界面与服务器进行交互&#xff0c;并进行各种测试和配置操作。例如&#xff0c;查看服务器上的文件结构&#xff0c;在文件中搜索特定的文本&#xff0c;检查日志文件中是否存在错误或…

作者头像 李华
网站建设 2026/4/20 11:43:59

如何在Windows上运行LobeChat镜像?WSL环境配置指南

如何在Windows上运行LobeChat镜像&#xff1f;WSL环境配置指南在当今AI应用快速普及的背景下&#xff0c;越来越多开发者希望在本地部署一个功能完整、交互流畅的聊天机器人系统。像 LobeChat 这样的开源项目提供了媲美 ChatGPT 的用户体验&#xff0c;支持多模型接入和插件扩展…

作者头像 李华