单片机解码接收

该文件为个人项目文件,仅以此作为备忘!

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


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小佐编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值