《電子技術應用》
您所在的位置:首頁 > 其他 > 業界動態 > 基于MDB/ICP協議的自動售賣系統的主控制器實現

基于MDB/ICP協議的自動售賣系統的主控制器實現

2008-12-09
作者:洪強寧 齊國生 葉 丹

  摘? 要: 介紹一種以DALLAS DS5002FP單片機為主控制器" title="主控制器">主控制器的MDB/ICP協議實現。從硬件和軟件描述了如何控制MDB總線,并給出一個較成熟的控制外設" title="外設">外設會話的總線驅動程序。該協議實現清晰、簡單,采用MCS-51兼容單片機降低成本,充分體現了MDB/ICP的優越性。?

  關鍵詞: 單片機 自動售賣系統 主控制器?

?

  隨著國民經濟和技術的發展,自動售賣系統由于其方便性、易管理性和低成本,正得到越來越廣泛的應用。而自動售賣系統的外設也越來越復雜,從投幣機到讀鈔機到非現金交易(如IC記帳卡),導致對主控制器的要求越來越高。為了簡化設計,采用一個簡單、穩定的內部通訊總線協議" title="總線協議">總線協議非常必要。?

  本文介紹了歐洲售貨機制造者協會(EVMMA)制定的MDB/ICP總線協議。該協議簡潔明了,功能強大,可擴展性強,并且對外掛設備數目沒有限制,是理想的自動售賣系統內部總線協議。本文從主控制器的角度給出了對MDB/ICP總線進行操作控制的硬件和軟件實現。?

1 MDB/ICP協議簡介?

  MDB/ICP協議(Multi-Drop Bus / Internal Communication Protocol)是歐洲售貨機制造者協會制定的一套用于協調自動售賣機的主控制器(VMC)與多個外設之間通信的協議。硬幣機和讀鈔機的標準首先是由Coinco在美國可口可樂公司的指定下開發的。這個標準于1993年被NAMA協會采用,經過一個專門的工作組修訂后,于1994年被EVMMA采用。第二階段的非現金交易標準由Debitek代表NAMA開發,并于1994年被NAMA采用。EVMMA加入了一些兼容的指令后于1995年采用。?

  MDB接口實際上是工作于9600波特率的主從型串行總線接口,所有外圍設備(例如硬幣機、讀鈔機、讀卡器等)均為主控制器(傳統上稱為售貨機控制器——VMC)的從機。所有外圍設備與VMC之間的通信方式都一致。?

  MDB協議的串行位格式為:1個起始位,8個數據位,1個方式位與1個停止位,共11位。位傳遞的順序如圖1所示。其中方式位根據傳遞的方式不同置0或置1。在MDB總線上,VMC通過廣播方式向外發送命令。第一字節為地址字節(實際上只有高5位尋址信息,低3位為對外設的指令),該字節被所有的外設讀取,但只有符合地址字節所指定的外設才處理其后的數據字節,并做出反應。在VMC到外設的數據中,地址字節的方式位被置1,數據字節的方式位被置0,外設通過檢驗接收到的方式位確認是地址命令還是數據。當數據從外設發送到主機時,最后送出的字節方式位被置1,標志著數據發送完畢。?

  VMC向外設傳送的指令由一個地址字節、一些可選的數據字節與一個校驗和(CHK)字節構成。發送指令后,外設應答VMC的通信塊可以由一個數據塊" title="數據塊">數據塊和一個CHK字節組成,或者一個應答字節(ACK),或者一個無應答字節(NAK)。如果外設應答數據塊的話,VMC將通過一個應答字節(ACK)、無應答字節(NAK)或重發字節(RET)應答外設傳回的數據。?

  圖2至圖5為幾個典型的會話例子,其中“*”表示傳送時方式位置1,“ADD”表示地址字節,“CHK”表示傳送數據的校驗和。?

?

?

2 硬件系統結構?

  在MDB/ICP總線協議基礎上,筆者構建了一個實際的自動售賣系統,系統原理圖如圖6所示。VMC通過MDB總線與投幣機、讀鈔機和讀卡器交互,控制外設的運轉,并從外設獲得用戶的支付情況。同時,VMC也負責處理與用戶之間的交互,驅動液晶顯示,處理鍵盤輸入,驅動符合用戶需要的電機運轉出貨。在本項目中,VMC還需通過MODEM自動撥號連接公司總部的服務器,將銷售數據傳送回公司。?

?

?

  如圖6所示,所有MDB外設均掛在同一總線上,由總線提供24V和5V的電源,數據線與單片機的串口" title="串口">串口相連。?

  本項目中選用的單片機為DALLAS DS5002FP。該單片機代碼級兼容MCS-51系列單片機,在使用外存的情況下仍然可以使用4個PO作為數據I/O,帶外設的能力較強。但它只有一個串口,控制MDB總線和控制MODEM都需要使用串口,因此必須將串口進行復用。通過一個譯碼器實現選通功能。?

3 MDB/ICP會話控制?

  將VMC與外設之間通過MDB總線的會話分為四個層次:?

  (1)串口初始化?

  初始化串口時,主要工作是設置波特率(9600)和傳輸方式(11位)。為順利獲得9600波特率,單片機采用的晶振為11.0592MHz。源代碼如下(采用Franklin C51語言編寫):?

// 一些常量定義?

#define uchar unsigned char?

#define T_RESPONSE 0xee ??? ??/*5.0毫秒*/?

#define MAX_BLOCK_SIZE 36? /*數據塊最大長度*/?

#define ERR_TIME_OUT 0x81? /*超時*/?

#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 &= 0x0f;?

??? TMOD |= 0x20;?????? // 設置定時器1為方式2?

??? TR1 = 1;??????????? // 定時器1使能?

??? TH1 = 0xfd;???????? // 設定波特率: 9600 NRZ?

??? PCON &= 0x7f;?????? // Set SMOD=0?

??? RI = 0;?

??? TI = 0;?

}?

  (2)字節的傳送?

  這里需要注意的是:發送數據時要根據需要設置方式位,而接收數據時要返回方式位的值,以判斷是否收完所有數據。?

??? // 傳送字節?

void TransmitByte(uchar byte, bit mode)?

??? // 形參:byte——準備發送的字節?

??? //?????? mode——預備要設置的方式位?

{?

??? TB8 = mode;???????? // 設置方式位?

??? SBUF = byte;??????????? // 發送字節?

??? while(!TI);???????? // 等待發送完畢?

??? TI = 0;?

}?

??? // 接收字節?

#pragma disable?

uchar ReceiveByte(uchar *byte, uchar *bMode)?

??? // 形參:*byte——返回接收到的字節值?

??? //?????? *bMode——返回接收到的字節的方式位?

??? // 返回值:0—超時,1—成功接收?

{?

??? TMOD &= 0xf0;?

??? TMOD |= 0x01;?????????? // 設置定時器0為方式1(16位)?? ?

??? TH0 = T_RESPONSE;?

??? TL0 = 0x00;???????????? // 設置超時門限?

??? TF0 = 0;?

??? TR0 = 1;??????????????? // 定時器0使能?

??? while (!RI && !TF0)?

??????? ;?????????????????? // 等待接收字節直至超時?

??? TF0 = 0;?

??? if (RI) {?????????????????? // 已接收字節?

??????? RI = 0;?

??????? *byte = SBUF;?????? // 返回字節值?

??????? *bMode = RB8;?????? // 返回方式位?

??????? return 1;?

??? } else {??????????????????? // 超時?

??????? RI = 0;?

??????? return 0;?

??? }?

}?

  (3) 數據塊的傳送?

  這部分與下面的會話部分放在一個函數體內實現。?

  (4) 會話?

  這是MDB會話控制的核心部分。根據需要傳送數據包,計算校驗字節,控制方式位,在時序允許的響應時間內接受外設返回的數據,做出ACK或NAK等反應。并且按照MDB/ICP標準中推薦的方式處理異常情況,當接受數據超時或校驗和錯時,重復發送命令多次,以增強容錯性能。將接收到的數據返回給調用者,并返回結果碼。源程序如下:?

//與外設會話,在調用之前確認譯碼器選通MDB總線?

uchar Session(uchar add, uchar dat[], uchar count)?

// 形參:add——VMC發送的地址指令字節?

// ??????dat[]——VMC發送的數據塊?

//?????? count——數據塊的大小?

// 返回值:0——外設應答ACK?

//?? 非0且小于0x80——外設應答的數據塊的大小?

//?? 大于等于0x80——會話中出錯?

// 外設應答的數據塊存放在全局數組uchar recBuff[]?

{?

??? uchar data check, i, j, err;?

??? uchar data mode;?

?????

??? for (j=0; j<5; j++) {? //最多重復發送命令5次?

??????? check = 0;?

??????? err = 0;?

??????? TransmitByte(add, 1);?????????? //發送地址字節?

??????? check += add;?????????????? //計算CHK?

??????? for (i=0; i

??????????? TransmitByte(dat[i], 0);?

??????????? check += dat[i];?

??????? }?

??????? TransmitByte(check, 0); ??????? //發送CHK?

??????? for (i=0, check=0, mode=0;?

??????? !mode && i

??????? i++)?

??????? { // 反復接收字節直至方式位為1或出錯?

??????? // 接收到的數據存在全局數組recBuff[]里?

??????????? if (!ReceiveByte(recBuff+i, &mode))?

??????????? //超時。外設可用超時表示NAK?

??????????????? err = i?ERR_TIME_OUT:NAK;?

??????????? else if (i==0 && recBuff[i]==NAK ?

??????????? && mode)?

??????????? // 收到NAK?

??????????????? err = NAK;?

??????????? else if (!mode)?

??????????? //方式位為0表示還有數據?

??????????????? check += recBuff[i];?

??????? }? // for i?

??????? ?

??????? if (!err) {???? // 未發生錯誤?

??????????? if (!mode) {?

??????????????????????? // 收完36個字節還未結束?

??????????????? TransmitByte(NAK, 0);?

??????????????? err = ERR_NO_MODE_BIT;?

??????????? } else if (i>1) {?

??????????????????????? // 收到數據塊?

??????????????? if (check != recBuff[i-1]) {?

??????????????????????? //校驗和錯?

??????????????????? TransmitByte(NAK, 0);?

??????????????????? err = ERR_CHECKSUM;?

??????????????? } else {?

??????????????????????? //一切正常,發送ACK后跳出循環?

??????????????????? TransmitByte(ACK, 0);?

??????????????????? break;?

??????????????? }?

??????????? } else?

??????????????????????????? //收到外設傳來的ACK?

??????????????? break;?

??????? } // if (!err)?

??????? Wait(T_RESPONSE);?? //防止與外設數據沖突?

??? } // for j?

??????????????? //返回接收到的數據塊大小或出錯代碼?

??? return err?err:(i-1);?

}?

  本文使用DS5002FP實現了對MDB總線的控制與訪問。通過將MDB/ICP協議進行分解,很好地實現了總線驅動。實踐證明該驅動程序穩定、可靠,大大降低了上層界面開發的難度,提高了系統的可維護性,節約了成本。?

參考文獻?

1 DALLAS Semiconductor Corp. Secure Microcontroller Data Book, 1996?

2 Philips Semiconductors.80C51-Based 8-Bit Microcontrollers,1994?

3 EVMMA. The I.C.P.(M.D.B. Europe) V2.1, 1996?

4 徐愛鈞, 彭繡華. 單片機高級語言C51應用程序設計.北京:電子工業出版社, 1998?

5 何立民. MCU應用系統的可靠性設計綱要V0.5. 電子技術應用, 1999; 5(4)?

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:[email protected]
主站蜘蛛池模板: 国产精品亚洲高清一区二区 | 美女视频免费看视频网站 | 欧美一级视频 | 欧美精品在线视频观看 | 亚洲欧美日韩国产精品一区 | 福利视频99| 欧美一区二区三区男人的天堂 | 高清黄色毛片 | 一区二区三区高清不卡 | 一区 在线播放 | 日韩一区二区三区视频在线观看 | 国产精品久久久久久久免费大片 | 日本人成在线视频免费播放 | 久久免费精品视频在线观看 | 拍拍拍又黄又爽无挡视频免费 | 亚洲成人综合网站 | 欧美日韩一区二区三区四区在线观看 | 性欧美精品孕妇 | 国产一区二区三区免费观看 | 性色tv视频观看 | 特级一级全黄毛片免费 | 亚洲综合网在线观看首页 | 国产专区在线 | 91精品专区 | 国产精品久久久久免费a∨ 国产精品久久久久免费视频 | 特黄日韩免费一区二区三区 | 91免费看片 | 日韩一级精品视频在线观看 | a级特黄毛片免费观看 | 国产午夜亚洲精品理论片不卡 | 另类自拍| 国产aⅴ一区二区 | 国产精品久久久久久搜索 | 一级成人毛片免费观看 | 欧美一级毛片一免费 | 九九全国免费视频 | 中文亚洲欧美 | 久久九九色 | 亚洲国产日韩综合久久精品 | 国产在线观看第一页 | 国产三级中文字幕 |