主题:求助高手来解释一下程序!!!
楼主 程序清单
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*定义25045*/
unit t01,t02,t03;
sbit xsck=p1^2;/*25045*/
sbit xso=p1^1;
sbit xsi=p1^3;
sbit xcs=p1^0;
/*定义电磁阀控制端*/
sbit j1=p2^5;/*out*/
sbit j2=p2^6;
sbit j3=p2^7;
sbit frng=p1^7;
/*定义光电开关*/
sbit in1=p1^4;
sbit in2=p1^5;
sbit in3=p1^6;
bdata uchar ab;
sbit abit0=ab^0;
sbit abit1=ab^1;
sbit abit2=ab^2;
sbit abit3=ab^3;
sbit abit4=ab^4;
sbit abit5=ab^5;
sbit abit6=ab^6;
sbit abit7=ab^7;
idata uchar t_num=0,crc=0;
bit flag1,flag2,flag3,stop;
/***************************/
/*-------------------------*/
/*----------x25045---------*/
/*----25045写数据函数-----*/
void write(uchar str)
{ uchar i;
ab=str;
for(i=0;i<8;i++)
{ xsck=0;
xsi=abit7;
xsck=1;
ab<<=1; }
xsi=0;
}
/*25045读数据函数*/
uchar read()
{
uchar i,ch;
xso=1;
for(i=0;i<8;i++)
{ xsck=1;
xsck=0;
ab<<=1;/*should move before then get a bit from xso*/
abit0=xso; }
ch=ab;
return(ch);
}
/*25045读状态函数*/
uchar read_state( )
{
uchar ch;
xsck=0;xcs=0;
write(0x05);
ch=read( );
xsck=0;xcs=1;
return(ch);
}
/*25045读多字节函数*/
void read_nbyte(uint add,uint num,uchar *str)
{
uint i;
union {
uchar ch[2];
uint addres;
}u;
u.addres=add;
xsck=0;xcs=0;
u.ch[0]=((u.ch[0]&0x01)<<3)│0x03;
write(u.ch[0]);
write(u.ch[1]);
for(i=0;i<num;i++)
{ *str=read( );
str++;
}
xsck=0;
xcs=1;
*str=0;
}
/*25045写RAM*/
void p_write(uint add,uchar num,uchar *str)/*num<=4*/
{
uchar i;
union {
uchar ch[2];
uint addres;
}u;
u.addres=add;
xsck=0;xcs=0;
write(0x06);
xcs=1;xcs=0;
u.ch[0]=((u.ch[0]&0x01)<<3)│0x02;
write(u.ch[0]);
write(u.ch[1]);
for(i=0;i<num;i++)
{ write(*str);
str++;
}
xsck=0;
xcs=1;
do{
ab=read_state( );
} while(abit0);
}
/*25045写状态数据*/
void write_state(uchar str)
{
xsck=0;xcs=0;
write(0x06);
xcs=1;xcs=0;
write(0x01);
write(str);
xsck=0;xcs=1;
do{
ab=read_state( );
} while(abit0);
}
/*25045复位*/
void reset( )
{ xcs=0;
_nop_( );
_nop_( );
xcs=1;
}
/*********************************/
void timer0(void) interrupt1 using0
{
TH0=0x9e;/*25ms*/
TL0=0x58;
t01++;t02++;t03++;
if(flag1)
{
if(!in1)
{ flag1=0;
j1=0;j2=0;j3=0;
t01=0;fmq=0;
}
if( t01>120)/*delay 4s*/
{ j1=1;}
if( t01>200)/*delay 5s*/
{j2=1;j3=1;fmq=1;
flag1=0;
stop=1;
TR0=0;}
}
/****************************************/
if(flag2)
{
if(!in2)
{ flag2=0;
j1=0;j2=0;j3=0;
t02=0;fmq=0;
}
if( t02>120)/*delay 4s*/
{ j1=1;}
if( t02>200)/*delay 5s*/
{j2=1;j3=1;fmq=1;
flag2=0;
stop=1;
TR0=0;}
}
/*******************************************/
if(flag3)
{
if(!in3)
{ flag3=0;
j1=0;j2=0;j3=0;
t03=0;fmq=0;
}
if( t03>120)/*delay 4s*/
{ j1=1;}
if( t03>200)/*delay 5s*/
{j2=1;j3=1;fmq=1;
flag3=0;
stop=1;
TR0=0;}
}
}
void initime( )
{
TMOD=0x21;
TH0=0x9e;
TL0=0x58;
EA=1;
ET0=1;
TR0=1;
}
/******************************************/
void inite( )
{
data uchar str,i;
write_state(0x00);/*看门狗定时1.4s*/
initime( );
}
void main( )
{
uchar i;
inite( );
ji=1;j2=1;j3=1;
fmq=1;/*led,fmq check*/
t01=0;
while(t01<20) reset( );
fmq=0;
stop=0;
while(in1&&in2&&in3) reset( );
j1=0;j2=0;j3=0;
while(1)
{
reset( );
if(!stop)
{ if(in1==0&&flag1==0)
{ flag1=1; t01=0;}
if(in2==0&&flag2==0)
{ flag2=1; t02=0;}
if(in3==0&&flag3==0)
{ flag3=1; t03=0;}
}
else reset( );
}
}
用的是AT89C52单片机X25045芯片
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*定义25045*/
unit t01,t02,t03;
sbit xsck=p1^2;/*25045*/
sbit xso=p1^1;
sbit xsi=p1^3;
sbit xcs=p1^0;
/*定义电磁阀控制端*/
sbit j1=p2^5;/*out*/
sbit j2=p2^6;
sbit j3=p2^7;
sbit frng=p1^7;
/*定义光电开关*/
sbit in1=p1^4;
sbit in2=p1^5;
sbit in3=p1^6;
bdata uchar ab;
sbit abit0=ab^0;
sbit abit1=ab^1;
sbit abit2=ab^2;
sbit abit3=ab^3;
sbit abit4=ab^4;
sbit abit5=ab^5;
sbit abit6=ab^6;
sbit abit7=ab^7;
idata uchar t_num=0,crc=0;
bit flag1,flag2,flag3,stop;
/***************************/
/*-------------------------*/
/*----------x25045---------*/
/*----25045写数据函数-----*/
void write(uchar str)
{ uchar i;
ab=str;
for(i=0;i<8;i++)
{ xsck=0;
xsi=abit7;
xsck=1;
ab<<=1; }
xsi=0;
}
/*25045读数据函数*/
uchar read()
{
uchar i,ch;
xso=1;
for(i=0;i<8;i++)
{ xsck=1;
xsck=0;
ab<<=1;/*should move before then get a bit from xso*/
abit0=xso; }
ch=ab;
return(ch);
}
/*25045读状态函数*/
uchar read_state( )
{
uchar ch;
xsck=0;xcs=0;
write(0x05);
ch=read( );
xsck=0;xcs=1;
return(ch);
}
/*25045读多字节函数*/
void read_nbyte(uint add,uint num,uchar *str)
{
uint i;
union {
uchar ch[2];
uint addres;
}u;
u.addres=add;
xsck=0;xcs=0;
u.ch[0]=((u.ch[0]&0x01)<<3)│0x03;
write(u.ch[0]);
write(u.ch[1]);
for(i=0;i<num;i++)
{ *str=read( );
str++;
}
xsck=0;
xcs=1;
*str=0;
}
/*25045写RAM*/
void p_write(uint add,uchar num,uchar *str)/*num<=4*/
{
uchar i;
union {
uchar ch[2];
uint addres;
}u;
u.addres=add;
xsck=0;xcs=0;
write(0x06);
xcs=1;xcs=0;
u.ch[0]=((u.ch[0]&0x01)<<3)│0x02;
write(u.ch[0]);
write(u.ch[1]);
for(i=0;i<num;i++)
{ write(*str);
str++;
}
xsck=0;
xcs=1;
do{
ab=read_state( );
} while(abit0);
}
/*25045写状态数据*/
void write_state(uchar str)
{
xsck=0;xcs=0;
write(0x06);
xcs=1;xcs=0;
write(0x01);
write(str);
xsck=0;xcs=1;
do{
ab=read_state( );
} while(abit0);
}
/*25045复位*/
void reset( )
{ xcs=0;
_nop_( );
_nop_( );
xcs=1;
}
/*********************************/
void timer0(void) interrupt1 using0
{
TH0=0x9e;/*25ms*/
TL0=0x58;
t01++;t02++;t03++;
if(flag1)
{
if(!in1)
{ flag1=0;
j1=0;j2=0;j3=0;
t01=0;fmq=0;
}
if( t01>120)/*delay 4s*/
{ j1=1;}
if( t01>200)/*delay 5s*/
{j2=1;j3=1;fmq=1;
flag1=0;
stop=1;
TR0=0;}
}
/****************************************/
if(flag2)
{
if(!in2)
{ flag2=0;
j1=0;j2=0;j3=0;
t02=0;fmq=0;
}
if( t02>120)/*delay 4s*/
{ j1=1;}
if( t02>200)/*delay 5s*/
{j2=1;j3=1;fmq=1;
flag2=0;
stop=1;
TR0=0;}
}
/*******************************************/
if(flag3)
{
if(!in3)
{ flag3=0;
j1=0;j2=0;j3=0;
t03=0;fmq=0;
}
if( t03>120)/*delay 4s*/
{ j1=1;}
if( t03>200)/*delay 5s*/
{j2=1;j3=1;fmq=1;
flag3=0;
stop=1;
TR0=0;}
}
}
void initime( )
{
TMOD=0x21;
TH0=0x9e;
TL0=0x58;
EA=1;
ET0=1;
TR0=1;
}
/******************************************/
void inite( )
{
data uchar str,i;
write_state(0x00);/*看门狗定时1.4s*/
initime( );
}
void main( )
{
uchar i;
inite( );
ji=1;j2=1;j3=1;
fmq=1;/*led,fmq check*/
t01=0;
while(t01<20) reset( );
fmq=0;
stop=0;
while(in1&&in2&&in3) reset( );
j1=0;j2=0;j3=0;
while(1)
{
reset( );
if(!stop)
{ if(in1==0&&flag1==0)
{ flag1=1; t01=0;}
if(in2==0&&flag2==0)
{ flag2=1; t02=0;}
if(in3==0&&flag3==0)
{ flag3=1; t03=0;}
}
else reset( );
}
}
用的是AT89C52单片机X25045芯片