📄 text1asd
字号:
#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 + -