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

📄 text1asd

📁 电梯光幕程序(keil开发环境)
💻
字号:
												#include<string.h>
#include"STC.h"

typedef unsigned char uchar;
typedef unsigned long ulong;


#define LIGHT 80 // 斜光数起屏蔽
#define FAT 10000  //

#define MHz     1000000U        // 定义 MHz
#define gCLK    (22.1184*MHz)   // 系统时钟频率
#define UART_BAUD   9600        // 定义所用的波特率


/*#define ADC_Power_On_Speed_Channel_0  0xE0
#define ADC_Power_On_Speed_Channel_1  0xE1
#define ADC_Power_On_Speed_Channel_2  0xE2
#define ADC_Power_On_Speed_Channel_3  0xE3
#define ADC_Power_On_Speed_Channel_4  0xE4
#define ADC_Power_On_Speed_Channel_5  0xE5
#define ADC_Power_On_Speed_Channel_6  0xE6
#define ADC_Power_On_Speed_Channel_7  0xE7
#define ADC_START					  0x08
#define ADC_FLAG					  0x10*/


sbit CK=P1^7;
sbit PL=P1^4;
//sbit BEEP=P1^5;
sbit SO=P1^3;
sbit SO4=P1^6;
//sbit buzzer_time=P1^2;
//sbit buzzer_delay=P1^1;
//sbit TRR=P3^5;
//sbit OB=P3^4;


sbit BEEP=P0^7;
sbit TRR=P0^5;
sbit OB=P0^4;


void SEND_byte(uchar dat,uchar SIZE);
void BEEPSOUND (void);
void EXECU (void);
void RECORD() ;


ulong SE[6]={0,0,0,0,0,0};
uchar CON_COR1;

void Delay_us(int time)
	{
	do 
 	time--;
	while(time>1);
	}

uchar BIT_WANT(ulong x,uchar n) 
{
x=(x>>n)&1;
return  x;
}

void RECORD()	  //记录入数组
{
	uchar s;
	ulong B[2]={0,0}; 
 	uchar i=0,j=0,k=0,t=0,byte;
	ulong temp;
    for(i=1;i<33;i++)//i为第几L,j为灯发几次光,t为脉冲收数据
    {
   		 for(j=0;j<2;j++) //2周循环	 
   		 {
			SEND_byte((i+2)/3,1); 
			Delay_us(50);
            PL=0;//parallel load
			Delay_us(2);
			PL=1;
			    for(t=0;t<32;t++)//32个脉冲t循环读数
  					        {
			 	
							CK=0;
							CK=1;
							byte=SO4;
 						   	B[j]=(B[j]+byte)<<1; //byte为每一个脉冲so4口收到的数据第一位为空
	  		           //   SEND_byte(byte,0) ;
							}

      	    //最尾一位放在第一位的
			//最好做好位交换        
            //掉好位置!!!!

			for(k=0;k<32;k+=4)
			{
				temp=B[j];
				if((bit)B[j]&(1<<k))
				{
					 B[j]|=(1<<(k+3));
				}
				else
				{
					B[j]&=~(1<<(k+3));	
				}

				if((bit)B[j]&(1<<(k+1)))
				{
					 B[j]|=(1<<(k+2));
				}
				else
				{
					B[j]&=~(1<<(k+2));	
				}
				
					
				if((bit)temp&(1<<(k+3)))
				{
					 B[j]|=(1<<k);
				}
				else
				{
					B[j]&=~(1<<k);	
				}

				if((bit)temp&(1<<(k+2)))
				{
					 B[j]|=(1<<(k+1));
				}
				else
				{
					B[j]&=~(1<<(k+1));	
				}			
			}
  
		  } 
		  		
		if(j<1)
		{
			for(s=0;s<3;s++)	
			{
				SE[2]=SE[2]<<1;
				if((bit)SE[1]&0x80000000)
				{
					SE[2]|=0x01;	
				}
				SE[1]=SE[1]<<1;

				if((bit)SE[0]&0x80000000)
				{
					SE[1]|=0x01;	
				}
				SE[0]=SE[0]<<1;
				
				B[j]=(B[j]<<(i-1));
				
				if((bit)((B[j]<<s)&0x80000000))
				{
					SE[0]|=0x01;
				}
			
			}
		}
		else
		{
			for(s=0;s<3;s++)	
			{
				SE[5]=SE[5]<<1;
				if((bit)SE[1]&0x80000000)
				{
					SE[5]|=0x01;	
				}
				SE[4]=SE[4]<<1;

				if((bit)SE[0]&0x80000000)
				{
					SE[4]|=0x01;	
				}
				SE[3]=SE[3]<<1;
				
				B[j]=(B[j]<<(i-1));
				
				if((bit)((B[j]<<s)&0x80000000))
					SE[3]|=0x01;
			
			}	
		}

			
				SE[2]=SE[2]<<1;
				if((bit)SE[1]&0x80000000)
				{
					SE[2]|=0x01;	
				}
				SE[1]=SE[1]<<1;

				if((bit)SE[0]&0x80000000)
				{
					SE[1]|=0x01;	
				}
				SE[0]=SE[0]<<1;
				
				SE[0]|=0x01;
				SE[2]|=0x80000000;


				
				SE[5]=SE[5]<<1;
				if((bit)SE[4]&0x80000000)
				{
					SE[5]|=0x01;	
				}
				SE[4]=SE[4]<<1;

				if((bit)SE[3]&0x80000000)
				{
					SE[4]|=0x01;	
				}
				SE[3]=SE[3]<<1;
							
				SE[3]|=0x01;
				SE[5]|=0x80000000;

          
    }

     
}

/*void Eight (void)//8位调试屏蔽
{
	uchar i;
	SE[0]=0x0FFFFFFF;
	for(i=1;i<3;i++)
	{
	SE[i+3]=0xFFFFFFFF;
	}
}

*/

void CHECK ()
{

	uchar CON_DEF=0,CON_COR=0,j,i,z,S,R,TROU_LIG,TROU_REC;

	for(j=0;j<2;j++)//两次循环修正值
	{
		for(i=0;i<2;i++)
		{
			if(CON_COR1>FAT)	//开始容错次数的决定
			{//根据那条光不通分析屏蔽S和R
			
				S=TROU_LIG;
				R=TROU_REC;
				SE[i]|=1<<3*S-2;//s第几灯,坏的个容错
				SE[i]|=1<<3*S-1;
				SE[i]|=1<<3*S;
				TRR=0;		  //发射通知 未写
				
				SE[i]|=1<<3*R-3;//r为第几接收头
				SE[i]|=1<<3*R-1;
				SE[i]|=1<<3*R+1;
				
				TRR=0;		 //闪未写
		
			}
		
	//	for(z=1;z<11;z++)
		for(z=0;z<32;z++)
		{
			//if(BIT_WANT(SE[i],3*z-1))	//表示正光3*z-1
			if(z*3<32)
			{
				if(!(bit)(SE[i*3]<<(z*3+1)))
				{
					CON_COR++;//正光被挡数
					
					//if(BIT_WANT(SE[i],3*z-2)==0&&BIT_WANT(SE[i],3*z)==0)//可能发射头坏了
					if(!(((bit)(SE[i*3]<<(z*3)))|((bit)(SE[i*3]<<(z*3+2)))))
					{
						//TROU_LIG=(11*i+z+1);
						TROU_LIG=z;
						CON_COR1++; 
					}
					
					//if (BIT_WANT(SE[i],3*z-3)==0&&BIT_WANT(SE[i],3*z+1)==0)//可能接收头坏了
				   if(!(((bit)(SE[i*3]<<(z*3)))|((bit)(SE[i*3]<<(z*3+2)))))
	
					{
						TROU_REC=(11*i+z+1);
						CON_COR1++;
					}
					else CON_COR1=0;
				}
			}
			else if((z*3<64))
			{
				if(!(bit)(SE[i*3+1]<<(z*3+2)))
				{
				}
			}
			else if((z*3<96))
			{
				if(!(bit)(SE[i*3+2]<<(z*3+3)))
				{
					
				}
			}
		}
		
		
		CON_DEF=94-CON_COR;//歪光数
		
		if (CON_DEF>LIGHT)	 //如果歪光大部分未照到	  屏蔽
		{								   //B	 6	   D	B	 6
			SE[0]|=0xB6DB6DB6;   		//1011  0110  1101 1011 0110 1101  1011 0110 
			SE[1]|=0xDB6DB6DB;			//1101 1011  0110 1101 1011 0110  1101 1011
			SE[2]|=0x6DB6DB6D;			//0110 1101  1011 0110 1101 1011  0110 1101 
		
			SE[3]|=0xB6DB6DB6;			//96个要分别判断
			SE[4]|=0xDB6DB6DB;
			SE[5]|=0x6DB6DB6D;
		
		}
		}
	}
}


void EXECU (void)	//执行
{
uchar j,i,BAD=0;

   for(j=0;j<3;j++)
	{
		for(i=1;i<33;i++)
		{
			if(BIT_WANT(SE[j],i)==0&&BIT_WANT(SE[j+3],i)==0)
 			{
				OB=0;  //叛为有阻隔
				SO=1;	// 阻隔灯亮
		        BAD++;		
				if(BAD>80)	//重复80次的阻隔
	  	 		BEEPSOUND();
  	  		}
    	}

 	}
}



void BEEPSOUND (void)			 //暂时
{
	//uchar i;
	BEEP=0;

/*	for (i=0;i<5000;i++)
			{
				BEEP=1;
  	 			Delay_us(50);
				BEEP=~BEEP;
   			 	Delay_us(50);
 			
			}	  */
}



 	void serial_init(void)
{
    SCON  = 0x50;               // Mode 1: 8-bit UART 允许接收
    TMOD |= 0x20;               // 定时器1 Mode 2: 8-Bit reload
    PCON  = 0x80;               // SMOD = 1
    TH1   = 256 - (uchar)(gCLK/192.0F/UART_BAUD);
    TR1   = 1;                  // 定时器 1 启动
    ES    = 1;                  // 串行中断允许
}


void SEND_byte(uchar dat,uchar SIZE)
	{ 
	uchar n=0;   
	n=SIZE; 

	TI=0; 	  //清除发送中断标志 
//  dat=1<<7|dat|SIZE<<6;
//	n=((dat&1)^((dat&2)>>1)^((dat&4)>>2)^((dat&8)>>3)^((dat&16)>>4)^((dat&32)>>5)^((dat&64)>>6)^((dat&128)>>7));
//	dat=dat<<1|n;
	SBUF=dat; //数据送发送缓冲区 
	while(TI==0);  //等待发送完成 
	TI=0;  //清除中断标志
	}

/*void ADC_Init(unsigned char CH)
{
	ADC_CONTR=0x80;	   							//打开A/D转换电源
	delay_ms(10);								//打开A/D转换电源  需要适当延迟以便A/D电源稳定
	//P1M0=P1M1=0x01;    	   					//设置P1.0 设置A/D通道所在的I/O为开漏模式
	ADC_CONTR |=CH;  							//选择P1.0作为A/D转换通道
	Delay_ms(10); 
}

int Ad_Change(unsigned char CH)
{
	uchar ADC_DATA_Temp;
	ADC_Init(CH);
	ADC_CONTR|=ADC_START;
	Delay_ms(10);
	while(1)
	{
		if(((bit)(ADC_CONTR&ADC_FLAG)==1)&&((bit)(ADC_CONTR&ADC_START))==0)	//判断A/D转换完成标志位
		{
			ADC_CONTR &=~ADC_FLAG; 		//清除A/D转换完成标志位ADC_FLAG
			ADC_DATA_Temp=ADC_DATA;		//把A/D转换结果保存到全局变量ADC_DATA_Temp中
 return ADC_DATA_Temp;

		}
	}
}

*/


void MAIN ()
{
	serial_init();
	while(1)
{
	RECORD();
//	Eight();
	CHECK();
	EXECU();
//    BEEPSOUND();
}
}

⌨️ 快捷键说明

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