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

📄 new.c

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

typedef unsigned char uchar;
typedef unsigned long ulong;

#define 	LED_NUM   32

#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;


uchar Tcount,Rcont;
ulong FaultFlg=0x000000001;

void Delay_100us(uchar time)
{
	uchar i;

	while(time--)
	{
		for(i=0;i<160;i++);	
	}
}


void BEEPSOUND (void)			 //暂时
{
	BEEP=1;
	Delay_100us(10);
}



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 RECORD()
{
	ulong TempB;
 	uchar i=0,j=0,k=0,t=0;

    for(i=0;i<8;i++)//i为第几L,j为灯发几次光,t为脉冲收数据
    {
		Delay_100us(100);
		BEEP=0;
   		 for(j=0;j<1;j++) //2周循环	 
   		 {
		 	if(((uchar)(i/4))%2)
			{
			//	SEND_byte(7*((uchar)(i/4))-(i-((uchar)(i/4)*4)),1);
			}
			else
			{
				//SEND_byte(i,1);
			} 
			Delay_100us(5);
            PL=0;//parallel load
			Delay_100us(1);
			PL=1;
		   TempB=0;
		    for(t=0;t<8;t++)//32个脉冲t循环读数
	        {

				CK=0;
				CK=1;

				TempB=TempB>>1;
				if(SO4)
				{
					TempB|=0x80000000;
				}
				else
				{
					TempB&=0x7FFFFFFF;	
				}
   			}

			TempB=~TempB;
		
			SEND_byte(((TempB>>24)&0XFF),1);
			///SEND_byte(TempB>>8,1);
			//SEND_byte(TempB>>16,1);
			//SEND_byte(TempB>>24,1);
		 
			//if(!(bit)((TempB<<i)&0x80000000))//正被挡 
			if(!((bit)(((TempB>>24)<<i)&0x01)))//正被挡 
			{
				//if((((TempB&(1<<i))==0)&&((FaultFlg&((1<<i))))==1))//无故障
				if(((((TempB>>24)&(1<<i))==0)&&((FaultFlg&((1<<i))))==1))//无故障
				{
					OB=0;  //叛为有阻隔
					SO=~SO;	// 阻隔灯亮
					if(Rcont>100)
					{
						Rcont=0;
						BEEPSOUND();		
					}
					else
					{
						Rcont++;
					}
				}	
			}
			

			if(i<1)
			{
				if((bit)((TempB<<1)&0x80000000))	//斜通 
				{
					Tcount++;
				}
			}
			else if(i<31)
			{
				
				if((i==3)||(i==4)||(i==7)||(i==8)||(i==11)||(i==12)||(i==15)||(i==16)||(i==19)||(i==20)||(i==23)||(i==24)||(i==27)||(i==28))
				{
					if((i==3)||(i==7)||(i==11)||(i==15)||(i==19)||(i==23)||(i==27))
					{
						if((i==3)||(i==11)||(i==19)||(i==27))
						{
							if(!(bit)((TempB<<i-1)&0x80000000))	//斜通
							{
								Tcount++;
							}
	
							if(!(bit)((TempB<<(7*((uchar)((i+1)/4))-((i+1)-((uchar)((i+1)/4)*4))))&0x80000000))	//斜通
							{
								Tcount++;
							}
						}
						else if((i==7)||(i==15)||(i==23))
						{

							if(!(bit)((TempB<<i-1)&0x80000000))	//斜通
							{
								Tcount++;
							}
							if(!(bit)((TempB<<(7*((uchar)((i-1)/4))-((i-1)-((uchar)((i-1)/4)*4))))&0x80000000))	//斜通 
							{
								Tcount++;
							}
						}		
					}			
				}
				else if((i==4)||(i==8)||(i==12)||(i==16)||(i==20)||(i==24)||(i==28))
				{
					 if((i==4)||(i==12)||(i==20)||(i==28))
					 {
					 	if(!(bit)((TempB<<(i+1))&0x80000000))	//斜通 
						{
							Tcount++;
						}
						if(!(bit)((TempB<<(((7*((uchar)(i/4))-(i-((uchar)(i/4)*4)))+1)))&0x80000000))	//斜通 
						{
							Tcount++;
						}	
					 }
					 else if((i==8)||(i==16)||(i==24))
					 {
					 	if(!(bit)((TempB<<(i-4))&0x80000000))	//斜通 
						{
							Tcount++;
						}
						if(!(bit)((TempB<<(i+1))&0x80000000))	//斜通 
						{
							Tcount++;
						}
					 }
				}
				else
				{

					if(!(bit)((TempB<<(i-1))&0x80000000))	//斜通 
					{
						Tcount++;
					}
					if(!(bit)((TempB<<(i+1))&0x80000000))	//斜通 
					{
						Tcount++;
					}	
				}
					
			}
			else if(i<32)
			{
				if(!(bit)((TempB<<(i-1))&0x80000000))	//斜通
				{
					Tcount++;
				}
			}	
 		}
					
    }

   /*
	if (Tcount<10)
	{
		OB=0;  //叛为有阻隔
		SO=1;	// 阻隔灯亮	
		Tcount=0;
		TRR=~TRR;
		if(Rcont>100)
		{
			Rcont=0;
			BEEPSOUND();		
		}
		else
		{
			Rcont++;
		}
	}
	*/
     
}

void MAIN ()
{
	serial_init();
	while(1)
	{
		RECORD();
	}
}

⌨️ 快捷键说明

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