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