//#include <AT892051.h>
#include <REG2051.h>
#include <stdlib.h>
#include "main.h"
#include "InputBin.h"
#include "eeaddr.h"
static U16 Lightness_Point;
U16 TransAddr;
U8 Light_Brightness;
unsigned char Light_Brightness1[3];
//U8 ucDot;
unsigned char ucDot[3];
U8 light_Point;
bit RS_BoardT_Flag;
bit IsFlash;
bit IsBrightness;
U8 ucBirghtLevel;
U8 ucPWMCouter;
U8 uc100us; //计时变量100us
U8 uc10ms; //计时变量0.01s
U16 ui1s; //计时变量 1s
unsigned int uc100us1; //zhuxiangyu82
unsigned char uc10ms1; //zhuxiangyu82
unsigned int uc100us2; //zhuxiangyu82
unsigned char uc10ms2; //zhuxiangyu82
unsigned char uc500ms1; //zhuxiangyu82
unsigned char uc20s2; //zhuxiangyu82
U16 ui10mschang;
bit f_ctl_10s;//zhuxiangyu82
bit f_ctl_data;
//char gcStep;
//U8 gucCurValue;
//U8 gucEndValue;
//U8 gucModeStep;//变化步骤值
bit IsSelfMode;//是否自变模式
bit IsChangeStep;//是否进行步骤变化
bit Is10mschang;//是否到10ms改变周期
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();
//static void Reset_WDog();
static void Deal_Comm();
static void Para_Init();
static void Comm_Init();
static void Deal_Ctrl();
//static void Dimming(U8 ucChannel,U8 ucStart,U8 ucEnd,U8 interval);
//static void ChangeValue();
/*************************
主函数 main
入口参数:无
返回值:无
*************************/
void pwm(void)
{ //f_ctl_data=0;
ucPWMCouter--;
if(ucPWMCouter>0)
{
if(ucDot[0]>0) {ucDot[0]--;LIGHT0=0;} else{ LIGHT0=1;}
if(ucDot[1]>0) {ucDot[1]--;LIGHT1=0;} else{ LIGHT1=1;}
if(ucDot[2]>0) {ucDot[2]--;LIGHT2=0;} else{ LIGHT2=1;}
}
else
{
ucPWMCouter=64;
ucDot[0] =Light_Brightness1[0]>>2;
ucDot[1] =Light_Brightness1[1]>>2;
ucDot[2] =Light_Brightness1[2]>>2;
}
}
void main()
{
Para_Init();
Comm_Init();
do
{
Deal_Comm();
if(uc20s2)//如果是10s得不到COMMAND就跳变
{ f_ctl_data=0;
Deal_Ctrl();
}
if(f_ctl_data) pwm();
}
while(1);
}
/*********
参数初始化
入口参数:无
返回值:无
********/
static void Para_Init()
{
ReadfromEEPROM(SELF_ADDR,&SelfAddr,2);
//uit=ReadfromEEPROM(SELF_ADDR,&SelfAddr,2);
ucPWMCouter=64;
IsSelfMode=0;
//gucModeStep=0;
IsChangeStep=YES;
Is10mschang=0;
Addr_Out=0;
//LIGHT0=0;
IsFlash=0;
ui1s=0;
IsBrightness=0;
//LIGHT0=0;
P1_7=1;
P1_6=1;
P1_5=1;
}
//---
/*********
通信初始化
入口参数:无
返回值:无
********/
static void Comm_Init()
{
PSW=0;
TMOD=0x21;
TL0=T0_low;
TH0=T0_high;
TL1=0xff;//Band_Set;
TH1=0xff;//Band_Set;
//PCON=0;
PCON=0x80;
SCON=0x50;
PS=1;
TCON=0x50;
IE=0x92;
RS_Send_Enable = NO;
Trans_Data_Length =0;
RS_T_Point =0;
RS_R_Point=0;
Recv_Data_Length=15;
Have_RS_R_Data = NO;
Lightness_Point = 0;
light_Point = 0;
RS_BoardT_Flag = NO;
Light_Brightness = 0;
}
/*接收缓冲数据处理函数
描述:
入口参数:无
返回值:无
改变:g
*/
void RS_Recive()
{
U16 tempAddr;
U8 tempData[4];
uc100us2=0;//zhuxiangyu82090215
uc20s2=0;//zhuxiangyu82090215
switch(RS_RECV_BUFFER[6])//command code
{
case 0x0://选测,return the lightness
P1_5=~P1_5;
break;
case 0x10://选测,return the lightness
Trans_Data_Length = 3+1;//3代表的是发送数据的帧头 后面的数据数是发送缓冲区的个数 配合发送流程函数的运算表达式来计算的有个减2的表达式
RS_TRANS_BUFFER[0] = 0x11;
RS_TRANS_BUFFER[1]=Light_Brightness;
Have_RS_T_Data = YES;
break;
case 0x20://ctrl single rtu
Light_Brightness=RS_RECV_BUFFER[7];
if (RS_RECV_BUFFER[7]!=0)
LIGHT0=1;
else
LIGHT0=0;
IsSelfMode=0;
Trans_Data_Length = 3;
RS_TRANS_BUFFER[0] = 0x21;
Have_RS_T_Data = YES;
break;
case 0x30://synchronization time
Trans_Data_Length = 3;
RS_TRANS_BUFFER[0] = 0x31;
Have_RS_T_Data = YES;
break;
case 0x40://start self mode
Trans_Data_Length = 3;
RS_TRANS_BUFFER[0] = 0x41;
Have_RS_T_Data = YES;
IsSelfMode=1;
//gucModeStep=0;
IsChangeStep=YES;
Is10mschang=0;
break;
case 0xa0://set the normal addr
SelfAddr=((U16)RS_RECV_BUFFER[7]<<8)+RS_RECV_BUFFER[8];
Write2EEPROM(SELF_ADDR,&SelfAddr,2);
Trans_Data_Length = 3;
RS_TRANS_BUFFER[0] = 0xa1;
Have_RS_T_Data = YES;
Addr_Out=1;
//IsFlash=1;
P1_6=0;
break;
case 0xb0://set the normal addr
Have_RS_T_Data = NO;//zhuxiangyu82090213
f_ctl_data=1;
Light_Brightness1[0]=RS_RECV_BUFFER[7];
Light_Brightness1[1]=RS_RECV_BUFFER[8];
Light_Brightness1[2]=RS_RECV_BUFFER[9];
break;
case 0xb1://set the normal addr
Have_RS_T_Data = NO;
P1_5=1;
P1_6=0;
P1_7=1;
// P1_6=1;
break;
case 0xb2://set the normal addr
Have_RS_T_Data = NO;
P1_5=1;
P1_6=1;
P1_7=0;
// P1_6=1;
break;
case 0xb3://set the normal addr
Have_RS_T_Data = NO;
P1_5=0;
P1_6=0;
P1_7=1;
// P1_6=1;
break;
case 0xb4://set the normal addr
Have_RS_T_Data = NO;
P1_5=0;
P1_6=1;
P1_7=0;
break;
case 0xb5://set the normal addr
Have_RS_T_Data = NO;
P1_5=0;
P1_6=0;
P1_7=0;
break;
case 0xb6:
Have_RS_T_Data = NO;
case 0xa2://set the special addr
SpecialAddr=((U32)RS_RECV_BUFFER[7]<<24)+((U32)RS_RECV_BUFFER[8]<<16)+((U32)RS_RECV_BUFFER[9]<<8)
+RS_RECV_BUFFER[10];
Write2EEPROM(SPECIAL_ADDR,&SpecialAddr,4);
Trans_Data_Length = 3;
RS_TRANS_BUFFER[0] = 0xa3;
Have_RS_T_Data = YES;
break;
case 0xa4://read the special addr
Trans_Data_Length = 3+4;
RS_TRANS_BUFFER[0] = 0xa3;
RS_TRANS_BUFFER[1] =(U8)(SpecialAddr>>24);
RS_TRANS_BUFFER[2] =(U8)(SpecialAddr>>16);
RS_TRANS_BUFFER[3] =(U8)(SpecialAddr>>8);
RS_TRANS_BUFFER[4] =(U8)SpecialAddr;
Have_RS_T_Data = YES;
break;
case 0xa6:
tempAddr=((U16)RS_RECV_BUFFER[7]<<8) + RS_RECV_BUFFER[8];
ReadfromEEPROM(tempAddr,&tempData,RS_RECV_BUFFER[9]);
Trans_Data_Length = 3+RS_RECV_BUFFER[9];
RS_TRANS_BUFFER[0] = 0xa7;
RS_TRANS_BUFFER[1] = tempData[0];
RS_TRANS_BUFFER[2] = tempData[1];
RS_TRANS_BUFFER[3] = tempData[2];
RS_TRANS_BUFFER[4] = tempData[3];
Have_RS_T_Data = YES;
break;
case 0xa8://set addr_out
if (RS_RECV_BUFFER[7]!=0)
Addr_Out=1;
else
Addr_Out=0;
Trans_Data_Length = 3;
RS_TRANS_BUFFER[0] = 0xa9;
Have_RS_T_Data = YES;
break;
default:
break;
}
RS_R_Point=10;
Erase_Recv_Buff();
REN=1;
}
/*
描述:清接收缓冲
输入:无
输出:无
改变:RS_R_Point,RS_RECV_BUFFER[],R_Flag
*/
void Erase_Recv_Buff()
{
unsigned char i;
for(i=0;i<=RS_R_Point;i++)
{
RS_RECV_BUFFER[i]=0;
}
RS_R_Point=0;
RS_BoardT_Flag = NO;
}
/*接收中断处理函数
描述:串口缓冲区数据的存放先放起始符到目的地址,若效验正确是本机数据,则开始接收下面的
数据,第一个字节放长度,然后放源地址,然后是TL,依次往下,CRC不放入缓冲区。
输入:无
输出:无
改变:CRC及接收各标志和缓冲区
*/
void Recv_Int()
{
U16 tempaddr;
RS_Recv_WaitTime = 0;
RS_RECV_BUFFER[RS_R_Point]=SBUF;
if (RS_BoardT_Flag != YES)
{
switch(RS_R_Point)
{
case 0:
if(RS_RECV_BUFFER[0]!=SIO1)
{
Erase_Recv_Buff();
return;
}
RS_Recv_Wait_Flag=YES;
break;
case 1:
if(RS_RECV_BUFFER[1]!=SIO2)
{
Erase_Recv_Buff();
return;
}
break;
case 3://len
Recv_Data_Length=((U16)RS_RECV_BUFFER[2]<<8)+RS_RECV_BUFFER[3];
break;
case 5://addr
//ReadfromEEPROM(SELF_ADDR,&SelfAddr,2);
tempaddr=(RS_RECV
2051DMX512.rar_PWM调光 DMX512_at89c2051 PWM_dmx512主控_dmx512协议_原理图
版权申诉
5星 · 超过95%的资源 21 浏览量
2022-07-14
01:16:24
上传
评论
收藏 165KB RAR 举报
四散
- 粉丝: 49
- 资源: 1万+
最新资源
- 农村信用社联合社计算机信息系统投产与变更管理办.docx
- 农村信用社联合社计算机信息系统数据管理办法.docx
- 利用SPSS作临床效度分析线上计算网站介绍-医学研究部统计谘.(医学PPT课件).ppt
- 利用Zabbix监控mysqldump定时备份数据库状态.docx
- 利用计算机解决问题的基本过程.doc
- 化工铁路通信工程总结.doc
- 北京大学网络教育软件工程作业.docx
- 医药公司(连锁店)计算机操作规程未新系统的自行按照旧制修改-新系统过制的编号加修模版.doc
- 医药公司(连锁店)计算机系统操作规程模版.doc
- 医药连锁门店计算机系统的操作和管理程序未新系统的自行按照旧制修改-新系统过制的编号加修模版.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论3