?? duxiem1ka.c
字號:
//;===============================================================
//;程序名: 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(txbuff[i]);
}
//;--------------------------------------------------------------------
//; Right: 3C 02 00 00 BCC 0D
//; Error: 3C 01 FF(錯誤代碼) BCC 0D
//;--------------------------------------------------------------------
for(i=0;i<6;i++)
{
rxbuff[i]=UART_GetByte();
if(rxbuff[0]!=0x3C)i=0;
if(rxbuff[i]==0x0D)break;
}
rxbuff[6]=0;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -