南宁专业做网站,网站建设怎么接单,做网站的公司怎么转型,做网站怎样赚到钱今天在调RGB灯带时发现#xff1a;颜色#xff0c;数量#xff0c;都能正常显示
但是就是每隔一会#xff0c;某颗RGB灯都会闪一下#xff0c;
正常#xff1a;异常#xff1a;#xff08;某个灯闪烁#xff09;最后发现是#xff0c;是因为中断的影响
因为51单片机没…今天在调RGB灯带时发现颜色数量都能正常显示但是就是每隔一会某颗RGB灯都会闪一下正常异常某个灯闪烁最后发现是是因为中断的影响因为51单片机没有中断优先级的概念所以任何意外中断都会打断时序。即使是中断内没有任何代码进入的过程也会花费几us导致时序错乱逻辑分析仪也会抓到了这一点解决方法操作时关闭总中断GIE0;// 关闭总中断send_px(10,0,1);// 操控灯GIE1;// 开启总中断代码TM1804的时序规则芯片参考手册TM1804在8位单片机上的代码TXD修改成自己的引脚当前适配的MCU是16Mhz 2T单个指令操作是125ns请修改nop数量来匹配时序main用法示例#includetm1804.h//导入RGB灯头文件voidmain(){while(1){delay_ms(200);//间隔200ms切换颜色GIE0;//关闭总中断send_px_num(3,10,0,1);//点亮3个灯RGB值10 0 1满载255GIE1;//开启总中断}}TM1804.h/* * TM1804 RGB灯幻彩变化 */#ifndefTM1804_H#defineTM1804_H#includesc.h// 单片机头文件// 自定义参数#defineTXDRA0//LED控制端口#defineIC54//LED灯总个数// 操作一个灯voidsend_px_one(unsignedcharR,unsignedcharG,unsignedcharB);// 操作指定个数灯voidsend_px_num(unsignedintnum,unsignedcharR,unsignedcharG,unsignedcharB);// 操作所有灯voidsend_px_all(unsignedcharR,unsignedcharG,unsignedcharB);//待加入:// 呼吸灯// 彩虹渐变// 流光效果// 等等#endifTM1084.c/********************* * TM1804 RGB灯幻彩变化。 ********************/#includetm1804.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(j550;j0;j--);}// 注意进入信号操作时要关闭总中断不然会打乱时序/********************发送0码函数,高电平400ns,周期1.25us************************/inlinevoidsend_data_0(){TXD1;// 高电平 300nsnop;// 一个nop大概0.125us(16MHz 2T) 300nsTXD0;// 低电平 900nsnop;nop;nop;//实测//高电平 1个nop 375ns引脚操作耗费250ns,nop耗费125ns//低电平 3个nop 1125ns//外面if耗费 625ns//切换RGB值耗费 750ns}/*******************发送1码函数,高电平800ns,周期1.25us*************************/inlinevoidsend_data_1(){TXD1;// 高电平 900nsnop;nop;nop;nop;nop;TXD0;// 低电平 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(i0;inum;i){send_data(G);//发送R灰度数据send_data(R);//发送G灰度数据send_data(B);//发送B灰度数据}}// 操作所有灯voidsend_px_all(unsignedcharR,unsignedcharG,unsignedcharB){unsignedinti;for(i0;iLED_PX;i){send_data(G);//发送R灰度数据send_data(R);//发送G灰度数据send_data(B);//发送B灰度数据}}/*主函数*///void main()//{// unsigned char i;// LED_PXIC; //像素点数等于TM1804个数// RdaGdaBda0; //R、G、B灰度数据复位清零// while(1)// {// for(i0;iPWM;i) //红色渐亮// {// Rdai; //灰度计算// send_px(); //发送灰度数据// delay(10); //复位延时// }// flag1; //标志位置位// while(flag) //标志位置位后循环函数// {// for(i0;iPWM;i) //红色渐灭绿色渐亮// {// Gdai;// RdaPWM-i; //灰度计算// send_px(); //发送灰度数据// delay(10); //复位延时// }// for(i0;iPWM;i) //绿色渐灭蓝色渐亮// {// Bdai;// GdaPWM-i; //灰度计算// send_px(); //发送灰度数据// delay(10); //复位延时// }// for(i0;iPWM;i) //蓝色渐灭红色渐亮// {// Rdai;// BdaPWM-i; //灰度计算// send_px(); //发送灰度数据// delay(10); //复位延时// }// }// }//}/*结束*/