可否詳細講解當bcb透過rs232傳值給8051時,8051的c program要怎樣寫??? |
尚未結案
|
mcng815
一般會員 發表:4 回覆:1 積分:1 註冊:2004-10-27 發送簡訊給我 |
|
geniustom
版主 發表:100 回覆:303 積分:260 註冊:2003-01-03 發送簡訊給我 |
|
pony0952
一般會員 發表:3 回覆:7 積分:2 註冊:2003-10-06 發送簡訊給我 |
由於個人使用 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 ; iPony
------
Pony |
pony0952
一般會員 發表:3 回覆:7 積分:2 註冊:2003-10-06 發送簡訊給我 |
|
cavy9999
一般會員 發表:16 回覆:21 積分:7 註冊:2002-03-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |