單片機(jī) 串口計(jì)算器 實(shí)驗(yàn)報(bào)告_第1頁
單片機(jī) 串口計(jì)算器 實(shí)驗(yàn)報(bào)告_第2頁
單片機(jī) 串口計(jì)算器 實(shí)驗(yàn)報(bào)告_第3頁
單片機(jī) 串口計(jì)算器 實(shí)驗(yàn)報(bào)告_第4頁
單片機(jī) 串口計(jì)算器 實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、二0一三年 單片機(jī)課程設(shè)計(jì)報(bào)告姓 名 王志超 學(xué) 號 1162910228 指導(dǎo)老師 陸曉春 完成時(shí)間 2013.12.27 河 海 大 學(xué)2013年12月 2013年電科專業(yè)單片機(jī)課程設(shè)計(jì)報(bào)告 Dec.20131、 作品簡介本作品的名稱是串口計(jì)算器,其功能是計(jì)算機(jī)將數(shù)據(jù)或者字符串發(fā)送給單片機(jī),單片機(jī)根據(jù)要求可以把用戶的相應(yīng)指令進(jìn)行整合運(yùn)算,并把這個(gè)數(shù)據(jù)的結(jié)果顯示到串口助手和數(shù)碼管上,完成計(jì)算的功能。其中還涉及到了浮點(diǎn)數(shù)的運(yùn)算,我們將浮點(diǎn)數(shù)精確到了一位,在這個(gè)計(jì)算其中還可以對負(fù)數(shù)進(jìn)行運(yùn)算,并將負(fù)數(shù)顯示到數(shù)碼管和串口助手。1、串行通信功能:實(shí)驗(yàn)板和PC電腦通過USB線相連,使MCU和PC軟件“串

2、口助手”能夠進(jìn)行串行通信。 (1)當(dāng)實(shí)驗(yàn)板上電時(shí)默認(rèn)波特率為9600bps,并發(fā)送歡迎詞和提示詞,例如“Welcome to Calculator V1.0”,You can press key1 and key2to change baud rate. (2)當(dāng)實(shí)驗(yàn)板上按鍵1按下時(shí)波特率變更為4800bps,按鍵2按下時(shí)波特率變更為9600bps,并用兩個(gè)LED燈指示相應(yīng)的波特率。2、計(jì)算器功能通過串口助手發(fā)送框發(fā)送需要計(jì)算的公式,例如20*4=,MCU收到后解析公式并計(jì)算結(jié)果,將結(jié)果返回給串口,例如“The result is 80”,同時(shí)將計(jì)算結(jié)果顯示在數(shù)碼管上,具體細(xì)節(jié)如下:(1)可以

3、進(jìn)行加(+)、減(-)、乘(*)、除()、取余(%)運(yùn)算;(2)整形、浮點(diǎn)型運(yùn)算;(3)當(dāng)計(jì)算結(jié)果為整形數(shù)時(shí),有效的運(yùn)算結(jié)果范圍是-9999999,超過此結(jié)果,返回相應(yīng)的提示符,例如“The result is out of range.”,數(shù)碼管上提示“Err”;(4)當(dāng)計(jì)算結(jié)果為浮點(diǎn)數(shù)時(shí),有效的運(yùn)算結(jié)果范圍是-99.9999.9,數(shù)碼管上顯示時(shí)保留1位小數(shù)點(diǎn),超過此結(jié)果,返回相應(yīng)的提示符,例如“The result is out of range.”,數(shù)碼管上提示“Err”。期間,本人編寫了串口助手程序,方便本人在調(diào)試過程中發(fā)現(xiàn)錯(cuò)誤,改正錯(cuò)誤。這是一個(gè)副產(chǎn)品。2、作品整體方案 本作品主要是

4、,實(shí)現(xiàn)串口計(jì)算功能。整體思路如下所示:串口助手字符顯示Stc89C52單片機(jī)數(shù)碼管波特率顯示按鍵波特率選擇數(shù)碼管結(jié)果顯示3、 程序設(shè)計(jì)思路對于這個(gè)作品,我們總共分了幾個(gè)模塊:主函數(shù)、計(jì)算函數(shù)、串口函數(shù)、數(shù)碼管函數(shù)、按鍵函數(shù)四部分組成。下面就是對具體函數(shù)思路的解析:字符串的讀取和識別算式的分解字符串的輸入運(yùn)算符的提取判定算式結(jié)束數(shù)的提取串口助手顯示結(jié)果的輸出數(shù)碼管顯示(1)對于主函數(shù),我最初的思路是在主函數(shù)里調(diào)用各個(gè)函數(shù),加上函數(shù)聲明即可。后來在程序出錯(cuò)的情況下,我無法對程序做出高效準(zhǔn)確地修改,故我采用了頭文件的方法,這也是老師上課提到過的。為此我還特意到網(wǎng)上學(xué)習(xí)了頭文件的撰寫。主函數(shù)就是定義了

5、各個(gè)變量,對整體做了一個(gè)大概的構(gòu)思,編寫了主要思路和各個(gè)中斷函數(shù)程序如下所示:主函數(shù):uchar block12; 暫存數(shù)組uchar i=0,a,b=0;uchar flag=0;uchar code prompt1 = welcome to use the uart calculator based on the 51n;uchar code prompt2 = Now you are entering a new world. tn;uchar code prompt3 = Please choose your own bps, k1:9600bps(默認(rèn)), k2:4800bps. t

6、n;uchar code prompt8 = Err;float result; extern uchar sym; 這是一個(gè)外部變量void main()Serialport();sendstring(prompt1);sendstring(prompt2);sendstring(prompt3);keyfirst();while(1) if(flag=1) flag=0;result=trans(block); 轉(zhuǎn)換為字符并發(fā)送到串口助手顯示b=0;a=0;sym=0; 符號位for(i=0;i12;i+) 數(shù)組清零,以防干擾下次接收blocki=0; keycheck(); 鍵盤檢測 s

7、howdigitron(); 在數(shù)碼管上顯示 對于串口和按鍵的問題,我也采用了中斷處理的方法,在中斷中,我對按鍵做了處理,即選擇對應(yīng)的波特率,這里這樣做不會對主程序的結(jié)構(gòu)造成影響,串口也是采用中斷傳輸?shù)模@樣就可以使數(shù)據(jù)可以在需要的時(shí)候傳輸,程序如下:/*串行口中斷函數(shù)*/void Serial() interrupt 4 if(RI)RI=0;a=SBUF;blockb+=SBUF;if(a=61) /檢測到等號flag=1; ES=0;SBUF=a;while(!TI);TI=0;ES=1; 對于按鍵我們使用的是外部中斷1,為的是出錯(cuò)是可以有高一點(diǎn)的中斷將其打斷,程序如下:void Key

8、() interrupt 2char aa;key_flag=1;p36=1;if(p33=1)key_mem=2;elsekey_mem=1;aa=p33;while(!aa)/松手檢測aa=p33;delay(); /目的去抖動(dòng)p36=0; /接口置零才可以,勿忘(2)對于計(jì)算函數(shù)的解決,我分別采用數(shù)組和指針的方法對數(shù)字進(jìn)行分離,由于算式是以字符串的形式輸入的,故我們對于數(shù)字只要識別0-9即可,當(dāng)我們識別了運(yùn)算符的時(shí)候前一位就是第一個(gè)數(shù)的字符串長度,運(yùn)算符后面的就是第二個(gè)字符串的開始,當(dāng)檢測到“=”的時(shí)候就是第二個(gè)字符串的長度,這樣就可以把兩個(gè)字符串給提取出來。當(dāng)我檢測到運(yùn)算符的時(shí)候,我會

9、進(jìn)行分類,例如我檢測到了“+”,則使用case(+)來進(jìn)行分類,滿足運(yùn)算需求。字符串的提取程序如下:for(m=0;(*p!=+)&(*p!=-)&(*p!=*)&(*p!=/)&(*p!=%);m+) /m記錄第一個(gè)運(yùn)算數(shù)的位數(shù)num11m=*p; /提取第一個(gè)操作數(shù)p+; sign=*p+; /將運(yùn)算符賦給變量sign n=z-m-2; /n記錄第二個(gè)操作數(shù)的位數(shù)for(i=0;i=num2)num3=num1-num2;elsenum3=num2-num1;sym=1;break;case *:num3=num1*num2;break;case /:if(num2=0) /除數(shù)是0的情況

10、SBUF=n;while(!TI);TI=0;sendstring(prompt6);false=1;/transdigitron(int)num3); /由于下一句返回,必須在此處改變數(shù)碼管的值return 0;elsenum3=num1/num2;break;case %:if(num2=0)/除數(shù)是0的情況SBUF=n;while(!TI);TI=0;sendstring(prompt6);false=1;/出錯(cuò)標(biāo)志transdigitron(int)num3); /由于下一句返回,必須在此處改變數(shù)碼管的值return 0;elsenum3=(int)num1%(int)num2;/只有

11、整形數(shù)才能進(jìn)行取余運(yùn)算break; default:break;數(shù)碼管的點(diǎn)亮,我把輸出的結(jié)果保存成數(shù)組,然后再通過數(shù)碼管輸出:數(shù)碼管的檢測:void transdigitron(uint number)int a=1;if(sym=0)&(number9999) /若大于9999b0=12;b1=12;b2=11;b3=0;/顯示“Err”l=3;return;/返回主函數(shù),不執(zhí)行后面的程序false=1;if(sym=1)&(number999)b0=12;b1=12;b2=11;b3=0;l=3;return;/返回主函數(shù),不執(zhí)行后面的程序 false=1;if(false=1) /fal

12、se=0; /清零出錯(cuò)標(biāo)志c0=12;c1=12;c2=11;c3=0;l=3;return;/返回主函數(shù),不執(zhí)行后面的程序l=0;/l是全局變量,每一次計(jì)算前將l清零,防止下次干擾!while(a!=0) /分解各位,存入數(shù)組b中a=number/10;cl+=number%10;number=number/10; if(l=1)&(f1|f1) cl+=0;if(sym)cl+=13; /將負(fù)號放入數(shù)組中對于數(shù)碼管的顯示:void showdigitron()char j;for(j=0;jl;j+) P1=block1cj;P0=block2j;if(j=1)&(false=0)if(f

13、1|f2) /浮點(diǎn)數(shù)P1&=0x7f;delaydigitron(); /數(shù)碼管的延時(shí)顯示 對于波特率的選擇我使用的是按鍵,采用選擇語句,可以使之有不同的選擇:void keycheck()if(key_flag=1)key_flag=0;switch(key_val)case 1:TH1=0xfa;TL1=0xfa;sym=0;transdigitron(4800);break; case 2:TH1=0xfd;TL1=0xfd;sym=0;transdigitron(9600);break; default:break;這就是我程序的大體思路,通過編寫頭文件,實(shí)現(xiàn)了各個(gè)函數(shù)間的相互調(diào)用,頭

14、文件的編寫框架:#ifndef _Key_press_H #define _Key_press_Hsbit p33=P33;sbit p35=P35;sbit p36=P36;extern char key_flag,key_val;void keyfirst();void keycheck();void delay();#endif使用的時(shí)候?qū)㈩^文件包含到要調(diào)用的函數(shù)即可。4、 遇到的問題及解決辦法在此次課程設(shè)計(jì)中,我遇到了問題,有問題是正常的,關(guān)鍵是看如何解決,故我將遇到的問題和解決方法列下:(1) 程序過長,造成修改程序不便。 解決:通過網(wǎng)上學(xué)習(xí)頭文件的寫法,利用頭文件來實(shí)現(xiàn)各個(gè)函數(shù)間的

15、相互調(diào)用,利用各個(gè)函數(shù)的聯(lián)系來實(shí)現(xiàn)功能,這樣子更加明了,結(jié)構(gòu)更加條理。(2) 數(shù)碼管顯示0的問題。開始的時(shí)候,我采用的是填充的方法來進(jìn)行數(shù)碼管顯示的,即負(fù)號放在最前,數(shù)字放在最后,中間使用0填充,這樣子數(shù)碼管上就有很多0,造成閱讀的障礙。解決:采用數(shù)組和指針的方法,使字符串可以按順序進(jìn)入數(shù)組中,對數(shù)組的循環(huán)掃描,從而可以是數(shù)碼管正常顯示。(3) 浮點(diǎn)數(shù)的問題。浮點(diǎn)數(shù)的問題開始的時(shí)候我們不知道如何讓小數(shù)點(diǎn)后的數(shù)顯示,這樣子就造成了困倦。解決:通過小數(shù)乘以“10”便可將小數(shù)變成整數(shù),然后對應(yīng)數(shù)碼管顯示即可。(4) 整數(shù)的顯示。 開始時(shí),認(rèn)為整數(shù)可以一下顯示的,后來發(fā)現(xiàn)不可以。解決:采用數(shù)值除以十然

16、后取余數(shù),循環(huán)執(zhí)行,便可實(shí)現(xiàn)。5、小結(jié) 在這次課程設(shè)計(jì)中,個(gè)人收獲頗多。首先,我是從頭把c語言看了一遍,是自己在c語言方面又學(xué)到了一些新的東西。其次,在做課程設(shè)計(jì)期間,我又把頭文件學(xué)習(xí)了一下,這樣我在編寫一些比較長的程序的時(shí)候就可以采用這種方法,是程序變得調(diào)理清晰,易于解讀,對于程序中出現(xiàn)的錯(cuò)誤就更可以修改了,方便快捷。第三,在這次課程設(shè)計(jì)中,我也找到了自己的薄弱項(xiàng),就是對程序的整體把握不夠,雖然可以條理清晰,但是卻無法對細(xì)節(jié)進(jìn)行好的優(yōu)化。通過這次課程設(shè)計(jì)設(shè)我也明白了優(yōu)化的重要性。第四,在課程設(shè)計(jì)中,我也體會到了幫助別人的快樂,自己是一個(gè)小組長,在幫助組員的過程中,我積極主動(dòng),在幫助他人的時(shí)候,也學(xué)習(xí)到了他人的對程序的一種能

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論