匯編語言實現(xiàn)串口通信(PC和單片機間)_第1頁
匯編語言實現(xiàn)串口通信(PC和單片機間)_第2頁
匯編語言實現(xiàn)串口通信(PC和單片機間)_第3頁
匯編語言實現(xiàn)串口通信(PC和單片機間)_第4頁
匯編語言實現(xiàn)串口通信(PC和單片機間)_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

8.用C語言或匯編語言實現(xiàn)串口通信〔PC和單片機間〕上位機和下位機的主從工作方式為工業(yè)控制及自動控制系統(tǒng)所采用。由于PC機分析能力強、處理速度更快及單片機使用靈活方便等特點,所以一般都將PC機作為上位機,單片機作為下位機,二者通過RS-232或者RS-485接收、發(fā)送數(shù)據和傳送指令。單片機可單獨處理數(shù)據和控制任務,同時也將數(shù)據傳送給PC機,由PC機對這些數(shù)據進行處理或顯示1硬件電路的設計MCS-51單片機有一個全雙工的串行通訊口UART,利用其RXD和TXD與外界進行通信,其內部有2個物理上完全獨立的接收、發(fā)送緩沖器SBUF,可同時發(fā)送和接收數(shù)據。所以單片機和PC機之間可以方便地進行串口通訊。單片機串口有3條引線:TXD(發(fā)送數(shù)據),RXD(接收數(shù)據)和GND(信號地)。因此在通信距離較短時可采用零MODEM方式,簡單三連線結構。IBM-PC機有兩個標準的RS-232串行口,其電平采用的是EIA電平,而MCS-51單片機的串行通信是由TXD(發(fā)送數(shù)據)和RXD(接收數(shù)據)來進行全雙工通信的,它們的電平是TTL電平;為了PC機與MCS-51機之間能可靠地進行串行通信,需要用電平轉換芯片,可以采用MAXIM公司生產的專用芯片MAX232進行轉換。電路如圖1所示。硬件連接時,可從MAX232中的2路發(fā)送器和接收器中任選一路,只要注意發(fā)送與接收的引腳對應關系即可。接口電路如圖3.5所示??傮w設計按照整體設計思路方案繪制原理圖如下所示:2系統(tǒng)軟件設計軟件設計分上位機軟件設計和下位機軟件設計。這兩局部雖然在不同的機器上編寫和運行,但它們要做的工作是對應的:一個發(fā)送,另一個接收。為了保證數(shù)據通信的可靠性,要制定通信協(xié)議,然后各自根據協(xié)議分別編制程序?,F(xiàn)約定通信協(xié)議如下:PC機和單片機都可以發(fā)送和接收。上位機和下位機均采用查詢方式發(fā)送控字符和數(shù)據、中斷方式接收控制字符和數(shù)據。采用RS-232串口異步通信,1上位PC機與下位單片機異步串行通信的通信協(xié)議為了保證可靠的通信,必須有一套完善的通信協(xié)議。分布式控制系統(tǒng)中的每臺單片機均有唯一的番號。通信開始時,先由PC機呼叫被叫單片機的番號,單片機在接收到微機的呼叫后,首先判斷是不是自己的番號,如果是,那么發(fā)送呼叫應答信號,否那么不予理睬。微機在接收到呼叫應答信號之后,將向單片機發(fā)出通信命令字符串。以下是上位PC機協(xié)議的格式:單片機號單片機號命令碼命令碼停止標志其中,單片機號代表現(xiàn)場第幾臺單片機,占用1個字節(jié),發(fā)送兩次的目的是為了防止干擾;命令碼那么代表上位機向下位機發(fā)布的工作命令,它也占用1個字節(jié),發(fā)送兩次的目的也是為了防止干擾。而停止標志那么說明一次命令發(fā)送完畢。使用時可依據該標志判斷上位機的命令是否發(fā)送完畢。下位機協(xié)議格式如下:數(shù)據塊校驗位該格式中,數(shù)據塊為下位機上傳到上位PC機的數(shù)據。校驗位那么用于PC機對收到的數(shù)據進行奇偶校驗〔占1個字節(jié)〕。校驗正確后,可將數(shù)據寫入內存,否那么發(fā)出數(shù)據傳輸錯誤信息,以要求單片機重新傳輸數(shù)據。另外,作為一個完整的通信協(xié)議,只有上述約定還不夠,還必須在發(fā)送和接收數(shù)據的時間間隔上加以限制。否那么,很可能由于某些原因而造成無限制的等待對方應答,使整個系統(tǒng)處于工作不正常狀態(tài),或者延誤其它動作的處理。具體時間限制可根據通信內容、CPU處理速度,再加上適當?shù)挠嗔縼泶_定。2單片機通信程序設計單片機的數(shù)據通信由串行口完成,定時器T1作為波特率發(fā)生器,其波特率要與PC機一致。數(shù)據的傳送格式為1位起始位、8位數(shù)據位和1位停止位。采用中斷方式發(fā)送和接收數(shù)據,定時器T1設置為工作工作模式2,串行口設置為工作方式3,由第9位判斷停止。具體的程序流程圖見下。①單片機中斷方式接收程序當PC機不發(fā)送任何數(shù)據的時候,從機單片機始終處于等待狀態(tài)〔P.〕,直到PC機發(fā)送數(shù)據過來。由于PC機在發(fā)送有效數(shù)據之前會加一個開始符〔FFH〕,在有效數(shù)據之后會加一個開始符〔7FH〕,所以單片機接收到主機發(fā)送來的FFH之后,置RAM存貯單元的初始地址30H單元,用來放緊接著接收的數(shù)據,程序中還用了一個計數(shù)器COUNTER來計接收到的數(shù)據位數(shù),直到接收到7FH為止。單片機接收主程序MAIN及中斷效勞程序STR清單如下:COUNTEREQU40HPOINTEQU41HORG0000HLJMPMAINORG0023HLJMPSRTMAIN:MOVSP,#60HMOVTMOD,#20H;定時器T1的方式2MOVPCON,#00H;串行口波特率控制位MOVTH1,#0F4H;2400Kb/sMOVTL1,#0F4HMOV30H,#15MOVCOUNTER,#1MOVR0,#30H;接收數(shù)據存放區(qū)MOVR1,#30HSETBTR1;開始計數(shù)CLRET1;清定時中斷MOVSCON,#50H;串行口控制存放器給值SETBEA;開總中斷SETBES;開串行口中斷MOVIP,#10HMAIN1:ACALLDISPSJMPMAIN1SRT:PUSHACCPUSH01HJBCRI,GETSJMPEXITGET:MOVA,SBUFCJNEA,#0FFH,GET1;判斷是否為開始字符,不是跳GET1放數(shù)據存貯MOVR0,#30H;是開始符就置存貯區(qū)首地址30H,計數(shù)器清0并跳出中斷MOVCOUNTER,#0SJMPEXITGET1:CJNEA,#07FH,GET2判斷是否為結束符,不是跳GET2放數(shù)據存貯區(qū)MOVR5,COUNTER;是結束符,放發(fā)送緩存區(qū)開始字符INCR5MOVPOINT,#30HMOVSBUF,#255SJMPEXITGET2:MOV@R0,AINCR0INCCOUNTEREXIT:POP01HPOPACCRETI②單片機中斷方式發(fā)送程序由于本次設計的系統(tǒng)要實現(xiàn)的功能是將PC機送到單片機的數(shù)據回送到PC機,所以單片機要在接收完PC機數(shù)據后立即將數(shù)據回送到PC機。也就是說要將RAM存貯單元的初始地址30H單元內數(shù)據逐一發(fā)送出去。程序框圖見下。單片機發(fā)送主程序MAIN及中斷效勞程序SEND清單如下:COUNTEREQU40HPOINTEQU41HORG0000HLJMPMAINORG0023HLJMPSRTMAIN:MOVSP,#60HMOVTMOD,#20H;定時器T1的方式2MOVPCON,#00H;串行口波特率控制位MOVTH1,#0F4H;2400Kb/sMOVTL1,#0F4HMOV30H,#15MOVCOUNTER,#1MOVR0,#30H;接收數(shù)據存放區(qū)MOVR1,#30HSETBTR1;開始計數(shù)CLRET1;清定時中斷MOVSCON,#50H;串行口控制存放器給值SETBEA;開總中斷SETBES;開串行口中斷MOVIP,#10HMAIN1:ACALLDISPSJMPMAIN1SRT:PUSHACCPUSH01HJBCRI,GET;判斷是否為接收,是跳GET接收程序,否執(zhí)行發(fā)送程序CLRTIDJNZR5,SEND1SJMPEXITSEND1:MOVR1,POINTMOVA,@R1MOVSBUF,AINCR1MOVPOINT,R1SJMPEXITEXIT:POP01HPOPACCRETI③單片機顯示程序單片機顯示局部可以用來檢測接收到的數(shù)據是否正確,單片機顯示程序主要將接AT89C51從串行口收到的數(shù)據顯示出來。在程序設計中,在AT89C51RAM存貯器中的四個顯示緩沖器單元30H-34H,分別存放著由PC機方發(fā)送過來的數(shù)據,AT89C51的P2口掃描輸出總是只有一位為高電平,即4位顯示器中僅有一位公共陰極為低電平,其它位為高電平,AT89C51的P0口相應位〔陰極為低〕的顯示數(shù)據的段數(shù)據,使該位顯示出一個字符,其它們?yōu)榘?,依次地改變P2口輸出為高的位,P0口輸出對應的段數(shù)據,4位顯示器就顯示出由緩沖器中顯示數(shù)據所確定的字符。程序框圖見下:單片機顯示子程序清單如下:DISP:PUSHACCMOVDPTR,#TABMOVR1,#30HMOVA,COUNTERJZDISP2;沒有接收到數(shù)據,跳出DISP繼續(xù)顯示P.等待狀態(tài)MOVR2,AMOVR6,#08HDISP1:MOVA,@R1CPLAANLA,#0FHMOVCA,@A+DPTRMOVP0,A;送字形碼到P0口MOVA,R6MOVP2,A;送位控制到P2口RRAMOVR6,ADJNZR7,$INCR1DJNZR2,DISP1;判斷接收位數(shù)DISP2:MOVR1,#30HPOPACCRETTAB:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHDB77H,7CH,39H,5EH,79H,0F3HEND3PC機通信程序PC通信程序采用VisualBasic語言編程,VB提供了串行端口控制Mscomm來為應用程序提供串行通訊。該控件屏蔽了通信過程中的底層操作,我們可以設置、監(jiān)視Mscomm控件的屬性和事件,結合Timer控件即可完成對串行口的初始化和數(shù)據的輸入輸出工作。主程序按照通信協(xié)議的要求,首先確定波特率和信息幀格式,然后調用發(fā)送子程序將鍵盤輸入的數(shù)據發(fā)送出去,為了使主機能夠對整個檢測過程進行控制,須要在發(fā)送命令以后設定等待的時間,也可以通過條件判斷下一步是發(fā)送還是接收命令。對發(fā)送的命令,可能是文本方式或二進制代碼。在發(fā)送二進制代碼時,應特別注意發(fā)送的格式。PC機通信程序清單:PrivateSubCommand1_Click()DimoutstringAsStringDimiAsIntegerDimdeAsIntegeroutstring=Text1.TextMSComm1.RThreshold=Len(Text1.Text)+2MSComm1.Output=Chr(255)Fori=1ToLen(outstring)MSComm1.Output=Chr(Asc(Mid(outstring,i,1))-48)NextiMSComm1.Output=Chr(127)EndSubPrivateSubCommand2_Click()Text2.Text=""EndSubPrivateSubCommand3_Click()IfMSComm1.PortOpen=FalseThenMSComm1.PortOpen=TrueCommand3.Caption="關閉端口"ElseMSComm1.PortOpen=FalseCommand3.Caption="翻開端口"EndIfEndSubPrivateSubForm_Load()MSComm1.CommPort=1'定義用端口COM1MSComm1.Settings="2400,n,8,1"'波特率,無奇偶校驗,8位數(shù)據,1位停止位MSComm1.PortOpen=True'翻開端口Command3.Caption="關閉端口"EndSubPrivateSubMSComm1_OnComm()DimlenthAsInteger,iAsIntegerlenth=Len(Text1.Text)+2ReDiminstring(1Tolenth)AsIntegerSelectCaseMSComm1.CommEventCasecomEvReceiveFori=1Tolenthinstring(i)=MSComm1.Input(0)NextiEndSelectText2.Text=""Fori=1TolenthIfinstring(i)<>255Andinstring(i)<>127ThenText2.Text=Text2.Text&instring(i)EndIfNextiEndSubPrivateSubTimer1_Timer()Text3.Text=DateText4.Text=Time()EndSubPrivateSubTimer2_Timer()Text1=Text1+1IfText1>9999ThenText1=1000Command1_Click7EndSub附:單片機通信程序清單:COUNTEREQU40HPOINTEQU41HORG0000HLJMPMAINORG0023HLJMPSRTMAIN:MOVSP,#60HMOVTMOD,#20H;定時器T1的方式2MOVPCON,#00H;串行口波特率控制位MOVTH1,#0F4H;2400Kb/sMOVTL1,#0F4HMOV30H,#15MOVCOUNTER,#1MOVR0,#30H;接收數(shù)據存放區(qū)MOVR1,#30HSETBTR1;開始計數(shù)CLRET1;清定時中斷MOVSCON,#50H;串行口控制存放器給值SETBEA;開總中斷SETBES;開串行口中斷MOVIP,#10HMAIN1:ACALLDISPSJMPMAIN1;********中斷效勞子程序**********SRT:PUSHACCPUSH01HJBCRI,GET;判斷是否為接收,是跳GET接收程序,否執(zhí)行發(fā)送程序CLRTIDJNZR5,SEND1SJMPEXITSEND1:MOVR1,POINTMOVA,@R1MOVSBUF,AINCR1MOVPOINT,R1SJMPEXITGET:MOVA,SBUFCJNEA,#0FFH,GET1;判斷是否為開始字符,不是跳GET1放數(shù)據存貯區(qū)MOVR0,#30H;是開始符就置存貯區(qū)首地址30H,計數(shù)器清0并跳出中斷MOVCOUNTER,#0SJMPEXITGET1:CJNEA,#07FH,GET2;判斷是否為結束符,不是跳GET2放數(shù)據存貯區(qū)MOVR5,COUNTER;是結束符,放發(fā)送緩存區(qū)開始字符INCR5MOVPOINT,#30HMOVSBUF,#255SJMPEXITGET2:MOV@R0,AINCR0INCCOUNTEREXIT:POP01HPOPACCRETI;*********顯示程序**********DISP:PUSHACCMOVDPTR,#TABMOVR1,#30HMOVA,COUNTERJZDISP2;沒有接收到數(shù)據,跳出DISP繼續(xù)顯示P.等待狀態(tài)MOVR2,AMOVR6,#08HDISP1:MOVA,@R1ANLA,#0FHMOVCA,@A+DPTRMOVP0,A;送字形碼到P0口MOVA,R6MOVP2,A;送位控制到P2口RRAMOVR6,ADJNZR7,$INCR1DJNZR2,DISP1;判斷接收位數(shù)DISP2:MOVR1,#30HPOPACCRETTAB:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHDB77H,7CH,39H,5EH,79H,0F3HENDPC機通信程序清單:PrivateSubCommand1_Click()DimoutstringAsStringDimiAsIntegerDimdeAsIntegeroutstring=Text1.TextMSComm1.RThreshold=Len(Text1.Text)+2MSComm1.Output=Chr(255)Fori=1ToLen(outstring)MSComm1.Output=Chr(Asc(Mid(outstring,i,1))-48)NextiMSComm1.Output=Chr(127)EndSubPrivateSubCommand2_Click()Text2.Text=""EndSubPrivateSubCommand3_Click()IfMSComm1.PortOpen=FalseThenMSComm1.PortOpen=TrueCommand3.Caption="關閉端口"Else

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論