📄 new.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 + -