先來個(gè)全家福!?。?br />
IC卡的特點(diǎn):
a、存儲(chǔ)容量大。磁卡的存儲(chǔ)容量大約在200個(gè)字符;IC卡的存儲(chǔ)容量根據(jù)型號(hào)不同,小的幾百個(gè)字符,大的上百萬(wàn)個(gè)字符。
b、安全保密性好,不容易被復(fù)制,IC卡上的信息能夠隨意讀取、修改、擦除,但都需要密碼。
c、CPU卡具有數(shù)據(jù)處理能力。在與讀卡器進(jìn)行數(shù)據(jù)交換時(shí),可對(duì)數(shù)據(jù)進(jìn)行加密、解密,以確保交換數(shù)據(jù)的準(zhǔn)確可靠;而磁卡則無此功能。
d、使用壽命長(zhǎng),可以重復(fù)充值。
e、IC卡具有防磁、防靜電、防機(jī)械損壞和防化學(xué)破壞等能力,信息保存年限長(zhǎng),讀寫次數(shù)在數(shù)萬(wàn)次以上。
思路:
首先讀取IC卡,將IC卡存儲(chǔ)的信息顯示出來,如果顯示成功,則打開電磁閥,開啟外部中斷計(jì)數(shù)脈沖,根據(jù)脈沖個(gè)數(shù)進(jìn)行相應(yīng)的扣款操作。比如每10個(gè)脈沖扣相應(yīng)的金額,完成扣款后同時(shí)返回余額,并顯示出來。寫一個(gè)上位機(jī)對(duì)姓名,錢包,學(xué)號(hào)等進(jìn)行更改。
[page]
材料:
2個(gè)EHY射頻卡讀寫模塊 串口協(xié)議 用于讀寫射頻卡
2個(gè)STC12C5A60S2單片機(jī) 選他是因?yàn)槭请p串口,并且速度還不
繼電器 控制電磁閥
若干三極管 8050 8550
若干驅(qū)動(dòng)蜂鳴器,繼電器 LED
2個(gè)7805穩(wěn)壓
2個(gè)12864液晶
2個(gè)流量計(jì) 一熱一冷(熱的是銅材質(zhì)的)
2個(gè)電磁閥 一熱一冷(熱的是銅材質(zhì)的)
原理圖以及PCB圖
首先設(shè)計(jì)電路圖,IO口其實(shí)沒幾個(gè)
圖里面的錯(cuò)誤:
1、驅(qū)動(dòng)繼電器的三極管大家用8050,
2、PCB上,液晶倒數(shù)第二腳沒接VCC,導(dǎo)致液晶有數(shù)據(jù)不顯示,后來發(fā)現(xiàn),原理圖里面沒有接,可以重畫。
驅(qū)動(dòng)12864
沒有用戶,等待模式。
[page]
讀到卡了,顯示姓名,學(xué)號(hào),錢包。
隨著流量計(jì)脈沖個(gè)數(shù)增長(zhǎng),單片機(jī)進(jìn)行計(jì)費(fèi),同時(shí)進(jìn)行扣款操作,操作完畢顯示當(dāng)前余額。
用戶移走卡,蜂鳴器長(zhǎng)鳴一聲,提示卡已移走。
上位機(jī)(改變姓名,充值,初始化等操作,依賴于模塊) 用C#寫語(yǔ)言編寫。
[page]
沒選擇串口前所有的都是灰色,表示不可操作。
選擇串口后,按鈕可操作,更改框可以進(jìn)行改寫。
單擊讀卡按鈕后的顯示。
[page]
程序部分
// search card and get card serial number
uchar xdata ComSearchCard[5] = {0xAA,0xBB,0x02,0x20};//尋卡,返回AA BB 06 20 92 BF 72 59 20
// read block No.x
uchar xdata ComReadBlock[13] = {0xAA, 0xBB, 0x0a, 0x21, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};//讀哪一塊第六位就是0x0幾。
// read block No.8
//uchar ComReadBlock6[13] = {0xAA, 0xBB, 0x0a, 0x21, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
// write block No.8 with 0x01 to 0x0f
uchar xdata ComWriteBlock[29] = {0xAA, 0xBB, 0x1a, 0x22, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,//0xff是密碼
0x02, 0x00, 0x01, 0x01, 0x00, 0x07, 0x00, 0x01,//
0x04, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00};//要寫的數(shù)據(jù)
// initialize block No.8 as a purse with value: 0x12345678
uchar xdata ComIntiPurse[17] = {0xAA, 0xBB, 0x0e, 0x23, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,//初始化錢包。分區(qū)5為錢包
0xff, 0xff, 0x00, 0x00};
// read purse value of block No.5
uchar xdata ComReadPurse[13] = {0xAA,0xBB,0x0a, 0x24, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};//讀取分區(qū)5的錢包 返回四字節(jié)的數(shù)據(jù)
// purse in block No.5 increase with value "2"
uchar xdata ComIncrPurse[17] = {0xAA,0xBB,0x0e, 0x25, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //增加錢包的余額
0x01, 0x00, 0x00, 0x00};//要增加的值
// purse in block No.5 decrease with value "1"
uchar xdata ComDecrPurse[17] = {0xAA,0xBB,0x0e, 0x26, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,//扣費(fèi)
0x01, 0x00, 0x00, 0x00};//要減少的值
// halt the card selected
uchar xdata ComHaltCard[5] = {0xAA,0xBB,0x02,0x28};//
// the purse final value after INC & DEC
/********************************************************************
*
* 接收從IC卡返回的數(shù)據(jù) 。用數(shù)組存儲(chǔ)
*
***********************************************************************/
uchar xdata ICSearchCard[9]={0};//5-7位是卡的序列號(hào)
uchar xdata ICReadBlock[21]={0};
uchar xdata ICWriteBlock[5]={0};
uchar xdata ICIntiPurse[5]={0};
uchar xdata ICReadPurse[9]={0};
uchar xdata ICIncrPurse[5]={0};
uchar xdata ICDecrPurse[5]={0};
uchar xdata ICHaltCard[5]={0};
/*****************************提取數(shù)據(jù)的數(shù)組*********************/
uchar xdata user_block8[12]={0}; //學(xué)號(hào)
uchar xdata user_card[4]={0}; //卡號(hào)
uchar xdata user_cash[4]={0}; //現(xiàn)金
uchar xdata user_name[6]={0}; //姓名
以上是要用到命令數(shù)組,處理數(shù)組,顯示數(shù)組等.。
這個(gè)是命令選擇入口函數(shù),注釋寫得很詳細(xì),大家自己去看哈。然后就是12864顯示的函數(shù),還有串口什么的初始化。
扣費(fèi)的時(shí)候需要注意下。
***************************************************
EX0 = 0;
countflag = 0;//脈沖標(biāo)志清零
feetemp = 0x01;//這里是扣的金額
feecount = feecount + feetemp;//計(jì)算使用總額,需要顯示也可以顯示的
ComDecrPurse[12] = feetemp;//寫入扣錢金額
j = Command_choic(7);//100個(gè)脈沖減少一分錢
*******************************************************************************
然后個(gè)數(shù)的問題,在外部中斷里面去修改下就好,建議大家使用宏定義直接可以在頂部修改即可
**************************************************************************
count++;
if (count == 1) // 更改脈沖個(gè)數(shù)
{
countflag = 1;
count = 0;
}
*********************************************************************
[page]
為什么使用雙串口單片機(jī)?
因?yàn)橐贿呉湍K通信,一邊要打印數(shù)據(jù)出來觀察是否正確,所以要使用兩個(gè)串口.
為什么用12C5A60S2的原因:
用串口2和模塊去通信.
搭建管道系統(tǒng),對(duì)飲水機(jī)進(jìn)行改裝模擬,(實(shí)際上淋浴系統(tǒng)應(yīng)該比飲水機(jī)好改)
熱水管道系統(tǒng),前面是流量計(jì),后面是電磁閥。
[page]
熱水冷水搭建即將結(jié)束。
冷水管道也好了,拐了幾道彎。
[page]
接上控制系統(tǒng),那個(gè)小的是射頻卡讀寫模塊。
最后就是這個(gè)樣子。
不足與缺陷:
1.流量計(jì)選用的四分,建議改成2分,但是電磁閥一定要4分的。
2.如您所見,丑陋之極,表示找不到地方安裝。
3.程序?qū)懙糜行﹣y。
建議:
a、建議大家寫程序注意部分
b、寫程序多用枚舉和結(jié)構(gòu)體,方便,高效
c、飲水機(jī)壓強(qiáng)和電磁閥里面的軟墊子需要一定的壓力才可以開啟,需要考慮周全。
相關(guān)閱讀:
DIY:自制車用超級(jí)電容器【附原理圖】
告別黑暗,牛人自制“搖一搖”手電筒
實(shí)用DIY:將USB鼠標(biāo)集成到PCI接口里