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

📄 kong.c

📁 GSM在单片机开发中的应用 和一些器件的应用程序 24c04 键盘编程
💻 C
字号:
#include <reg51.h>
#define uchar unsigned char
#define SLAVE 0x01
uchar rdata[5]={0x01,0x01,};                             //接收数据区
uchar tdata[5];                              //发送数据区

unsigned int cal_crc(unsigned char *ptr,  unsigned char len)   //CRC校验验
{
  unsigned int crc;
  unsigned char da;
  unsigned int crc_ta[16]={               /* CRC余式表 */
   0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
   0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef};
  crc=0;
  while(len--!=0) {
    da=((uchar)(crc/256))/16;      /* 暂存CRC的高四位 */
    crc<<=4;                   /* CRC右移4位,相当于取CRC的低12位)*/
    crc^=crc_ta[da^(*ptr/16)];     /* CRC的高4位和本字节的前半字节相加后查表计算CRC,
然后加上上一次CRC的余数 */
    da=((uchar)(crc/256))/16;      /* 暂存CRC的高4位 */
    crc<<=4;                   /* CRC右移4位, 相当于CRC的低12位) */
    crc^=crc_ta[da^(*ptr&0x0f)];   /* CRC的高4位和本字节的后半字节相加后查表计算CRC,
然后再加上上一次CRC的余数 */
    ptr++;
  }
  return(crc);
}
void open_key(uchar *op_key_temp)              /*开锁*/
{
 uchar op_key,i,r_move;
  r_move=0x01;
  op_key=*(op_key_temp+1);
  for(i=0;i<8;i++)
  {
   if((op_key&&r_move)==0)
     { while((P3&&0x80)!=0);}
	r_move=r_move<<1;
  }
}

void check_key_state(uchar *ch_key_temp)              /*读取锁的状态*/
{ uchar key_state,i,a,*p;
  unsigned int crcdata;
  a=3;
  p=tdata;
  key_state=P1;
  tdata[0]=0x02;                                //锁的地址
  tdata[1]=*(ch_key_temp+1);                     //锁的原状态
  tdata[2]=key_state;                            //锁的现状态
  crcdata=cal_crc(p+1,a);                          //校验码
  tdata[3]=crcdata;
   }

void clear_key_warning(void)            /*清除锁告警状态*/
{ uchar key_state,i,a,*p;
  p=tdata;a=2;
  key_state=P1;
  tdata[0]=0x03;
  tdata[1]=key_state;
  tdata[2]=key_state;
  tdata[3]=cal_crc(p+1,a);                 /*CRC校验码*/
   }

void open_door(uchar *op_door_temp)                      /*开门*/
{ uchar op_door,i;
  op_door=*(op_door_temp+1);
  P1=op_door;
  tdata[0]=0xA0;tdata[1]=op_door;tdata[2]=P1;
  tdata[3]=cal_crc(tdata+1,2);                        //CRC校验码
  }

void check_door_state(uchar *ch_door_temp)              /*读取门的状态*/
{ uchar door_state,i,a,*p;
  p=tdata;
  door_state=P1;
  tdata[0]=0xB0;
  tdata[1]=*(ch_door_temp+1);
  tdata[2]=door_state;
  tdata[3]=cal_crc(p+1,a);                                       /*CRC校验码*/
    }

void clear_door_warning(void)            /*清除门告警状态*/
{ uchar door_state,i,a,*p;a=2;
  p=tdata;
  door_state=P1;
  tdata[0]=0xC0;
  tdata[1]=door_state;
  tdata[2]=door_state;
  tdata[3]=cal_crc(p+1,a);                //CRC校验码
   }

void openall(void)                                        /*紧急开锁、门*/
{ uchar temp,i;
  temp=P1;
  P3=P3||0x20;
  for(i=0;i<8;i++)
  { temp=temp<<1;
    P1=temp;
    }
    }


void error(void)                            /*出错处理*/
{SBUF=0xFF;
while(TI!=1);
TI=0;
}

void main(void)
{
uchar Order;
Order=rdata[0];                          //接收到的命令数据
switch(Order)                            //判断相对应的命令
 {
  case 0x01: open_key(rdata);break;           //开锁命令
  case 0x02: check_key_state(rdata);break;     //返回锁的状态
  case 0x03: clear_key_warning();break;       //清除锁告警状态
  case 0xA0: open_door(rdata);break;           //开门
  case 0xB0: check_door_state(rdata);break;    //返回门的状态
  case 0xC0: clear_door_warning();break;     //清除门告警状态
  case 0xff: openall();break;                 //开全部锁
  default: error();break;                     //命令错误
  }}

⌨️ 快捷键说明

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