標題:
有沒有大佬給我指教一下 我想把這存儲id卡變?yōu)榭梢詣討B(tài)存儲,可以通過串口添加刪除卡
[打印本頁]
作者:
tianxi第一
時間:
2025-6-21 16:01
標題:
有沒有大佬給我指教一下 我想把這存儲id卡變?yōu)榭梢詣討B(tài)存儲,可以通過串口添加刪除卡
我想把這存儲id卡變?yōu)榭梢詣討B(tài)存儲,可以通過串口添加刪除卡,我嘗試了好幾次都沒有解決不是報錯就是下載程序lcd無反應串口卡住了,下面是我的源碼
#include <reg52.h>
#include "lcd1602.h"
#include "mfrc522.h"
#include "uart.h"
#include <stdio.h>
// 系統(tǒng)時鐘頻率(Hz),用于計算延時
#define FOSC 11059200
// 定義蜂鳴器控制端口
sbit BUZZER = P3^6;
// 定義系統(tǒng)狀態(tài)
#define SYSTEM_IDLE 0 // 空閑狀態(tài)
#define SYSTEM_SUCCESS 1 // 簽到成功狀態(tài)
#define SYSTEM_FAILURE 2 // 簽到失敗狀態(tài)
// 定義卡片數(shù)量
#define CARD_COUNT 3
// 學生信息結構體定義
typedef struct {
unsigned char card_id[4]; // 卡片ID
unsigned char student_id[10]; // 學生學號
unsigned char name[20]; // 學生姓名
} StudentInfo;
// 預定義學生信息 (3名學生)
StudentInfo students[3] = {
{{0xE4, 0xCA, 0x18, 0x05}, "2501", "張三"},
{{0x16, 0x41, 0xC0, 0x01}, "2502", "李四"},
{{0x70, 0x02, 0x53, 0xF4}, "2503", "王五"},
};
volatile unsigned char systemState = SYSTEM_IDLE;
volatile unsigned int displayTimer = 0; // 顯示計時器
// 定義卡片數(shù)據(jù)緩沖區(qū)
unsigned char card_data[16];
unsigned char current_card_id[4];
unsigned char display_card_id_str[13]; // 顯示用卡號字符串
// 存儲當前學生信息
unsigned char current_student_id[10]; // 當前學生學號
unsigned char current_student_name[20]; // 當前學生姓名
// 蜂鳴器狀態(tài)定義
#define BEEP_IDLE 0 // 空閑狀態(tài)
#define BEEP_ON 1 // 蜂鳴器開啟
#define BEEP_OFF 2 // 蜂鳴器關閉
volatile unsigned char beepState = BEEP_IDLE; // 蜂鳴器狀態(tài)
volatile unsigned char beepCount = 0; // 剩余鳴叫次數(shù)
volatile unsigned int beepTimer = 0; // 計時計數(shù)器
// 蜂鳴器發(fā)聲函數(shù) - 成功時短鳴
void beep_success(void) {
unsigned int i, j;
for(i = 0; i < 1000; i++) {
BUZZER = ~BUZZER;
for(j = 0; j < 30; j++); // 約0.5ms延時,1000次約500ms
}
BUZZER = 0; // 確保蜂鳴器最終關閉
}
//蜂鳴器失敗提示音 - 短鳴三聲
void beep_failure(void) {
if(beepState == BEEP_IDLE) { // 僅在空閑狀態(tài)下啟動
beepState = BEEP_ON; // 切換到開啟狀態(tài)
beepCount = 3; // 設置鳴響3次
beepTimer = 500; // 首次鳴響500ms
}
}
// 蜂鳴器任務
void beepTask(void) {
static unsigned int beepCounter = 0; // 新增計數(shù)器,跟蹤精確計時
// 如果處于空閑狀態(tài),直接返回,不執(zhí)行任何操作
if(beepState == BEEP_IDLE) {
return;
}
switch(beepState) {
case BEEP_ON:
BUZZER = ~BUZZER; // 翻轉(zhuǎn)電平發(fā)聲
// 精確計時控制
if(++beepCounter >= 200) { // 500次計數(shù)約500ms
beepCounter = 0;
BUZZER = 0; // 關閉蜂鳴器
// 檢查是否為最后一聲
if(beepCount == 1) {
beepState = BEEP_IDLE; // 最后一聲后直接進入空閑狀態(tài)
BUZZER = 0; // 雙重確保蜂鳴器關閉
} else {
beepState = BEEP_OFF; // 否則進入間隔狀態(tài)
beepTimer = 300; // 間隔300ms
}
}
break;
case BEEP_OFF:
if(++beepCounter >= 300) { // 300次計數(shù)約300ms
beepCounter = 0;
beepCount--; // 剩余次數(shù)減1
beepState = BEEP_ON; // 繼續(xù)鳴響
beepTimer = 500; // 鳴響500ms
}
break;
default:
beepCounter = 0; // 重置計數(shù)器
beepState = BEEP_IDLE;
BUZZER = 0; // 確保蜂鳴器關閉
break;
}
}
// 顯示歡迎信息
void display_welcome(void) {
LCDInit();
DisplayListChar(0, 0, "Student Attend");
DisplayListChar(0, 1, "Place Card Here");
}
// 顯示狀態(tài)處理函數(shù)
void displayTask(void) {
switch(systemState) {
case SYSTEM_SUCCESS:
if(displayTimer > 0) {
displayTimer--;
} else {
systemState = SYSTEM_IDLE;
display_welcome();
}
break;
case SYSTEM_FAILURE:
if(displayTimer > 0) {
displayTimer--;
} else {
systemState = SYSTEM_IDLE;
display_welcome();
}
break;
default: break;
}
}
// 查找學生信息
bit find_student_info(unsigned char *card_id) {
unsigned char i, j;
// 遍歷所有學生信息
for(i = 0; i < CARD_COUNT; i++) {
// 逐個字節(jié)比較卡號
for(j = 0; j < 4; j++) {
if(card_id[j] != students[i].card_id[j]) {
break;
}
}
// 如果4個字節(jié)都匹配,找到學生信息
if(j == 4) {
// 復制學生ID和姓名
for(j = 0; j < 10 && students[i].student_id[j] != '\0'; j++) {
current_student_id[j] = students[i].student_id[j];
}
current_student_id[j] = '\0';
for(j = 0; j < 20 && students[i].name[j] != '\0'; j++) {
current_student_name[j] = students[i].name[j];
}
current_student_name[j] = '\0';
return 1;
}
}
// 未找到匹配的學生信息
return 0;
}
// 顯示簽到成功信息
void display_success(unsigned char *card_id) {
unsigned char i, j;
// 轉(zhuǎn)換卡號為字符串(保持LCD顯示不變)
j = 0;
for(i = 0; i < 4; i++) {
display_card_id_str[j++] = (card_id[i] >> 4) + ((card_id[i] >> 4) < 10 ? '0' : 'A' - 10);
display_card_id_str[j++] = (card_id[i] & 0x0F) + ((card_id[i] & 0x0F) < 10 ? '0' : 'A' - 10);
display_card_id_str[j++] = ' ';
}
display_card_id_str[j] = '\0';
// 發(fā)出成功提示音
beep_success();
// 設置顯示狀態(tài)
LCDInit();
DisplayListChar(0, 0, "Attend Success!");
DisplayListChar(0, 1, display_card_id_str);
systemState = SYSTEM_SUCCESS;
displayTimer = 5000; // 5000個滴答 = 約5秒
// 查找學生信息
if(find_student_info(card_id)) {
// 通過串口發(fā)送學生信息
Uart_Send_String("簽到成功 - ");
Uart_Send_String("學號: ");
Uart_Send_String(current_student_id);
Uart_Send_String(" 姓名: ");
Uart_Send_String(current_student_name);
Uart_Send_String("\r\n");
} else {
// 未找到學生信息,發(fā)送卡號
Uart_Send_String("簽到成功 - 卡號: ");
for(i = 0; i < 4; i++) {
Sent_UART((card_id[i] >> 4) + ((card_id[i] >> 4) < 10 ? '0' : 'A' - 10));
Sent_UART((card_id[i] & 0x0F) + ((card_id[i] & 0x0F) < 10 ? '0' : 'A' - 10));
Sent_UART(' ');
}
Sent_UART('\r');
Sent_UART('\n');
}
}
// 顯示簽到失敗信息
void display_failure(unsigned char *card_id) {
unsigned char i, j;
// 轉(zhuǎn)換卡號為字符串
j = 0;
for(i = 0; i < 4; i++) {
display_card_id_str[j++] = (card_id[i] >> 4) + ((card_id[i] >> 4) < 10 ? '0' : 'A' - 10);
display_card_id_str[j++] = (card_id[i] & 0x0F) + ((card_id[i] & 0x0F) < 10 ? '0' : 'A' - 10);
display_card_id_str[j++] = ' ';
}
display_card_id_str[j] = '\0';
// 發(fā)出失敗提示音
beep_failure();
// 設置顯示狀態(tài)
LCDInit();
DisplayListChar(0, 0, "Invalid Card!");
DisplayListChar(0, 1, display_card_id_str);
systemState = SYSTEM_FAILURE;
displayTimer = 5000; // 5000個滴答 = 約5秒
// 通過串口發(fā)送未授權卡片信息
Uart_Send_String("未授權卡片 - 卡號: ");
for(i = 0; i < 4; i++) {
Sent_UART((card_id[i] >> 4) + ((card_id[i] >> 4) < 10 ? '0' : 'A' - 10));
Sent_UART((card_id[i] & 0x0F) + ((card_id[i] & 0x0F) < 10 ? '0' : 'A' - 10));
Sent_UART(' ');
}
Sent_UART('\r');
Sent_UART('\n');
}
// 核對卡片ID是否ok
bit check_card_id(unsigned char *card_id) {
unsigned char i, j;
// 遍歷所有學生信息
for(i = 0; i < CARD_COUNT; i++) {
// 逐個字節(jié)比較卡號
for(j = 0; j < 4; j++) {
if(card_id[j] != students[i].card_id[j]) {
break;
}
}
// 如果4個字節(jié)都匹配,返回ok
if(j == 4) {
return 1;
}
}
// 未找到匹配的卡片,返回不ok
return 0;
}
// 主函數(shù)
void main(void) {
unsigned char card_detected = 0;
// 初始化系統(tǒng)
PcdReset(); // 初始化RC522
Uart_Init(); // 初始化串口
LCDInit(); // 初始化LCD
BUZZER = 0; // 初始化蜂鳴器端口
// 串口提示系統(tǒng)啟動
Uart_Send_String("RFID Attendance System Started\r\n");
display_welcome(); // 顯示歡迎信息
while(1) {
// 處理蜂鳴器狀態(tài)
beepTask();
// 處理顯示狀態(tài)
displayTask();
// 檢測卡片(僅在空閑狀態(tài)下檢測)
if(systemState == SYSTEM_IDLE &&
PcdRequest(PICC_REQIDL, &card_data[0]) == MI_OK) {
// 防沖突,獲取卡片序列號
if(PcdAnticoll(current_card_id) == MI_OK) {
// 選卡
if(PcdSelect(current_card_id) == MI_OK) {
card_detected = 1;
// 核對卡片ID
if(check_card_id(current_card_id)) {
// ok卡片,顯示簽到成功
display_success(current_card_id);
} else {
// 不ok卡片,顯示失敗
display_failure(current_card_id);
}
// 讓卡片進入休眠狀態(tài)
PcdHalt();
}
}
}
// 延時降低CPU使用率(精確延時)
delay_ms(1); // 1ms延時,提高響應速度
}
}
復制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1