该文件为个人项目文件,仅以此作为备忘!
#include<reg52.h>
#define CODENUM 10 //接收的码长度
#define INTERVAL 25000 //码之间的判决时间长度
#define MAX 65535
sbit port=P1^0; //输入端口
sbit out=P1^3; //控制输出端口
sbit run=P1^2; //测试信号显示端口
unsigned char receivecode[CODENUM]; //数据接收存储数组
unsigned int lowtime; //低电平时间
void init(); //初始化函数
unsigned char JudStart(); //判断开始三脉冲函数
unsigned char Receive(); //接收函数
unsigned char ReadHighTime(); //读取高电平时间函数
void ReadLowtime(); //读取低电平时间函数
unsigned char WaitHighTimeGo(); //等待高电平过去函数
void Send(unsigned char receivecode[]); //串口发送函数
void Check(); //验证身份是否通过,控制门锁的开
void main()
{
unsigned char i,flag;
init();
while(1)
{
start: while(!port);
while(ReadHighTime()==0) //判断接下来的高电平是否有效
{
while(JudStart()==3) //三脉冲为真时开始接收数据
{
label2: run=0;
receivecode[CODENUM]=0;
for(i=0;i<CODENUM;i++) //接收过程中根据接收函数的不同返回值进行不同的操作
{
flag=Receive();
if(flag==2)
{
receivecode[i]=0;
}else if(flag==1){
receivecode[i]=1;
}else if(flag==3){
goto label2; //重新开始接收
}else if(flag==0){
//goto start;
break;
}
}
TI=0;
Send(receivecode);
Check();
run=1;
break;
}
}
}
}
void init() //初始化函数
{
TMOD=0X21; //
TL1=0xFF;
TH1=0xFF;
TR1=1;
PCON=0x80;
SCON=0x40;
REN=1;
}
unsigned char ReadHighTime() //读取高电平时间
{
unsigned char time;
TL0=0;
TH0=0;
TF0=0;
while(!port);
TR0=1;
while(port==1&&TF0==0);
TR0=0;
time=TF0;
return time;
}
unsigned char JudStart() //判断是否为开始
{
unsigned char count;
count=1;
ReadLowtime();
if(lowtime<INTERVAL)
{
count++;
while(port);
ReadLowtime();
if(lowtime<INTERVAL)
{
count++;
while(port);
while(!port);
}else{
}
}else{
}
return count;
}
void ReadLowtime() //读取低电平时间
{
TL0=0;
TH0=0;
TF0=0;
//while(port);
TR0=1;
while(port==0&&TF0==0);
TR0=0;
if(TF0)
{
lowtime=MAX;
}else{
lowtime=TH0*256+TL0;
}
}
unsigned char WaitHighTimeGo() //等待高电平过去
{
unsigned char ifover;
TL0=0;
TH0=0;
TF0=0;
while(!port);
TR0=1;
while(port==1&&TF0==0);
TR0=0;
ifover=TF0;
return ifover;
}
unsigned char Receive() //读取光接收电路的信息
{
unsigned char count;
count=1;
if(ReadHighTime()) //如果高电平过长,返回0
{
return 0;
}
ReadLowtime();
if(lowtime<INTERVAL)
{
count++;
//while(port);
if(WaitHighTimeGo())
{
return 0;
}
ReadLowtime();
if(lowtime<INTERVAL)
{
count++;
//while(port);
if(WaitHighTimeGo())
{
return 0;
}
while(!port);
}else{
}
}else{
}
return count;
}
void Send(unsigned char receivecode[]) //发送接收到的信息
{
unsigned char i;
SBUF=0x15;
while(!TI);
TI=0;
for(i=0;i<CODENUM;i++)
{
SBUF=receivecode[i];
while(!TI);
TI=0;
}
}
void Check() //根据电脑端发过来的信息判断是否进行开门
{
unsigned char read;
unsigned int i,j;
RI=0;
for(i=0;i<5500;i++)
{
if(RI==1)
{
read=SBUF;
RI=0;
if(read==0xAA)
{
out=0;
for(j=0;j<60000;j++);
out=1;
}
break;
}
}
}