全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2371
推到 Plurk!
推到 Facebook!

可否詳細講解當bcb透過rs232傳值給8051時,8051的c program要怎樣寫???

尚未結案
mcng815
一般會員


發表:4
回覆:1
積分:1
註冊:2004-10-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-28 00:50:20 IP:219.77.xxx.xxx 未訂閱
請問大大 可否詳細講解當bcb透過rs232傳值給8051時,8051的c program要怎樣寫???
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-31 20:02:19 IP:219.68.xxx.xxx 未訂閱
mcng815您好..您的問題應該是屬於硬體喔... 而不是BCB...我幫您找了份資料 >
pony0952
一般會員


發表:3
回覆:7
積分:2
註冊:2003-10-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-01 17:33:55 IP:61.220.xxx.xxx 未訂閱
由於個人使用 source insight 軟體造成不便 在此更正:........    以下是我個人寫的一段程式    使用Keil 51 程式重點在於  void PowerOn(void) //初始化串列埠 UART_Int() interrupt 4 using 1 //接收/傳送 之處理 副程式中的 subSendxxxxx //表示51送資料至PC    範列中的程式是配合硬體設計,所以有些部份,可能會看不懂,但這不是你的重點。 另外51歸51 bcb歸bcb,重點是其中的通訊協定才是重點。程式中的通訊協定是        我自己定的,我不確定別人是否與我一樣。其中PC端為Master 51端slave ,51收到資料才會動作。    通訊處理方式: PC(送出命令)->51接收資料->運算checksum->功能處理->回傳工作情況。    程式中的缺點: 1.51無法處理大量的資料 2.無多工之功能 3.通訊方式為半雙工能力 4.PC不可超高速與51通訊    
#include <reg51.h>    //通訊格式
//傳送/收資料格式             啟始碼  讀寫命令 命令碼   資料碼(長度不定)            checksum                    結束碼
//例:                        0x02          R        A           1                          65 xor 31 =97                 0x0d
//但如果 checksum <= 0x0f 則反向 也就是 0x0f -> 0xf0
//
//資料碼之資料範圍  0~9 A~F  (以ascii看) 如 1 = 0x31,2=0x32 , A= 0x40 ,B=0x41
//資料碼2個byte為一個值  由HiData 與 LowData 組成
//Ex:  "3A"  (0x33,0x40) = 實際資料為 3*16   10 = 58 (00111010)
//以下各命令沒有說明的部份表示沒有定義再程式中 (若沒有程資料程式 將回應0X0F OR 不回應)
//
//各命令說明
//##################################################################################################
//OUTPUT 接點                        啟始碼  讀寫命令 命令碼   資料碼(2byte)   checksum                                  結束碼                 
//        (PC傳送至51)------------------------------------------------------------------------------------------
//           讀取                0x02     R       O        無             'R'  xor 'O'                          0x0d           
//           寫入                0x02     W       O        HiData,LwData          'W' xor 'O' xor HiData xor LowData    0x0d
//             重置                 0x02     T       O        無                  'T'  xor 'O'                          0x0d
//        (51傳送至PC)------------------------------------------------------------------------------------------
//             讀取                0x02     R       O     HiData,LowData    'R' xor 'O' xor HiData xor LowData    0x0d           
//             寫入                 0x0A(資料己收到)
//             重置                 0x0A(資料己收到)    //##################################################################################################
//INPUT     接點                啟始碼  讀寫命令 命令碼   資料碼(2byte)    checksum                                         結束碼
//        (PC傳送至51)------------------------------------------------------------------------------------------
//          讀取                0x02     R        I         無               'R' xor  'I'                                         0x0d
//          寫入                0x02     W        I            無              'w' xor  'I'                                         0x0d  (無此功能)
//          重置                0x02     T        I            無                   'T' xor  'I'                                   0x0d  (無此功能)
//        (51傳送至PC)------------------------------------------------------------------------------------------
//          讀取                0x02     R        I    HiData,LowData      'R' xor 'I' xor HiData xor LowData                   0x0d
//            寫入                0x0f(不知之命令)
//            重置                0x0f(不知之命令)    //##################################################################################################
//投幣機                           啟始碼  讀寫命令 命令碼   資料碼(2byte)     checksum                                      結束碼
//        (PC傳送至51)------------------------------------------------------------------------------------------
//          讀取                0x02     R         C        無                'R'  xor 'C'                                  0x0d
//            寫入                0x02     W         C            無                      -------                                        0x0d
//            重置                0x02     T         C            無                    'T'  xor 'C'                                0x0d
//            致能                0x02     E         C        HiData,LowData            'E'  xor 'C' xor HiData xor LowData                0x0d
//            清除                0x02     C         C            無                    'C'  xor 'C'                                0x0d
//        (51傳送至PC)------------------------------------------------------------------------------------------
//          讀取                0x02     R         C    (OPA HiData,OPA LowData),           
//                                                        (OPB HiData,OPA LowData),
//                                                        (OPC HiData,OPA LowData),
//                                                        (OPD HiData,OPA LowData),
//                                                        (OPE HiData,OPA LowData),
//                                                        (OPF HiData,OPF LowData), 
//                                                        (OPA HiData,OPA LowData)    'R'  xor 'C' XOR DATA ......         0x0d
//            寫入                0x0f(不知之命令)
//            重置                0x0A(資料己收到)關閉所所有的INH接腳 清除投幣計數器
//            致能                0x0A(資料己收到)設定使用的INH
//            清除                0x0A(資料己收到)清除投幣計數器    //##################################################################################################
//紙鈔機                           啟始碼  讀寫命令 命令碼   資料碼                              checksum                                       結束碼
//        (PC傳送至51)------------------------------------------------------------------------------------------
//           讀取                0x02     R        P        無                    'R' xor 'P'                                                  0x0d
//             重置                 0x02     T        P            無                        'T' xor 'P'                                              0x0d
//             致能                 0x02     E        P         '1'(啟動紙鈔機)        'E' xor 'p'        xor '1'                                        0x0d
//             致能                 0x02     E        P         '0'(停止使用紙鈔機)        'E' xor 'p'        xor '0'                                        0x0d
//             清除                 0x02     C        P           無                          checksum                                              0x0d
//        (51傳送至PC)------------------------------------------------------------------------------------------
//           讀取                0x02     R             I    HiData,LowData                          'R' xor 'P' xor HiData xor LowData          0x0d
//                                                            (紙鈔機金額) * 100元
//             寫入                 0x0f(不知之命令)
//             重置                 0x0A(資料己收到)關閉紙鈔機 /清除紙鈔機計數器
//             致能                 0x0A(資料己收到)    //##################################################################################################
//退幣機                                   啟始碼  讀寫命令 命令碼   資料碼                                 checksum                                      結束碼
        -----------------
        --------
//    //##################################################################################################
//滿位偵測                                   啟始碼  讀寫命令 命令碼   資料碼                                 checksum                                      結束碼               -------
        -------
        -------
//----------------------- 常數定義(通訊碼)
#define  CommRead                                'R'                //命令Read
#define  CommWrite                                'W'                //命令Write
#define  CommReset                                'T'                //命令Reset
#define  CommEnable                                'E'                //命令Enable
#define  CommClear                                'C'                //命令clear    #define  CommOutput                                'O'                //輸出埠
#define  CommInput                                'I'                //INPUT
#define  CommCoin                                'C'                //投幣機
#define  CommPaper                                'P'                // 紙鈔機
#define  CommHoper                                'H'                // 退幣機
#define         CommNocom                        0                //沒有命令
#define         ConStartCode                        0x02        //啟始碼   
e
const unsigned  char    ConRevEd                =        0x0A;        //資料己收到
#define         ConEndCode                                0x0d        //結束碼
const unsigned  char        ConUnknowCommand        =        0x0f;        //不知之命令
#define        ConNoCommand                        0x00                        //沒有任何命令
#define        ConGetExternOutpt                'A'                //延伸輸出設定
#define        ConGetExternInput                'B'                //讀取延伸輸入
#define        ConGetCoinOut                        'C'                //投幣機輸出控制
#define        ConGetCoinIn                        'D'                //投幣機輸入讀取輸入量
#define   ConGetPaper                        'P'                //紙鈔控制
#define        ConGetTest                        'T'                //傳輸測試
#define        ConGetCOMout                        'M'                //錢幣輸出
#define        ConGetCOMControl                'Y'                //錢幣輸出電源控制
#define        ConGetCOMFill                        'F'                //錢幣滿位狀態
#define        ConGetExOut                        'O'                //讀取延輸出 
#define   ConGetCoinOutt                'J'                //讀取投幣機輸出狀態            #define        ConSendExternOutpt                'a'                //延伸輸出設定
#define        ConSendExternInputt                'b'                //延伸輸出設定
#define        ConSendCoinOut                        'c'                //投幣機輸出回傳控制
#define        ConSendCoinIn                        'd'                //投幣機輸入讀取回傳
#define        ConSendCOMoutCount                'n'                //錢幣輸出狀態
#define        ConSendCOMFill                        'f'                //回傳錢幣輸出狀態
#define        ConSendPaperOut                        'p'                //紙鈔控制輸出
#define        ConSendPaperIn                        'q'                //紙鈔輸入
#define        ConSendTest                        't'                //回傳傳輸測試
#define        ConError                        'e'                //錯誤
#define   ConSendExOut                        'o'                //讀取延伸輸出狀態
#define   ConSendCoinOutt                'j'                //投幣機輸出狀態        回傳    // ******************************************* 外掛程式區 **********************************************************************    //----------------------------------------------延伸輸入訊號--------------------------------------------------------------------    extern void ExInputInitial(void) ;
extern unsigned char ExInput(void) ;
// ----------------------- 使用變數定義
unsigned char bdata ExInData;                                                        //輸入狀態&檢查
/*
        sbit ExInData_0        = ExInData ^ 0;                                                //外部輸入 0
        sbit ExInData_1        = ExInData ^ 1;                                                //外部輸入 1
        sbit ExInData_2        = ExInData ^ 2;                                                //外部輸入 2
        sbit ExInData_3        = ExInData ^ 3;                                                //外部輸入 3
        sbit ExInData_4        = ExInData ^ 4;                                                //外部輸入 4
        sbit ExInData_5        = ExInData ^ 5;                                                //外部輸入 5
        sbit ExInData_6        = ExInData ^ 6;                                                //外部輸入 6
        sbit ExInData_7        = ExInData ^ 7;                                                //外部輸入 7
        */
        
//----------------------------------------------延伸輸出訊號   交流總電源控制-----------------------------------------------------
extern void ExOutputInitial(void) ;
extern void ExOutput(unsigned char SendDatal) ;    //----------------------------------------------   投幣機控制     ---------------------------------------------------------------------
extern unsigned char CoinMachineInput(void);
extern void CoinMachineIOutput(unsigned char SendDatal);
extern void CoinMachineInitial(void);
//----------------------------------------------   紙鈔機控制     ---------------------------------------------------------------------
extern void PaperMachineInitial(void);
extern void PaperMachineIOutput(bit Control);
extern unsigned char PaperReset();
extern unsigned char PaperMachineInput(void) ;
extern void PapeCountClear(void) ;
//----------------------------------------------   退幣機控制     ---------------------------------------------------------------------    //----------------------------------------------接腳定義----------------------------------------------------------------------
sbit  Pin_COMOut0Control          = 0xb7;                //輸出1
sbit  Pin_COMOut1Control          = 0xb6;                //輸出2
sbit  Pin_COMOut2Control          = 0xb5;                //輸出3
sbit  Pin_COMOut3Control          = 0xb4;                //輸出4     
sbit        Pin_Lim0                        =0x90;                //Sensor 0
sbit        Pin_Lim1                        =0x92;                //Sensor 1
sbit        Pin_Lim2                        =0x94;                //Sensor 2
sbit        Pin_Lim3                        =0x96;                //Sensor 3
sbit        Pin_SW0                                =0x91;                //SW 0
sbit        Pin_SW1                                =0x93;                //SW 1
sbit        Pin_SW2                                =0x95;                //SW 2
sbit        Pin_SW3                                =0x97;                //SW 3
sbit        Pin_AcDet0                        = 0xa0;                //交流偵測0
sbit        Pin_AcDet1                        = 0xa1;                //交流偵測1
sbit        Pin_AcDet2                        = 0xa2;                //交流偵測2
sbit        Pin_AcDet3                        = 0xa3;                //交流偵測3
//----------------------------------------------常數定義----------------------------------------------------------------------    // ----------------------- 使用變數定義    unsigned char bdata detdata;
        sbit        bit_COMFillBuf0         = detdata ^ 0        ;
        sbit        bit_COMFillBuf1         = detdata ^ 1        ;
        sbit        bit_COMFillBuf2         = detdata ^ 2        ;
        sbit        bit_COMFillBuf3         = detdata ^ 3        ;
        sbit         bit_Det0                = detdata ^ 4; 
        sbit         bit_Det1                = detdata ^ 5; 
        sbit         bit_Det2                = detdata ^ 6; 
        sbit         bit_Det3                = detdata ^ 7;     //----------------------------------------------錢幣輸出控制----------------------------------------------------------------------
#define   HoperOn                        0
#define   HoperOff                        1
//----------------------------------------------初始化----------------------------------------------------------------------
void CoinOutMachineInitial(void) {
        Pin_COMOut0Control = HoperOff;
        Pin_COMOut1Control = HoperOff;
        Pin_COMOut2Control = HoperOff;
        Pin_COMOut3Control = HoperOff;
        P1 = 0xff;
        P2 = P2 | 0x0f;
}    //----------------------------------------------------------------------------------------------------------------------------------------------------
//------------------------延伸輸出使用變數定義
#define ExAcPowerOff                0
#define ExAcPowerOn                1
unsigned char  bdata ExOutData;
         sbit ExOutData_AllAcPower = ExOutData ^ 6;                        //交流總電源控制    // 接腳定義    sbit         Pin_PaperCont        =0xa7;                                //紙鈔輸入        //----------------------------------------------變數定義--------------------------------------------------------------------
#define conGetMaxLength                 15                 //接收最大暫存數
#define conSendMaxLength         18                //傳送最大數    unsigned char UartinArray[conGetMaxLength 2];        //接收Buffer
unsigned char UartSendArray[conSendMaxLength 2];//傳送Buffer    unsigned char CoinOutData;                        //投幣機輸出資料
unsigned char  CoinInData;                        //投幣機輸入狀態
unsigned char CoinInDataBuf;    unsigned char CoinInDataDet;                        //投幣機輸入狀態檢知
unsigned char CoinInArray[7];                        //投幣機輸入狀態檢知
unsigned char UartinIndexS;
unsigned char UartSendIndexS;                        //傳送指標
unsigned char UartSendIndexE;                        //傳送指標
unsigned char getCommand;                        //接收命令
unsigned char getCommand2;                        //接收命令
unsigned char CoinDeboms;                        //錢幣機雜訊處理
unsigned char PaperCount;                        //紙鈔數量
unsigned char COMCount[4];                        //退幣數量
unsigned char COMDelay[4];                        //退幣時間輸出
unsigned char  COMFillBuf;                        //滿位用
unsigned int         WashDog;                        //看門狗        unsigned int  bdata VC_Status;
         //sbit bit_UartRevError        = VC_Status ^ 0;                                        //接收錯誤
        sbit bit_sending        = VC_Status ^ 1;                                        //傳送資料中
        sbit bit_Reving                = VC_Status ^ 2;                                        //接收中
        sbit bit_Buf                = VC_Status ^ 3;                                        //buf
        //sbit bit_CoinIn        = VC_Status ^ 4;                                        //投幣輸入
        sbit bit_COM0                = VC_Status ^ 5;                                        //退幣控制0
        sbit bit_COM1                = VC_Status ^ 6;                                        //退幣控制1
        sbit bit_COM2                = VC_Status ^ 7;                                        //退幣控制2
        sbit bit_COM3                = VC_Status ^ 8;                                        //退幣控制3
        sbit bit_COMFill        = VC_Status ^ 9;                                        //錢幣滿
        sbit bit_COMError0        = VC_Status ^ 10;                                        //退錢0有問題
        sbit bit_COMError1        = VC_Status ^ 11;                                        //退錢1有問題
        sbit bit_COMError2        = VC_Status ^ 12;                                        //退錢2有問題
        sbit bit_COMError3        = VC_Status ^ 13;                                        //退錢3有問題
        sbit bit_Reved                = VC_Status ^ 14;                                        //接收資料完成
        sbit bit_comKnow        = VC_Status ^ 15;                                        //己知之命令
        //sbit bit_ExInChange        = VC_Status ^ 14;                                        //輸入狀態改變    //----------------------------------------------延時副程式 --------------------------------------------------------------------    void Delay(unsigned int del) {
        unsigned int i;
        for (i=0 ; i0X2f && indata <0x3a) 
                return indata-0x30;
        else if( indata > 0x3f && indata < 0x47 ) {
                return indata -55;
        } 
        return 0;
}
//----------------------------------------------轉換為ASCII?-------------------------------------------------------------------
unsigned char getHexiToAscii(unsigned char indata) {
        indata = indata& 0x0f;
        if (indata<10) 
                return indata   0x30;
        else {
                return indata  55;
        }
}
//----------------------------------------------回傳命令處理 --------------------------------------------------------------------
void SendGeData(unsigned char seddata) {
        unsigned char index;
        bit bl;
        bl = 1 ;
        while (bl)
        {
                index  = UartSendIndexS;
                index   ;
                if (index>conSendMaxLength) 
                        index = 0;
                if (UartSendIndexE != index )
                        bl = 0;
        }
        
        UartSendArray[UartSendIndexS] = seddata;
        UartSendIndexS   ;
        
        if (UartSendIndexS > conSendMaxLength)
                UartSendIndexS = 0;
}
//---------------------------------------------------------------------------------------------------------------
void subSendOneCommandToPc (unsigned char cm) {
        SendGeData(cm);        
        if (!bit_sending)  {
                SBUF = UartSendArray[UartSendIndexE];                //傳送第一筆資料
                bit_sending        = 1;
        }
}
//---------------------------------------------------------------------------------------------------------------
void subSendToPC (unsigned char *sd,unsigned length) 
{
        char i;
        unsigned char buf;
        
        SendGeData(ConStartCode);                //啟始碼
        buf = ConStartCode;
        if (length != 0 ) 
        {
                for (i=0;i>4));
                buf = buf ^ getHexiToAscii(CoinInArray[i]>>4);
                SendGeData(getHexiToAscii(CoinInArray[i]));        
                buf = buf ^ getHexiToAscii(CoinInArray[i]);
        }
        if (buf < 0x0f)                        //檢查碼是否小於0x0f
                buf = ~buf;            SendGeData(buf);                //檢查碼
        SendGeData(ConEndCode);                //結束碼              if (!bit_sending)  {
                SBUF = UartSendArray[UartSendIndexE];                //傳送第一筆資料
                bit_sending        = 1;
        }
}
//---------------------------------------------------------------------------------------------------------------
void subSendHoperToPC ()
{
        char i;
        unsigned char buf;
        
        SendGeData(ConStartCode);        //啟始碼
        SendGeData(CommRead);                //啟始碼
        SendGeData(CommHoper);                //啟始碼
        buf = ConStartCode ^ CommRead ^ CommHoper ;            for (i=0 ; i<4 ; i  )
        {
                SendGeData(getHexiToAscii(COMCount [i]>>4));
                buf = buf ^ getHexiToAscii(COMCount [i]>>4);
                SendGeData(getHexiToAscii(COMCount [i]));        
                buf = buf ^ getHexiToAscii(COMCount [i]);
        }
        //總電源
        if (ExOutData_AllAcPower) 
                i=1;
        else
                i =0;
        SendGeData(getHexiToAscii(i));
        buf = buf ^ getHexiToAscii(i);
        //滿位狀態
        i=0;
        if (Pin_SW0)
                i=1;
        if (Pin_SW1)
                i = i | 0x02;
        if (Pin_SW2)
                i |= 0x04;
        if (Pin_SW3)
                i |= 0x08;
        SendGeData(getHexiToAscii(i));
        buf = buf ^ getHexiToAscii(i);
        //錯誤狀態
        i=0;
        if (!bit_COMError0)
                i =1;
        if (!bit_COMError1)
                i |= 0x02;
        if (!bit_COMError2)
                i |= 0x04;
        if (!bit_COMError3)
                i |= 0x08;
        SendGeData(getHexiToAscii(i));
        buf = buf ^ getHexiToAscii(i);
        if (buf < 0x0f)                                        //檢查碼是否小於0x0f
                buf = ~buf;            SendGeData(buf);                                //檢查碼
        SendGeData(ConEndCode);                                //結束碼  
        if (!bit_sending)  {
                SBUF = UartSendArray[UartSendIndexE];        //傳送第一筆資料
                bit_sending        = 1;
        }
}        //----------------------------------------------投幣機輸入自動計數副程式--------------------------------------------------------------------    void  subCoinInput(void){
        unsigned char buf1;
        unsigned char i;
        CoinInData =  CoinMachineInput();
        buf1 = CoinInData  ^ CoinInDataDet;
        if (buf1 !=0) {
                CoinDeboms   ;
                if (CoinDeboms > 10) {
                        CoinInDataDet = CoinInData;
                        for (i=0;i<7;i  ) {
                                if ((buf1>>i) & 0x01) {
                                        if((CoinInData>>i)&0x01)
                                                CoinDeboms =0;
                                        else {
                                                CoinInArray [6-i ]   ;
                                        }
                                }
                        }
                        
                        CoinDeboms =0;
                }
        } else {
                CoinDeboms = 0;
        }
        
}    //----------------------------------------------串列中斷--------------------------------------------------------------------
//處理通訊功能
UART_Int() interrupt 4 using 1  {
        unsigned char buf;
        unsigned char i;
        if (TI) {        //硬體傳送處理
                WashDog = 0;
                TI = 0;
                UartSendIndexE  ;
                
                if (UartSendIndexE>conSendMaxLength) 
                        UartSendIndexE = 0;
                
                if (UartSendIndexE == UartSendIndexS ) {        // 資料傳送完成
                        bit_sending =0;
                } else {                                        //傳送下一筆資料
                        SBUF = UartSendArray[UartSendIndexE];
                }
        }
        if (RI) {        //硬體接收處理
                
                buf = SBUF;
                if (buf == ConStartCode) {
                        UartinIndexS = 0;
                        bit_Reving = 1;
                }else {
                        UartinIndexS   ;
                        if (UartinIndexS>conGetMaxLength)                
                                UartinIndexS = conGetMaxLength;
                }
                UartinArray[UartinIndexS] = buf;
                if (buf == ConEndCode) {
                        bit_Reving = 0;
                        buf = 0;
                        for(i=0 ; i<(UartinIndexS-1) ; i  ) {                //checksum 運算 
                                buf = buf ^ UartinArray[i];
                        }
                        if (buf <= 0x0f )
                                buf = ~buf;
                        if (buf == UartinArray[UartinIndexS-1]) {        //命令帶入
                                bit_Reved = 1;
                                
                                getCommand  =  UartinArray[1];
                                getCommand2  =  UartinArray[2];
                        }                                                // checksum 錯誤
                }
                RI = 0;
        }
}    //---------------------------------------------------------------------------------------------------------------
//******************************************************************************
//***************************    電源初始化  *******************************************
//******************************************************************************
void PowerOn(void) {
        //設定掃線為 low 電源輸出
        //設定每一組的輸出皆為Low
        unsigned int i;            Delay(50000);                        // 串列通訊初始化
        UartinIndexS         = 0;
        UartSendIndexS        = 0;
        UartSendIndexE         = 0;
        getCommand         = CommNocom;
        bit_Reving = 0;
        //sendCommand        = ConNoCommand;
        for(i=0;i<15;i  ) {
                UartinArray[i]=0;
        }
        SCON = 0x50;
        TMOD = TMOD | 0x20 ;                //設定時器1 為模式2
        TH1 = 253 ;                        //設定工作速度為 9600
        TR1 = 1;                        /* start timer 1               */
        TI = 0;
        RI = 0;
        i=SBUF;
        ES=1;              
          ExInputInitial();                //初始化延伸輸入電路
        ExOutputInitial();                //初始化延伸輸出訊號   交流總電源控制
        ExInData = ExInput();
        ExOutData=0;
        ExOutput(ExOutData);
        VC_Status         = 0;
        bit_sending         = 0;
        
        //投幣機初始化
        CoinMachineInitial();                
        CoinOutData                 = 0;
        CoinInData                 = 0;                //投幣機輸入狀態
        CoinInDataDet         = 0;                        //投幣機輸入狀態檢知
        for (i=0 ; i<7 ; i   ) {                //錢幣數量
                CoinInArray[i] = 0;
        }
        //bit_CoinIn = 0;
        CoinDeboms =0;
        PaperMachineInitial();
        PaperCount = PaperMachineInput();
        CoinOutMachineInitial();                //退幣機初始化
        EA  = 1;                            /* global interrupt enable     */
        for( i=0; i<4;i   ) {
                COMCount[i]= 0;
                COMDelay[i]=0;
        }
        COMFillBuf = 0;                                //未有任何錢幣滿位
        WashDog = 0;
        bit_Reved = 0;
        getCommand2 = 0;
        
        
 }
//---------------------------------------------------------------------------------------------------------------    //******************************************************************************
//***************************    主程式  *******************************************
//******************************************************************************
unsigned char uartSend[12];
void main(void) {
        unsigned char i;
        unsigned char buf;
        unsigned char buf1;
        
        i=0;
        PowerOn();
        Delay(50000);
        PaperCount = PaperMachineInput();
        PaperCount = PaperReset();
        while(1) {
                subCoinInput();                                //投幣機使用狀態檢查
                
                if (bit_Reved == 1 )
                {
                        bit_Reved = 0;
                        bit_comKnow =0;
                        
                        switch(getCommand2) 
                        {
                        //---------------------------------------------------------------------------------------------------------------
                        case CommOutput:        
                                switch(getCommand)
                                {
                                case CommWrite :                //命令Write
                                        buf = getAsciiToHex(UartinArray[3]);
                                        buf1 = getAsciiToHex(UartinArray[4]);
                                        i = ExOutData & 0x40;
                                        ExOutData  = (buf * 16   buf1) | i;
                                        ExOutput(ExOutData);
                                        subSendOneCommandToPc(ConRevEd);
                                         break;
                                case CommRead :                //命令Read
                                        uartSend[0] = CommRead ;
                                        uartSend[1] = CommOutput ;
                                        uartSend[2] = getHexiToAscii(ExOutData>>4);
                                        uartSend[3] =  getHexiToAscii(ExOutData);
                                        subSendToPC(&uartSend,4);
                                        break;
                                case CommReset:                                                //reset 輸出
                                        i = ExOutData & 0x40;
                                        ExOutData = 0 | i;
                                        ExOutput(ExOutData);
                                        subSendOneCommandToPc(ConRevEd);
                                        break;
                                default:
                                        buf = ConUnknowCommand;
                                        subSendOneCommandToPc(buf);
                                        break;
                                }
                                break;
                        //---------------------------------------------------------------------------------------------------------------
                        
                        case CommInput:
                                subCoinInput();
                                switch(getCommand)
                                {
                                case CommRead :                //命令Read
                                        ExInData = ExInput();
                                        uartSend[0] = CommRead ;
                                        uartSend[1] = CommInput ;
                                        uartSend[2] = getHexiToAscii(ExInData>>4);
                                        uartSend[3] =  getHexiToAscii(ExInData);
                                        subSendToPC(&uartSend,4);
                                        break;
                                default :
                                        buf = ConUnknowCommand;
                                        subSendOneCommandToPc(buf);
                                        break;
                                }
                                break;
                        //---------------------------------------------------------------------------------------------------------------
                        
                        case CommCoin :                              //投幣機                                                        
                                switch(getCommand)
                                {
                                
                                case CommRead :      //命令Read
                                        subSendCoinToPC();                        //傳送錢幣數量到pc
                                        break;
                                case CommClear :                                //清除錢幣計數器(歸零)
                                        for (i=0 ; i<7 ; i  )
                                                CoinInArray[i] = 0;
                                        buf = ConRevEd;
                                        subSendOneCommandToPc(buf);
                                        break;
                                case CommReset:                                                
                                        CoinOutData  = 0;
                                        CoinMachineIOutput(CoinOutData);        //關閉所有的輸出
                                        for (i=0 ; i<7 ; i  )                        //清除所有的錢幣計數
                                                CoinInArray[i] = 0;
                                        buf = ConRevEd;
                                        subSendOneCommandToPc(buf);
                                        break;
                                case CommEnable :        //命令Enable
                                        CoinOutData  = getAsciiToHex(UartinArray[3]) * 16   getAsciiToHex(UartinArray[4]);
                                        CoinMachineIOutput(CoinOutData);
                                        buf = ConRevEd;
                                        subSendOneCommandToPc(buf);
                                        break;
                                        
                                default :
                                        buf = ConUnknowCommand;
                                        subSendOneCommandToPc(buf);
                                        
                                }
                                break;
                                
                        //---------------------------------------------------------------------------------------------------------------
                        case CommPaper:                                // 紙鈔機
                                ---
                                ---
                                ---
                                
                        //---------------------------------------------------------------------------------------------------------------
                        case CommHoper:                                //退幣機
                                -----
                                -----
                                -----
                                
                        default :                        //未知的命令
                                buf = ConUnknowCommand;
                                subSendOneCommandToPc(buf);
                                
                        }
                }
                
                
                //---------------------------------------------------------------------------------------------------------------
                //退幣動作                      -----
                  -----
                  -----                        //---------------------------------------------------------------------------------------------------------------
                //檢查若退幣金額為零 則強制關閉輸出接點
                //No 0 Hoper Machine
                    --------------------------
                  -------------
                //---------------------------------------------------------------------------------------------------------------
                
                CoinOutMachineFillDetect();                        //錢幣滿位偵測
                
                if (!bit_sending ) {
                        WashDog   ;
                        if (WashDog > 1200) {                //約3秒
                                WashDog = 0;
                                UartSendIndexS = UartSendIndexE = 0;
                        }
                }
                
        }
}    
Pony
------
Pony
pony0952
一般會員


發表:3
回覆:7
積分:2
註冊:2003-10-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-01 17:44:21 IP:61.220.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/loadfile.php?TOPICID=18437904&CC=412356 範例程式 
------
Pony
cavy9999
一般會員


發表:16
回覆:21
積分:7
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-12-13 00:08:52 IP:61.64.xxx.xxx 未訂閱
pony0952 大大您好: 請問您程式所介紹到的投幣機是哪買的. 抱歉,會這麼問,實在是因為我找了非常多的廠商, 都說沒有賣可連接PC,並附予RS232-PC通訊模組的投幣機.        
引言: http://delphi.ktop.com.tw/loadfile.php?TOPICID=18437904&CC=412356 範例程式 >< face="Verdana, Arial, Helvetica">
系統時間:2024-04-29 1:11:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!