⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 本源码程序采用用51单片机AT89C55分控采用软件模拟的方式输出SPI信号! 控制16段LED护栏管的单色跳变
💻 C
📖 第 1 页 / 共 3 页
字号:
/*  本程序要实现以下功能:  
*          1)、可控24路跳变点变化(即每点刷新频率《10次)                           *
*          2)、自变与受控变化                                                                  *
*          3)、自变模式可以从eeprom中获取自变模式组合                                          *
*          4)、可以通过通讯来改变eeprom里面的变化。进而达到改变外部效果的目的                  *                
*          5)、可以在直接点控制和串行移位控制两种模式中选择                                    *   
*/

//特别针对义乌项目修改,目标:标准化
//可以控制64个全彩像素点跳变
//可以分别依照指令控制8、16、24、32、40、48、56、64个全彩像素点跳变
 


#include <at89x55.h>
#include <stdlib.h>
#include <eeaddr.h>
#include <intrins.h>



//*************宏定义****************
#define uchar unsigned char
#define uint  unsigned int
#define YES   1
#define NO    0
#define TRUE  1
#define FALSE 0


#define      OFF     0
#define        ON    1
/*
//#define Write2EEPROM(x,y,z) EE_W_Addr((x));\
    					//	Write_N_Bytes((y),(z));\
    					//	IIC_Stop(); 
//#define ReadfromEEPROM(x,y,z) EE_W_Addr((x));\
 //   						  EE_RNB((z),(y)); 

 */
#define EE_R_ADDR 0xA1
#define EE_W_ADDR 0xA0
#define DELAY_TIME 20
//********硬件接口的宏定义*************
#define RS485_ENABLE    P3_4
#define SDA             P3_3
#define SCL             P3_2
sbit P3_4=P3^4; 
sbit P3_2=P3^2; 
sbit P3_3=P3^3;
sbit P1_0=P1^0;
sbit P1_1=P1^1; 
sfr   WDREST = 0xa6; 

//*************一些通信协议的宏定义*****
#define  HEAD1  0xeb
#define  HEAD2  0x90 
#define  Recv_OverTime    500
//串行移位转并行输出的操作函数 用到的端口定义
#define SCLK595       P1_1
#define SDATA595      P1_0
#define SLATCH595     P1_2

//#define JUMP_NUMBER_MAX     735   

uchar   idata  ucdot[24],uctemp[24],tt;
uchar   Dimming_Count,j;
bit     Is_change=0;

//uint   LightNumber=735;//led 总个数735
uint   JUMP_NUMBER_MAX=735;//led 总个数735

//************全局变量定义***************
// 1,一些中断的全局变量定义
uint  uc1fz ;
uint   ut10msTimer,ut10sTimer,ut20s;      
//2,通信的一些全局变量定义
uint   SelfAdd;
uchar  RECV_Point;//接收数据指针
uchar  RecvBuf[8];//接收数据缓冲区
uchar  Recv_Wait_Time;//接收等待计时
uint   Recv_DataLeng;
//****************位变量定义******
bdata   uchar  Flag;
sbit   Recv_WaitTime_Flag=Flag^0;
sbit   Recv_OverTime_Flag=Flag^1;
sbit   Recv_LightData_Flag=Flag^2; 
sbit   NO_RecvFlag=Flag^3; 
bdata   unsigned char  road0,road1,road2;//24路

//3,PWM的一些变量定义
uchar PWMcount;
uchar Light_Point;
uint  LightCount;//灯的个数的加数器
uchar LightData[24];
 

//******函数定义************************
void SYS_Init(void);
void SCON_Init(void);
void REST_WDT(void); 
void RECV_Deal(void);
void Clear_RecvBuf(void);
void Com_Deal();

void Delay(unsigned int time);
bit EE_W_Addr(unsigned int ui_Addr_Value);
bit EE_RNB(unsigned char n,unsigned char *buffer);
bit Write_N_Bytes(unsigned char *buffer,unsigned char n);
void IIC_Stop();
static bit Read_N_Bytes(unsigned char n,unsigned char *buffer);
static void IIC_Start(); 
static void SEND_0(void); 
static void SEND_1(void); 
static void IIC_Byte_W(unsigned char b);
static unsigned char IIC_Byte_R(); 
static bit IIC_ACK();
void  COM_Jump(void);
void Jump_mode1();//
void Jump_mode2();
void Jump_mode3();
void Jump_mode4();
void  mini_led_red_full_on(void);//小功率红色整体亮
void  clear_all(void);

void clr(void);
void tb_red(void);//红色整体亮
void tb_green(void);//绿色整体亮
void tb_blue(void);//蓝色整体亮
void tb_red_green(void);//跳变红绿整体亮
void tb_red_blue(void);//跳变红蓝整体亮
void  tb_green_blue(void);//跳变绿蓝整体亮

void  pd_red(void);//红色跑动效果
void  pd_green(void);//绿色跑动效果
void  pd_blue(void);//蓝色跑动效果
void  pd_red_green(void);//红绿跑动效果
void  pd_red_blue(void);//红蓝跑动效果
void  pd_green_blue(void);//绿蓝跑动效果

void  seven_color_full(void);//全彩跑动效果



/*************
模式一	小功率线光源整体单色、整体七彩变换、七彩跑动变换								
模式二	大功率洗墙光源整体单色、整体七彩变换、七彩跑动变换								
模式三	小功率线光源和大功率洗墙光源同步整体单色、同步整体七彩变换、七彩跑动变换								
模式四	小功率线光源和大功率洗墙光源间隔整体单色、间隔整体七彩变换、间隔七彩跑动变换								
*/

void Delay1(unsigned int time);
void Delay2(unsigned int time); 
void Delay3(unsigned int time);//七彩追逐间隔延时 
//void ShiftOutput( uchar Ucdata0,uchar Ucdata1,uchar Ucdata2);     //FOR  B //串行移位转并行输出的操作函数
//void NopDelay(void);
//void ALL_0ff(void);
void Dimming_Ctrl(void);



void main(void)
{
  SYS_Init();
  SCON_Init();
  while(1)
  {
     //REST_WDT();
  	if(NO_RecvFlag&&uc1fz)
	 {
	   Dimming_Ctrl();
	 } 
	else
    {
       	COM_Jump();	 
  	    Com_Deal();
	 }

  }

}
 

/*************
模式一	小功率线光源整体单色、整体七彩变换、七彩跑动变换								
模式二	大功率洗墙光源整体单色、整体七彩变换、七彩跑动变换								
模式三	小功率线光源和大功率洗墙光源同步整体单色、同步整体七彩变换、七彩跑动变换								
模式四	小功率线光源和大功率洗墙光源间隔整体单色、间隔整体七彩变换、间隔七彩跑动变换								
*/



//*********受控功能函数*****
void COM_Jump(void)
{
 if(LightData[1]==0xa1)
	  {
	   Jump_mode1();
	   } 

   if(LightData[2]==0xa2)
	  {
	   Jump_mode2();
	   } 


   if(LightData[3]==0xa3)
	  {
	   Jump_mode3();
      } 


	   
   if(LightData[4]==0xa4)
	  {
	   Jump_mode4();
	  } 
  

}


void Jump_mode1()//模式一七种单色整体跳变	
{
	     
        tb_red();
		Delay1(LightData[0]);
		clr();

        tb_green();
        Delay1(LightData[0]);
        clr();

        tb_blue();
        Delay1(LightData[0]);
		clr();

        tb_red_green();
        Delay1(LightData[0]);
	    clr();

        tb_red_blue();
        Delay1(LightData[0]);
		clr();

        tb_green_blue();
        Delay1(LightData[0]);
		clr();

       
        

        //clr();
  //pd_red();
 // clr();
 // Delay2(LightData[0]);
  clr();
  Delay2(LightData[0]);
  pd_red();//红色跑动效果
  
  Delay2(LightData[0]);
  clr();
  pd_green();//绿色跑动效果
  
  Delay2(LightData[0]);
  clr();
  pd_blue();//蓝色跑动效果
  
  Delay2(LightData[0]);
  clr();
  pd_red_green();//红绿跑动效果
  
  Delay2(LightData[0]);
  clr();
  pd_red_blue();//红蓝跑动效果
  
  Delay2(LightData[0]);
  clr();
  pd_green_blue();//绿蓝跑动效果
  
  Delay2(LightData[0]);
  clr();
  


 

   clr();
  Delay2(LightData[0]);
  pd_red();//红色跑动效果
  
  Delay2(LightData[0]);
  //clr();
  pd_green();//绿色跑动效果
  
  Delay2(LightData[0]);
  //clr();
  pd_blue();//蓝色跑动效果
  
  Delay2(LightData[0]);
 // clr();
  pd_red_green();//红绿跑动效果
  
  Delay2(LightData[0]);
 // clr();
  pd_red_blue();//红蓝跑动效果
  
  Delay2(LightData[0]);
  //clr();
  pd_green_blue();//绿蓝跑动效果
  
  Delay2(LightData[0]);
  //clr();  

  
   clr();
  seven_color_full();//全彩跑动效果	
  Delay2(LightData[0]);      
  
}


//*************************************************
void Jump_mode2()//模式二	七种单色跑动	
{

  //clr();
  //pd_red();
 // clr();
 // Delay2(LightData[0]);
  clr();
  Delay2(LightData[0]);
  pd_red();//红色跑动效果
  
  Delay2(LightData[0]);
  clr();
  pd_green();//绿色跑动效果
  
  Delay2(LightData[0]);
  clr();
  pd_blue();//蓝色跑动效果
  
  Delay2(LightData[0]);
  clr();
  pd_red_green();//红绿跑动效果
  
  Delay2(LightData[0]);
  clr();
  pd_red_blue();//红蓝跑动效果
  
  Delay2(LightData[0]);
  clr();
  pd_green_blue();//绿蓝跑动效果
  
  Delay2(LightData[0]);
  clr();
  

   clr();
  seven_color_full();//全彩跑动效果	
  Delay2(LightData[0]);

  
}

//***************************************************
void Jump_mode3()//模式三	七种色彩追逐跑动
{


  clr();
  seven_color_full();//全彩跑动效果	
  Delay2(LightData[0]);

}

//***********************************************************
void  Jump_mode4()//模式四	小功率线光源和大功率洗墙光源间隔整体单色、间隔整体七彩变换、间隔七彩跑动变换
{  
  
   clr();
  Delay2(LightData[0]);
  pd_red();//红色跑动效果
  
  Delay2(LightData[0]);
  //clr();
  pd_green();//绿色跑动效果
  
  Delay2(LightData[0]);
  //clr();
  pd_blue();//蓝色跑动效果
  
  Delay2(LightData[0]);
 // clr();
  pd_red_green();//红绿跑动效果
  
  Delay2(LightData[0]);
 // clr();
  pd_red_blue();//红蓝跑动效果
  
  Delay2(LightData[0]);
  //clr();
  pd_green_blue();//绿蓝跑动效果
  
  Delay2(LightData[0]);
  //clr();
 
}


/*
void  mini_led_red_full_on()
{
       uchar i;
        SLATCH595=0; 
		     for(i=0;i<(JUMP_NUMBER_MAX);i++)
	      {
		     
	         SCLK595=0;       //BIT 7   0     
             SDATA595=0; 
             SCLK595=1; 
  
	         SCLK595=0;      //BIT 6    0 
             SDATA595=0; 
             SCLK595=1; 
			  
	         SCLK595=0;      //BIT 5    B      high power led
             SDATA595=0; 
             SCLK595=1; 
             
	         SCLK595=0;      //BIT 4    G     high power led
             SDATA595=0; 
             SCLK595=1; 
			 
	         SCLK595=0;        //BIT 3   R   high power led
             SDATA595=0; 
             SCLK595=1; 
			 
	         SCLK595=0;        //BIT 2   B    mini led
             SDATA595=0; 
             SCLK595=1; 
			 
	         SCLK595=0;        //BIT 1   G   mini led
             SDATA595=1; 
             SCLK595=1; 
			 
	         SCLK595=0;        //BIT 0    R   mini led
             SDATA595=1; 
             SCLK595=1;             
	      }   
		
		 SLATCH595=1;   


}

void  clear_all()
{
       uchar i;
        SLATCH595=0; 
		     for(i=0;i<(JUMP_NUMBER_MAX);i++)
	      {
		     
	         SCLK595=0;       //BIT 7   0     
             SDATA595=0; 
             SCLK595=1; 
  
	         SCLK595=0;      //BIT 6    0 
             SDATA595=0; 
             SCLK595=1; 
			  
	         SCLK595=0;      //BIT 5    B      high power led
             SDATA595=0; 
             SCLK595=1; 
             
	         SCLK595=0;      //BIT 4    G     high power led
             SDATA595=0; 
             SCLK595=1; 
			 
	         SCLK595=0;        //BIT 3   R   high power led
             SDATA595=0; 
             SCLK595=1; 
			 
	         SCLK595=0;        //BIT 2   B    mini led
             SDATA595=0; 
             SCLK595=1; 
			 
	         SCLK595=0;        //BIT 1   G   mini led
             SDATA595=0; 
             SCLK595=1; 
			 
	         SCLK595=0;        //BIT 0    R   mini led
             SDATA595=0; 
             SCLK595=1;             
	      }   
		
		 SLATCH595=1;   


}
*/
//************系统初始化函数************
void  SYS_Init(void)
{
  uchar i;
  bit  SetAdd_Flag,t;
  SetAdd_Flag=P1_7;
  if( SetAdd_Flag)
  {
    t=P1_6;
	//SelfAdd=P0;
    SelfAdd=2;
    SelfAdd= SelfAdd|((unsigned int)t<<8);
  //	Write2EEPROM(SELF_ADDR,&SelfAdd,2);
  }
  else
  {	 
   // ReadfromEEPROM(SELF_ADDR,&SelfAdd,2);
  }	
  PWMcount=255;
  Light_Point=0;
  LightCount=0;
  tt=0;
  for(i=0;i<24;i++)
  {
    ucdot[i]=LightData[i]=0;
  }
   ut10msTimer=0;
   uc1fz=0;
   ut20s=0;   
   ut10sTimer=0;
   Recv_DataLeng=0;
   RECV_Point=0;//接收数据指针 
   Recv_Wait_Time=0;//接收等待计时
  // Recv_WaitTime_Flag=NO;//
   Recv_WaitTime_Flag=YES;//
   Recv_OverTime_Flag=NO;
   Recv_LightData_Flag=NO; 
   NO_RecvFlag=YES;
  
}

//*********串口初试化函数**************
void SCON_Init(void)
{
  PSW=0;
  TMOD=0X01; //TMR0 WORK 1 16BIT
  T2MOD=0X00;
  TH0=0xff;//100us
  TL0=0Xaa;
  TCON=0X10;
  PCON=0;//波特例不加倍。SMOD=0;
  C_T2=0;
  RCLK=1;
  TCLK=1;
  TF2=0;
  RCAP2H=0XFF;
  RCAP2L=0XF1;//@24MH,50,000BP
//  RCAP2H=0XFF;
//  RCAP2L=0XDC;//@24MH,50,000BP
  SCON=0X50;
  TR2=1;
  PS=1;//串口中断优先
  IE=0X92;
  RS485_ENABLE=0; //允许接收  
  

}

//**********TMR0中断函数*************
void  TMR0(void) interrupt 1 using 2
{
 // uchar i;
  TH0=0xfe;//10ms
  TL0=0Xf0;
 // ut10msTimer++;
  ut10msTimer++;
  if(ut10msTimer >300)	//1秒左右以上	
	{
	    ut10msTimer = 0;
	    ut10sTimer++;
		ut20s++;
	    uc1fz=1;
	  //  NO_RecvFlag=N0;
	} 

   if( ut10sTimer>100)
   {
   	 ut10sTimer=0;	
   }

    if( ut20s>5000)
   {
   	 ut20s=0;
	 NO_RecvFlag=YES;
   }


   //*******通信计时***************
   if( Recv_WaitTime_Flag==YES)
   {
   	 if(  Recv_Wait_Time>= Recv_OverTime )
	 {
	    Recv_Wait_Time=0;
	    Recv_OverTime_Flag=YES;
		Recv_WaitTime_Flag=NO;
	  }
   	  else   Recv_Wait_Time++; 
   } 
}



//************通信中断函数*******************
void SCON_ZD(void) interrupt 4 using 1
{
  if(RI==1)
  {  
    RI=0;
	RECV_Deal();
   } 
}




void Dimming_Ctrl(void)
 { 
   uint i;
    //j=0;
  //P1_0=1;
 
   switch(tt)
    {
     
        case  0://红色亮
             
	        SLATCH595=0; 
              for(i=0;i<=JUMP_NUMBER_MAX;i++)
	            {
                   SCLK595=0;        //蓝 
                   SDATA595=OFF; 
	               SCLK595=1;

 
                   SCLK595=0;        //红
                   SDATA595=ON; 
	               SCLK595=1;
	


                   SCLK595=0;        //绿 
                   SDATA595=OFF; 
	               SCLK595=1;
	               
	           }
          	     SCLK595=0;
                 SLATCH595=1;
                  
	             SLATCH595=0; 
	            // delay();	

               if(ut10sTimer<50)
                 {  if(Is_change==1)
                    { 
 		             Is_change=0;              
                    }
		      	 }

              else {
		            Is_change=0; 		     
		            ut10sTimer=0;
                    tt++; 
	                j=0;
	  	           }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -