串口通信的計算器_第1頁
串口通信的計算器_第2頁
串口通信的計算器_第3頁
串口通信的計算器_第4頁
串口通信的計算器_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、信息工程課程設(shè)計報告書課 程 名 稱 單片微機原理與接口技術(shù) 課 程 設(shè) 計 題目 串口通信的計算器 學生姓名、學 號 學 生 專 業(yè) 班級 指 導 教 師 姓名 課程設(shè)計起止日期 2017年6月19日-6月30日 一、課程設(shè)計項目名稱串口通信的計算器二、項目設(shè)計目的及技術(shù)要求2.1 項目設(shè)計目的通過單片微型計算機與接口技術(shù)課程設(shè)計,使學生能夠掌握單片機的開發(fā)過程、設(shè)計方法和單片機應(yīng)用電路的特點,使學生能夠綜合應(yīng)用單片機原理及應(yīng)用、模擬電子技術(shù)基礎(chǔ)、數(shù)字電子技術(shù)基礎(chǔ)等課程的知識。要求學生經(jīng)過課程設(shè)計的教學環(huán)節(jié)進一步理解智能電子系統(tǒng)的結(jié)構(gòu)和組成原理,掌握智能電子系統(tǒng)的基本設(shè)計方法,完成系統(tǒng)電路和

2、應(yīng)用程序的實踐,從而使學生的電子線路設(shè)計能力、單片機機應(yīng)用能力有較大提高。1)學會單片機的應(yīng)用方法,開發(fā)環(huán)境;2)結(jié)合任務(wù)要求,完成系統(tǒng)設(shè)計和調(diào)試,功能擴展和創(chuàng)新;3)熟悉匯編或C51語言,用C51完成系統(tǒng)的軟件編程;2.2 項目的主要任務(wù)1)上位機串口助手發(fā)送字符串,單片機接受到后,進行字符的分解,計算出結(jié)果,顯示在數(shù)碼管上,并將結(jié)果發(fā)送到串口助手上顯示。2)計算的+,-,X,/都可以。在除法運算中,如果除數(shù)為0,則在數(shù)碼管顯示0H,表示不能運算。計算出來的結(jié)果不能超過999超過,則在數(shù)碼管上顯示0H。3)矩陣按鍵的0-4四個按鍵分別代表+,-,X,/運算。按下按鍵編號為運算的鍵,則表示確定

3、開始計算結(jié)果,并把結(jié)果顯示在數(shù)碼管上面,通過串口發(fā)送到上位機顯示。同樣的在第2步的要求也能實現(xiàn)。三、項目設(shè)計方案論證3.1實現(xiàn)串口通信的計算器的整體方案PC可通過串口助手軟件將數(shù)據(jù)發(fā)送至單片機,單片機接收數(shù)據(jù),通過按鍵立進行相應(yīng)的運算,將計算結(jié)果在數(shù)碼管上顯示,并且將計算結(jié)果發(fā)送回PC。單片機STC89C52上位機串口助手按鍵運算串口助手數(shù)碼管顯示結(jié)果圖3-1串口通信的計算器的整體思路3.2硬件原理圖串口通信計算器主要涉及到按鍵、數(shù)碼管、單片機的電路圖。 3.3程序設(shè)計思路主函數(shù),串口函數(shù)、拆分函數(shù)、按鍵函數(shù)、計算函數(shù)、數(shù)碼管函數(shù)等五部分組成。下面就是對具體函數(shù)思路的解析:串口助手字符串的輸入

4、字符串的讀取輸出結(jié)果字符串拆分成num1、num2數(shù)碼管顯示按鍵掃描按鍵驅(qū)動操作計算結(jié)果串口助手顯示圖3-3程序中函數(shù)的思路圖(1)串口函數(shù):PC通過串口向單片機發(fā)送的算式是以字符串的形式發(fā)送的,故單片機程序可使用數(shù)組存放接收到的字符串。由于每次發(fā)送的算式均以“#”結(jié)尾,所以在程序中可對每次接收到的字符進行檢測,若檢測到“#”則接收結(jié)束,程序開始執(zhí)行下一步操作。/* 串口數(shù)據(jù)寫入,即串口發(fā)送函數(shù),buf-待發(fā)送數(shù)據(jù)的指針,len-指定的發(fā)送長度 */void UartWrite(unsigned char *buf, unsigned char len) while (len-) /循環(huán)發(fā)送所

5、有字節(jié) flagTxd = 0; /清零發(fā)送標志 SBUF = *buf+; /發(fā)送一個字節(jié)數(shù)據(jù) while (!flagTxd); /等待該字節(jié)發(fā)送完成 /* 串口中斷服務(wù)函數(shù) */void InterruptUART() interrupt 4 if (RI) /接收到新字節(jié) RI = 0; /清零接收中斷標志位 if(SBUF!='#') if (cntRxd < sizeof(bufRxd) /接收緩沖區(qū)尚未用完時, /保存接收字節(jié),并遞增計數(shù)器 bufRxdcntRxd+ = SBUF;/if(bufRxd0='1')LED1=0;/if(buf

6、Rxd2='2')LED2=0; else cntRxd =0;restopflag=1; if (TI) /字節(jié)發(fā)送完畢 TI = 0; /清零發(fā)送中斷標志位 flagTxd = 1; /設(shè)置字節(jié)發(fā)送完成標志 2.拆分函數(shù):單片機將接收到的bufRxd數(shù)組用strtok()函數(shù)拆分成兩個字符串,再通過atoi()函數(shù)將字符串轉(zhuǎn)化為整型賦值給num1、num2。/分離所接收到字符串,賦值給num1、num2 void ApartUart(char*strin,int*num1,int*num2) char *ps3; char *t=NULL; int i=0; t=strto

7、k(strin,""); while(t!=NULL) psi+=t; t=strtok(NULL,""); *num1=atoi(ps0); *num2=atoi(ps1);3.按鍵函數(shù):矩陣按鍵的驅(qū)動、1ms掃描一次矩陣按鍵。循環(huán)檢測按鍵的動作。 for (i=0; i<4; i+) /循環(huán)檢測4*4的矩陣按鍵 for (j=0; j<4; j+) if (backupij != KeyStaij) /檢測按鍵動作 if (backupij != 0) /按鍵按下時執(zhí)行動作 / KeyAction(KeyCodeMapij); /調(diào)用按鍵

8、動作函數(shù) GetResult(); backupij = KeyStaij; /刷新前一次的備份值 4.計算函數(shù):按下按鍵編號為運算的鍵,計算的+,-,X,/都可以。在除法運算中,如果除數(shù)為0;在減法運算中,num1<num2 等情況無法顯示計算結(jié)果。將計算結(jié)果在數(shù)碼管上顯示,無法顯示計算的顯示“0H”;并將計算結(jié)果發(fā)送發(fā)到串口助手上顯示。void GetResult() if(KeySta00=0)result = num1 + num2;SBUF=result; else if(KeySta01=0) if(num1>num2)result = num1 - num2;SBUF

9、=result; elseLedBuff0 =0x76;LedBuff1 =0x3f;LedBuff2 =0x00; else if(KeySta02=0)result = num1 * num2;SBUF=result; else if(KeySta03=0) if( num2!=0)result = num1 / num2;SBUF=result; elseLedBuff0 =0x76;LedBuff1 =0x3f;LedBuff2 =0x00; else if(KeySta10=0)result = 0; else if(KeySta11=0)result = num1 * num1;

10、else if(KeySta12=0)result = num2 * num2;5.數(shù)碼管函數(shù):1ms中刷新一次數(shù)碼管,將計算結(jié)果處理結(jié)果按十進制從高到低依次提取并轉(zhuǎn)為數(shù)碼管顯示字符。當計算結(jié)果大于999時,無法顯示計算結(jié)果,數(shù)碼管顯示“0H”。if(flag1s = 1) flag1s = 0;if(result<999) LedBuff0 = LedCharresult%10; LedBuff1 = LedCharresult/10%10; LedBuff2 = LedCharresult/100%10; elseLedBuff0 =0x76;LedBuff1 =0x3f;LedBu

11、ff2 =0x00;擴展應(yīng)用: 增加清零,num1的平方運算、num2的平方運算的操作 else if(KeySta10=0)result = 0; else if(KeySta11=0)result = num1 * num1; else if(KeySta12=0)result = num2 * num2;3.4軟件程序#include <reg52.h>#include<stdio.h>#include<string.h>#include<stdlib.h>bit flagTxd = 0; /單字節(jié)發(fā)送完成標志,用來替代TXD中斷標志位un

12、signed char cntRxd = 0; /接收字節(jié)計數(shù)器unsigned char pdata bufRxd20; /接收字節(jié)緩沖區(qū)sbit KEY_IN_1 = P17;sbit KEY_IN_2 = P16;sbit KEY_IN_3 = P15;sbit KEY_IN_4 = P14;sbit KEY_OUT_1 = P13;sbit KEY_OUT_2 = P12;sbit KEY_OUT_3 = P11;sbit KEY_OUT_4 = P10;/sbit LED1=P20;/sbit LED2=P21;unsigned char pdata KeySta44 = /全部矩陣

13、按鍵的當前狀態(tài) 1, 1, 1, 1,1, 1, 1, 1,1, 1, 1, 1,1, 1, 1, 1;signed int num1 = 0;signed int num2 = 0;signed int result = 0;sbit ADDR0=P22;sbit ADDR1=P23;sbit ADDR2=P24;unsigned char LedChar=0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f;unsigned char LedBuff=0x00, 0x00, 0x00, 0x00, 0x00, 0x00;uns

14、igned char flag1s = 0;unsigned long sec = 0;unsigned char restopflag = 0;void ConfigTimer0(); void ConfigUART(unsigned int baud);void UartWrite();void ApartUart(char*strin,int*num1,int*num2);void KeyDriver();void KeyScan();void GetResult();void main()TMOD = 0x01;TH0 = 0xFC;TL0 = 0x67;TR0 = 1;EA = 1;

15、ET0 = 1;ConfigUART(2400); while (1) if(restopflag=1) ApartUart(bufRxd,&num1,&num2);/*if(num1=1)&(num2=2) result=num1+num2; LED1=0; LED2=0; */KeyDriver(); /調(diào)用按鍵驅(qū)動 /*GetResult(); if(result>999)LcdShowStr(0,0,result); elseLcdShowStr(0,1,"0H")*/if(flag1s = 1) flag1s = 0;if(resul

16、t<999) LedBuff0 = LedCharresult%10; LedBuff1 = LedCharresult/10%10; LedBuff2 = LedCharresult/100%10; elseLedBuff0 =0x76;LedBuff1 =0x3f;LedBuff2 =0x00; /分離所接收到字符串,賦值給num1、num2 void ApartUart(char*strin,int*num1,int*num2) char *ps3; char *t=NULL; int i=0; t=strtok(strin,""); while(t!=NULL

17、) psi+=t; t=strtok(NULL,""); *num1=atoi(ps0); *num2=atoi(ps1);/* 串口配置函數(shù),baud-通信波特率 */void ConfigUART(unsigned int baud) SCON = 0x50; /配置串口為模式1 TMOD &= 0x0F; /清零T1的控制位 TMOD |= 0x20; /配置T1為模式2 TH1 = 256 - (12000000/12/32)/baud; /計算T1重載值 TL1 = TH1; /初值等于重載值 ET1 = 0; /禁止T1中斷 ES = 1; /使能串口中

18、斷 TR1 = 1; /啟動T1/* 串口數(shù)據(jù)寫入,即串口發(fā)送函數(shù),buf-待發(fā)送數(shù)據(jù)的指針,len-指定的發(fā)送長度 */void UartWrite(unsigned char *buf, unsigned char len) while (len-) /循環(huán)發(fā)送所有字節(jié) flagTxd = 0; /清零發(fā)送標志 SBUF = *buf+; /發(fā)送一個字節(jié)數(shù)據(jù) while (!flagTxd); /等待該字節(jié)發(fā)送完成 /* 串口中斷服務(wù)函數(shù) */void InterruptUART() interrupt 4 if (RI) /接收到新字節(jié) RI = 0; /清零接收中斷標志位 if(SBU

19、F!='#') if (cntRxd < sizeof(bufRxd) /接收緩沖區(qū)尚未用完時, /保存接收字節(jié),并遞增計數(shù)器 bufRxdcntRxd+ = SBUF;/if(bufRxd0='1')LED1=0;/if(bufRxd2='2')LED2=0; else cntRxd =0;restopflag=1; if (TI) /字節(jié)發(fā)送完畢 TI = 0; /清零發(fā)送中斷標志位 flagTxd = 1; /設(shè)置字節(jié)發(fā)送完成標志 /* 按鍵驅(qū)動函數(shù),檢測按鍵動作,調(diào)度相應(yīng)動作函數(shù),需在主循環(huán)中調(diào)用 */void KeyDriver(

20、) unsigned char i, j; static unsigned char pdata backup44 = /按鍵值備份,保存前一次的值 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1; for (i=0; i<4; i+) /循環(huán)檢測4*4的矩陣按鍵 for (j=0; j<4; j+) if (backupij != KeyStaij) /檢測按鍵動作 if (backupij != 0) /按鍵按下時執(zhí)行動作 / KeyAction(KeyCodeMapij); /調(diào)用按鍵動作函數(shù) GetResult(); backup

21、ij = KeyStaij; /刷新前一次的備份值 /* 按鍵掃描函數(shù),需在定時中斷中調(diào)用,推薦調(diào)用間隔1ms */void KeyScan() unsigned char i; static unsigned char keyout = 0; /矩陣按鍵掃描輸出索引 static unsigned char keybuf44 = /矩陣按鍵掃描緩沖區(qū) 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF; /將一行的4個按鍵值移入緩沖區(qū) keybufkeyo

22、ut0 = (keybufkeyout0 << 1) | KEY_IN_1; keybufkeyout1 = (keybufkeyout1 << 1) | KEY_IN_2; keybufkeyout2 = (keybufkeyout2 << 1) | KEY_IN_3; keybufkeyout3 = (keybufkeyout3 << 1) | KEY_IN_4; /消抖后更新按鍵狀態(tài) for (i=0; i<4; i+) /每行4個按鍵,所以循環(huán)4次 if (keybufkeyouti & 0x0F) = 0x00) /連續(xù)4

23、次掃描值為0,即4*4ms內(nèi)都是按下狀態(tài)時,可認為按鍵已穩(wěn)定的按下 KeyStakeyouti = 0; else if (keybufkeyouti & 0x0F) = 0x0F) /連續(xù)4次掃描值為1,即4*4ms內(nèi)都是彈起狀態(tài)時,可認為按鍵已穩(wěn)定的彈起 KeyStakeyouti = 1; /執(zhí)行下一次的掃描輸出 keyout+; /輸出索引遞增 keyout &= 0x03; /索引值加到4即歸零 switch (keyout) /根據(jù)索引,釋放當前輸出引腳,拉低下次的輸出引腳 case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break; c

24、ase 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break; case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break; case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break; default: break; void GetResult() if(KeySta00=0)result = num1 + num2;SBUF=result; else if(KeySta01=0) if(num1>num2)result = num1 - num2;SBUF=result; elseLedBuff0 =0

25、x76;LedBuff1 =0x3f;LedBuff2 =0x00; else if(KeySta02=0)result = num1 * num2;SBUF=result; else if(KeySta03=0) if( num2!=0)result = num1 / num2;SBUF=result; elseLedBuff0 =0x76;LedBuff1 =0x3f;LedBuff2 =0x00; else if(KeySta10=0)result = 0; else if(KeySta11=0)result = num1 * num1; else if(KeySta12=0)resul

26、t = num2 * num2;void InterruptTime0() interrupt 1 static unsigned char i = 0; static unsigned int cnt = 0; TH0 = 0xFC; TL0 = 0x67; KeyScan(); /按鍵掃描 cnt+; if(cnt >= 1000) cnt = 0;flag1s = 1; P0 = 0x00; switch(i) case 0: ADDR2=0; ADDR1=0; ADDR0=0; i+; P0=LedBuff0;break; case 1: ADDR2=0; ADDR1=0; AD

27、DR0=1; i+; P0=LedBuff1;break; case 2: ADDR2=0; ADDR1=1; ADDR0=0; i=0; P0=LedBuff2;break; default:break; 四、項目設(shè)計結(jié)果分析4.1實驗結(jié)果(1)通過串口發(fā)送字符串4;2;#,按下第一行第一列的按鈕,進行加法操作,數(shù)碼管上顯示“6”,串口助手上顯示“6”;按下第一行第二列按鈕,進行清零操作,數(shù)碼管上顯示“00”;按下第二行第二列按鈕,進行num1的平方操作,數(shù)碼管上顯示“16”。實驗結(jié)果及現(xiàn)象如圖所示: (2)通過串口發(fā)送字符串4;7;#,按下第一行第二列的按鈕,進行減法操作,數(shù)碼管上顯示“0

28、H”。實驗結(jié)果及現(xiàn)象如圖所示: 4.2遇到的問題及解決方法(1)串口發(fā)送數(shù)據(jù)、單片機接收數(shù)據(jù)時,拆分數(shù)組的問題。 解決:通過網(wǎng)上查找學習拆分函數(shù)strtok()、頭文件的寫法,通過調(diào)試找到數(shù)據(jù)處理出現(xiàn)問題的地方,例如串口發(fā)送字符串“1;2;#”,單片機接收字符串后點亮第一個小燈 ,判斷數(shù)據(jù)接收是否出現(xiàn)問題;拆分數(shù)組時,當num1=1、num2=2時進行加法操作時,點亮第二個小燈,判斷數(shù)組拆分是否正確。 (2) 數(shù)碼管顯示0H的問題。開始的時候,沒考慮到數(shù)組運算中遇到除數(shù)為0且大于999時的問題。 解決:查看書本經(jīng)過一番思索后,在按鍵操作和數(shù)碼管顯示時,根據(jù)計算情況將其異常處理,顯示在數(shù)碼管上。

29、 (3) 按鍵驅(qū)動、掃描的問題解決:查看書上的關(guān)于獨立按鍵、矩陣按鍵的代碼,與同學討論了下后解決了這個問題。先將行置零,處理列,再將列置零,處理行。五、參考文摘1惠仇:手把手教你學51單片機,電子工業(yè)出版社,2009年。內(nèi)容摘要:本書概括地論述了單片機的基礎(chǔ)知識,包括單片機的基本結(jié)構(gòu)和工作原理;并就實際單片機項目開發(fā)中會遇到的各種問題進行了闡述,列舉了單片機開發(fā)的流程和必須遵守的一些規(guī)范,說明了仿真器和編程器在開發(fā)中的作用以及基本的使用方法。具體內(nèi)容如下。首先論述了單片機的基礎(chǔ)知識,包括單片機的基本結(jié)構(gòu)和工作原理,闡述了目前單片機的發(fā)展情況,列舉了最新流行的單片機種類,總結(jié)了單片機的選擇方法。2 張毅剛等, MCS-51單片機應(yīng)用設(shè)計,哈工大出版社,2004年第2版內(nèi)容摘要:本書從應(yīng)用的角度,詳細地介紹了MCS-51單片機的硬件結(jié)構(gòu)、指令系統(tǒng)、各種硬件接口設(shè)計、各種常用的數(shù)據(jù)運算和處理程序及接口驅(qū)動程序的設(shè)計以及MCS-51單片機應(yīng)用系統(tǒng)的設(shè)計,并對MCS-51單片機應(yīng)用系統(tǒng)設(shè)計中的抗干擾技術(shù)以及各種新器件也作了詳細的介紹。本書突出了選取內(nèi)容的實用性、典型性。書中的應(yīng)用實例

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論