基于MDB/ICP協(xié)議的自動(dòng)售賣(mài)系統的主控制器實(shí)現 作者: 時(shí)間:2007-03-09 來(lái)源:網(wǎng)絡(luò ) 加入技術(shù)交流群 掃碼加入和技術(shù)大咖面對面交流海量資料庫查詢(xún) 收藏 摘要:介紹一種以DALLAS DS5002FP單片機為主控制器的MDB/ICP協(xié)議實(shí)現。從硬件和軟件描述了如何控制MDB總線(xiàn),并給出一個(gè)較成熟的控制外設會(huì )話(huà)的總線(xiàn)驅動(dòng)程序。該協(xié)議實(shí)現清晰、簡(jiǎn)單,采用MCS-51兼容單片機降低成本,充分體現了MDB/ICP的優(yōu)越性。 關(guān)鍵詞:單片機 自動(dòng)售賣(mài)系統 主控制器 隨著(zhù)國你經(jīng)濟和技術(shù)的發(fā)展,自動(dòng)售賣(mài)系統由于其方便性、易管理性和低成本,正得到越來(lái)越廣泛的應用。而自動(dòng)售賣(mài)系統的外設也越來(lái)越復雜,從投幣機到讀鈔機到非現金交易(如IC記賬卡),導致對主控制器的要求越來(lái)越高。為了簡(jiǎn)化設計,采用一個(gè)簡(jiǎn)單、穩定的內部通訊總線(xiàn)協(xié)議非常必要。 本文介紹了歐洲售機制造者協(xié)會(huì )(EVMMA)制定的MDB/ICP總線(xiàn)協(xié)議。該協(xié)議簡(jiǎn)潔明了,功能強大,可擴展性強,并且對外掛外設備數目沒(méi)有限制,是理想的自動(dòng)售賣(mài)系統內部總線(xiàn)協(xié)議。本文從主控制器的角度給出了對MDB/ICP總線(xiàn)進(jìn)行操作控制的硬件和軟件實(shí)現。 1 MDB/ICP協(xié)議簡(jiǎn)介 MDB/ICP協(xié)議(Multi-Drop Bus / Internal Communication Protocol)是歐洲售貨機制造者協(xié)會(huì )制定的一套用于協(xié)調自動(dòng)售賣(mài)機的主控制器(VMC)與多個(gè)外設之間通信的協(xié)議。硬幣機和讀鈔機的標準首先是由Coinco在美國可口可樂(lè )公司的指定下開(kāi)發(fā)的。這個(gè)標準于1993年被NAMA協(xié)會(huì )采用,經(jīng)過(guò)一個(gè)專(zhuān)門(mén)的工作組修訂后,于1994年被EVMMA采用。第二階段的非現金交易標準由Debitek代表NAMA開(kāi)發(fā),并于1994年被NAMA采用。EVMMA加入了一些兼容的指令后于1994年采用。 MDB接口實(shí)際上是工作于9600波特率的主從型串行總線(xiàn)接口,所外圍設備(例如硬幣機、讀鈔機、讀卡器等)均為主控制器(傳統上稱(chēng)售貨機控制器——VMC)的從機。所有外圍設備與VMC之間的通信方式都一致。 MDB協(xié)議的串行位格式為:1個(gè)起始位,8個(gè)數據位,1個(gè)方式位與1個(gè)停止位,共11位。位傳遞的順序如圖1所示。其中方式位根據傳遞的方式不同置0或置1。在MDB總線(xiàn)上,VMC通過(guò)廣播方式向外發(fā)送命令。第一字節為地址字節(實(shí)際上只有高5位尋址信息,低3位為對外設的指令),該字節被所有的外設讀取,但只有符合地址字節所指定的外設才處理其后的數據字節,并做出反應。在VMC到外設的數據中,地址字節的方式位被置1,數據字節的方式位被置0,外設通過(guò)檢驗接收到的方式位確認是地址命令還是數據。當數據從外設發(fā)送到主機時(shí),最后送出的字節方式位被置1,標志著(zhù)數據發(fā)送完畢。 VMC向外設傳送的指令由一個(gè)地址字節、一些可選的數據字節與一個(gè)校驗和(CHK)字節構成。發(fā)送指令后,外設應答VMC的通信塊可以由一個(gè)數據塊和一個(gè)CHK字節組成,或者一個(gè)應答字節(ACK),或者一個(gè)無(wú)應答字節(NAK)。如果外設應答數據塊的話(huà),VMC將通過(guò)一個(gè)應答字節(ACK)、無(wú)應答字節(NAK)或得發(fā)字節(RET)應答外設傳回的數據。 圖2至圖5為幾個(gè)典型的會(huì )話(huà)例子,其中“*”表示傳送時(shí)方式位置1,“ADD”表示地址字節,“CHK”表示傳送數據的校驗和。 2 硬件系統結構 在MDB/ICP總線(xiàn)協(xié)議基礎上,筆者構建了一個(gè)實(shí)際的自動(dòng)售賣(mài)系統,系統原理圖如圖6所示。VMC通過(guò)MDB總線(xiàn)與投幣機、讀鈔機和讀卡器交互,控制外設的運轉,并從外設獲得用戶(hù)的支持情況。同時(shí),VMC也負責處理與用戶(hù)之間的交互,驅動(dòng)液晶顯示,處理鍵盤(pán)輸入,驅動(dòng)符合用戶(hù)需要的電機運轉出貨。在本項目中,VMC還需通過(guò)MODEM自動(dòng)撥號連接公司總線(xiàn)的服務(wù)器,將銷(xiāo)售數據傳送回公司。 如圖6所示,所有MDB外設均掛在同一總線(xiàn)上,由總線(xiàn)提供24V和5V的電源,數據線(xiàn)與單片機的串口相連。 本項目中選用的單片機為DALLAS DS5002FP。該單片機代碼級兼容MCS-51系列單片機,在使用外存的情況下仍然可以使用4個(gè)PO作為數據I/O,帶外設的能力較強。但它只有一個(gè)串口,控制MDB總線(xiàn)和控制MODEM都需要使用串口,因此必須將串口進(jìn)行復用。通過(guò)一個(gè)譯碼器實(shí)現選通功能。 3 MDB/ICP會(huì )話(huà)控制 將VMC與外設之間通過(guò)MDB總線(xiàn)的會(huì )話(huà)分為四個(gè)層次: (1)串口初始化 初始化串口時(shí),主要工作是設置波率(9600)和傳輸方式(11位)。為順利獲得9600波特率,單片機采用的晶振為11.0592MHz。源代碼如下(采用Franklin C51語(yǔ)言編寫(xiě)): // 一點(diǎn)常量定義 #define uchar unsigned char #define T_RESPONSE 0xee //*5.0毫秒*/ #define MAX_BLOCK_SIZF 36 /*數據塊最大長(cháng)度*/ #define ERR_TIME_OUT 0x81 /*超時(shí)*/ #define ERR_NO_MODE_BIT 0x82*/未收到最后字節*/ #define ERR_CHECKSUM 0x83 /*校驗和錯*/ #define ACK 0x00 #define RET 0xaa #define NAK 0xff //初始化串口 void InitSerialPort() { SCON = 0xd0; //設置串口為方式3(9bit) TMOD %26;amp;=0x0f; TMOD I=0x20; //設置定時(shí)器1為方式2 TR1 =1; //定時(shí)器1使能 TH1 = 0xfd; //設定波行率:9600 NRZ PCON %26;amp;=0x7f; //Set SMOD=0 RI=0; TI=0; }(2)字節的傳送 這里需要注意的是:發(fā)送數據時(shí)要根據需要設置方式位,而接收數據時(shí)要返回方式位的值,以判斷是否收完所有數據。 // 傳送字節 void TransmitByte(uchar byte,bit mode) //形參:byte——準備發(fā)送的字節 // mode——預備要設置的方式位 { TB8=mode; //設置方式位 SBUF = byte; //發(fā)送字節 While(!TI); //等待發(fā)送完畢 TI=0; } //接收字節 #pragma disable uchar ReceiveByte(uchar *byte,uchar *bMode) //形參:*byte——返回接收到的字節值 // *bMode——返回接收到的字節的方式位 //返回值:0—超時(shí),1—成功接收 { TMOD %26;amp;=0xf0; TMOD |=0x01; //設置定時(shí)器0為方式1(16位) TH0=T_RESPONSE; TL0=0x00; //設置超時(shí)門(mén)限 TF0=0; TR0=1; //定時(shí)器0使能 While (!RI %26;amp;%26;amp; !TF0) ; //等待接收字節直至超時(shí) TF0=0; if(RI){ //已接收字節 RI=0; *byte=SBUF; //返回字節值 *bMode=RB8; //返回方式位 return 1; }else{ //超時(shí) RI=0; return 0; } } (3)數據塊的傳送 這部分與下面的會(huì )話(huà)部分放在一個(gè)函數體內實(shí)現。 (4)會(huì )話(huà)這是MDB會(huì )話(huà)控制的核心部分。根據需要傳送數據包,計算校驗字節,控制方式位,在時(shí)序允許的響應時(shí)間內接愛(ài)外設返回的數據,做出ACK或NAK等反應。并且按照MDB/ICP標準中堆薦的方式處理異常情況,當接受數據超時(shí)或校驗和錯時(shí),重復發(fā)送命令多次,以增強容錯性能。將接收到的數據返回給調用乾,并返回結果碼。源程序如下: //與外設會(huì )話(huà),在調用之前確認譯碼器選通MDB總線(xiàn) uchar Session(uchar add,uchar dat[],uchar count) //形參:add——VMC發(fā)送的地址指令字節 // dat[]——VMC發(fā)送的數據塊 // count——數據塊的大小 //返回值:0——外設應答ACK //非0且小于0x80——外設應答的數據塊的大小 //大于等于0x80——會(huì )話(huà)中出錯 //外設應答的數據塊存放在全局數組uchar recBuff[] { uchar data check,i,j,err; uchar data mode; for(j=0;j<5;j++){ //最多重復發(fā)送命令5次 check=0; err=0; TransmitByte(add,1); //發(fā)送地址字節 Check +=add; //計算CHK For(i=0;i1) { //收到數據塊 if(check !=recBuff[i-1]){ //校驗和錯 TransmitByte(NAK,0); err=ERR_CHECKSUM; } else{ //一切正常,發(fā)送ACK后跳出循環(huán) TransmitByte(ACK,0); break; } } else //收到外設傳來(lái)的ACK break; }//if(!err) Wait(T_RESPONSE); //防止與外設數據沖突 }//for j //返回接收到的數據塊大小或出錯代碼 return err?err:(i-1); } 本文使用DS5002FP實(shí)現了對MDB總線(xiàn)的控制與訪(fǎng)問(wèn)。通過(guò)將MDB/ICP協(xié)議進(jìn)行分解,很好地實(shí)現了總線(xiàn)驅動(dòng)。實(shí)踐證明該驅動(dòng)程序穩定、可靠,大大降低了上層界面開(kāi)發(fā)的難度,提高了系統的可維護性,節約了成本。
評論