我现在在做一个基于RFID技术的小区门禁系统,用的是51单片机,硬件部分需要与上位机实现通信,都有什么样的通信方式呀?哪一种比较好实现通信呢?现在硬件部分是这样的:
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include <intrins.h>
#include "delay.h"
#include "rc522.h"
#include "1602.h"
sbit buzzer =P1^1; //引脚定义
/********************/
unsigned char cardTab[4]={0x52,0x80,0xe3,0x73}; //该出修改有效卡ID号
/********************/
unsigned char UID[5]; //暂存卡号
unsigned char Temp[4] ; //中间变量
unsigned long time_20ms; //定时计数
char dis0[16]; //显示数组变量
bit disFlag; //显示更新标志
unsigned int timelater =0; //时间延时计数
unsigned char timesNum =0; //防止抖动计数
unsigned char startFlag = 0; //开始计数标志
void Init_Timer0(void);
void uartSendStr(unsigned char *s,unsigned char length);
void UART_Init(void);
void uartSendByte(unsigned char dat);
void main (void)
{
Init_Timer0(); //定时器0初始化
UART_Init();
LCD_Init(); //初始化液晶
buzzer = 0;
DelayMs(200); //延时有助于稳定
buzzer = 1;
LCD_Clear();
LCD_Write_String(0,0,"My Designer !");//显示第一行
uartSendStr("ready ok!",9);
PcdReset();//复位RC522
PcdAntennaOn();//开启天线发射
timesNum = 3;
while (1) //主循环
{
if(PcdRequest(0x52,Temp)==MI_OK)
{
if(PcdAnticoll(UID)==MI_OK)
{
uartSendByte(0x00);
uartSendStr(UID,4);//上报卡号
uartSendByte(0x00);
if((UID[0]==cardTab[0])&&(UID[1]==cardTab[1])) //确定卡 通过
{
if(timesNum>2) //防止抖动大于1s后刷卡有效
{
startFlag++; //开始计数
if(startFlag<6) //开始计数标志最多计数5次
{
timelater=timelater+5;//时间延时
}
buzzer =0; //刷卡成功标志
DelayMs(10);
buzzer =1;
timesNum = 0; //清楚消抖计数
}
}
}
}
if(disFlag == 1) //定时更新显示
{
sprintf(dis0,"Time:%02d s",timelater);//打印要显示的数据
LCD_Write_String(0,1,dis0);//显示第二行
disFlag = 1; //清除标志
}
}
}
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Timer0_isr(void) interrupt 1
{
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
time_20ms++;
if(time_20ms%10==0) //定时显示
{disFlag =1;timesNum++;}
if(time_20ms%48==0) //1s定时
{
if(startFlag != 0) //刷卡成功标志
{
if(timelater>0) //延时计数时间--
{timelater--;}
else
{buzzer=0;startFlag=0;} //时间到进入下次循环
}
}
}
.
链接:
https://pan.baidu.com/s/1BfuZgerapvL-UCI2p65hGg.
首先,要实现RFID读卡器和上位机之间的通信,可以考虑以下几种方式:
// 打开串口
SerialPort sp = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
sp.Open();
// 读取串口数据
byte[] buffer = new byte[1024];
int len = sp.Read(buffer, 0, buffer.Length);
// 处理数据
string data = Encoding.Default.GetString(buffer, 0, len);
// 关闭串口
sp.Close();
USB通信:通过USB接口进行通信,使用USB转串口模块将读卡器的数据发送到上位机,上位机可以使用串口进行接收,同样可以使用上述代码进行串口通信。
以太网通信:通过以太网接口进行通信,使用网络通信协议(如TCP/IP协议)将读卡器的数据发送到上位机,上位机可以使用网络通信协议进行接收和处理,如下所示(C#代码):
// 创建Socket对象
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 连接服务器
socket.Connect("192.168.0.1", 8080);
// 发送数据
string data = "Hello World";
byte[] buffer = Encoding.Default.GetBytes(data);
socket.Send(buffer);
// 接收数据
buffer = new byte[1024];
int len = socket.Receive(buffer);
data = Encoding.Default.GetString(buffer, 0, len);
// 关闭Socket
socket.Close();
此外,如果不想进行焊接,可以使用无线通信模块(如WiFi模块或蓝牙模块)进行数据传输,将读卡器的数据通过无线模块发送到上位机,上位机可以通过串口或网络通信协议进行接收和处理。具体实现方法和代码请参考相应的无线通信模块的使用说明和示例代码。