2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  嵌入式控制系統(tǒng)課程設(shè)計(jì)</p><p><b>  ------計(jì)算器</b></p><p>  學(xué)院: 自動(dòng)化學(xué)院 </p><p>  班級: 自1103 </p><p>  2014年7月12日</p><p><b&g

2、t;  摘要</b></p><p>  本設(shè)計(jì)在Embedded Visual C++集成開發(fā)環(huán)境下編寫程序,通過鍵盤或觸摸</p><p>  屏的輸入,實(shí)現(xiàn)計(jì)算器的順序計(jì)算并且實(shí)現(xiàn)判斷優(yōu)先級計(jì)算,自動(dòng)判斷數(shù)據(jù)的正</p><p>  確性(不多于小數(shù)點(diǎn)、數(shù)字以0 開頭、左右括號前出現(xiàn)數(shù)字)及合理性(被除數(shù)</p><p> 

3、 為0、單個(gè)數(shù)據(jù)超過10 位),在4 位LED 上面輪流顯示8 位計(jì)算結(jié)果,控制LED</p><p>  燈和驅(qū)動(dòng)LED 數(shù)碼管的應(yīng)用程序,并在WinCE 平臺下運(yùn)行,實(shí)現(xiàn)在PXA270 實(shí)</p><p>  驗(yàn)箱的數(shù)碼管上和對話框的數(shù)字顯示控件上同步顯示手動(dòng)輸入的數(shù)字、數(shù)碼管按</p><p>  照預(yù)設(shè)頻率循環(huán)顯示數(shù)字等功能。</p><

4、p>  關(guān)鍵詞:WinCE 操作系統(tǒng)EVC 集成開發(fā)環(huán)境PXA270 實(shí)驗(yàn)箱LED GPIO</p><p><b>  對話編輯框</b></p><p><b>  Abstract</b></p><p>  This application is attempted implement a calculato

5、r which has the ability to orderly calculate and judge the priority of the calculation, as well as to test the validity and the rationality of the data. It is triggered by the input from the keyboard or the touch screen

6、and programmed in Embedded Visual C++ integrated development environment. Besides, with the Wince platform, it could use 4 LED to indicate the 8-bit outcome of the calculator circularly, control the 4 LED and drive the a

7、pplicatio</p><p>  program of the digital LED, so as to complete the mission which aims to show the number keyed by the operator both on the LED of the PXA270 experimental box and the edit box of the screen

8、simultaneously. The application also owns the function to change the color of the number showed in the edit box of the screen in a constant frequency.</p><p>  Key words: WinCE OS EVC IDE PXA270 experiment b

9、ox LED</p><p>  GPIO Dialogue edit box</p><p><b>  目錄</b></p><p><b>  1 設(shè)計(jì)目的1</b></p><p>  2 設(shè)計(jì)功能與設(shè)計(jì)特色1</p><p>  2.1 設(shè)計(jì)功能1</p

10、><p>  2.2 設(shè)計(jì)特色2</p><p>  3 功能模塊設(shè)計(jì)3</p><p>  3.1 計(jì)算器模塊3</p><p>  3.1.1 任務(wù)要求3</p><p>  3.1.2 設(shè)計(jì)思路3</p><p>  3.1.3 程序部分4</p><p>

11、  3.2 顯示模塊(LED 數(shù)碼管)11</p><p>  3.2.1 任務(wù)要求11</p><p>  3.2.2 設(shè)計(jì)思路12</p><p>  3.2.3 程序?qū)崿F(xiàn)12</p><p><b>  3.3 其他12</b></p><p>  4 使用手冊與測試結(jié)果性能分析

12、13</p><p>  4.1 使用手冊13</p><p>  4.2 測試結(jié)果性能分析16</p><p><b>  5 小結(jié)16</b></p><p>  6 小組中承擔(dān)的任務(wù)17</p><p><b>  1 設(shè)計(jì)目的</b></p>&

13、lt;p> ?。?)通過理論學(xué)習(xí)、查閱資料、軟件設(shè)計(jì)、系統(tǒng)調(diào)試等環(huán)節(jié),鞏固和提高</p><p>  所學(xué)的知識和應(yīng)用水平,進(jìn)一步學(xué)習(xí)和領(lǐng)悟嵌入式程序開發(fā)的方法和流程。全面</p><p>  綜合的應(yīng)用所學(xué)基礎(chǔ)知識,建立起一個(gè)完整的嵌入式系統(tǒng)開發(fā)過程的概念。</p><p>  (2)了解WinCE 操作系統(tǒng)的概念。學(xué)會(huì)在Embedded Visual C+

14、+集成開發(fā)</p><p>  環(huán)境中開發(fā)應(yīng)用程序。</p><p> ?。?)通過做實(shí)驗(yàn),測試應(yīng)用程序功能,直觀的了解PXA270 實(shí)驗(yàn)設(shè)備的組</p><p>  成部分,尤其是課程設(shè)計(jì)中經(jīng)常用的一些外部設(shè)備。</p><p>  (4)通過課程設(shè)計(jì),了解嵌入式編程的特點(diǎn),并且通過自己的實(shí)踐,解決</p><p>

15、  嵌入式編程的各種問題。</p><p> ?。?)通過完成這個(gè)課程設(shè)計(jì),要培養(yǎng)分析問題和解決問題的能力;實(shí)際動(dòng)</p><p>  手操作的能力;查閱中外文獻(xiàn)的能力;制定設(shè)計(jì)方案的能力;計(jì)算機(jī)應(yīng)用的能力;</p><p>  設(shè)計(jì)計(jì)算和繪圖的能力;語言文字表達(dá)的能力;團(tuán)隊(duì)合作的能力,并能從中得到</p><p><b>  一定

16、的收獲與啟發(fā)。</b></p><p>  2 設(shè)計(jì)功能與設(shè)計(jì)特色</p><p><b>  2.1 設(shè)計(jì)功能</b></p><p>  本次嵌入式控制系統(tǒng)課程設(shè)計(jì)試圖將老師提供的課程設(shè)計(jì)題目綜合在一起,</p><p>  以對話框?yàn)橹鹘缑妫肊VC 編程,盡可能的實(shí)現(xiàn)一個(gè)集多種功能于一體的綜<

17、/p><p>  合小設(shè)計(jì)。其功能包括:</p><p>  (1)創(chuàng)建了一個(gè)計(jì)算器,可以實(shí)現(xiàn)順序計(jì)算與判別優(yōu)先級計(jì)算;可以自動(dòng)</p><p>  判斷數(shù)據(jù)的正確性(如:參加計(jì)算的數(shù)不多于10 位,否則提示“數(shù)據(jù)溢出”);</p><p>  提示“算術(shù)邏輯錯(cuò)誤”,在一些常見的錯(cuò)誤方面,如:數(shù)字以0 開頭,被除數(shù)為</p><

18、;p>  0;有括號優(yōu)先級運(yùn)算。</p><p> ?。?)創(chuàng)建文本編輯框,用于顯示運(yùn)算式及輸出結(jié)果,并將文本框的背景色</p><p>  設(shè)置為黑色。設(shè)置“清零”按鈕控件,用來清除輸入框內(nèi)容,以便重新輸入新的</p><p>  內(nèi)容;設(shè)置“清除”按鈕控件,用來將前一步輸錯(cuò)的內(nèi)容刪除,可以接著輸入正</p><p><b>

19、;  確的內(nèi)容。</b></p><p> ?。?)創(chuàng)建了一個(gè)LED 數(shù)字顯示控件,該控件可以顯示輸入框內(nèi)輸入的內(nèi)容</p><p>  及計(jì)算器輸出結(jié)果,此外結(jié)合PXA270 八段數(shù)碼管,將計(jì)算內(nèi)容同時(shí)顯示在數(shù)碼</p><p>  管上。創(chuàng)建了一個(gè)循環(huán)模塊,其功能是將計(jì)數(shù)器的計(jì)算結(jié)果在PXA270 的4 個(gè)八</p><p>

20、  段數(shù)碼管上循環(huán)顯示。循環(huán)方式為右循環(huán),設(shè)置循環(huán)間隔時(shí)間為任意輸入值。</p><p><b>  2.2 設(shè)計(jì)特色</b></p><p>  本次設(shè)計(jì)不僅能夠完成課程設(shè)計(jì)題目的其中計(jì)算機(jī)的基本要求,并且我們小</p><p>  組精益求精,將3 項(xiàng)要求結(jié)合在一塊,并在原有功能的基礎(chǔ)上進(jìn)行了修改和完善,</p><p&

21、gt;  實(shí)現(xiàn)了更為理想的功能,實(shí)現(xiàn)了計(jì)算器的各種功能,我們主要的設(shè)計(jì)特色有:</p><p> ?。?)本設(shè)計(jì)功能豐富,分模塊進(jìn)行,分為計(jì)算器、顯示、顏色三個(gè)模塊,界面設(shè)計(jì)以Group Box 控件劃分,界面顯得清楚明了且整齊大方。</p><p> ?。?)在顯示模塊中,含有“清除”、“清零”按鈕,可以方便重新輸入新的</p><p>  內(nèi)容,而不必關(guān)閉對話框

22、再打開輸入,同時(shí)這也是考慮到PXA270 實(shí)驗(yàn)箱上鍵盤</p><p>  部分沒有清除鍵而增加的。</p><p> ?。?)在顏色模塊中,用戶通過改變是三個(gè)滑條的值,來改變計(jì)算機(jī)顯示文</p><p>  本框中數(shù)字的顏色。在改變滑動(dòng)條的同時(shí),可以在右邊的編輯框中顯示當(dāng)前紅、</p><p>  綠、藍(lán)三原色各自的數(shù)值,這樣可以十分準(zhǔn)確的

23、改變顏色為用戶需要的顏色。程</p><p>  序設(shè)計(jì)時(shí)分別編寫有改變字體顏色的函數(shù)和改變背景顏色的函數(shù)(已注釋),通</p><p>  過簡單修改即去除注釋,也可完成改變背景顏色的功能,或者同時(shí)使用兩種功能。</p><p>  (4)在數(shù)碼管顯示模塊,可以輪流顯示多于四位的的內(nèi)容和小數(shù)點(diǎn),且循</p><p>  環(huán)間隔的時(shí)間都不是固

24、定的,可以進(jìn)行修改,這樣更加有利于用戶在使用時(shí),當(dāng)</p><p>  不滿足其需求時(shí)可以方便修改。</p><p> ?。?)為了處理異常情況,比如說編輯框未輸入內(nèi)容或輸入不正確的內(nèi)容,</p><p>  將給出報(bào)錯(cuò)信息,提示輸入正確的內(nèi)容。</p><p><b>  3 功能模塊設(shè)計(jì)</b></p>

25、<p><b>  3.1 計(jì)算器模塊</b></p><p>  3.1.1 任務(wù)要求</p><p>  1)順序計(jì)算與判別優(yōu)先級計(jì)算:實(shí)現(xiàn)加減乘除及括號的計(jì)算。</p><p>  2)自動(dòng)判斷數(shù)據(jù)的正確性及運(yùn)算過程的正確性:除數(shù)為0,兩個(gè)數(shù)之間沒有運(yùn)</p><p>  算符連接,以及括號處理遇到的各

26、種問題。其中包括括號前沒有出現(xiàn)運(yùn)算符就出</p><p>  現(xiàn)了數(shù)字,以及括號后也出現(xiàn)了數(shù)字,而沒有進(jìn)行運(yùn)算符號的連接;出現(xiàn)了多個(gè)</p><p>  小數(shù)點(diǎn)的問題;數(shù)據(jù)溢出的問題。</p><p>  3)實(shí)現(xiàn)退格、清零功能。</p><p>  3.1.2 設(shè)計(jì)思路</p><p><b>  1)界面

27、設(shè)計(jì)</b></p><p>  計(jì)數(shù)器模塊的界面設(shè)計(jì)如圖3.1,所有控件放在一個(gè)組框Group Box 中。</p><p>  圖3.1 計(jì)算器界面</p><p>  多個(gè)Button 按鈕, 包含數(shù)字“ 0-9 ” 的ID 分別為</p><p>  IDC_Button_ZERO/ONE/TWO/ … … /NINE ,

28、 運(yùn) 算 符 “+-×÷ ” 的 ID 為</p><p>  IDC_Button_ADD/SUB/MUL/DIV/Equal ,清零、后退的ID 為IDC_Button_Caption 為“清除”的Button 控件ID 為IDC_Button_CleanIt/IDC_Button_Del 。</p><p><b>  2)程序設(shè)計(jì)思路</b>

29、;</p><p>  主要由以下部分組成:</p><p> ?。?)根據(jù)返回值,識別出控制鍵與一般字符鍵,作出不同的處理來實(shí)現(xiàn)對歷史</p><p><b>  命令的調(diào)用。</b></p><p> ?。?)對表達(dá)式的預(yù)處理:檢查括號的配對情況(正確配對,則前括號與后括號</p><p> 

30、 的數(shù)量相同)。負(fù)號的處理。</p><p>  3.1.3 程序部分</p><p><b>  它的實(shí)現(xiàn)代碼如下:</b></p><p>  void CProjectDlg::OnButtonC()</p><p><b>  {</b></p><p>  // T

31、ODO: Add your control notification handler code here</p><p>  CleanIt(); //清除文本框</p><p>  Str.Format(_T("%s"),str);</p><p>  GetDlgItem(IDC_EDIT_CAL)->SetWindowText(Str

32、);</p><p><b>  }</b></p><p>  void CProjectDlg::OnButtonDiv() //加、減、乘,0-9 的類似,省略</p><p><b>  {</b></p><p>  // TODO: Add your control notificati

33、on handler code here</p><p>  str[strlong] = '/'; //將輸入的字符添加到字符串中</p><p>  strlong++; //字符串長度+1</p><p>  str[strlong] = '\0'; //添加字符串結(jié)束標(biāo)志</p><p>  Str.F

34、ormat(_T("%s"),str); //打印到CString 對象Str 中</p><p>  GetDlgItem(IDC_EDIT_CAL)->SetWindowText(Str); //將Str 中字符串輸出到編輯框</p><p><b>  }</b></p><p>  void CProjectD

35、lg::Finish() //計(jì)算算式處理主函數(shù)</p><p><b>  {</b></p><p>  char num[1000]; //記錄獨(dú)立數(shù)字字符串</p><p>  double suanshi[100]; //記錄由字符串處理成數(shù)字形式的算式</p><p>  double number; //記

36、錄由數(shù)字字符換轉(zhuǎn)換成的數(shù)字</p><p>  int bit; //記錄十字字符串的位數(shù)</p><p><b>  int i;</b></p><p>  double total; //記錄最后計(jì)算結(jié)果</p><p><b>  bit = 0;</b></p><p&

37、gt;<b>  l=0;</b></p><p>  for (i = 0; str[i]!='\0';i++) //從同開始處理整個(gè)字符串成為數(shù)字串</p><p><b>  {</b></p><p>  if ((str[i]>='0' && str[i] &

38、lt;='9') || str[i] == '.')</p><p>  //如果為0~9 或小數(shù)點(diǎn)則加入要處理為數(shù)字的字符串中</p><p><b>  {</b></p><p>  num[bit]=str[i];</p><p><b>  bit++;</b&g

39、t;</p><p><b>  }</b></p><p>  else //如果為符號則特殊處理</p><p><b>  {</b></p><p>  if (bit>10) //如果單個(gè)數(shù)字串位數(shù)超過10 位,則報(bào)溢出錯(cuò)誤</p><p><b>

40、  {</b></p><p>  AfxMessageBox(_T("數(shù)據(jù)溢出"));</p><p><b>  return ;</b></p><p><b>  }</b></p><p>  num[bit] = '\0'; //在數(shù)字串后

41、添加結(jié)束標(biāo)志</p><p>  if (str[i]!='(' && (i>0 && str[i-1]!=')'))</p><p>  //如果當(dāng)前字符不為(,或者當(dāng)前字符前一字符不為),則可以處理當(dāng)前數(shù)字串</p><p>  {//理由是(前或者)后出現(xiàn)數(shù)字,則為算式邏輯錯(cuò)誤,不允許參與計(jì)

42、算</p><p>  number = solve(num); //處理當(dāng)前數(shù)字串成為數(shù)字</p><p>  if (number==-1)</p><p>  //若返回為-1 則是數(shù)字串出現(xiàn)錯(cuò)位,原因是小數(shù)點(diǎn)多于一個(gè),詳見solve()</p><p>  { //則提示邏輯錯(cuò)誤,結(jié)束計(jì)算</p><p>  

43、AfxMessageBox(_T("算式邏輯錯(cuò)誤"));</p><p><b>  return ;</b></p><p><b>  }</b></p><p>  suanshi[l]=number; //將處理得到的浮點(diǎn)型數(shù)加入數(shù)字算式傳中</p><p>  l++;

44、 //數(shù)字算式串程度+1</p><p><b>  }</b></p><p>  else if (str[i]=='(' && bit>0)</p><p>  //當(dāng)前符號為(,并且數(shù)字串位數(shù)大于0,即(前出現(xiàn)數(shù)字,則返回邏輯錯(cuò)誤,結(jié)束</p><p><b>  

45、{</b></p><p>  AfxMessageBox(_T("算式邏輯錯(cuò)誤"));</p><p><b>  return ;</b></p><p><b>  }</b></p><p>  else if (str[i]==')' &am

46、p;& str[i+1]!='\0' && str[i+1]>'0' && str[i+1]<'9')</p><p>  //若當(dāng)前符號為),并且字符串后一位沒有結(jié)束</p><p>  { //并且后一位為數(shù)字,則提示邏輯錯(cuò)誤,結(jié)束</p><p>  AfxMe

47、ssageBox(_T("算式邏輯錯(cuò)誤")); //理由詳見上</p><p><b>  return ;</b></p><p><b>  }</b></p><p>  switch (str[i])</p><p>  //如果沒有出現(xiàn)以上不合法操作,則將當(dāng)前符號,以特

48、殊數(shù)字的方式加入數(shù)字算式串</p><p><b>  {</b></p><p>  case '+':suanshi[l] = -1;break;</p><p>  case '-':suanshi[l] = -2;break;</p><p>  case '*':

49、suanshi[l] = -3;break;</p><p>  case '/':suanshi[l] = -4;break;</p><p>  case '(':suanshi[l] = -5;break;</p><p>  case ')':suanshi[l] = -6;break;</p>

50、<p>  default:break;</p><p><b>  }</b></p><p><b>  l++;</b></p><p><b>  bit = 0;</b></p><p><b>  }</b></p>&

51、lt;p><b>  }</b></p><p>  num[bit] = '\0';//給算式結(jié)束后最后的一個(gè)數(shù)字進(jìn)行處理</p><p>  if (i>0 && str[i-1]!=')') //處理方式同上</p><p><b>  {</b></

52、p><p>  number = solve(num);</p><p>  if (number==-1)</p><p><b>  {</b></p><p>  AfxMessageBox(_T("算式邏輯錯(cuò)誤"));</p><p><b>  return ;

53、</b></p><p><b>  }</b></p><p>  suanshi[l]=number;</p><p><b>  l++;</b></p><p><b>  }</b></p><p>  total = 0.0; /

54、/給計(jì)算結(jié)果清零</p><p>  total = tryit(suanshi); //對算式進(jìn)行計(jì)算,詳見tryit()</p><p>  if (n<l && suss)</p><p>  //如果n<l,suss 為真,即算式?jīng)]有計(jì)算完成就跳出,多余了反括號,報(bào)錯(cuò)</p><p><b>  

55、{</b></p><p>  AfxMessageBox(_T("算式邏輯錯(cuò)誤"));</p><p><b>  return ;</b></p><p><b>  }</b></p><p>  Str.Format(_T("%0.5lf"

56、),total); //將得到的結(jié)果打印到Str 中</p><p>  GetDlgItem(IDC_EDIT_CAL)->SetWindowText(Str); //將Str 中字符串輸出到Edit 框</p><p><b>  中</b></p><p>  LEDDisplay(); //數(shù)碼管顯示</p><

57、;p><b>  }</b></p><p>  double CProjectDlg::tryit(double *suanshi) //加減計(jì)算主函數(shù),將括號、乘除法視為</p><p>  獨(dú)立數(shù)字進(jìn)行加減運(yùn)算</p><p><b>  {</b></p><p>  double t

58、otal=0;</p><p>  if (suanshi[n]>=0) //若算式開始第一位是數(shù)字</p><p><b>  {</b></p><p>  total=calculate(suanshi); //直接開始計(jì)算以這個(gè)數(shù)字為主的部分</p><p>  if (suanshi[n]==-6) //

59、如果計(jì)算結(jié)束后的負(fù)號為),則后移一位</p><p><b>  n++;</b></p><p><b>  }</b></p><p>  while (n<l && suss) //如果算式?jīng)]有處理完,并且沒有出現(xiàn)除數(shù)為0 時(shí),繼續(xù)運(yùn)算</p><p><b>

60、  {</b></p><p>  if (suanshi[n]==-1) //當(dāng)符號為+時(shí)</p><p><b>  {</b></p><p><b>  n++;</b></p><p>  total+=calculate(suanshi);</p><p&

61、gt;<b>  }</b></p><p>  else if (suanshi[n] == -2) //當(dāng)符號為-時(shí)</p><p><b>  {</b></p><p><b>  n++;</b></p><p>  total -= calculate(suansh

62、i);</p><p><b>  }</b></p><p>  else if (suanshi[n] == -5) //當(dāng)整個(gè)數(shù)字算式第一位就為(時(shí)</p><p><b>  {</b></p><p>  total=calculate(suanshi);</p><p

63、><b>  n++;</b></p><p><b>  }</b></p><p>  else if (suanshi[n] == -6) //當(dāng)符號為),跳出當(dāng)前子部分計(jì)算</p><p><b>  {</b></p><p><b>  break;

64、</b></p><p><b>  }</b></p><p>  else if (suanshi[n]>0) //當(dāng)當(dāng)前位為數(shù)字時(shí),出現(xiàn)算式邏輯錯(cuò)誤,理由是</p><p>  不可能處理出連續(xù)兩個(gè)數(shù)字,兩個(gè)數(shù)字必須由符號隔開</p><p><b>  {</b></

65、p><p>  AfxMessageBox(_T("算式邏輯錯(cuò)誤"));</p><p>  suss = false;</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  }&

66、lt;/b></p><p>  return total;</p><p><b>  }</b></p><p>  double CProjectDlg::calculate(double *suanshi) //數(shù)字子部分的乘除運(yùn)算</p><p><b>  {</b></p&

67、gt;<p>  double number;</p><p>  if (suanshi[n] == -5) //當(dāng)子部分算式第一位為(時(shí),調(diào)用tryit 對子部分進(jìn)行遞歸運(yùn)算</p><p><b>  {</b></p><p><b>  n++;</b></p><p>  

68、number=tryit(suanshi);</p><p><b>  }</b></p><p>  else number = suanshi[n];//當(dāng)子部分算式第一位為數(shù)字時(shí),直接加入子部分結(jié)果中</p><p>  while (n<l)</p><p><b>  {</b>&

69、lt;/p><p>  if (suanshi[n]>-3 && suanshi[n]<0)</p><p>  //當(dāng)符號位出現(xiàn)+-號時(shí),跳出子部分處理,回到加減處理中</p><p><b>  {</b></p><p><b>  break;</b></p&g

70、t;<p><b>  }</b></p><p><b>  n++;</b></p><p>  if (n==l) //當(dāng)n 等于l 時(shí),結(jié)束運(yùn)算</p><p><b>  break;</b></p><p>  if (suanshi[n]>-3

71、)</p><p>  //當(dāng)符號位出現(xiàn)數(shù)字,或者加減號時(shí),結(jié)束子部分處理,回到加減處理中</p><p><b>  {</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  if (su

72、anshi[n]==-3) //當(dāng)符號為*號時(shí)</p><p><b>  {</b></p><p><b>  n++;</b></p><p>  number*=calculate(suanshi); //使用遞歸運(yùn)算,處理乘號后可能出現(xiàn)括號</p><p><b>  }<

73、/b></p><p>  else if (suanshi[n]==-4) //當(dāng)符號為/號</p><p><b>  {</b></p><p><b>  n++;</b></p><p>  if (suanshi[n]==0) //當(dāng)除數(shù)為0 時(shí),返回錯(cuò)誤</p>&

74、lt;p><b>  {</b></p><p>  AfxMessageBox(_T("算式邏輯錯(cuò)誤"));</p><p>  suss = false;</p><p><b>  return 0;</b></p><p><b>  }</b>

75、;</p><p>  if (suanshi[n]>0) //當(dāng)除號后為數(shù)字</p><p><b>  {</b></p><p>  number/=suanshi[n]; //直接除掉,不能遞歸</p><p><b>  }</b></p><p>  els

76、e if (suanshi[n]==-5)</p><p>  //當(dāng)除號后出現(xiàn)括號,則進(jìn)行遞歸,防止出現(xiàn)算式優(yōu)先級錯(cuò)誤</p><p>  number/=calculate(suanshi);</p><p><b>  }</b></p><p>  else if (suanshi[n]==-5) //當(dāng)數(shù)字位后

77、出現(xiàn)(,則是邏輯錯(cuò)誤,結(jié)束</p><p><b>  {</b></p><p>  AfxMessageBox(_T("算式邏輯錯(cuò)誤"));</p><p>  suss = false;</p><p><b>  return 0;</b></p><

78、p><b>  }</b></p><p>  if (suanshi[n]==-6) //當(dāng)出現(xiàn))時(shí),結(jié)束子部分的計(jì)算,跳出</p><p><b>  {</b></p><p><b>  break;</b></p><p><b>  }</b&

79、gt;</p><p><b>  }</b></p><p>  return number; //返回子部分的計(jì)算值</p><p><b>  }</b></p><p>  double CProjectDlg::solve(char *num) //將字符串處理為數(shù)字</p>

80、<p><b>  {</b></p><p>  double number=0;</p><p>  double xiaoshu = 0;</p><p><b>  int i,j;</b></p><p>  for (i = 0;num[i]!='\0' &a

81、mp;& num[i]!='.';i++)</p><p><b>  {</b></p><p>  number=number*10+num[i]-'0';</p><p><b>  }</b></p><p>  if (num[i]=='.&

82、#39;) //處理小數(shù)點(diǎn)后的數(shù)</p><p><b>  {</b></p><p>  for (j=i+1;num[j]!='\0';j++)</p><p><b>  {</b></p><p>  if (num[j]=='.') //如果小數(shù)點(diǎn)后的數(shù)中

83、又出現(xiàn)小數(shù)點(diǎn),報(bào)錯(cuò)</p><p>  return -1;</p><p>  xiaoshu=xiaoshu*10+num[j]-'0';</p><p><b>  }</b></p><p>  for (j=i+1;num[j]!='\0';j++)</p><

84、;p><b>  {</b></p><p>  xiaoshu/=10.0;</p><p><b>  31</b></p><p><b>  }</b></p><p>  number+=xiaoshu;</p><p><b>

85、;  }</b></p><p>  return number; //返回轉(zhuǎn)換值</p><p><b>  }</b></p><p>  void CProjectDlg::CleanIt()</p><p><b>  {</b></p><p>  st

86、r[0]='\0';</p><p><b>  n=0;</b></p><p><b>  l=0;</b></p><p>  strlong = 0;</p><p>  suss = true;</p><p>  times = 0;</p&

87、gt;<p>  m_bValue = true;</p><p><b>  T = 0;</b></p><p><b>  }</b></p><p>  void CProjectDlg::OnButtonEqual()</p><p><b>  {</b&g

88、t;</p><p>  // TODO: Add your control notification handler code here</p><p>  str[strlong] = '\0'; //等于號被按下是,進(jìn)行計(jì)算,并且清除一部分記錄</p><p><b>  Finish();</b></p>

89、<p>  CleanIt();</p><p><b>  }</b></p><p>  BOOL CProjectDlg::PreTranslateMessage(MSG* pMsg) //鍵盤的消息響應(yīng)</p><p><b>  {</b></p><p>  // TODO:

90、Add your specialized code here and/or call the base class</p><p>  if (pMsg->message == WM_KEYDOWN)</p><p><b>  {</b></p><p>  switch (pMsg->wParam)</p><

91、;p><b>  {</b></p><p>  case VK_NUMPAD0 :str[strlong] = '0';break;</p><p>  case VK_NUMPAD1 :str[strlong] = '1';break;</p><p>  case VK_NUMPAD2 :str[st

92、rlong] = '2';break;</p><p>  case VK_NUMPAD3 :str[strlong] = '3';break;</p><p>  case VK_NUMPAD4 :str[strlong] = '4';break;</p><p>  case VK_NUMPAD5 :str[str

93、long] = '5';break;</p><p>  case VK_NUMPAD6 :str[strlong] = '6';break;</p><p>  case VK_NUMPAD7 :str[strlong] = '7';break;</p><p>  case VK_NUMPAD8 :str[strl

94、ong] = '8';break;</p><p>  case VK_NUMPAD9 :str[strlong] = '9';break;</p><p>  case VK_ADD :str[strlong] = '+';break;</p><p>  case VK_SUBTRACT:str[strlong]

95、= '-';break;</p><p>  case VK_MULTIPLY:str[strlong] = '*';break;</p><p>  case VK_DIVIDE :str[strlong] = '/';break;</p><p>  case VK_DECIMAL :str[strlong] =

96、'.';break;</p><p>  case VK_RETURN :</p><p>  if (::GetDlgCtrlID(pMsg->hwnd)!=IDC_BUTTON_EQUAL)</p><p><b>  {</b></p><p>  GotoDlgCtrl(GetDlgItem

97、(IDC_BUTTON_EQUAL));</p><p><b>  }</b></p><p>  OnButtonEqual();</p><p>  return FALSE;break;</p><p>  default:return CDialog::PreTranslateMessage(pMsg);bre

98、ak;</p><p><b>  }</b></p><p>  strlong++;</p><p>  str[strlong] = '\0';</p><p>  Str.Format(_T("%s"),str);</p><p>  GetDlgIte

99、m(IDC_EDIT_CAL)->SetWindowText(Str);</p><p><b>  }</b></p><p>  return CDialog::PreTranslateMessage(pMsg);</p><p><b>  }</b></p><p>  void CP

100、rojectDlg::OnButtonPoint() //添加小數(shù)點(diǎn)進(jìn)字符串</p><p><b>  {</b></p><p>  // TODO: Add your control notification handler code here</p><p>  str[strlong] = '.';</p>

101、<p>  strlong++;</p><p>  str[strlong] = '\0';</p><p>  Str.Format(_T("%s"),str);</p><p>  GetDlgItem(IDC_EDIT_CAL)->SetWindowText(Str);</p><p

102、><b>  }</b></p><p>  void CProjectDlg::OnButtonDel() //退格</p><p><b>  {</b></p><p>  // TODO: Add your control notification handler code here</p>&

103、lt;p>  (strlong>0)?(strlong--):(strlong=strlong); //當(dāng)字符串長度不為0 時(shí),字符串長度-1,</p><p><b>  添加結(jié)束標(biāo)志</b></p><p>  str[strlong] = '\0';</p><p>  Str.Format(_T("

104、%s"),str);</p><p>  GetDlgItem(IDC_EDIT_CAL)->SetWindowText(Str);</p><p><b>  }</b></p><p>  3.2 顯示模塊(LED 數(shù)碼管)</p><p>  3.2.1 任務(wù)要求</p><p&

105、gt;  1)LED 數(shù)碼管驅(qū)動(dòng)程序:實(shí)現(xiàn)在目標(biāo)板上的LED 數(shù)碼管顯示計(jì)數(shù)器輸入的運(yùn)</p><p>  算符及計(jì)算后的結(jié)果。如果超過四位,則輪流顯示。</p><p>  3.2.2 設(shè)計(jì)思路</p><p>  這個(gè)模塊,即綜合了實(shí)驗(yàn)8 和實(shí)驗(yàn)9 的內(nèi)容。</p><p>  計(jì)數(shù)器模塊的界面設(shè)計(jì)如圖3.1 中,為了將整個(gè)模塊綜合起來,

106、當(dāng)“=”按鍵按下時(shí),實(shí)現(xiàn)LED 的顯示。</p><p>  數(shù)碼管顯示的關(guān)鍵部分是如何顯示4 位數(shù)之后的部分,就要用到輪流顯示,</p><p>  每次裝入緩沖4 位數(shù)字(包括小數(shù)點(diǎn)),通過定時(shí)器,可以設(shè)置停留時(shí)間的不一樣,第一組數(shù)據(jù)停的時(shí)間長一點(diǎn),后面的稍微短些。</p><p>  3.2.3 程序?qū)崿F(xiàn)</p><p>  void

107、CProjectDlg::LEDDisplay() //LED 顯示函數(shù)</p><p><b>  {</b></p><p>  int i,j,len;</p><p>  BYTE data[4];</p><p>  DWORD bytes;</p><p>  len = Str.Ge

108、tLength(); //獲取計(jì)算結(jié)果的字符串長度</p><p>  for (i=0;i<len-3;i++) //從字符串0 位顯示到len-3 位,每次顯示四位數(shù)</p><p><b>  {</b></p><p>  memset(data,0,4); //緩沖清0</p><p>  for (j=

109、i;j<i+4;j++) //依次將要顯示的四位寫入緩沖</p><p><b>  {</b></p><p>  if (Str[j]!='.')</p><p>  data[j-i] = ledfont[Str[j]-'0'];</p><p>  else data[j-i

110、] = 0x01; //當(dāng)前位為小數(shù)點(diǎn)時(shí)</p><p><b>  }</b></p><p>  WriteFile(m_hDev,data,4,&bytes,NULL); //將緩沖區(qū)數(shù)據(jù)以流形式寫入外設(shè)</p><p><b>  if (i==0)</b></p><p>  Sl

111、eep(3000); //如果為最前四位,顯示3 秒</p><p>  else Sleep(500); //每前進(jìn)一位停留0.5 秒</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  3.3 其他</b></p

112、><p>  (1)打開設(shè)備并做確認(rèn)</p><p>  因?yàn)槲覀兊脑O(shè)計(jì)中要驅(qū)動(dòng)PXA270 實(shí)驗(yàn)箱上的八段數(shù)碼管和LED 燈,因此</p><p>  在對話框初始化的時(shí)候需要打開設(shè)備,并做一個(gè)確認(rèn),如果失敗,則彈出提示對</p><p>  話框。這部分程序代碼添加在OnInitDialog 中,實(shí)現(xiàn)代碼如下:</p><

113、p>  m_hDev = CreateFile(_T("LED2:"),GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);</p><p>  //初始化外設(shè)數(shù)碼管,掛載外設(shè),建立流連接</p><p>  if (m_hDev == INVALID_HANDLE_VALUE)</p><p>  //如果返回

114、值為失敗,輸出打開設(shè)備失敗</p><p><b>  {</b></p><p>  AfxMessageBox(_T("打開設(shè)備失敗"));</p><p><b>  }</b></p><p><b>  m_hDevL =</b></p>

115、;<p>  CreateFile(_T("GIO1:"),GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);</p><p>  //初始化LED 燈,掛載</p><p>  if (m_hDevL == INVALID_HANDLE_VALUE)</p><p><b>  {</

116、b></p><p>  AfxMessageBox(_T("打開設(shè)備失敗LED"));</p><p><b>  }</b></p><p>  (2)添加處理窗口失敗的響應(yīng)函數(shù)</p><p>  選擇View -Class Wizard,在彈出的對話框中,添加系統(tǒng)用來處理窗口失敗<

117、/p><p>  時(shí)發(fā)送的消息WM_DESTORY,點(diǎn)擊“Add Function”,再點(diǎn)擊“Edit Code”。添</p><p><b>  加代碼如下:</b></p><p>  void CProjectDlg::OnDestroy()</p><p><b>  {</b></p&g

118、t;<p>  CDialog::OnDestroy();</p><p>  // TODO: Add your message handler code here</p><p>  CloseHandle(m_hDev);</p><p><b>  }</b></p><p>  4 使用手冊與測試

119、結(jié)果性能分析</p><p><b>  4.1 使用手冊</b></p><p>  通過設(shè)計(jì)對話框界面、查閱相關(guān)書籍,編寫控件程序、不斷調(diào)試,完善設(shè)計(jì)</p><p>  功能,最終我們小組完成的對話框界面如圖3.1。下面具體說明此操作界面的使</p><p><b>  用方法。</b><

120、;/p><p>  (1)雙擊打開WinCE 系統(tǒng)“我的電腦”中“pro.exe”文件,顯示如圖4.1 的</p><p>  界面。或者點(diǎn)擊本地電腦Windows CE 的軟件運(yùn)行,也可以直接彈出本地的運(yùn)行</p><p><b>  程序。</b></p><p>  (2)在Display 模塊中,通過鍵盤或是界面輸入

121、合理的運(yùn)算表達(dá)式,可以看到</p><p>  在結(jié)果框顯示,輸入“=”,可在結(jié)果框中顯示,同時(shí)在PXA270 實(shí)驗(yàn)箱的八段數(shù)</p><p>  碼管也顯示,測試結(jié)果如圖4.2。</p><p>  圖3.1 計(jì)算器界面</p><p>  圖4.1 一般計(jì)算結(jié)果顯示 圖4.2 超過四位計(jì)算結(jié)果顯示<

122、;/p><p>  圖4.3 除數(shù)為零計(jì)算結(jié)果顯示</p><p>  圖4.4 數(shù)碼管移位顯示</p><p> ?。?)當(dāng)計(jì)算結(jié)果小于9999且除數(shù)非零時(shí),輸出結(jié)果與圖4.1類似,圖中為6×8的結(jié)果。</p><p>  (4)當(dāng)計(jì)算結(jié)果大于9999且除數(shù)非零時(shí),輸出結(jié)果與圖4.2類似,溢出位在實(shí)驗(yàn)箱的數(shù)碼管上不顯示。</p&

123、gt;<p> ?。?)當(dāng)除數(shù)為零時(shí),計(jì)算結(jié)果如圖4.3所示,彈出警報(bào)窗口。</p><p> ?。?)在左下角的文本框中輸入時(shí)間,單位為毫秒,在倒數(shù)第二排文本框輸入四個(gè)值,點(diǎn)擊OK,文本框中的四個(gè)數(shù)字分別顯示在對應(yīng)的數(shù)碼管上,且按照預(yù)設(shè)時(shí)間間隔右移。如圖4.4所示。</p><p>  4.2 測試結(jié)果性能分析</p><p>  通過測試,很明顯的

124、看到我們的設(shè)計(jì)能夠很好地完成課程設(shè)計(jì)題目的要求。</p><p>  主要實(shí)現(xiàn)了計(jì)數(shù)器的功能,同時(shí)結(jié)合LED 數(shù)碼管驅(qū)動(dòng)程序和LED 數(shù)字顯示控件,</p><p>  把二者的功能進(jìn)行整合,既能實(shí)現(xiàn)LED 數(shù)字顯示控件和PXA270 實(shí)驗(yàn)箱八段數(shù)</p><p>  碼管同時(shí)顯示數(shù)字,又?jǐn)U展性的完成了不同數(shù)字在八段數(shù)碼管上按照預(yù)設(shè)的頻率</p>&l

125、t;p>  循環(huán)。此外,為了完善功能,美化界面,方便用戶使用,還增加了滑動(dòng)條,用于</p><p>  改變文本顏色和文本背景顏色以及設(shè)置了“清除”、“后退”等按鈕??偟膩碚f,</p><p>  這是一個(gè)集多種功能于一體的設(shè)計(jì)。</p><p><b>  5 小結(jié)</b></p><p>  通過完成這次嵌入式

126、控制系統(tǒng)課程設(shè)計(jì),我覺得自己學(xué)到很多東西,現(xiàn)總結(jié)</p><p><b>  如下:</b></p><p>  (1)此次課程設(shè)計(jì)和前期的實(shí)驗(yàn)都是建立在PXA270 實(shí)驗(yàn)箱和WinCE 嵌入式</p><p>  操作系統(tǒng)上的,因此我們更加直觀的了解了PXA270 的硬件組成,結(jié)合課本上的</p><p>  知識更加

127、深刻的理解了WinCE 操作系統(tǒng)。</p><p>  (2)我們的設(shè)計(jì)是在Embedded Visual C++集成開發(fā)環(huán)境下完成的,我們發(fā)現(xiàn)</p><p>  EVC 的編程和以前學(xué)過的C 語言、VB 語言編程都不太一樣,因此也借這次課程</p><p>  設(shè)計(jì)的機(jī)會(huì),學(xué)習(xí)到一些C++編程的方法,比如如何新建工程,如何添加控件,</p><

128、;p>  如何添加消息響應(yīng)函數(shù)等等。</p><p>  (3)這一次課程設(shè)計(jì)用到的相關(guān)知識很多都是沒有學(xué)過的,尤其是一些功能</p><p>  函數(shù),比如UpdateData()、OnCtlColor()、SetTimer()等,但是我們小組并沒有退</p><p>  縮,而是盡自己最大努力,通過在圖書館查閱書籍、上網(wǎng)搜索資料以及詢問老師</p&g

129、t;<p>  等方法逐一的解決問題,也算是培養(yǎng)了自己解決問題的能力。</p><p>  (4)這個(gè)課程設(shè)計(jì)報(bào)告是嚴(yán)格按照畢業(yè)設(shè)計(jì)的格式來撰寫的,這讓我對報(bào)告</p><p>  的組成部分和格式要求有了一定的了解,也對以后書寫畢業(yè)設(shè)計(jì)打下基礎(chǔ)。</p><p>  (5)做這個(gè)課程設(shè)計(jì)給我的體會(huì)是: 本次課程設(shè)計(jì)除了學(xué)習(xí)到了大量的嵌入</p&

130、gt;<p>  式知識外,也充分認(rèn)識到了團(tuán)隊(duì)合作的重要性。在課程設(shè)計(jì)中,大家發(fā)揮各自的</p><p>  長處,分工合作,克服了時(shí)間短、任務(wù)重的困難,最終較好的完成了這次課程設(shè)</p><p><b>  計(jì)。</b></p><p><b>  參考文獻(xiàn)</b></p><p>

131、  [1]歐陽志宏,董霖,鐘俊華. MFC 程序設(shè)計(jì)輕松入門[M].北京:人民郵電出版</p><p><b>  社,2009</b></p><p>  [2]任哲. MFC Windows 應(yīng)用程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2007</p><p>  [3]陳浩杰. Visual C++ 6.0 程序設(shè)計(jì)[M].北京:科學(xué)出版社

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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

提交評論