news 2026/4/16 15:22:00

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/16 12:32:15

测试用例设计方法:正交试验法详解!

01 正交试验法介绍 正交试验法是研究多因素、多水平的一种试验法&#xff0c;它是利用正交表来对试验进行设计&#xff0c;通过少数的试验替代全面试验&#xff0c;根据正交表的正交性从全面试验中挑选适量的、有代表性的点进行试验&#xff0c;这些有代表性的点具备了“均匀分…

作者头像 李华
网站建设 2026/4/16 0:22:04

颈椎枕专利量化分析:3 大痛点频次与 2 条技术路线落地性测试

“投了50万做颈椎枕&#xff0c;仓库堆3万货卖不动”“跟风做智能枕&#xff0c;研发半年才发现核心技术早被专利卡脖子”——后台收到的创业者吐槽&#xff0c;几乎都绕不开一个问题&#xff1a;没找对“靠谱的决策依据”。很多人做颈椎枕创业&#xff0c;要么靠“感觉”&…

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

Plotly高级可视化库的使用方法(一)

前言 在我平时的工作中&#xff0c;常常用到可视化来分析数据&#xff0c;但是matplotlib生成的是静态图片&#xff0c;分析使用起来多有不变&#xff0c;因此渐渐的plotly成为了我工作中数据分析的主力库。特此开一篇博客&#xff0c;系统总结对plotly的理解&#xff0c;也借…

作者头像 李华
网站建设 2026/4/15 6:10:40

GEO优化服务商如何构建“负责任的AI”?技术伦理已成关键分水岭

一份来自真实案例的数据显示&#xff0c;当优化行为演变为“数据投毒”时&#xff0c;最终侵蚀的是整个AI生态赖以生存的信任基石。随着生成式AI成为主流信息入口&#xff0c;生成式引擎优化&#xff08;GEO&#xff09;服务商的价值已毋庸置疑。然而&#xff0c;行业早期伴生的…

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

Qwen3-8B+Dify智能体平台:打造企业级AI助手全流程

Qwen3-8B Dify智能体平台&#xff1a;打造企业级AI助手全流程 在企业智能化转型的浪潮中&#xff0c;越来越多组织希望引入AI助手来提升运营效率——从自动回复客户咨询&#xff0c;到辅助员工撰写报告、管理项目进度。但现实往往令人却步&#xff1a;大模型部署动辄需要数张A…

作者头像 李华
网站建设 2026/4/10 17:05:29

关于使用EL7201配置Motor AM3112的介绍

一、AM3112系列伺服的介绍 二、驱动EL7201模块的介绍 EL7201:EL7201 | EtherCAT 端子模块,单通道运动控制接口,伺服电机,48 V DC,2.8 A,旋转变压器(增量式)

作者头像 李华