串口編程.doc_第1頁
串口編程.doc_第2頁
串口編程.doc_第3頁
串口編程.doc_第4頁
串口編程.doc_第5頁
已閱讀5頁,還剩14頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

串口編程1、串行口方式1應用編程補充例1 本例采用方式1進行雙機通信,收發雙方均采用6MHz晶振,波特率為2400,每一幀信息為10位,第0位為起始位,18位為數據位,最后1位為停止位。發送方將78H、77H單元的內容為首地址,以76H、75H單元內容減1為末地址的數據塊內容通過串行口發送給接收方。發送方要發送的數據塊的地址為2000H201FH。發送時先發送地址幀,再發送數據幀;接收方在接收時,使用一個標志位來區分接收的數據是地址還是數據,然后將其分別存放在指定的單元中。發送方可采用查詢方式或中斷方式發送數據,接收方采用中斷或查詢方式接收。本例子僅給出中斷方式的發送和接收的程序。1)甲機發送程序中斷方式的發送程序如下:ORG 0000HLJMP MAINORG 0023HLJMP COM_INTORG 1000HMAIN:MOV SP,#53H ;set stock top pointer MOV 78H,#20H ;set sending data first-bottom address MOV 77H,#00H MOV 76H,#20H MOV 75H,#40H ACALL TRANS ;call send prog SJMP $TRANS:MOV TMOD,#20H ;set timer/counter working model MOV TH1,#0F3H ;set counter initial value MOV TL1,#0F3H MOV PCON,#80H ;set baud rate double SETB TR1 ;open counter MOV SCON,#40H ;set serial working model MOV IE,#00H ;First close interrupt,use query model sending address CLR F0 MOV SBUF,78H ;send first-address high 8bitWAIT1:JNB TI,WAIT1 CLR TI MOV SBUF,77H ;send first-address low 8bitWAIT2:JNB TI,WAIT2 CLR TI MOV SBUF,76H ;send end-address high 8bitWAIT3:JNB TI,WAIT3 CLR TI MOV SBUF,75H ;send end-address low 8bitWAIT4:JNB TI,WAIT4 CLR TI MOV IE,#90H ;open interrupt,interrupt model send data MOV DPH,78H MOV DPL,77H MOVX A,DPTR MOV SBUF,A ;send first dataWAIT: JNB F0,WAIT ;wait sending RETCOM_INT: CLR TI ;close sending-interrupt flag bit TI INC DPTR ;data pointer add 1,intend sending next data MOV A,DPH ;determine current sending data address wether or not bottom address CJNE A,76H,END1 ;no bottom address,jump MOV A,DPL CJNE A,75H,END1 SETB F0 ;data sending end,set F0 equ 1 CLR ES ;close serial interrupt CLR EA ;close interrupt RETEND1: MOVX A,DPTR ;wait sending data give A,intend to send MOV SBUF,A ;send data RETI END2)乙機接收程序中斷方式的接收程序如下:ORG 0000HLJMP MAINORG 0023HLJMP COM_INTORG 1000HMAIN:MOV SP,#53H ;set stock top pointer ACALL RECEI SJMP $RECEI: MOV R0,#78H MOV TMOD,#20H MOV TH1,#0F3H ;set counter initial value MOV TL1,#0F3H MOV PCON,#80H ;set baud rate double SETB TR1 ;open counter MOV SCON,#50H ;set serial working model MOV IE,#90H ;open interrupt CLR F0 ;clear flag F0 CLR 7FHWAIT: JNB 7F,WAIT ;query flag-bit,wait receive data RETCOM_INT:PUSH DPL ;保護現場 PUSH DPH PUSH ACC CLR RI ;清接收中斷RI JB F0,R_DATA ;判斷接收的是數據還是地址,F00為地址 MOV A,SBUF ;接收數據 MOV R0,A ;將地址幀送指定的寄存器 DEC R0 CJNE R0,#74H,RETN SETB F0 ;置標志位,地址接收完畢RETN: POP ACC ;出棧 POP DPH POP DPL RETIR_DATA: MOV DPH,78H ;數據接收程序區 MOV DPL,77H MOV A,SBUF ;接收數據 MOVX DPTR,A ;送指定的數據存儲單元中 INC 77H ;地址加1 MOV A,77H ;判斷接收的數據的地址是否應向高8位進位 JNZ END2 INC 78HEND2: MOV A,76H CJNE A,78H,RETN ;判斷是否為最后一幀數據,不是則繼續 MOV A,75H CJNE A,77H,RETN ;是最后一幀數據則清各種標志位 CLR ES CLR EA SETB 7FH SJMP RETN END2、串行口方式2應用編程方式2和方式1有兩點不同之處:一是傳輸信息格式不同,即方式2接收/發送11bit,第0位為起始位,第18位為數據位,第9位為控制位(該位由TB8決定),第10位為停止位;二是波特率變化范圍不同,方式2的波特率振蕩器頻率/n,其中當SMOD0時,n64;當SMOD1時,n32。由于方式2的使用和方式3基本一樣(只是波特率不同,方式3的波特率要由用戶決定),所以方式2的具體編程使用,可參照方式3的應用編程。3、串行口方式3應用編程補充例2 MCS-51串行通訊方式3進行發送和接收的應用實例。發送方采用查詢方式發送地址幀,采用中斷或查詢方式發送數據;接收方采用中斷或查詢方式接收數據。發送和接收雙方均采用6MHz的晶振,波特率為4800。發送方首先將存放在78H和77H單元中的地址發送給接收方,然后發送數據00HFFH,共256個數據。1)甲機發送程序中斷方式的發送程序如下:ORG 0000HLJMP MAINORG 0023HLJMP COM_INTORG 1000HMAIN: MOV SP,#53H MOV 78H,#20H ;設置要存放數據的單元的首地址 MOV 77H,#00H ACALL TRAN ;調用發送子程序 SJMP $TRAN:MOV TMOD,#20H ;設置定時器/計數器工作方式 MOV TH1,#0FDH ;設置波特率為4800 MOV TL1,#0FDH SETB TR1 ;開定時器 MOV SCON,#0E0H ;設置串口工作方式為3 SETB TB8 ;設置第9位數據位 MOV IE,#00H ;關中斷 MOV SBUF,78H ;查詢方式發送首地址高8位WAIT: JNB TI,WAIT CLR TI MOV SBUF,77H ;發送首地址低8位WAIT2:JNB TI,WAIT2 CLR TI MOV IE,#90H ;開中斷 CLR TB8 MOV A,#00H MOV SBUF,A ;開始發送數據WAIT1:CJNE A,#0FFH,WAIT1 ;判斷數據是否發送完畢 CLR ES ;發送完,關中斷 RETCOM_INT:CLR TI ;中斷服務子程序 INC A ;要發送數據值1 MOV SBUF,A ;發送數據 RETI END2)乙機接收程序接收方把先接收到的數據送給數據指針,將其作為數據存放的首地址,然后將接下來接收到的數據存放在以首地址開始的單元中。采用中斷方式的接收程序如下:ORG 0000HLJMP MAINORG 0023HLJMP COM_INTORG 1000HMAIN: MOV SP,#53H MOV R0,#0FEH ;設置地址幀接收計數寄存器初值 ACALL RECEI ;調用接收子程序 SJMP $RECEI: MOV TMOD,#20H ;設置C/T工作方式 MOV TH1,#0FDH ;設置波特率4800 MOV TL1,#0FDH SETB TR1 ;開定時器 MOV IE,#90H ;開中斷 MOV SCON,#0F0H ;設置串口工作方式,允許接收 SETB F0 ;設置標志位WAIT: JB F0,WAIT ;等待接收 RETCOM_INT:CLR RI ;清接收中斷標志位 MOV C,RB8 ;對第9位數據進行判斷,是數據還是地址 JNC PD2 ;是地址,則送給數據指針指示器DPTR INC R0 MOV A,R0 JZ PD MOV DPH,SBUF SJMP PD1PD: MOV DPL,SBUF CLR SM2 ;清地址標志位PD1: RETIPD2: MOV A,SBUF ;接收數據 MOVX DPTR,A INC DPTR CJNE A,#0FFH,PD1 ;判斷是否是最后一幀數據 SETB SM2 ;是,則清相關的標志位 CLR F0 CLR ES RETI END一般來說,定時器方式2用來確定波特率是比較理想的,它不需要在中斷服務程序中設置初值,且計算的波特率比較準確。在用戶使用波特率不是很低的情況下,建議使用定時器T1的方式2來確定波特率。補充例3 某單片機頻率位11.0592MHz,選用T1方式2作為波特率發生器,波特率為2400b/s,求初值。(T1方式2,選SMOD0)解:由公式:波特率(其中x為初值)。將已知條件代入公式,有得到x244F4H,將F4H裝入TH1、TL1,即可得到2400的波特率。單片機電子琴設計1 實驗任務 (1 由4X4組成16個按鈕矩陣,設計成16個音。(2 可隨意彈奏想要表達的音樂。2電路原理圖 3系統板硬件連線 (1 把“單片機系統”區域中的P1.0端口用導線連接到“音頻放大模塊”區域中的SPK IN端口上;(2 把“單片機系統“區域中的P3.0P3.7端口用8芯排線連接到“4X4行列式鍵盤”區域中的C1C4R1R4端口上;4 相關程序內容 (1 4X4行列式鍵盤識別;(2 音樂產生的方法;一首音樂是許多不同的音階組成的,而每個音階對應著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構成我們所想要的音樂了,當然對于單片機來產生不同的頻率非常方便,我們可以利用單片機的定時/計數器T0來產生這樣方波頻率信號,因此,我們只要把一首歌曲的音階對應頻率關系弄正確即可。現在以單片機12MHZ晶振為例,例出高中低音符與單片機計數T0相關的計數值如下表所示音符頻率(HZ)簡譜碼(T值) 音符頻率(HZ)簡譜碼(T值)低1DO26263628# 4 FA#74064860#1DO#27763731中 5 SO78464898低2RE29463835# 5 SO#83164934#2 RE#31163928中 6 LA88064968低 3 M33064021# 693264994低 4 FA34964103中 7 SI98865030# 4 FA#37064185高 1 DO104665058低 5 SO39264260# 1 DO#110965085# 5 SO#41564331高 2 RE117565110低 6 LA44064400 # 2 RE#124565134# 646664463高 3 M131865157低 7 SI49464524高 4 FA139765178中 1 DO52364580# 4 FA#148065198# 1 DO#55464633高 5 SO156865217中 2 RE58764684# 5 SO#166165235# 2 RE#62264732高 6 LA176065252中 3 M65964777# 6186565268中 4 FA69864820高 7 SI196765283下面我們要為這個音符建立一個表格,有助于單片機通過查表的方式來獲得相應的數據低音019之間,中音在2039之間,高音在4059之間TABLE: DW 0,63628,63835,64021,64103,64260,64400,64524,0,0 DW 0,63731,63928,0,64185,64331,64463,0,0,0 DW 0,64580,64684,64777,64820,64898,64968,65030,0,0 DW 0,64633,64732,0,64860,64934,64994,0,0,0 DW 0,65058,65110,65157,65178,65217,65252,65283,0,0 DW 0,65085,65134,0,65198,65235,65268,0,0,0 DW 02、音樂的音拍,一個節拍為單位(C調)曲調值DELAY 曲調值DELAY調4/4125ms 調4/462ms調3/4187ms 調3/494ms調2/4250ms 調2/4125ms對于不同的曲調我們也可以用單片機的另外一個定時/計數器來完成。下面就用AT89S51單片機產生一首“生日快樂”歌曲來說明單片機如何產生的。在這個程序中用到了兩個定時/計數器來完成的。其中T0用來產生音符頻率,T1用來產生音拍。5程序框圖6匯編源程序KEYBUF EQU 30H ;定義變量STH0 EQU 31H STL0 EQU 32H TEMP EQU 33H ORG 0000H ;初始化 LJMP START ORG 0BH LJMP INT_T0 START: MOV TMOD,#01H ;設置T0工作方式1 SETB EA ;開中斷 SETB ET0 WAIT: MOV P3,#0FFH ;設置P3,判斷第一行是否有鍵被按下 CLR P3.4 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY1 ;若無,判斷第二行是否有鍵被按下 LCALL DELY10MS ;調用延時子程序 MOV A,P3 ;再次判斷第一行是否有鍵被按下 ANL A,#0FH XRL A,#0FH JZ NOKEY1 ;判斷按鍵值 MOV A,P3 ;識別按鍵 ANL A,#0FH CJNE A,#0EH,NK1 MOV KEYBUF,#0 LJMP DK1 NK1: CJNE A,#0DH,NK2 MOV KEYBUF,#1 LJMP DK1 NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#2 LJMP DK1 NK3: CJNE A,#07H,NK4 MOV KEYBUF,#3 LJMP DK1 NK4: NOP DK1: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK1A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK1A CLR TR0 NOKEY1: MOV P3,#0FFH ;判斷第二行是否有鍵被按下,若有,則進行識別 CLR P3.5 ;若無,則判斷第三行是否有鍵被按下 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY2 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY2 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK5 MOV KEYBUF,#4 LJMP DK2 NK5: CJNE A,#0DH,NK6 MOV KEYBUF,#5 LJMP DK2 NK6: CJNE A,#0BH,NK7 MOV KEYBUF,#6 LJMP DK2 NK7: CJNE A,#07H,NK8 MOV KEYBUF,#7 LJMP DK2 NK8: NOP DK2: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK2A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK2A CLR TR0 NOKEY2: MOV P3,#0FFH ;判斷第三行是否有鍵被按下,若有,則進行識別 CLR P3.6 ;若無,則判斷第四行是否有鍵被按下 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY3 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY3 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK9 MOV KEYBUF,#8 LJMP DK3 NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#9 LJMP DK3 NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10 LJMP DK3 NK11: CJNE A,#07H,NK12 MOV KEYBUF,#11 LJMP DK3 NK12: NOP DK3: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK3A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK3A CLR TR0 NOKEY3: MOV P3,#0FFH ;判斷第四行是否有鍵被按下,若有,則進行識別; CLR P3.7 ;若無,則等待 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY4 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY4 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK13 MOV KEYBUF,#12 LJMP DK4 NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#13 LJMP DK4 NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#14 LJMP DK4 NK15: CJNE A,#07H,NK16 MOV KEYBUF,#15 LJMP DK4 NK16: NOP DK4: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK4A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK4A CLR TR0 NOKEY4: LJMP WAIT DELY10MS: MOV R6,#10 ;延時子程序D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET INT_T0: MOV TH0,STH0 MOV TL0,STL0 CPL P1.0 RETI TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H TABLE1: DW 64021,64103,64260,64400 DW 64524,64580,64684,64777 DW 64820,64898,64968,65030 DW 65058,65110,65157,65178 END 7 C語言源程序 #include unsigned char code table=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71; unsigned char temp; unsigned char key; unsigned char i,j; unsigned char STH0; unsigned char STL0; unsigned int code tab=64021,64103,64260,64400, 64524,64580,64684,64777, 64820,64898,64968,65030, 65058,65110,65157,65178; void main(void) TMOD=0x01; /初始化中斷寄存器,開中斷 ET0=1; EA=1; while(1) P3=0xff; /判斷第一行是否有鍵被按下,若有,則進行識別 P3_4=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) for(i=50;i0;i-) for(j=200;j0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=0; break; case 0x0d: key=1; break; case 0x0b: key=2; break; case 0x07: key=3; break; temp=P3; P1_0=P1_0; P0=tablekey; STH0=tabkey/256; STL0=tabkey%6; TR0=1; temp=temp & 0x0f; while(temp!=0x0f) temp=P3; temp=temp & 0x0f; TR0=0; P3=0xff; /判斷第二行

溫馨提示

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

評論

0/150

提交評論