基于單片機的雙機串行通信設(shè)計_第1頁
基于單片機的雙機串行通信設(shè)計_第2頁
基于單片機的雙機串行通信設(shè)計_第3頁
基于單片機的雙機串行通信設(shè)計_第4頁
基于單片機的雙機串行通信設(shè)計_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、00一、總體設(shè)計L實現(xiàn)功能:用單片機的串口模擬短信的收發(fā),當(dāng)A主機要向 B主機發(fā)送一行字符串時,首先A主機把這行字 符串打印到1602LCD液晶屏幕上,當(dāng)A主機按發(fā) 送按鍵的時候,A主機向B主機發(fā)送一行字符串, 這時字符串會通過串口發(fā)送到B主機上,當(dāng)B主 機收到字符串時,會在1602LCD液晶屏幕上把字 符串打印出來,這時按下B主機上的接受按鍵, B主機會把要發(fā)送的字符串,打印到B主機的 1602LCD液晶屏幕上,按下B主機的發(fā)送按鍵, 這時B主機會通過串口向A主機發(fā)送字符串。最 后用兩個矩陣鍵盤模擬發(fā)送短信用的字母鍵盤, A主機可以通過矩陣鍵盤輸入想要發(fā)送的數(shù)據(jù), 然后按發(fā)送按鍵發(fā)送,同樣B

2、主機也可以通過矩 陣鍵盤輸入信息,然后通過發(fā)送按鍵發(fā)送。2.設(shè)計方案:首先把兩個ATS89C51各自連接成單片機最小 系統(tǒng),在把他們的TXD、RXD 口分別與MAX232 相連,然后一個MAX232的T10UT和RUN ,分 別與另一個MAX232的R1IN和TIout相連,P0 口接矩陣鍵盤,P1 口接液晶顯示的數(shù)據(jù)端???的電路圖如圖:A主機ftZSIS 匚廠 EEnnE3.6/一:”.圖1、總電路圖二、設(shè)計基礎(chǔ)L單片機串行口通信方式U112XTAL1PO.O/ADO PO.1/AD1A QP0.2/AD2XTAL2P0.3/AD3P0.4/AD4PO.5/AD5 dP0.6/AD6RST

3、P0.7/AD7 P2.0/A8P2.1/A9P2.2/A10PSENP2.3/A11ALEP2.4/A12EAP2.5ZA13P2.6ZA14P27/A15 3P1.0P3.0/RXDP1 AP3.1XTXDP1.2P3.2力NT。5P1.3P3.3/1NT1P1.4P3.47T0a乏P1 5P1.5P3.5/T1P1.7P3.7/RDAT09C51 xTEXT圖 2.AT89C51計算機與外界的信息交換稱為通信,常用的通信 方式有兩種:并行通信和串行通信。51單片機 用4個接口與外界進行數(shù)據(jù)輸入與數(shù)據(jù)輸出就 是并行通信,并行通信的特點是傳輸信號的速度 快,但所用的信號線較多,成本高,傳輸?shù)?/p>

4、距離 較近。串行通信的特點是只用兩條信號線(一條 信號線,再加一條地線作為信號回路)即可完成 通信,成本低,傳輸?shù)木嚯x較遠。51單片機的串行接口是一個全雙工的接口,它 可以作為UART (通用異步接受和發(fā)送器)用, 也可以作為同步移位寄存器用。51單片機串行 接口的結(jié)構(gòu)如下:(1)數(shù)據(jù)緩沖器(SBUF)接受或發(fā)送的數(shù)據(jù)都要先送到SBUF緩存。有兩 個,一個緩存,另一個接受,用同一個接地址 99H,發(fā)送時用指令將數(shù)據(jù)送到SBUF即可啟動發(fā) 送 接收時用指令將SBUF中接收到的數(shù)據(jù)取出。(2)串行控制寄存器(PCON)SCON用于串行通信方式的選擇,收發(fā)控制及狀 態(tài)指示,各位含義如下:SMO SM

5、I SM2 REN TB8 RB8TIRISMO, SM1:串行接口工作方式選擇位,這兩位組合 成00, 01, 10, 11對應(yīng)于工作方式0、1、2、3o 串行接口工作方式特點見下表SM0SM1工作功能波特率0008位同步移位寄存器 (用于I/O擴展)foRc/1201110位異步串行通信 (UART)可變(T1溢出 率 *2swd/32)10211位異步串行通信 (UART)foRc/64或foRc/3211311位異步串行通信 (UART)可變(T1溢出率*2./32)SM2:多機通信控制位。REN:接收允許控制位。軟件置1允許接收;軟件置0禁止接收。TB8:方式2或3時,TB8為要發(fā)送

6、的第9位數(shù) 據(jù),根據(jù)需要由軟件置1或清0。RB8:在方式2或3時,RB8位接收到的第9位 數(shù)據(jù),實際為主機發(fā)送的第9位數(shù)據(jù)TB8,使從 機根據(jù)這一位來判斷主機發(fā)送的時呼叫地址還 是要傳送的數(shù)據(jù)。TI:發(fā)送中斷標(biāo)志。發(fā)送完一幀數(shù)據(jù)后由硬件自動置位,并申請中斷。必須要軟件清零后才能繼 續(xù)發(fā)送。RI:接收中斷標(biāo)志。接收完一幀數(shù)據(jù)后由硬件自動置位,并申請中斷。必須要軟件清零后才能繼 續(xù)接收。(3)輸入移位寄存器接收的數(shù)據(jù)先串行進入輸入移位寄存器,8位數(shù) 據(jù)全移入后,再并行送入接收SBUF中。(4)波特率發(fā)生器波特率發(fā)生器用來控制串行通信的數(shù)據(jù)傳輸速 率的,51系列單片機用定時器T1作為波特率發(fā) 生器,

7、T1設(shè)置在定時方式。波特率用來表示串 行通信數(shù)據(jù)傳輸快慢程度的物理量定義為每秒鐘傳送的數(shù)據(jù)位數(shù)。(5)電源控制寄存器PCON,其最高位為SMOD。(6)波特率計算對于方式1和方式3,波特率都是由定時器1的 溢出率決定,計算公式如下:波特率二善哈J一定時初值定時器T1工作于方式0時,k=13;定時器T1工作于方式1時,k=16;定時器T1工作于方式2和方式3, k=8;2、1602LCD 操作(1) 1602LCD 特性:+5V電壓,對比度可調(diào)內(nèi)含復(fù)位電路 提供各種控制命令,如:清屏、字符閃爍、光標(biāo) 閃爍、顯示移位等多種功能 有80字節(jié)顯示數(shù)據(jù)存儲器DDRAM內(nèi)建有160個5X7點陣的字型的字符

8、發(fā)生器CGR0M8個可由用戶自定義的5X7的字符發(fā)生器CGRAM字符型LCD1602通常有14條引腳線或16條引腳 線的LCD,多出來的2條線是背光電源線VCC(15 腳)和地線GND (16腳)引腳號引腳名電平輸入/輸出作用1US5電源地2Ucc電源L5U)3Uee1對比調(diào)整電壓4RS0/1輸入用卷入指令1=播入數(shù)據(jù)5R/W0/1輸入0=向LCD寫入指僉或數(shù)據(jù) 僅從LCD讀取信息6E諭入使能信號,1時諼取信息, 1一 9(下降沿)蹌指令7DBG0/1輸入/輸出數(shù)據(jù)總線式強。(最低位)8DB10/1鐲入/錨出數(shù)據(jù)總線linel9DB20/1輸入/輸出數(shù)據(jù)總線line210DBS0/1輸入/輸出

9、數(shù)據(jù)總線1ine311DB40/1輸入/鐲出數(shù)據(jù)總線工皿皿12DBS0/1輸入/輸出數(shù)據(jù)總線Une513DB60/1輸入/輸出數(shù)據(jù)總線line614DB70/1輸入/輸出數(shù)據(jù)總線最高位)1SAUccLCD背光電源正極16K接地LCD背光電源負極圖3、1602各引腳的定義HD44780內(nèi)置了 DDRAM (顯示數(shù)據(jù)存儲RAM)、CGROM (字符存儲ROM)和CGRAM (用戶自定義 顯示的字符代碼。共80個字節(jié),其地址和屏幕 的對應(yīng)關(guān)系如下表:RAM)oDDRAM就是顯示數(shù)據(jù)RAM,用來寄存待顯示位置1234567,r t40DDRfiM 地址第一行00H01H02H03H05H06H27H第

10、二行40H42H43H岫H45H剛67H也就是說想要在LCD1602屏幕的第一行第一列顯示一個“A”字,就要向DDRAM的00H地址寫入“A”的代碼就行了。但具體的寫入是要按LCD模塊的指令格式來進行的,后面我會講到的。一 行有40個地址 在1602中我們就用前16個就 行了。第二行也一樣用前16個地址。對應(yīng)如下: DDRAM地址與顯示位置的對應(yīng)關(guān)系 TOC o 1-5 h z (1IIj O0H 01H 02H 03H 耿H 05H 96H 07H 08H 09H 0AH 0BH 0cH GDH 0EH OFH jII5 4GH 41H 42H 43H 44H 45H 46H 47H 48H

11、 49H 4AH 4BH 4CH 4DH EH 4FH ;1602液晶模塊內(nèi)部的字符發(fā)生存儲器(CGROM)已經(jīng)存儲了 160個不同的點陣字符圖形,如下表所示,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大 小寫、常用的符號、和日文假名等,每一個字 符都有一個固定的代碼,比如大寫的英文字母A”的代碼是01000001B (41H),顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們 就能看到字母“A”8RJ3WI中字符碼與宇字將宇楔關(guān)系對照表1OOOC COQ10010 M11 0100 01101 0110 0111 1000100t1010 toil 1100 1101 11101111xxxxO

12、OOO黑 (1)0 a p r一0三0PxxxxOOOl1;iiimei-a 司o T吁仁區(qū)qxxxxOOIOQ)BI|2|B|R|b|n| 783層exxxxOO11#|3|C|S|o|s|I。廳圮后)oocx0100S)第4|1丁1日代廠TTlIhTPxxxxOIOl6) 1X 日 U|e|u I才I尹.后 uIO冕_&|6|FU|-F|m|Z利力I二月叵zxxxxOl 11間1? |7|G|W|-3|w|TLxxxxIOOC*而1二l9!IIV|i|y|。力Ulib產(chǎn)XXKJClOlO工口心|問xxxxlOl 1y 1_+rriKic ikiciz才 IflBIi帶日xxxxl 100,

13、KIL|L|il|刊劃nc庫RXXKX1101|.xxxxl110.INrinWsrtunrfnJOOOC31 1 1 圖4、1602字符表上表中的字符代碼與我們PC中的字符代碼是基 本一致的。因此我們在向DDRAM寫C51字符 代碼程序時甚至可以直接用P1 =,A,這樣的方法。PC在編譯時就把“A”先轉(zhuǎn)為41H代碼了。字符代碼0 x00-0 x0F為用戶自定義的字符圖形RAM(對于5X8點陣的字符,可以存放8組), 就是 CGRAM 了。對DDRAM的內(nèi)容和地址操作,HD44780的指 令集及其設(shè)置說明,共有11條指令:基本操作時序: 讀狀態(tài) 輸入:RS=L, RW=H,E=H輸出:DBOD

14、B7=狀態(tài)字寫指令 輸入:RS=L, RW=L, E=下降沿脈沖,DBODB7=指令碼輸出:無讀數(shù)據(jù)輸 :RS=H, RW=H,E=H輸出:DBODB7=數(shù)據(jù) 寫數(shù)據(jù) 輸入:RS=H, RW=L, E=下降沿脈沖,DBODB7=數(shù)據(jù) 輸出:無1 .清屏指令I(lǐng)指令功能指令編碑/WS.RSft/WD87D86D84D83DB2D01DBO清屏001I 0000001功能:vl清除液晶顯示器,即將DDRAM的內(nèi)容全部填入“空白”的字符碼20H;2光標(biāo)歸位,即將光標(biāo)撤回液晶顯示屏的左上方;3將地址計數(shù)器(AC)的值設(shè)為0。2 .光標(biāo)歸位指令11I指令功能指令編刊/ns1RSR/WDB7D86DB5DB

15、4D83DB2DB1DB0光標(biāo)歸位0&060001X功能:Vl把光標(biāo)撤回到顯示器的左上方;2把地址計數(shù)器(AC)的值設(shè)置為0;3保持DDRAM的內(nèi)容不變 3 .輸入模式設(shè)置指令指令功能指令編碼牖RSR/W087DB60B5DB4DB3DB20B1060進入模式設(shè)置Q60000a11/。54。功能:設(shè)定每次寫入1位數(shù)據(jù)后光標(biāo)的移位方 向,并且設(shè)定每次寫入的一個字符是否移動。參數(shù)設(shè)定的情況如下所示:位名I/D移S設(shè)置0=寫入新數(shù)據(jù)后光標(biāo)左1=寫入新數(shù)據(jù)后光標(biāo)右移0=寫入新數(shù)據(jù)后顯示屏不移動1=寫入新數(shù)據(jù)后顯示屏整體右移1個字4 .顯示開關(guān)控制指令指令功能指令編弼輻 /USRSR/WDB7DB6DB

16、5DB3DB2DB1DB0顯示開關(guān)控制0006001DCB40功能:控制顯示器開/關(guān)、光標(biāo)顯示/關(guān)閉以及光標(biāo)是否閃爍。參數(shù)設(shè)定的情況如下: 位名1=顯示功能開1=有光標(biāo)1=光標(biāo)閃爍D0=顯示功能關(guān)C0=無光標(biāo)B0=光標(biāo)不閃爍5.設(shè)定顯示屏或光標(biāo)移動方向指令指令功能指令編碼璃 /USRSR/WDB7DB6DBSDB4DB3DB2DB1DB0000001S/CR/LXX功能:使光標(biāo)移位或使整個顯示屏幕移位。參數(shù)設(shè)定的情況如下:S/CR/L000110但光標(biāo)不動11但光標(biāo)不動設(shè)定情況光標(biāo)左移1格,且AC值減1光標(biāo)右移1格,且AC值加1顯示器上字符全部左移一格,顯示器上字符全部右移一格,6 .功能設(shè)定

17、指令 功能:設(shè)定數(shù)據(jù)總線位數(shù)、顯示的行數(shù)及字型。 參數(shù)設(shè)定的情況如下:指令功能指令編碼/USRSR/WDB7DB6DB5DB4DB3DB2DB1DB0功能設(shè)定00001DLHFXX4。位名設(shè)置DL0=數(shù)據(jù)總線為4位1=數(shù)據(jù)總線為8位N0=顯示1行1=顯示2行F0=5 X 7點陣/每字符1=5 X10點陣/每字符.設(shè)定CGRAM地址指令指令功能指令編碼牖 /USKSR/WD87086DBS DBU DB3 QB2 DB1 DB0設(shè)定c Cram ,地址0001CGRAH的地址46位)40功能:設(shè)定下一個要存入數(shù)據(jù)的CGRAM的地 址。.設(shè)定DDRAM地址指令指令功能指令編弱/USRSR/WD87

18、DB6DB5DBUD83D82DB1DB0設(shè)定DDRAM 地址001CCRM的地址p位)40功能:設(shè)定下一個要存入數(shù)據(jù)的CGRAM的地 址。(注意這里我們送地址的時候應(yīng)該 是0 x80+Address,這也是前面說到寫地址命令的時候要加上0 x80的原因).讀取忙信號或AC地址指令指令功能指令編陰時間 /U5RSR/WDB7DB6 DBS DBH D830B2 DB1 DBO讀取忙碌信號 4AC地址01FBAC內(nèi)容(7位)功能:1讀取忙碌信號BF的內(nèi)容,BF=1表 送來的數(shù)據(jù)或指令;當(dāng)BF=0時,液晶顯示器可 以接收單片機送來的數(shù)據(jù)或指令;示液晶顯示器忙,暫時無法接收單片機2讀取地址計數(shù)器(A

19、C)的內(nèi)容。.數(shù)據(jù)寫入DDRAM或CGRAM指令指令功能指令編碼強行 時I司/SRSR/WDB7DB6D85DB4D630B2DB1DB0數(shù)據(jù)寫入到DDRAM或CGRAM10要寫入的數(shù)據(jù)U0功能:vl將字符碼寫入DDRAM,以使液晶 顯示屏顯示出相對應(yīng)的字符;2將用戶自己設(shè)計的圖形存入CGRAMo.從CGRAM或DDRAM讀出數(shù)據(jù)的指令指令功能指令編碼/usRSR/WDB7DB6DBSDB4DB3DB21MHOBB從CGKAM或 DDRAMj賣出 數(shù)據(jù)11要讀出的數(shù)據(jù)D7D040工功能:讀取DDRAM或CGRAM中的內(nèi)容?;静僮鲿r序:讀狀態(tài)輸入:RS=L, RW=H,E=H 輸出:DBODB

20、7=狀態(tài)字寫指令輸入:RS=L, RW=L,E=下降沿脈沖,DBODB7=指令碼輸出:無讀數(shù)據(jù)輸入:RS=H, RW=H,E=H 輸出:DBODB7=數(shù)據(jù)寫數(shù)據(jù)輸入:RS=H, RW=L, E=下降沿脈沖,DB0DB7=數(shù)據(jù)輸出:無2. MAX232 芯片 用8051串行接口通信,如果兩臺8051單片機之 間的距離很近(不超過1.5m),可以采用直接將 兩臺8051單片機的串行接口直接相連,利用其 自身的TTL電平(0-5V)直接傳輸數(shù)據(jù)信息。如 果傳輸距離較遠(超過由于傳輸線的阻抗與分布電容,會產(chǎn)生電平損耗和波形畸變,以 至于檢測不出數(shù)據(jù)或數(shù)據(jù)出錯。此時可利用 RS232標(biāo)準(zhǔn)總線接口,將單片

21、機輸出的TTL電平轉(zhuǎn)換為RS232標(biāo)準(zhǔn)電平(邏輯1為-155V;邏輯0為+5卜15V)。用RS232可將傳輸距離提高到15m,如果想遠距離傳輸,可以采用RS422或 者 RS485o電平轉(zhuǎn)換芯片MAX232是美信公司(MAXIM)生 產(chǎn),專用于進行將TTL電平轉(zhuǎn)換為RS232電平的 芯片,MAX232內(nèi)部有泵電源,能將+5V電源電壓 在芯片內(nèi)提高到RS232電平所需的+10V或者-10V電平。r圖5、兩個MAX232的接法3.整體電路設(shè)計最終設(shè)計電路如下圖3所示,發(fā)送方的數(shù)據(jù)由串 行口 TXD段輸出,經(jīng)過電平轉(zhuǎn)換芯片MAX232將TTL電平轉(zhuǎn)換為RS232電平輸出,經(jīng)過傳輸 線將信號傳送到接收

22、端。接收方也使用MAX232 芯片進行電平轉(zhuǎn)換后,信號到達接收方串行口的 接收端。接受方接收后,通過1602LCD液晶顯 示接收的信息。三、軟件設(shè)計本單片機課程設(shè)計實現(xiàn)的功能:單片機間的串口 通信。首先,A主機與B主機進入模擬英文對話 (英文短語直接調(diào)用已編好的數(shù)組,無需輸入) 的交流短信模式.。A主機發(fā)送數(shù)據(jù)時,A主機顯 示器顯示要發(fā)送的數(shù)據(jù),發(fā)送鍵按下就開始向B 主機發(fā)送數(shù)據(jù),發(fā)送成功后,發(fā)送燈閃爍提示發(fā) 送成功。A主機接收數(shù)據(jù)時,將B主機發(fā)送來的 數(shù)據(jù)送到A主機顯示器顯示,接收完畢,接收燈 亮起提示接收成功。B主機的發(fā)送與接收英問短 語與A主機是一致的。當(dāng)A主機與B主機進行完 模擬英文對

23、話的交流短信模式結(jié)束之后,A主機 與B主機進入到可輸入數(shù)據(jù)的數(shù)字串口通信模 式,此模式增加了增加輸入功能,其他功能與模 擬英文對話的交流短信模式是一樣的。串行口 工作于方式1;用定時器1產(chǎn)生9600bit/s的波 特率,工作于方式2。2.程序流程圖(1)發(fā)送端程序流程圖開始22鍵盤輸入數(shù)據(jù) 模式?LCD顯示數(shù)字LCD顯示英文據(jù)?是LCD顯示數(shù)字LCD顯示英文(2)接收方程序流程圖同上四、聯(lián)合調(diào)試在protues上進行仿真實驗。首先使用KeilC將 編寫完成的程序編譯生成HEX文件,將HEX文件 燒錄到兩片單片機中,進行仿真實驗,結(jié)果如下 圖所示,可以看到,接收端已將接受到的數(shù)據(jù)完 整的顯示了出

24、來。1AlMllhH 一II II II0EIDO EElIHD 以 c 2皿Hi筵a8_E “A主機|b|b接收按班發(fā)送按健HellOrNite I。 neel aou圖7.仿真圖五、設(shè)計小結(jié)回顧起此課程設(shè)計,至今我仍感慨頗多,從理論 到實踐,在這段日子里,可以說得是苦多于甜,但是可以學(xué)到很多很多的東西,同 時不僅可以鞏固了以前所學(xué)過的知識,而且學(xué)到了很多在書本上所沒有學(xué)到過的知識。通過這次課程設(shè)計使我懂得了理論與實際相結(jié)合是很重要的,只有理論知識是遠遠不夠 的,只有把所學(xué)的理論知識與實踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會服 務(wù),從而提高自己的實際動手能力和獨立思考的能力。在設(shè)計的

25、過程中遇到問題,可以 說得是困難重重,但可喜的是最終都得到了解決。六、 附錄1.A機發(fā)送程序/*串口通信模擬短信通信*/ /*發(fā)送方寫完信息,點擊按下發(fā)送按鍵,發(fā)送數(shù) 據(jù),發(fā)送成功后,發(fā)送燈閃爍三次*/*接收方接收開始信息時,接收燈亮起,按下接 收按鍵,接收燈熄滅,隨后開始填下將要發(fā)送的 數(shù)據(jù)*/#includehsbit LED1=P2AO;定義接收燈sbit LED2=P2A1;定義發(fā)送燈sbit lcden=P2A7; 定義 LCD 使能端sbit lcdrs=P2A6; 定義 LCD 的 RS 端#define uchar unsigned char#define uint unsig

26、ned intuchar code table=n Hello/1;uchar code tablel=HNice to meet you.n;uchar code table2=nMe too J;uchar code table3=HYour name?.n;uchar code table4=nMy name is J;uchar code table5=H Jox.n;uchar code digit=n0123456789-+=-*/n;/定義字符數(shù)組顯示數(shù)字及正負號uint butter16=0;定義待發(fā)送數(shù)據(jù)數(shù)組 ucharagr,agr0,agrl9agr2,num,flag,

27、flagl,flag2,flag3,al, a2,temp;定義全局標(biāo)志位及全局變量char numl,num2;定義全局變量void delay(uint z)延時子程序uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);)void LED2_turn()發(fā)送燈閃爍子程序(LED2=0;delay (500);LED2=1;delay(500);LED2=0;delay (500);LED2=1;delay (500);void write_com(uchar com) 液晶寫指令子程I ,工 rr(lcdrs=0;Pl=com;delay ;lcden=l;de

28、lay (5);lcden=O;)void write_data(uchar date) 液晶寫數(shù)據(jù)子程序(lcdrs=l;Pl=date;delay (5);lcden=l;delay (5);lcden=0;)void lcdmit()液晶初始化函數(shù)(lcden=0;write_com(0 x38);write_com(0 x0f);write_com(0 x06);write_com(OxO 1);write_com(0 x80);設(shè)液晶初始地址為第一行第一列)void send(unsigned char dat)數(shù)據(jù)發(fā)送程序SBUF=dat;送的數(shù)據(jù)存入發(fā)送緩沖器中 while(TI

29、=0);將要發(fā)標(biāo)志位沒有置1(正在發(fā)送數(shù)據(jù)),TI=0;若發(fā)送中斷就等待若發(fā)送完成,TI自動置1,這里把它清零串口通信初始化TMOD=0 x20;作方式2設(shè)置定時器1為工THl=0 xfd;設(shè)波特率置TLl=Oxfd;TR1=1;PCON=OXOO;SMO=O;SM1=1;REN=1;ES=1;)void extern_interrupt()外部中斷初始化(EXO=1;開外部中斷0EX1=1;開外部中斷1ITO=1;下降沿觸發(fā)中斷)uint keeyboard() 鍵盤掃描子程序(P0=0 xfe;temp=P0;temp=temp &0 xf0;numl=20;while(temp !=Ox

30、fO)(temp=PO;switch(temp)(case Oxee:numl=7;break;case Oxde:numl=8;break;case Oxbe:numl=9;break;case 0 x7e:numl=13;break;)while(temp!=OxfO) 松手檢測temp=P0;temp=temp &Oxf0;) )PO=Oxfd;temp=PO;temp=temp &Oxf0; while(temp!=OxfO) (temp=PO;switch(temp)(case Oxed:numl=4;break;case Oxdd:numl=5;break;case Oxbd:nu

31、ml=6;break;case 0 x7d:3numl=14;break;)while(temp!=OxfO) 松手檢測(temp=PO;temp=temp &OxfO;)PO=Oxfb;temp=PO;temp=temp &Oxf0;while(temp!=OxfO)(temp=PO;switch(temp)(case Oxeb:numl=l;break;case Oxdb:numl=2;break;case Oxbb:numl=3;break;case 0 x7b:numl=10;break;)while(temp!=OxfO) 松手檢測(temp=P0;temp=temp &OxfO;)

32、P0=0 xf7;temp=P0;temp=temp &Oxf0;while(temp!=OxfO)temp=PO;switch(temp)case 0 xe7:numl=15; break;case 0 xd7: numl=O; break;case 0 xb7:numl=12; break;case 0 x77: numl=ll; break;)while(temp!=0 xf0)/松手檢測33temp=PO;temp=temp &OxfO;)return(numl);) void main(void)(uchar i9numn;uint m;uint pbutter; 定義數(shù)組指針pbu

33、tter=&butterO; 將數(shù)組指針初始化為butter 口起止地址flag=l;flag3=0;agr=0;agr0=0;agrl=0; agr2=0;al=l;LED1=1;/關(guān)閉接收燈LED2=1;/關(guān)閉發(fā)送燈i=0;EA=1;開總中斷extern_internipt(); 外部中斷初始化 lcdinit(); /LCD 初始化 trinitO;串口初始化while(l)(while(flag=l) 等待標(biāo)志位置1(flag=O;ES=0;for(i=0;i7;i+)(write_data(tablei); 液晶寫數(shù)據(jù) delay(lOO);)write_com(0 x80+0 x4

34、0); 液晶地址改 變到第2行第1列for(i=0;i18;i+)(write_data(tablel i); 液晶寫數(shù)據(jù) delay(lOO);)while(agr=O);等待發(fā)送信號for(i=0;i7;i+)(send(tablei); 發(fā)送數(shù)據(jù) delay(lOO);)for(i=0;i18;i+)(send(tableli); 發(fā)送數(shù)據(jù) delay(lOO);)LED2_turn();delay(500);write_com(OxO 1); 清屏ES=1;開外部中斷,等待接收數(shù)據(jù) write_com(0 x01); 再次清屏,防止光標(biāo) 不在第一行第一位,否則可能出現(xiàn)在第二位一位 )w

35、hile(flagl=l)(while(agrO=O);flagl=O;ES=O;delay(lOOO);write_com(OxO 1);for(i=0;i8;i+)(write_data(table2 i); delay(lOO);)write_com(0 x80+0 x40);for(i=0;i12;i+)(write_data(table3i);delay(lOO);)agr=O;while(agr=O);for(i=0;i8;i+)(send(table2i); delay(lOO);)for(i=0;i12;i+)(send(table3i);delay(lOO);)LED2_tu

36、rn();delay(500);write_com(OxO 1);ES=1;write_com(0 x01);再次清屏,防止光標(biāo)不 在第一行第一位,否則可能出現(xiàn)在第二位)while(flag2=l)(agrO=O;while(agrO=O);flag2=0;ES=O;delay(lOOO);write_com(OxO 1);for(i=0;i12;i+)(write_data(table4i);delay(lOO);)write_com(0 x80+0 x40);for(i=0;i7;i+)443write_data(table5 i); delay(XOO);)agr=O;while(agr

37、=O);for(i=0;i12;i+)(send(table4i);delay(lOO);)for(i=0;i7;i+)(send(table5i);delay(lOO);)LED2_turn();delay (500);write_com(0 x01);ES=1;write_com(0 x01);再次清屏,防止光標(biāo)不 在第一行第一位,否則可能出現(xiàn)在第二位flag3=l;delay(lO);write_com(0 x01);)while(flag3=l) 進入自由發(fā)送與接收數(shù) 據(jù)的模式LED1=1;m=keeyboard(); 掃描鍵盤數(shù)據(jù)if(numl!=20) 判斷鍵盤是否有數(shù)據(jù)輸入,有的

38、話執(zhí)行IF語氣LED1=1;*pbutter=m; 將鍵盤數(shù)據(jù)存在 butter數(shù)組中pbutter+;delay (5);write_data(digitbutternumn);numn+;if(agrl=l) 判斷是否發(fā)送數(shù)據(jù)(LED1=1;agrl=O;for(i=0;inumn;i+)(send(butteri);delay(lOO);)numn=0;pbutter=&butterO;write_com(OxO 1);delay(lO);LED2_turn();ES=1;)if(agr2=l)(agr2=0;write_com(OxO 1);delay(lO);write_com(0

39、x80);)void exterO() interrupt 0外部中斷 0 子程序 (LED1=1;agrO=l;agr2=l;void exterl() interrupt 2 外部中斷 1 子程序agr=l;agrl=l;ES=0;)void ser() interrupt 4串口中斷子程序RI=0;LED1=O;LED2=1;num=SBUF;if(num=y) write_data(num);write_com(0 x80+0 x3e);)if(flag3=l)(write_data(digit num);elsewrite_data(num);)if(mim=)(if(al=l)(a

40、l-;flagl=l;)else(if(a2=0)(a2;flag2=l;)2. B機接收程序/*串口通信模擬短信通信*/*發(fā)送方寫完信息,點擊按下發(fā)送按鍵,發(fā)送數(shù)據(jù),發(fā)送成功后,發(fā)送燈閃爍三次*/*接收方接收開始信息時,接收燈亮起,按下接 收按鍵,接收燈熄滅,隨后開始填下將要發(fā)送的 數(shù)據(jù)*/#includesbit LED1=P2”;sbit LED2=P2l;#define uchar unsigned char#define uint unsigned int sbit lcden=P27; sbit lcdrs=P2 6; ucharuchar uchar uchar uchar uc

41、har uintcode code code code codetable =Hi, tablel=I am happy.;table2 =Danny,;table3口=And you?.; digit =”0123456789-+=-*/”;butter16=0;agr, agrO, agri, agr2, num, flag, flagl, flag2, a 1, a2, temp;char numl, num2, numm;void delay(uint z)(uint x, y;for(x=z;x0;x-)for (y=110;y0;y一);)void LED2_turn ()(LED

42、2=0;delay(500);LED2=1;delay(500);LED2=0;delay(500);LED2=1;delay(500);)void write_com(uchar com)lcdrs=O;Pl=com;delay(5);lcden=l;delay(5);Icden=O;)void write_data(uchar date)(lcdrs=l;Pl=date;delay (5);lcden=l;delay(5);lcden=0;void Icdinit ()lcden=0;write_com(0 x38);write_com(OxOf); writ e_com(0 x06);

43、write_com(0 x01); write_com(0 x80);void send (unsigned char dat)數(shù)據(jù)發(fā)送程序 (SBUF=dat;將要發(fā)送的數(shù)據(jù)存入發(fā)送緩沖器中while (TI0);若發(fā)送中斷標(biāo)志位沒有置1 (正在發(fā)送數(shù)據(jù)),就等待TI=0;若發(fā)送完成,TI自動置L這里把它清零 ) void trinit ()TM0D=0 x20;設(shè)置定時器1為工作方式2THl=Oxfd;TLl=Oxfd;TR1=1;PCON=OXOO;SMO=O;SM1=1;REN=1;ES=1; void extern_interrupt()(EXO=1; 開外部中斷0EX1=1; 開外

44、部中斷1ITO=1; 下降沿觸發(fā)中斷uint keeyboard ()鍵盤掃描子程序P0=0 xfe;temp=P0;43t emp=t emp&Oxf0;numl=20;while(temp!=OxfO)(temp=PO;switch(temp)(case Oxee:numl=7;break;case Oxde:numl=8;break;case Oxbe:numl=9;break;case 0 x7e:numl=13;break;)while (temp! =OxfO) 松手檢測temp=PO;temp=temp&OxfO;PO=Oxfd;temp=PO;t emp=t emp&Oxf0;

45、 while(temp!=OxfO) (temp=PO;switch(temp)(case Oxed:numl=4;break;case Oxdd:numl=5;break;case Oxbd:ntiml=6;break;case 0 x7d:numl=14;break;)while (temp! =Oxf0)松手檢測(temp=P0;temp=temp&0 xf0;)P0=0 xfb;temp=P0;t emp=t emp&Oxf0;while(temp!=OxfO)(temp=PO;switch(temp)case Oxeb: 53nurnl=l;break;case Oxdb:numl=

46、2;break;case Oxbb:numl=3;break;case 0 x7b:numl=10;break;)whi le (temp! =0 xf 0)松手檢測 (temp=PO;temp=temp&Oxf0;P0=0 xf7;temp=P0;t emp=t emp&Oxf0; while(temp!=OxfO) (temp=PO;switch(temp) (case 0 xe7: numl=15; break;case 0 xd7: numl=O; break;case 0 xb7:numl=12; break;case 0 x77: numl=ll; break;while (temp! =OxfO)松手檢測 (temp=PO;temp=temp&OxfO;)return(numl);)void main(void)(uchar i, numn;uint m;uint *pbutter;pbutter=&butter0;EA=1; 開總

溫馨提示

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

評論

0/150

提交評論