2022高职国赛ZigBee通过UHF接收RFID

1|02022高职国赛ZigBee通过UHF接收RFID数据

1|1题目要求:

使用一个黑色 ZigBee 模块,模块上安装双联继电器外接一个照明灯与警示 灯,同时模块连接 UHF 超高频读写器。当识别到正确的人员标签信息时(如果 警示灯亮要先灭警示灯)照明灯亮 5 秒后灭,当别到非授员人员信息时(如果 照明灯亮要先灭照明灯)警示灯亮 5 秒后灭。利用竞赛资料提供的引用库与文 档说明等资源,实现任务要求。 任务要求:  使用两个超高频标签纸(卡)并用不干胶标签纸贴上分别标注“员工卡 A”、“员工卡 B”,代表不同的员工。  将两个员工卡的“超高频标签卡号”进行登记存储,存储方式由选手自 行实现。  模块上电或复位后板上的灯全灭,外接的灯全灭。  随意读取其中的一张员工卡,识别到正确的人员标签信息时警示灯灭, 照明灯亮 5 秒后灭。  当读取到信息为员工卡 A 时,板上的灯 D4、D3 亮,D6、D5 灭。  当读取到信息为员工卡 B 时,板上的灯 D4、D3 灭,D6、D5 亮。  如果读取到的卡号信息不在登记的范围里时,板上的灯全灭,照明灯灭, 警示灯亮 5 秒后灭。 第 7 页 共 10 页  点击板上的 SW1 按钮警示灯灭,照明灯亮 5 秒后灭。  点击板上的 SW2 按钮照明灯灭,警示灯亮 5 秒后灭。

1|2串口调试

通过串口调试助手进行调试:

FF 55 00 00 03 0A 07 BB 00 22 00 00 22 7E C7 C0

使用以上命令发送至 UHF 查询标签 #16位

返回情况

  • 没有查询到标签

FF 55 00 00 83 0A 08 BB 01 FF 00 01 15 16 7E FD 32

返回16位

  • 查询到标签

FF 55 00 00 83 0A 18 BB 02 22 00 11 DA 30 00 12 24 F2 0B 50 18 27 7A E2 34 0F 2B 1A AD 92 7E 4F 9B

返回长度33位

其中第18-28位为标签数据位

卡A:

F2 0B 50 18 27 7A E2 34 0F 2B

卡B:

F2 0B 50 18 27 7A E2 34 0F 2C


具体功能已经实现,代码迷迷糊糊的写出来了

1|3代码

#include "hal_defs.h" #include "hal_cc8051.h" #include "hal_int.h" #include "hal_mcu.h" #include "hal_board.h" #include "hal_led.h" #include "hal_rf.h" #include "basic_rf.h" #include "hal_uart.h" #include <stdio.h> #include <string.h> #include <stdarg.h> /*****点对点通讯地址设置******/ #define RF_CHANNEL 0 // 频道 11~26 #define PAN_ID 0x0 //网络id #define MY_ADDR 0x0 //本机模块地址 #define SEND_ADDR 0x0 //发送地址 /**************************************************/ static basicRfCfg_t basicRfConfig; // 无线RF初始化 void ConfigRf_Init(void) { basicRfConfig.panId = PAN_ID; basicRfConfig.channel = RF_CHANNEL; basicRfConfig.myAddr = MY_ADDR; basicRfConfig.ackRequest = TRUE; while(basicRfInit(&basicRfConfig) == FAILED); basicRfReceiveOn(); } char *p = NULL;//定义接收指针 void init(){ //端口的一些初始化 P1SEL &= ~0x1F; P1DIR |= 0x1B; P1SEL &= ~0x80; P1DIR |= 0x80; P2SEL &= ~0x01; P2DIR |= 0x01; P0SEL &= ~0x01<<1; P0DIR &= ~0x01<<1; P1 = 0; P2 = 0; } char *Uart_Read(){//接收串口数据并进行判断 char Read[34]; static char Zhi[10];//定义静态数组 halUartRead(Read,34); if((Read[18]==0xff&&Read[19]==0xff&&Read[20]==0xff)||Read[17]!=0xF2){ //P1_1 = 1; Zhi[0] = '\0';//清除静态区 return NULL;//返回没接收到数据 }else { unsigned char i = 0; while(i < 10){//通过串口调试接收到的内容进行判断 Zhi[i]=Read[18+i-1]; i++; } Read[0] = '\0';//清除接收数组 return Zhi;//返回接收到的内容 } } void delay(unsigned int time){//定义延时函数 unsigned int i; static char t = 0;//设置时间 for(i = 0;i < time;i++){ halMcuWaitMs(1);//标准延时1ms if(P1_2 == 0){//按键判断 SW1 while(P1_2 == 0); p = NULL; P2_0 = 0; P1_7 = 1; delay(5000);//递归延时 P1_7 = 0; } if(P0_1 == 0){//按键判断 SW2 while(P0_1 == 0); p = NULL; P1_7 = 0; P2_0 = 1; delay(5000);//递归延时 P2_0 = 0; } /*.*/ t++;//每200ms接收一次数据 if(t == 200){ t = 0;//清除时间标志 p = Uart_Read(); //halUartWrite(p,34); if(p!=NULL&&*p!=0){//是否接收到数据 if(*(p+9)==0x2B){//A人员 P1_0 = 1; P1_1 = 1; P1_3 = 0; P1_4 = 0; P1_7=1; delay(5000); P1_7=0; p = NULL; } else if(*(p+9)==0x2C){//B人员 P1_0 = 0; P1_1 = 0; P1_3 = 1; P1_4 = 1; P1_7=1; delay(5000); P1_7=0; p = NULL; } else {//其他人员 P1 = 0; P2_0=1; delay(5000); P2_0=0; p = NULL; } } if(p == NULL){//未接收到数据进行处理 {不知道为什么加上这句就能正常运行} delay(1); } } } } unsigned char Select[16] = {0xFF,0x55,0x00,0x00,0x03,0x0A,0x07,\ 0xBB,0x00,0x22,0x00,0x00,0x22,0x7E,0xC7,0xC0}; //发送查询数据常量 /********************MAIN************************/ //设 P2_0 报警 P1_7 照明 void main(void) { halBoardInit();//选手不得在此函数内添加代码 ConfigRf_Init();//选手不得在此函数内添加代码 init(); while(1) { /* user code start */ delay(100); //halMcuWaitMs(20); halUartWrite(Select,16); /* user code end */ } }

__EOF__

本文作者~内个臣呐~
本文链接https://www.cnblogs.com/Xin-chen/p/16879443.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ~内个臣呐~  阅读(267)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示