📄 main.c
字号:
/* 本程序要实现以下功能:
* 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 + -