找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

DMX512信号讨论

[复制链接]
admin 发表于 2012-9-2 08:16:46 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
从网上找的,有时行有时不行。大家分析下是什么原因
//晶体32M。89S52.。。/C51程序。。/完整中文注释。大约1KB,还没有做地址开关扫描程序。不过这个简单,你在T1里面随便加个测试就好了。再做个函数。不要几句。呵呵。。你要改通道,就改address好了!!!这个程序收6路信号,我预留了第一个和最后一个它用。不过这里没有用到。只用了6个信道的中间4个来PWM LED;
//如换AT89C2051,T2不能用。改程序用串口方式2,SMOD=0,16M晶体。LED在低亮度下会有轻微抖动!!
//89s52.
#include<AT89X52.h>
#include<bin.h>
uchar data m[5]; //接收数据缓存
uchar xhn=0; //循环N次
uchar nn=10; //测试10次T1中断有无DMX信号
uchar a1,a2,a3,a4;
uchar b1,b2,b3,b4 ;
uchar biao; //循环256级亮度中的任意一个值的次数。
unsigned int n=0; //记数器
unsigned int address; //地址
sbit RE_RXD=P3^2; //MAX485使能
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
sbit led5=P1^7;
bit biao1;
bit dmxout; //T1中断一次送一DMX数据
bit dmxtest;
bit dmxsure; //有无DMX信号测试?
uchar dmxtest1;
/*****************************//************************************/
void init()
{
biao1=1; //PWM函数中是否能继续运行的甄选位,初值设为1
dmxtest=0; //DMX信号一贞有无标致位,初置1.有信号程序设为0;
TMOD=0x12; //T1 16位定时器 T0 8位自动重装。
//T2MOD=2;
IP=0x10; //串口高优先

TH0=0x52; //50HZ..0x98 60hz..0xa9 //32MHZ.60HZ 0x52//
TL0=TH0;
TH1=0x52;
TL1=0xaa; //32MHZ 60HZ 16575US 0x5358//
RCAP2H=0xff; //250K T2初值。
RCAP2L=0xfc;
IE=0x9a; //开总中断,串口,T1 T0 10011010
SCON=0xd0; //SM0=1;SM1=1;SM2=0;REN=1;工作方式3,并允许接收,开T2定时器
T2CON=0x20; //RCKL=1,使用T2做接收时钟
TR0=1;TR1=1;TR2=1; //打开T0 开T0
address=1; /***设置地址程序***/
}
/***********************100ms延时程序***************************/
void delay(uchar a)
{
uchar x,y,z;
for(x=a;x!=0;x--)
for(y=0;y!=255;y++)
for(z=0;z!=255;z++);
}
/***********************DMX信号有无测试***************************/
uchar test()
{
static uchar last_test,num_test;
if(dmxtest==1) {last_test=1;num_test=0;dmxtest=0;}
if(last_test==1)
{
if(num_test<10){num_test++;return 1;}
num_test=0;last_test=0;
}
return 0;
//此段程序的功能是:先测试 dmxtest是否为1,为1则把 last_test=1,
//在后面的10次判断中。last_test都是等于1的。所以都返回1。因为T1是16MS中断一次。
//有可能再测试的时候,dmxtest还没有置1,所以在此last_test一直等于1且10次。
//10次过后。还为0.则把 last_test=0,并且返回0------因为确实没有DMX信号过来。
//{last_test=1;num_test=0;dmxtest=0;}后面两句是:
//1. num_test=0;为后面的不为1时能测试10次准备。
//2. dmxtest=0;为再次收到一帧DMX时做置1准备!

}
////////////////////////pwm程序 ////////////////////////////////
void pwm()
{
extern uchar biao ;
while(biao);
biao=1; //循环256级亮度中的任意一个值biao次。
switch(xhn)
{
case 0: if(b1!=0){b1--;} else xhn++;break; //LED1渐熄
case 1: if(b2!=0){b2--;} else xhn++;break; //LED2渐熄
case 2: if(b3!=0){b3--;} else xhn++;break; //LED3渐熄
case 3: if(b1!=255){b4--;b1++;} else xhn++;break; //LED4渐熄,LED1渐亮,
case 4: if(b2!=255){b2++;} else xhn++;break; // LED2渐亮,
case 5: if(b3!=255){b1--;b3++;}else xhn++;break; //LED1渐熄,LED3渐亮,
case 6: if(b4!=255){b2--;b4++;} else xhn++;break; //LED2渐熄,LED4渐亮, 到此1-2熄。3-4亮
case 7: if(b1!=255){b1++;b2++;b3--;b4--;}else xhn++;break; //LED1渐亮,LED2渐亮,LED3渐熄,LED4渐熄,
case 8: if(b2!=0){b2--;}else xhn++;break; //LED2渐熄,
case 9: if(b3!=255){b3++;}else xhn++;break; //LED1渐亮, 到此1-3亮 2-4熄
case 10:if(b2!=255){b1--;b3--;b2++;b4++;}else xhn++;break; //到此1-3熄 2-4亮
case 11:if(b1!=255){b1++;b3++;} else xhn++;break; //全亮了!
default: xhn=0;
}

}
/**********************DMX显示程序**********************/
void dmx()
{
static uchar a=0,led5num=25; //
if(a!=led5num) a++; //
else //
{ //
led5=!led5 ; //LED5有DMX信号0.5S闪烁。
a=0; //
} //
b1=m[1];b2=m[2];b3=m[3];b4=m[4];
if((b1>0)&&(b1<3))
b1= 3; //R通道
if((b2>0)&&(b2<3))
b2= 3; //G通道
if((b3>0)&&(b3<3))
b3= 3; //B通道
if((b4>0)&&(b4<3))
b4= 3;
//y通道
while(dmxout); //16MS输入DMX数据到a1--a4。
dmxout=1;
}

/**********************主程序 **********************/
void main ()
{
static uchar PWM_DMX ;
init();
b1=255;b2=255;b3=255;b4=255;
delay(15); //长亮2S。
RE_RXD=0;
while(1)
{
if(dmxsure==0)
{if(PWM_DMX==1)
{
b1=255;b2=255;b3=255;b4=255;
PWM_DMX=0;
xhn=0;
led5=1;
}
pwm();
}
else
{
PWM_DMX=1;

dmx();
}

}
}
/********************** 主程序 **********************/
/**********************T0中断程序 **********************/
void tim0() interrupt 1
{
if(a1!=0) a1--;
else led1=0;
if(a2!=0) a2--;
else led2=0;
if(a3!=0) a3--;
else led3=0;
if(a4!=0) a4--;
else led4=0;
/*
#pragma asm
tim00: djnz a1,tim0a //把T1中断一次10MS分成255等分。39US。。初值0xd9。
clr LED1
tim0a: djnz a2,tim0b
clr LED2
tim0b: djnz a3,tim0c
clr LED3
tim0c: djnz a4,tim0_end
clr LED4
tim0_end:

#pragma endasm */
}
void tim1() interrupt 3
{
TH1=0x52;
TL1=0xaa;
TL0=TH0; //32MHZ 60HZ 16575US 0x5358//
led1=led2=led3=led4=1;
a1=b1^0xff;
a2=b2^0xff;
a3=b3^0xff;
a4=b4^0xff;
/*a1=b1;
a2=b2;
a3=b3;
a4=b4; */
dmxout=0; //16MS输入DMX数据到a1--a4。
biao--;
dmxsure=test(); //没有测试到为0.有为1.
}
void jpuz() interrupt 4 using 0 //接收
{
RI=0;
dmxtest=1;
if(RB8==0){n=0;return;};
if(n<address)
{ //n=0时是ST,丢弃,n=1时是第一个通道数据。
n++;
return;
}
else if(n>address+5) //;n>(地址码+5)的数据也丢弃。
{
n++;
return;
}
else //在等于地址码时,保存DATA,后面的5个也保存。
{ //即保存了6个数据到以m[0]为首地址的单元中。
m[n-address]=SBUF;
n++; //n在ST开始的时候就是没进一次中断的自加一的。
}
if(n==512) dmxtest=1; //收到512个数据。dmxtest=1;
}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 09:06 , Processed in 0.064771 second(s), 11 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表