




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第頁#include<reg52.h>#include<string.h>#defineucharunsignedchar#defineuintunsignedint/*通信命令*/#define_ACTIVE_0x01//主機詢問從機是否存在#define_GETDATA_0x02//主機發送讀設備請求#define_OK_0x03//從機應答#define_STATUS_0x04//從機發送設備狀態信息#define_MAXSIZE0x08//緩沖區長度#define_ERRLEN12//任何通信幀長度超過12則表示出錯uchardbuf[MAXSIZE]; //該緩沖區用于保存設備狀態信息uchardev;//該字節用于保存本機設備號sbitM_DE=P1^0;//驅動器使能,1有效sbitM_RE=P1^1;//接收器使能,0有效voidget_status();//調用該函數獲得設備狀態信息,函數全碼未給出voidsend_data(uchartype,ucharlen,uchar*buf);//發送數據幀bitrecv_cmd(uchar*type);//接收主機命令,主機請求包含命令信息。voidsend_byte(ucharda);//該函數發送一幀數據中的一個字節,由send_data()函數調用voidmain()uchartype;ucharlen;/*系統初始化*/P1=0xff;//讀取本機設備號dev=(P1>>2);TMOD=0x20;//定時器T1使用方式2TH1=250;TL1=250;TR1=1;//開始計時PCON=0x80;//SMOD=1;SCON=0x50;//工作方式1,波特優選法9600bps,允許接收ES=0; //關閉串品中斷IT0=0;//外部中斷0使有電平觸發模式EX0=1;//開啟外部中斷0EA=0;//開啟總中斷/*主程序流程*/while(1)if(recv_cmd(&type)==0)//發送幀錯誤或幀地址及本機地址不符,丟棄當前幀后返回 continue; switch(type) case_ACTIVE_://主機詢問從機是否存在 send_data(_OK_,0,dbuf);//發送應答信息,這里的buf的內容并未用到 break; case_GETDATA_://主機發送讀設備請求 len=strlen(dbuf); snd_data(_STATUS_,len,dbuf);//發送設備信息 break; default: break;//命令類型錯誤,丟棄當前幀返回voidREADSTATUS()interrput0using1//產生外部中斷0時表示設備狀態發生改變,該函數使用寄存器組1get_status();//獲得設備狀態信息,并將其存入dbuf指向的存儲區,數據最后一個字節置0表示數據結束/*該函數接收一幀數據度進行檢測,無論該幀是否錯誤,函數均會返回。*函數參數type保存接收到的命令字*當接收的數扭幀錯誤或其地址位不為0時(非主機發送幀),快活數返回0,反之返回1bitrecv_cmd(uchar*type) bitdb=0;//當接收到的上一個字節為0xdb時,該位置位 bitc0=0;//當接慢到的上一個字節為0xc0時,該位置位 uchardata_buf[_ERRLEN];//保存接收到的幀 uchartmp; ucharecc=0; uchari; M_DE=0;//置發送禁止,接收允許 M_RE=0; /*接收一幀數據*/ i=0; while(!c0)//循環直至幀接收完畢 RI=0; while(RI); tmp=SBUF; RI=0; if(db==1)//接收到的上一個字節為0xdb swithc(tmp) case0xdd: data_buf[i]=0xdb;//0xdbdd表示0xdb ecc=ecc^0xdb; db=0; break; case0xdc: data_buf[i]=0xc0;//0xdbdc表示0xc0 ecc=0; db=0; break; default: return0;//幀錯誤,返回 i++; switch(tmp)//正常情況下 case0xc0://幀結束 c0=1; break; case0xdb: //檢測到轉義字符 db=1; break; default://普通數據 data_buf[i]=tmp;//保存數據 ecc=ecc^tmp;//計算校驗字節 i++; if(i==_ERRLEN)//幀超長,錯誤,返回 return0; /*判斷幀是否錯誤*/ if(i<4)//幀過短,錯誤,返回 return0; if(ecc!=0)//校驗錯誤,返回 return0; if(data_buf[i!=dev) //非訪問本機命令,錯誤,返回 return0; *type=data_buf[1];//獲得命令字 return1;//函數成功返回/*該函數發送一數據幀,參數type為命令字,len為數據長度,buf為要發送的數據內容*/voidsend_data(uchartype,ucharlen,uchar*buf)uchari;ucharecc=0;M_DE=1;//置發送允許,接收禁止M_RE=1;send_byte(dev);//發送本機地址ecc=dev;send_byte(type);//發送命令字ecc=ecc^type;send_byte(len);//發送長度ecc=ecc^len;for(i=0;i<len;i++)send_byte(*buf);ecc=ecc^(*buf);buff++;send_byte(ecc);//發送校驗字節TI=0;//發送幀結束標志SBUF=0xc0;while(!TI);TI=0;/*該函數發送一個數據字節,若該字節為0xdb,則發送0xdbdd,若該字節為0xc0,則發送0xdbdc*/voidsend_byte(ucharda)switch(da)case0xdb://字節為0xdb,發送0xdbdd TI=0; SBUF=0xdb; while(!TI); TI=0; SBUF=0xdd; while(!TI); TI=0; break; case0xc0://字節為0xc0,則發送0xdbdc TI=0;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工作中合同協議書
- 美容消費服務合同協議書
- 數產品方案策劃書3
- 電鍍氧化加工合同協議書
- 一種適老智能家居全場景方案規劃
- 中國乙二醇乙醚項目創業投資方案
- 非洲豬瘟與常見豬病的癥狀鑒別
- 原材料投資合同協議書
- 旅游管理-旅行社品牌策略
- 全國項目拓展計劃書模板
- 三級安全教育登記表
- 部編版小學語文三年級下冊《我不能失信》課件PPT(公開課)
- 水稻加工項目可行性研究報告(范文)
- 家庭教育方式綜合測驗
- 律師會見筆錄范本
- 浙教版科學電學基礎知識總結
- T/CEC 164-2018 火力發電廠智能化技術導則_(高清-最新版)
- 抹機水MSDS 安全資料表
- 醫院感染管理組織框架
- 特殊平行四邊形課件
- 八種皮膚類型PPT課件
評論
0/150
提交評論