微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机控制1804C程序求解!求高手解答!

单片机控制1804C程序求解!求高手解答!

时间:10-02 整理:3721RD 点击:

各位大家好,我这里有一个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个数 32PCS

unsigned 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++)          //红色渐亮  

{

Rda=i;              //灰度计算

send_px();          //发送灰度数据

//delay(50);          //复位延时

delay(5);          //复位延时

}

flag=1;                     //标志位置位

while(flag)                 //标志位置位后循环函数

{

for(i=0;i<PWM;i++)  //红色渐灭,绿色渐亮

{

Gda=i;

Rda=PWM-i;  //灰度计算

send_px();  //发送灰度数据

//delay(50);  //复位延时

delay(5);          //复位延时

}

for(i=0;i<PWM;i++)  //绿色渐灭,蓝色渐亮

{

Bda=i;           

Gda=PWM-i;  //灰度计算

send_px();  //发送灰度数据

//delay(50);  //复位延时

delay(5);          //复位延时

}

for(i=0;i<PWM;i++)  //蓝色渐灭,红色渐亮

{

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
晶振不是在程序里設的,是下載的時候設定的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top