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

下載本文檔

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

文檔簡介

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

2、主機也可以通過矩 陣鍵盤輸入信息,然后通過發送按鍵發送。2.設計方案:首先把兩個ATS89C51各自連接成單片機最小 系統,在把他們的TXD、RXD 口分別與MAX232 相連,然后一個MAX232的T10UT和RUN ,分 別與另一個MAX232的R1IN和TIout相連,P0 口接矩陣鍵盤,P1 口接液晶顯示的數據端。總 的電路圖如圖:A主機ftZSIS 匚廠 EEnnE3.6/一:”.圖1、總電路圖二、設計基礎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個接口與外界進行數據輸入與數據輸出就 是并行通信,并行通信的特點是傳輸信號的速度 快,但所用的信號線較多,成本高,傳輸的

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

5、I SM2 REN TB8 RB8TIRISMO, SM1:串行接口工作方式選擇位,這兩位組合 成00, 01, 10, 11對應于工作方式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為要發送

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

7、T1設置在定時方式。波特率用來表示串 行通信數據傳輸快慢程度的物理量定義為每秒鐘傳送的數據位數。(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電壓,對比度可調內含復位電路 提供各種控制命令,如:清屏、字符閃爍、光標 閃爍、顯示移位等多種功能 有80字節顯示數據存儲器DDRAM內建有160個5X7點陣的字型的字符

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

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

10、二行40H42H43H岫H45H剛67H也就是說想要在LCD1602屏幕的第一行第一列顯示一個“A”字,就要向DDRAM的00H地址寫入“A”的代碼就行了。但具體的寫入是要按LCD模塊的指令格式來進行的,后面我會講到的。一 行有40個地址 在1602中我們就用前16個就 行了。第二行也一樣用前16個地址。對應如下: DDRAM地址與顯示位置的對應關系 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液晶模塊內部的字符發生存儲器(CGROM)已經存儲了 160個不同的點陣字符圖形,如下表所示,這些字符有:阿拉伯數字、英文字母的大 小寫、常用的符號、和日文假名等,每一個字 符都有一個固定的代碼,比如大寫的英文字母A”的代碼是01000001B (41H),顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們 就能看到字母“A”8RJ3WI中字符碼與宇字將宇楔關系對照表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吁仁區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產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”先轉為41H代碼了。字符代碼0 x00-0 x0F為用戶自定義的字符圖形RAM(對于5X8點陣的字符,可以存放8組), 就是 CGRAM 了。對DDRAM的內容和地址操作,HD44780的指 令集及其設置說明,共有11條指令:基本操作時序: 讀狀態 輸入:RS=L, RW=H,E=H輸出:DBOD

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

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

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

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

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

19、C)的內容。.數據寫入DDRAM或CGRAM指令指令功能指令編碼強行 時I司/SRSR/WDB7DB6D85DB4D630B2DB1DB0數據寫入到DDRAM或CGRAM10要寫入的數據U0功能:vl將字符碼寫入DDRAM,以使液晶 顯示屏顯示出相對應的字符;2將用戶自己設計的圖形存入CGRAMo.從CGRAM或DDRAM讀出數據的指令指令功能指令編碼/usRSR/WDB7DB6DBSDB4DB3DB21MHOBB從CGKAM或 DDRAMj賣出 數據11要讀出的數據D7D040工功能:讀取DDRAM或CGRAM中的內容。基本操作時序:讀狀態輸入:RS=L, RW=H,E=H 輸出:DBODB

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

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

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

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

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

25、過程中遇到問題,可以 說得是困難重重,但可喜的是最終都得到了解決。六、 附錄1.A機發送程序/*串口通信模擬短信通信*/ /*發送方寫完信息,點擊按下發送按鍵,發送數 據,發送成功后,發送燈閃爍三次*/*接收方接收開始信息時,接收燈亮起,按下接 收按鍵,接收燈熄滅,隨后開始填下將要發送的 數據*/#includehsbit LED1=P2AO;定義接收燈sbit LED2=P2A1;定義發送燈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;/定義字符數組顯示數字及正負號uint butter16=0;定義待發送數據數組 ucharagr,agr0,agrl9agr2,num,flag,

27、flagl,flag2,flag3,al, a2,temp;定義全局標志位及全局變量char numl,num2;定義全局變量void delay(uint z)延時子程序uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);)void LED2_turn()發送燈閃爍子程序(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) 液晶寫數據子程序(lcdrs=l;Pl=date;delay (5);lcden=l;delay (5);lcden=0;)void lcdmit()液晶初始化函數(lcden=0;write_com(0 x38);write_com(0 x0f);write_com(0 x06);write_com(OxO 1);write_com(0 x80);設液晶初始地址為第一行第一列)void send(unsigned char dat)數據發送程序SBUF=dat;送的數據存入發送緩沖器中 while(TI

29、=0);將要發標志位沒有置1(正在發送數據),TI=0;若發送中斷就等待若發送完成,TI自動置1,這里把它清零串口通信初始化TMOD=0 x20;作方式2設置定時器1為工THl=0 xfd;設波特率置TLl=Oxfd;TR1=1;PCON=OXOO;SMO=O;SM1=1;REN=1;ES=1;)void extern_interrupt()外部中斷初始化(EXO=1;開外部中斷0EX1=1;開外部中斷1ITO=1;下降沿觸發中斷)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; 定義數組指針pbu

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

34、0); 液晶地址改 變到第2行第1列for(i=0;i18;i+)(write_data(tablel i); 液晶寫數據 delay(lOO);)while(agr=O);等待發送信號for(i=0;i7;i+)(send(tablei); 發送數據 delay(lOO);)for(i=0;i18;i+)(send(tableli); 發送數據 delay(lOO);)LED2_turn();delay(500);write_com(OxO 1); 清屏ES=1;開外部中斷,等待接收數據 write_com(0 x01); 再次清屏,防止光標 不在第一行第一位,否則可能出現在第二位一位 )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);再次清屏,防止光標不 在第一行第一位,否則可能出現在第二位)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);再次清屏,防止光標不 在第一行第一位,否則可能出現在第二位flag3=l;delay(lO);write_com(0 x01);)while(flag3=l) 進入自由發送與接收數 據的模式LED1=1;m=keeyboard(); 掃描鍵盤數據if(numl!=20) 判斷鍵盤是否有數據輸入,有的

38、話執行IF語氣LED1=1;*pbutter=m; 將鍵盤數據存在 butter數組中pbutter+;delay (5);write_data(digitbutternumn);numn+;if(agrl=l) 判斷是否發送數據(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機接收程序/*串口通信模擬短信通信*/*發送方寫完信息,點擊按下發送按鍵,發送數據,發送成功后,發送燈閃爍三次*/*接收方接收開始信息時,接收燈亮起,按下接 收按鍵,接收燈熄滅,隨后開始填下將要發送的 數據*/#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)數據發送程序 (SBUF=dat;將要發送的數據存入發送緩沖器中while (TI0);若發送中斷標志位沒有置1 (正在發送數據),就等待TI=0;若發送完成,TI自動置L這里把它清零 ) void trinit ()TM0D=0 x20;設置定時器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; 下降沿觸發中斷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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論