• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 關 閉

    新聞中心

    EEPW首頁 > 工控自動化 > 設計應用 > 基于MDB/ICP協議的自動售賣系統的主控制器

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

    作者: 時間:2011-05-23 來源:網絡 收藏

    {
    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)會話

    本文引用地址:http://www.czjhyjcfj.com/article/162064.htm

    這是MDB會話控制的核心部分。根據需要傳送數據包,計算校驗字節,控制方式位,在時序允許的響應時間內接愛外設返回的數據,做出ACK或NAK等反應。并且按照標準中堆薦的方式處理異常情況,當接受數據超時或校驗和錯時,重復發送命令多次,以增強容錯性能。將接收到的數據返回給調用乾,并返回結果碼。源程序如下:
    //與外設會話,在調用之前確認譯碼器選通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;j5;j++){ //最多重復發送命令5次
    check=0;
    err=0;
    TransmitByte(add,1); //發送地址字節
    Check +=add; //計算CHK
    For(i=0;icount,i++){ //發送數據字節
    TransmitByte(dat[i],0);
    check +=dat[i];
    }
    TransmitByte(check,0); //發送CHK
    for (i=0,check=0,mode=0;
    !mode iMAX_BLOCK_SIZE !err;
    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總線的控制與訪問。通過將進行分解,很好地實現了總線驅動。實踐證明該驅動程序穩定、可靠,大大降低了上層界面開發的難度,提高了的可維護性,節約了成本


    上一頁 1 2 3 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 苗栗县| 建平县| 龙山县| 库车县| 沂南县| 晋中市| 普安县| 新密市| 浪卡子县| 平果县| 衡阳县| 陵川县| 开远市| 阳新县| 深泽县| 金溪县| 扶绥县| 廊坊市| 肥西县| 东阳市| 东莞市| 桦南县| 龙泉市| 霞浦县| 鱼台县| 金溪县| 阿鲁科尔沁旗| 昭平县| 瓦房店市| 芦溪县| 郎溪县| 晋宁县| 嘉善县| 靖远县| 南开区| 义马市| 大厂| 喀什市| 葵青区| 平昌县| 泾川县|