//;===============================================================
//;程序名: 11T6_SC.C
//;Hex程序名:11T6_SC.hex
//;程序功能:读写Mifare One卡,11T6模块的c演示程序[使用模拟串口]
//;说明:此例程为一个块的读写操作,若对多个块进行读写操作时,只
//; 需操作“读指定块”、“写指定块”这两个子程序即可。
//;注意:====跳线应在Soft位====
//;晶振: 11.0592M
//;波特率:9600bps
//;日期: 07.07.04
//;===============================================================
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
sbit UART_RX_BIT=P3^2;
sbit UART_TX_BIT=P3^3;
sbit GREEN_LINE =P3^7;
sbit RED_LINE =P3^5;
//sbit step4 =P1^4;
//时钟硬件设置
#define ad P2 //地址数据总线
sbit cs = P0^0; //片选
sbit as = P0^1; //地址选通输入
sbit rw = P0^2; //读允许输入脚
sbit ds = P0^3; //写允许输入
sbit beep =P1^2;
#define qidongzhuangtaidizhi 14 //启动状态存储字节地址
//#define kaishididizhi 15 //记录开始指针低位
#define wangdiangaodizhi 16 //网点编号高字节
#define wangdiandidizhi 17 //网点编号低字节
#define dukama 0x55 //读卡码
#define cqingkongma 0x56 //清空0x0c 块
#define chqingkongma 0x61 //清空0x0c以后的 块
#define qingkongma 0x57 //清空卡内数据
#define dukashujuma 0x58 //读数据码
#define jiaozhengshizhongma 0x59 //校正时钟码
#define xieshujuma 0x60 //校正时钟码
#define dukuaima 0x62 //读块码
uchar tmpResult;
uchar CardStatus;
const uchar SearMode=0x01; //全局变量
//卡片连续读取数据不需要拿开
void led_cyc_on(void);
void delay10ms(uchar j)
{ unsigned int i;
uchar k;
for(k=0;k<j;k++)
for(i=0;i<3950;i++);
}
//***************************************************8
void sen(unsigned char dd)
{
TI=0;
SBUF=dd;
while(!TI)
{};
TI=0;
}
void writertc(uchar dd1,uchar dd2)
{
//写的时序
//、都给0
//1、ds=1
//2、rw=1
//3、as=1
//4、cs=0
//5、ad给地址值
//6、as=0
//7、rw=0;
//8、ad给数据
//9、rw=1
// cs=1
//8、as=1
//初值
//
ds=1;
rw=1;
as=1;
cs=0;
ad=dd1;
//
as=0;
rw=0;
ad=dd2;
rw=1;
cs=1;
as=1;
}
uchar readrtc(uchar dd1)
{
uchar d,d1;
//读的时序
//、都给0
//1、ds=1
//2、rw=1
//3、as=1
//4、cs=0
//5、ad给地址值
//6、as=0
//7、ds=0;
//7、ds=0;
//8、ad输出数据
//7、ds=1;
//9、rw=1
//8、as=1
// 返回值
//初值
rr:
//
ds=1;
rw=1;
as=1;
cs=0;
ad=0x0a;
//
as=0;
ds=0;
ad=0xff;
d1=ad;
ds=1;
rw=1;
cs=1;
as=1;
if ((d1 & 0x80)==0 )
{
//
ds=1;
rw=1;
as=1;
cs=0;
ad=dd1;
//
as=0;
ds=0;
ad=0xff;
d=ad;
ds=1;
rw=1;
cs=1;
as=1;
return (d);
};
// sen(0xee);
goto rr;
}
//******************************************************88
/*--------------------------------------------------------------------
FUNCTION: Init_UART(),硬串口初始化
INPUT:
OUTPUT:
--------------------------------------------------------------------*/
void Init_UART(void) //软串口初始化
{ UART_RX_BIT=1;
UART_TX_BIT=1;
}
void delay104us(void)
{ uchar i;
for(i=0;i<19;i++); //8 和 11
//for(i=0;i<26;i++);
}
/*--------------------------------------------------------------------
FUNCTION: UART_PutByte(),发送一字节数据
INPUT: uchar UARTDATA
OUTPUT:
--------------------------------------------------------------------*/
void UART_PutByte(uchar UARTDATA)
{ uchar i;
i=0;
UART_TX_BIT=0;
delay104us();
do
{ if(UARTDATA&0x01)
UART_TX_BIT=1;
else
UART_TX_BIT=0;
delay104us();
i++;
UARTDATA>>=1;
}while(i<8);
UART_TX_BIT=1;
delay104us();
}
/*--------------------------------------------------------------------
FUNCTION: UART_GetByte(),接收1BYTE数据
INPUT: 无
OUTPUT: UARTDATA,1BYTE数据
--------------------------------------------------------------------*/
uchar UART_GetByte(void)
{ uchar UARTDATA=0,i=0;
while(UART_RX_BIT);
delay104us();
while(i<8)
{ UARTDATA>>=1;
if(UART_RX_BIT)
{
UARTDATA|=0x80;
}
i++;
delay104us();
}
UART_RX_BIT=1;
return UARTDATA;
}
/*--------------------------------------------------------------------
FUNCTION: Commu_test(),通讯测试
INPUT:
OUTPUT: 1byte CardStatus
--------------------------------------------------------------------*/
/************************************************
一、 通讯测试,测试单片机与模块通讯是否正常
master command:3C 04 00 60 00 00 BCC 0D
************************************************/
void Commu_test(void)
{ uchar i;
uchar txbuff[8];
uchar rxbuff[6];
CardStatus=0;
txbuff[0]=0x3C;
txbuff[1]=0x04;
txbuff[2]=0x00;
txbuff[3]=0x60;
txbuff[4]=0x00;
txbuff[5]=0x00;
txbuff[6]=0;
for(i=0;i<5;i++) txbuff[6]^=txbuff[i];
txbuff[7]=0x0D;
for(i=0;i<8;i++)
{
UART_PutByte(txbuff[i]);
}
//;--------------------------------------------------------------------
//; Right: 3C 01 01 BCC 0D
//; Error: 3C 01 00 BCC 0D
//;--------------------------------------------------------------------
//;;;;;;
for(i=0;i<5;i++)
{
rxbuff[i]=UART_GetByte();
if(rxbuff[0]!=0x3C)i=0;//纠错
}
rxbuff[5]=0;
for(i=0;i<3;i++)
rxbuff[5]^=rxbuff[i];//纠错
if(rxbuff[5]==rxbuff[3])
if(rxbuff[2])
{
CardStatus=0x01;
}
}
/*--------------------------------------------------------------------
FUNCTION: Search_Card,寻卡,有卡则读出卡号
INPUT: uchar *CardNo,uchar SearMode
OUTPUT: 4byte CardNo and 1byte CardStatus
--------------------------------------------------------------------*/
/***********************************************************
二、 寻卡
command:3C 04 01 70 00(寻卡模式00(IDLE)或01(ALL)) 00 BCC 0D
***********************************************************/
void Search_Card(uchar *CardNo_,uchar SMode_)
{ uchar i;
uchar txbuff[8];
uchar rxbuff[10];
CardStatus=0; //卡状态给初值 0
txbuff[0]=0x3C;
txbuff[1]=0x04;
txbuff[2]=0x01;
txbuff[3]=0x70;
txbuff[4]=SMode_; //search mode
txbuff[5]=0x00;
txbuff[6]=0x00;
for(i=0;i<6;i++) txbuff[6]^=txbuff[i];
txbuff[7]=0x0D;
for(i=0;i<8;i++)
{
UART_PutByte(txbuff[i]);
}
//;--------------------------------------------------------------------
//; Right: 3C 05 四字节卡号 00 BCC 0D
//; Error: 3C 01 FF(错误返回代码) BCC 0D
//;--------------------------------------------------------------------
//;;;;;;
for(i=0;i<9;i++)
{
rxbuff[i]=UART_GetByte();
if(rxbuff[0]!=0x3C)i=0;//纠错
if(rxbuff[i]==0x0D)break;
}
rxbuff[9]=0;
for(i=0;i<7;i++)rxbuff[9]^=rxbuff[i];
if(rxbuff[9]==rxbuff[7])
if(rxbuff[1]==0x05)
{
CardStatus=0x01;
for(i=0;i<4;i++)*CardNo_++=rxbuff[2+i];
}
}
/*--------------------------------------------------------------------
FUNCTION: Psd_Verify,密码校验
INPUT: uchar *BlockKey,uchar BlockKeyAorB,uchar BlockNo,uchar *CardNo
OUTPUT: 1byte CardStatus
--------------------------------------------------------------------*/
/**************************************************
三、 密码校验
command:3C 0E 01 6C 6字节密码 00(A密码或B密码01) 00(块号) 四字节卡号 BCC 0D
***************************************************/
void Psd_Verify(uchar *BlockKey_,uchar BlockKeyAorB_,uchar BlockNo_,uchar *CardNo_)
{ uchar i;
uchar txbuff[18];
uchar rxbuff[7];
CardStatus=0;
txbuff[0]=0x3C;
txbuff[1]=0x0E;
txbuff[2]=0x01;
txbuff[3]=0x6C;
for(i=0;i<6;i++)txbuff[4+i]=*BlockKey_++;
txbuff[10]=BlockKeyAorB_;
txbuff[11]=BlockNo_;
for(i=0;i<4;i++)txbuff[12+i]=*CardNo_++;
txbuff[16]=0;
for(i=0;i<16;i++)txbuff[16]^=txbuff[i];
txbuff[17]=0x0D;
for(i=0;i<18;i++)
{
UART_PutByte(txbu
m1ka.rar_mifare_rc531
版权申诉
129 浏览量
2022-09-20
14:31:09
上传
评论
收藏 55KB RAR 举报
四散
- 粉丝: 51
- 资源: 1万+
最新资源
- WebCrawler.scr
- 【计算机专业毕业设计】大学生就业信息管理系统设计源码.zip
- YOLO 数据集:8种路面缺陷病害检测【包含划分好的数据集、类别class文件、数据可视化脚本】
- JAVA实现Modbus RTU或Modbus TCPIP案例.zip
- 基于YOLOv8的FPS TPS AI自动锁定源码+使用步骤说明.zip
- JAVA实现Modbus RTU或Modbus TCPIP案例.zip
- 基于yolov8+streamlit的火灾检测部署源码+模型.zip
- 测试aaaaaaabbbbb
- VID20240521070643.mp4
- Android系统原理与开发学习要点详解-培训课件.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈