各位大家好,我这里有一个C语言程序,是用单片机给1804信号驱动LED的程序,我以前有学过单片机,但是对这个程序有些地方可以看懂,有些地方看不懂,所以求大家帮忙解读补充注视更好!谢谢!这个MCU 型号:STC15F104E晶震频率:33MHZ(内部时钟) 我从程序里面没有看到哪个语句说明时钟是33的,我如果把内部时钟设置为12MHZ或者其他频率,整个程序就不工作了!
以下我看不懂的地方我就用文字加以提问,懂的就不需要提问!希望朋友们根据问题一一解答,感谢!/*******************************************************************************/#include <reg52.h> //MCU头文件#include "intrins.h" //包含nop指令头文件
#define nop _nop_(); //宏定义 这个是宏定义空操作指令,用于延时,我知道!/********************************定义控制端口***********************************/sbit DO=P3^3; //定义信号输出DO/**********************************定义变量*************************************/unsigned char IC=32; //控制TM1804个数 32PCSunsigned int LED_PX; //像素点数 unsigned char PWM=255; //TM1804灰度数据 unsigned char Rda,Gda,Bda; //R、G、B灰度数据unsigned char bdata LED_data; //可位操作的数据发送暂存变量声明sbit bit0=LED_data^0; //被发送的数据各位定义sbit bit1=LED_data^1;sbit bit2=LED_data^2;sbit bit3=LED_data^3;sbit bit4=LED_data^4;sbit bit5=LED_data^5;sbit bit6=LED_data^6;sbit bit7=LED_data^7;bit flag=0; //定义一个标志位
/**********************************延时函数*************************************/void delay(unsigned int n) //n=1,延时500us{ unsigned int i; while(n--) for(i=0;i<860;i++);}
/********************发送0码函数,高电平400ns,周期1.25us************************/void send_data_0() { DO=1; nop;nop;nop;nop;nop; 这些工操作是干什么用?多了少了又有什么区别? nop;nop;nop;nop;nop; DO=0; nop;nop;nop;nop;nop;nop;nop; nop;nop;nop;nop;nop;nop;nop; }
/*******************发送1码函数,高电平800ns,周期1.25us*************************/void send_data_1() { DO=1; nop;nop;nop;nop;nop;nop; nop;nop;nop;nop;nop; nop;nop;nop;nop;nop;nop; nop;nop;nop;nop;nop; DO=0; }
/***********************发送1个字节数据,高位先发*******************************/void send_data(unsigned char DATA){LED_data=DATA; if(bit7)send_data_1();else send_data_0();if(bit6)send_data_1();else send_data_0();if(bit5)send_data_1();else send_data_0();if(bit4)send_data_1();else send_data_0();if(bit3)send_data_1(); else send_data_0();if(bit2)send_data_1(); else send_data_0();if(bit1)send_data_1(); else send_data_0();if(bit0)send_data_1();else send_data_0(); }/******************************发送1帧数据*************************************/void send_px(){unsigned int i;for(i=0;i<LED_PX;i++) 这句如何理解?前面我的是32个1804{send_data(Rda); //发送R灰度数据send_data(Gda); //发送G灰度数据send_data(Bda); //发送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++) //红 {MOD}渐亮 {Rda=i; //灰度计算send_px(); //发送灰度数据//delay(50); //复位延时delay(5); //复位延时}flag=1; //标志位置位while(flag) //标志位置位后循环函数{for(i=0;i<PWM;i++) //红 {MOD}渐灭,绿 {MOD}渐亮 {Gda=i;Rda=PWM-i; //灰度计算send_px(); //发送灰度数据//delay(50); //复位延时delay(5); //复位延时}for(i=0;i<PWM;i++) //绿 {MOD}渐灭,蓝 {MOD}渐亮 {Bda=i; Gda=PWM-i; //灰度计算send_px(); //发送灰度数据//delay(50); //复位延时delay(5); //复位延时}for(i=0;i<PWM;i++) //蓝 {MOD}渐灭,红 {MOD}渐亮 {Rda=i;Bda=PWM-i; //灰度计算send_px(); //发送灰度数据//delay(50); //复位延时delay(5); //复位延时}}}}/*================================结束==========================================*/
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
nop;越多,延時越長;
for(i=0;i<LED_PX;i++) 这句如何理解?前面我的是32个1804
每一個IC都有RBG,每個RGB你都要給到值,所以,for下面有三個Sen....,同樣,你那N個IC,那就是要給N次RGB,N就是LED_PX
晶振不是在程序里設的,是下載的時候設定的
一周热门 更多>