這類程序很多的,給你一個作為參考吧:
#include〈reg51.h〉
#include<absacc.h>
#define ucharunsigned char
#define uint unsignedint
/*IC卡信號輸入/輸出*/
sbit scl=P1^7;
sbit sda=P1^6;
/*I/O口定義*/
sbit ICOUT=P3^2; /*拔卡信號*/
sbit ICIN=P3^3; /*插卡信號,與上同接卡座微動開關*/
sbit COMM=P3^4; /*正在通信指示*/
sbit BELL=P3^5; /*蜂鳴器控制*/
sbit PWR=P1^4; /*IC卡座電源控制*/
/*波特率選擇*/
sbit BAUD=P1^2; /*0:2400;1:4800*/
/*24c01~24c16讀/寫驅動程序*/
sbit a0=ACC^0; /*定義ACC的位,利用ACC操作速度最快*/
sbit a1=ACC^1;
sbit a2=ACC^2;
sbit a3=ACC^3;
sbit a4=ACC^4;
sbit a5=ACC^5;
sbit a6=ACC^6;
sbit a7=ACC^7;
/*讀/寫數據緩沖區,24c01最多為128B*/
uchar buf[16]; /*這里定義有效讀入數據最多為16B,用戶根據需要定*/
uchar flag; /*全局標志位元組*/
/*標志定義*/
sbitIC-WR=flag^0; /*IC卡在讀/寫狀態標志*/
sbit ONCOMM=flag^1; /*系統與上位機在通信狀態標志*/
sbit RST=flag^2; /*系統熱復位標志*/
void start-ic(void)
{
sda=1;
scl=1;
delay(2);
sda=0;
delay(6); /*scl為高狀態下,sda的下降沿跳變啟動*/
scl=0;
delay(6);
}
voidstop-ic(void)
{
sda=0;
scl=1;
delay(6);
sda=1; /*在scl=1,sda的0到1跳變結束*/
delay(6);
scl=0;
sda=0;
}
voidack-ic(void)
{
sda=0;
delay(3);
scl=1;
delay(3);
scl=0;
sda=1;
}
/*讀寫節函數,無應答信號*/
unsignedchar rd24(void)
{
sda=1;
scl=1;a7=sda;scl=0;
scl=1;a6=sda;scl=0;
scl=1;a5=sda;scl=0;
scl=1;a4=sda;scl=0;
scl=1;a3=sda;scl=0;
scl=1;a2=sda;scl=0;
scl=1;a1=sda;scl=0;
scl=1;a0=sda;scl=0;
sda=1;scl=1;sci=0;
return(ACC);
}
/*寫位元組函數*/
Voidwd24(unsigned char dd)
{
ACC=dd;
sda=a7;scl=1;scl=0;
sda=a6;scl=1;scl=0;
sda=a5;scl=1;scl=0;
sda=a4;scl=1;scl=0;
sda=a3;scl=1;scl=0;
sda=a2;scl=1;scl=0;
sda=a1;scl=1;scl=0;
sda=a0;scl=1;scl=0;
sda=1;scl=1;
while(sda= =1);
SCL=0;
}
/*隨機地址讀位元組函數,address為欲讀單元地址*/
{
unchar x;
start-oc();
wd24(0a0);
wd24(address);
start-ic();
wd24(0a1);
x=rd24();
stop-ic();
return(x);
}
/*從指定地址開始順序讀塊地址數據,數據存入全局緩沖區buf中,n為數據位元組數*/
Ucharread-bytes(uchar address,uchar n)
{
uchar a,y;
for(y=0;y<n;y++)
{
A=read-buter(address+y);
Buf[y]=a;
}
}
/**/
/*位元組寫入模式寫函數,其中阿對address為單元地址,dd為數據*/
voidwrire-byte(uchar address,uchar dd)
{
Start-ic();
Wd24(0a0);
Wd24(address);
Wd24(dd);
Stop-ic();
}
/*串列通信子程序*/
/*波特率2400,8位數據位,1位停止位,無校驗位*/
/*先用握手位元組y,然後發送x個數據*/
/*待發送數據在trdata緩沖區中*/
Void comm(ucharx,uchar y)
{
uchar i,a;
uint j;
while(1)
{l1: while(RI==0);
RI=0;
a=SBUF;
if(a!=y)goto l1;
for(i=0;i<x;i++)
{ SBUF=trdata[i];
While(T1= =0);
TI=0;
}
For(j=0;j<12500;j++);
}
}
/*主程序初始化函數*/
voidinit(void)
{
RST=0; /*系統熱復位標志清除,只有拔卡才能置位*/
PWR=1; /*關閉IC卡電源*/
IC-WR=0; /*清有卡標志*/
ONCOMM=0; /*清正在通信標志*/
EX0=1; /*准許INT0中斷*/
TMOD=0X20;
SCON=0X50; /*串列口工作方式*/
TH1=0Xf3;TL1=0Xf3;
If(BAUD= =0)
{
PCON=0X80; /*波特率設置為2400*/
}
else
{
PCON=0X00; /*波特率設置為4800*/
}
TR1=1;
EA=1; /*開放中斷*/
}
/*將緩沖區數據16B發往上位機*/
/*波特率2400,8位數據位,1位停止位,無校驗位*/
/*待發送數據在buf緩沖中*/
voidtransfer(void)
{
uchar I;
uint j;
for(i=0;i<16;i++)
{ SBUF=buf[i];
WHILE(TI= =0);
TI=0;
for(j=0;j<1000;j++);
}
}
/*接收16B存入緩沖區*/
/*波特率2400,8位數據位,1位停止位,無校驗位*/
/*緩沖區為buf*/
voidreceive(void)
{
uchar i,a;
for(i=0;i<16;i++)
{ while(RI==0);
RI=0;
a=SBUF;
buf[i]=a;
}
}
/*將緩沖區中的n位元組寫入IC卡address開始的區域*/
Voidreceive(void)
{
uchar x,y;
for(y=0;y<n;y++)
{
Writ-byte(address+y,buf[y]);
delay(10); /*寫之間的延時時間間隔,以保證寫入*/
}
}
/*拔卡中斷程序,主要完成IC卡下電及讀/寫器軟復位*/
voidint-0(void)interrupt 0 using 1
{
while(! ICOUT); /* 延時去抖*/
delay(10);
if(! ICOUT) /*確實拔卡則進行以下處理*/
{
If(IC-WR|ONCOMM)
{
PWR=1; /*關閉IC卡電源*/
BELL=0; /*否則,蜂鳴一聲返回*/
delay(10);
BELL=1;
RST=1; /*設置熱復位標志,以便熱復位*/
}
}
}
/*延時函數,延時ms數由N決定,但不同的系統需要調整相應參數*/
voiddelay(uchar n)
{
uchar i,j,k;
for(k=0;k<n;k++)
for(i=0;i〈100;i++〉
for(j=0;j<255;j++);
}
Void main(void)
{
uchar a;
fuwei: init(); /*系統初始化*/
while(! ICIN); /*等待IC卡插入*/
delay(10); /*軟體去抖並等待IC卡穩定*/
while(! ICIN); /*確認IC卡插入*/
IC-wr=1; /*設置讀/寫標志(有卡,以便避免帶電插拔)*/
/*開始讀IC卡16B並存入緩沖區*/
PWR=0; /*IC卡上電,以便讀卡*/
read-bytes(0,16);
PWR=1; /*關IC卡電源*/
/*等待與上位機建立通信聯系*/
ONCOMM=1; /*設置正在通信標志*/
While(RI= =0);
RI=0;
a=SBUF;
switch(a)
{
case 0xaa: SBUF=0xaa;
while(! TI); /*向上位機回送AA*/
TI=0;
transfer(); /*將緩沖區數據發往上位機*/
break;
case 0xbb: SBUF=0xbb;
while(! TI); /*向上位機回送BB*/
TI=0;
/*上位機在發送前必須適當延時,以等待下位機准備好*/
receive(); /*接收數據存放在緩沖區*/
PWR=0; /*IC卡上電*/
write-ic(0,16); /*將數據寫入IC卡,並回讀比較*/
PWR=1; /*IC卡下電*/
Break;
Default: SBUF=0Xcc; /*如果握手信號不是AA,BB,則*/
While(! TI); /*向上位機回送CC*/
TI=0;
}
ONCOMM=0; /*清正在通信標志*/
while(! RST);
goto fuwei; /*等待拔卡中斷,以軟
復位*/
}
⑵ 如何實現IC卡讀卡器與單片機間的通信,我想通過外圍單片機和讀卡器上的IC卡通信,求有經驗的大神給個思路
看看讀卡器有什麼介面,例如485或232的都可以連。
再看看讀卡器的資料,是什麼通信協議。就可以通信了 。
⑶ SD卡讀卡器的原理是什麼,只是實現了介面的轉換還是說含有單片機的程序在裡面
這個沒有什麼懸念,就是個橋接晶元的作用。
SD卡本身和USB設備沒有關系,要電腦能夠通過USB介面 讀取SD卡,讀卡器裡面主要就是一個橋接晶元,將SD通信標准轉換為USB通信標准,電腦就可以正確識別並讀取SD卡。
其實無論是SD卡讀卡器還是USB介面移動硬碟之類,都是通過橋接晶元來實現的。
橋接晶元,就是一個定製功能的單片機。
⑷ 如何用單片機做一個id卡讀卡器 並把讀到的數據保存下來 要源碼
這個和你的單片機類型、ID卡類型有關,程序也不一樣。一般的沒有加密的卡或簡單加密的卡I2C的介面或SPI的口,只要按照卡的數據手冊調調就可以的。要是不懂單片機那幾就花錢找人做了。
⑸ 如何用單片機做一個id卡讀卡器 並把讀到的數據保存下來 手裡有一個別人用11f02做的id卡讀卡器
你說的ID卡讀卡器是 EM_ID卡的讀卡器吧 用STC11F02這個的話 應該是用分立元器件搭建的電路,這個要做好的話比較麻煩。如果不考慮成本什麼的 只是想做個ID卡讀卡器 看下U2270B晶元手冊吧 加上點簡單的外圍電路就能讀取ID卡卡號了 保存數據 就加個FLASH就好 或者EEPROM看數據量
⑹ 如何用單片機製作射頻讀卡器
當然先去了解射頻讀卡器晶元的所有資料,
再去做.
不過,
還是去買一個現成的方案吧.
晶元+電路圖+
測試程序
都有,
在此基礎上再自己做.
不貴幾百元.
我以前一個項目
就這么做
的.
西門子的卡.
⑺ 讀卡器要怎麼與單片機進行連接可以使用串口將卡號傳給單片機嗎
為什麼不直接讀卡號,然後串口發給單片機呢。你這樣不是要兩個串口嗎,雖然有雙串口的單片機但是徒然增加難度了。
⑻ 怎麼利用單片機做讀卡器
這個不簡單,我在網上也找過,不過沒有最終實現。比較復雜,牽扯到協議的問題,讀SD卡,很多人建議用89S51單片機的ISP介面,我也只知道這么多,你再研究研究。
⑼ 讀卡器用什麼主控晶元
其實也是U盤的主控,只是說區別在它跟存儲單元分開而已.你可以用一個叫chipgenius的軟體,插上讀卡器,就可以認出用什麼的主控了~
⑽ 有前輩會用51單片機設計SD卡讀卡器嗎
51單片機讀寫SD卡比較簡單,網上有很多例子
但用其做插在電腦上的讀卡器則比較麻煩,牽涉到USB協議,硬體和軟體都很復雜