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

📄 processdata.h

📁 C51单片机通过红外通信实现PC键盘的无线通信 读取与显示具体细节请参考源程序将时钟线接入外部中断数据线接入普通I/O输入输出口
💻 H
字号:
/**********************************Copyright (c)*********************************
;**       文件名:       ProcessData.h
;**       功能:         数据处理头文件,接收和处理键盘发送到主机的数据,
;**                      将数据组合好后,利用红外线发送
;**       包含头文件:    无 
*********************************************************************************/ 
#include <at89x52.h>				  //芯片功能定义头文件

sbit Data_Line=P3^4;                  //数据线P3_4
sbit Clock_Line=P3^2;                 //时钟线P3_2
/***********************定义位变量***************************/
unsigned char bdata Temp_Buffer;      //接收字节
sbit D_Buf0=Temp_Buffer^0;            //Temp_Buffer第0位
sbit D_Buf1=Temp_Buffer^1;            //Temp_Buffer第1位
sbit D_Buf2=Temp_Buffer^2;
sbit D_Buf3=Temp_Buffer^3;
sbit D_Buf4=Temp_Buffer^4;
sbit D_Buf5=Temp_Buffer^5;
sbit D_Buf6=Temp_Buffer^6;
sbit D_Buf7=Temp_Buffer^7;            //Temp_Buffer第7位0
/************************************************************/
unsigned char Buffer[11];             //缓冲数组 缓存设备到主机的数据
unsigned char Rec_ptr=0x00;           //接收数据指针
unsigned char Rec_data=0xFF;          //接收数据
unsigned char Buffer_ptr=0x00;        //缓冲区数据指针
unsigned char ptr_data=0;             //接收数据计数
unsigned char flag_e0=0;              //扩展数据E0标志  有E0位1 否则为0
unsigned char Packet[6];              //键盘信息
unsigned char flag_KeyChanged=0;      //按键改变标志
const unsigned int code CRC_Code[16]={ /* CRC余式表 */
                 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
                 0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,};
/*******************************************************
 名称:   CRC校验模块
 功能:  对接收到的数据进行CRC校验
 参数:  unsigned char *ptr  源数据
         unsigned char len   数据长度
 返回值:int CRC   CRC值
*******************************************************/
unsigned int cal_CRC(unsigned char *ptr,unsigned char len) 
{
    unsigned int CRC=0;
    unsigned int temp;
    while(len--!=0) 
    {
          temp=((unsigned char)(CRC/256))/16;       //暂存CRC的高四位 
          CRC<<=4;                                  //CRC右移4位,相当于取CRC的低12位 
          CRC^=CRC_Code[temp^(*ptr/16)];            //CRC的高4位和本字节的前半字节
		                                            //相加后查表计算CRC, 然后加上上一次CRC的余数
          temp=((unsigned char)(CRC/256))/16;       //暂存CRC的高4位 
          CRC<<=4;                                  //CRC右移4位, 相当于CRC的低12位
          CRC^=CRC_Code[temp^(*ptr&0x0f)];          //CRC的高4位和本字节的后半字节
		                                            //相加后查表计算CRC,然后再加上上一次CRC的余数
          ptr++;
    }
    return CRC;
}
/*******************************************************
 名称:   奇偶校验模块
 功能:  对接收到的数据进行奇偶校验
 参数:  无
 返回值:校验正确  1
         校验错误  0
*******************************************************/
unsigned char Checkout(void)
{
     ACC=Temp_Buffer;                 //将数据送A寄存器
     if(~P==Buffer[9])                //将奇偶校验位于A寄存器奇偶标志进行比较
        return 1;
     else
        return 0;
} 
/*******************************************************
 名称:   数据处理模块   
 功能:  处理接收到的数据
 参数:  无
 返回值:无
*******************************************************/
void ProcessData()
{   
    if(Packet[0]==flag_e0 && Packet[1]==Rec_data)
    {
        flag_KeyChanged=1;
    }
    else
    {
        flag_KeyChanged=0;
    }
    Packet[0]=flag_e0;
    Packet[1]=Rec_data;
}
/*******************************************************
 名称:   发送模块   
 功能:  利用串口发送1个字符
 参数:  无
 返回值:无
*******************************************************/
void SendData()  
{   
    unsigned char i;
    unsigned int temp;
    unsigned char crch,crcl;
    temp=cal_CRC(Packet,2);
    crch=temp>>8;
    crcl=temp;
    Packet[2]=crch;
    Packet[3]=crcl;
    for(i=0;i<=3;i++)
    {
        SBUF=Packet[i];                        //发送数据送发送缓冲区
        while(TI==0);                    //等待发送完成
        TI=0;                            //置发送完成标志
    }
}
/*******************************************************
 名称:   组合数据模块
 功能:  将接收到的数据为组合成数据
 参数:  无
 返回值:无
*******************************************************/
void CombinData(void)
{
/*********将接收到的各位赋值给Temp_Buffer对应的位***********/
	D_Buf0=Buffer[1];
    D_Buf1=Buffer[2];
	D_Buf2=Buffer[3];
	D_Buf3=Buffer[4];
	D_Buf4=Buffer[5];
	D_Buf5=Buffer[6];
	D_Buf6=Buffer[7];
	D_Buf7=Buffer[8];
/************************************************************/
	if(Checkout())                   //如果奇偶校验正确
	{  
		if(Temp_Buffer!=0xF0)
		{
			if(ptr_data==0)               //处理接收到的第一个数据
			{
				if(Temp_Buffer==0xE0)     //如果接收到的第一个数据为E0
				{
					flag_e0=1;             //置E0标志
					ptr_data=1;            //允许要求再接收第二个数据
				}
				else
				{
					flag_e0=0;             //否则清楚FO标志与E0标志
					Rec_data=Temp_Buffer;  //接收缓冲区中的数据
					ptr_data=0; 
                    ProcessData();
                    return;                //跳出此次处理 准备处理下一组数据
				}
			}
			else if(ptr_data==1)           //处理接收到的第二个数据
			{
				if(Temp_Buffer==0xF0)      //如果接收到的第二个数据为F0
				    return;
				else
				{
					Rec_data=Temp_Buffer;
					ptr_data=0;
                    ProcessData();
                    return;
				}
			}
			else                           //处理接收到的第三个数据
			{
				Rec_data=Temp_Buffer;      //接收缓冲区中的数据 
				ptr_data=0;                //准备处理下一组数据
                ProcessData();
            }
		}
	}
}
/*******************************************************
 名称:   外部中断0服务程序
 功能:  接收键盘发送到主机的个数据位
 参数:  无
 返回值:无
*******************************************************/
void ReceiveKeyBoardData(void)  interrupt 0
{
     TR0=0;
     if(Rec_ptr<=10)
     {
         do{
         }while(Clock_Line==0);        //等待设备拉高时钟线
         Buffer[Rec_ptr++]=Data_Line;  //接收数据
     }
     else
     {
         CombinData();                 //组合接收到的数据
         do{
         }while(Clock_Line==0);        //等待设备拉高时钟线
         Buffer[0]=Data_Line;          //接收数据
	     Rec_ptr=0x01;
     }
     TR0=1;
}


⌨️ 快捷键说明

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