單片機(jī)課程設(shè)計(jì)--簡(jiǎn)易計(jì)算器_第1頁(yè)
已閱讀1頁(yè),還剩31頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  信息與通信工程學(xué)院</b></p><p><b>  簡(jiǎn)易計(jì)算器</b></p><p><b>  目 錄</b></p><p>  一、設(shè)計(jì)任務(wù)和性能指標(biāo)2</p><p><b>  1.1設(shè)計(jì)任務(wù)2</b

2、></p><p><b>  1.2性能指標(biāo)2</b></p><p><b>  二.設(shè)計(jì)方案2</b></p><p>  三.系統(tǒng)硬件設(shè)計(jì)3</p><p>  3.1單片機(jī)最小系統(tǒng)3</p><p>  3.2鍵盤(pán)接口電路3</p>&

3、lt;p>  3.3數(shù)碼管顯示電路4</p><p>  3.4錯(cuò)誤報(bào)警電路5</p><p>  四、系統(tǒng)軟件設(shè)計(jì)6</p><p>  4.1鍵盤(pán)掃描子程序設(shè)計(jì)6</p><p>  4.2移位子程序及結(jié)果計(jì)算子程序設(shè)計(jì)10</p><p>  4.3顯示子程序設(shè)計(jì)12</p>&l

4、t;p>  4.4主程序設(shè)計(jì)13</p><p>  五、調(diào)試及性能分析13</p><p>  5.1調(diào)試步驟13</p><p>  5.2性能分析14</p><p><b>  六、心得體會(huì)14</b></p><p><b>  參考文獻(xiàn)14</b>

5、;</p><p>  附錄1 系統(tǒng)硬件電路圖15</p><p>  附錄2 程序清單16</p><p>  一、設(shè)計(jì)任務(wù)和性能指標(biāo)</p><p><b>  1.1設(shè)計(jì)任務(wù)</b></p><p>  印刷電路板(要求布局合理,線(xiàn)路清晰),繪出程序流程圖,并給出程 利用單片機(jī)及外圍接

6、口電路(鍵盤(pán)接口和顯示接口電路)設(shè)計(jì)制作一個(gè)計(jì)算器,用LED顯示計(jì)算數(shù)值及結(jié)果。</p><p>  要求用Protel 畫(huà)出系統(tǒng)的電路原理圖(要求以最少組件,實(shí)現(xiàn)系統(tǒng)設(shè)計(jì)所要求的功能),序清單(要求思路清晰,盡量簡(jiǎn)潔,主程序和子程序分開(kāi),使程序有較強(qiáng)的可讀性)。</p><p><b>  1.2性能指標(biāo)</b></p><p>  加法:四

7、位加法,計(jì)算結(jié)果若超過(guò)四位則顯示計(jì)算錯(cuò)誤</p><p>  減法:四位減法,計(jì)算結(jié)果若小于零則顯示計(jì)算錯(cuò)誤</p><p><b>  乘法:個(gè)位數(shù)乘法</b></p><p><b>  除法:整數(shù)除法</b></p><p>  有清零功能,計(jì)算錯(cuò)誤報(bào)警</p><p>

8、;<b>  二.方案總體設(shè)計(jì)</b></p><p>  按照系統(tǒng)設(shè)計(jì)的功能的要求,初步確定設(shè)計(jì)系統(tǒng)由主控模塊、顯示模塊、錯(cuò)誤報(bào)警模塊、鍵掃描接口電路共四個(gè)模塊組成,電路系統(tǒng)構(gòu)成框圖如圖1.1所示。主控芯片使用51系列AT89C52單片機(jī),采用高性能的靜態(tài)80C51設(shè)計(jì),由先進(jìn)工藝制造,并帶有非易失性Flash程序存儲(chǔ)器。它是一種高性能、低功耗的8位COMS微處理芯片,市場(chǎng)應(yīng)用最多。<

9、;/p><p>  鍵盤(pán)電路采用4*4矩陣鍵盤(pán)電路。</p><p>  顯示模塊采用4枚共陽(yáng)極數(shù)碼管和74ls273鎖存芯片構(gòu)成等器件構(gòu)成。</p><p>  錯(cuò)誤報(bào)警電路采用5V蜂鳴器。</p><p>  系統(tǒng)選用以STC89C51單片機(jī)為主控機(jī)。通過(guò)擴(kuò)展必要的外圍接口電路,實(shí)現(xiàn)對(duì)計(jì)算器的設(shè)計(jì)。</p><p>&

10、lt;b>  三.系統(tǒng)硬件設(shè)計(jì)</b></p><p>  3.1單片機(jī)最小系統(tǒng)</p><p>  單片機(jī)最小系統(tǒng)就是支持主芯片正常工作的最小電路部分,包括主控芯片、復(fù)位電路和晶振電路。</p><p>  主控芯片選取STC89C52RC芯片,因其具有良好的性能及穩(wěn)定性,價(jià)格便宜應(yīng)用方便。</p><p>  晶振選取1

11、1.0592MHz,晶振旁電容選取30pF。</p><p>  采用按鍵復(fù)位電路,電阻分別選取100Ω和10K,電容選取10μF。</p><p>  以下為單片機(jī)最小系統(tǒng)硬件電路圖。</p><p>  圖3.1 單片機(jī)最小系統(tǒng)</p><p><b>  3.2鍵盤(pán)接口電路</b></p><p

12、><b>  計(jì)算器所需按鍵有:</b></p><p>  數(shù)字鍵:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’</p><p>  功能鍵:’+’, ’-‘ , ’*’, ’/ ’ , ’ = ’, ’ C( 清零)’</p><p>  共計(jì)16個(gè)按鍵,采用4*4矩陣鍵盤(pán),鍵盤(pán)的行和列之間都有公共端

13、相連,四行和四列的8個(gè)公共端分別接P1.0~P1.7,這樣掃描P1口就可以完成對(duì)矩陣鍵盤(pán)的掃描,通過(guò)對(duì)16個(gè)按鍵進(jìn)行編碼,從而得到鍵盤(pán)的口地址,對(duì)比P1口德掃描結(jié)果和各按鍵的地址,我們就可以得到是哪個(gè)鍵按下,從而完成鍵盤(pán)的功能。</p><p>  以下為鍵盤(pán)接口電路的硬件電路圖</p><p>  圖3.2 矩陣鍵盤(pán)內(nèi)部電路</p><p>  3.3 LCD顯示

14、模塊:</p><p>  本設(shè)計(jì)采用LCD液晶顯示器來(lái)顯示輸出數(shù)據(jù).通過(guò)D0-D7引腳向LCD寫(xiě)指令字或?qū)憯?shù)據(jù)以使LCD實(shí)現(xiàn)不同的功能或顯示相應(yīng)數(shù)據(jù).</p><p>  在與單片機(jī)最小系統(tǒng)連接時(shí),采用并行連接方式,此方式的特點(diǎn)是傳輸速度快。并行接口的輸入由p0.0-p0.7進(jìn)行控制,傳輸信息。</p><p>  LCD顯示使用了兩片極化材料,在它們之間是液體水

15、晶溶液。電流通過(guò)該液體時(shí)會(huì)使水晶重新排列,以使光線(xiàn)無(wú)法透過(guò)它們。因此,每個(gè)水晶就像百葉窗,既能允許光線(xiàn)穿過(guò)又能擋住光線(xiàn)。</p><p>  LCD也就顯示具有直角顯示、低耗電量、體積小、還是零輻射等優(yōu)點(diǎn)。</p><p>  圖3.3 LCD顯示電路</p><p><b>  3.4錯(cuò)誤報(bào)警電路</b></p><p&g

16、t;  錯(cuò)誤報(bào)警電路就是在計(jì)算結(jié)果出現(xiàn)錯(cuò)誤時(shí)或輸入數(shù)據(jù)出現(xiàn)錯(cuò)誤時(shí),發(fā)出聲音警報(bào),提示使用者錯(cuò)誤出現(xiàn)。</p><p>  這里就采用5V蜂鳴器作為報(bào)警設(shè)備,利用PNP三極管對(duì)蜂鳴器進(jìn)行驅(qū)動(dòng),有P2.2對(duì)其進(jìn)行控制,這樣在出現(xiàn)錯(cuò)誤的同時(shí)用P2.2輸出低,就可以使蜂鳴器工作,完成報(bào)警任務(wù)。</p><p>  在編寫(xiě)程序時(shí),報(bào)警電路實(shí)現(xiàn)的功能是:當(dāng)計(jì)算正常時(shí)使p2.2口輸出高電平時(shí),蜂鳴器不會(huì)

17、響應(yīng)。當(dāng)計(jì)算出現(xiàn)錯(cuò)誤(例如0作為被除數(shù)時(shí))此時(shí)給p2.2輸出低電平,使蜂鳴器響應(yīng),達(dá)到報(bào)警功能。</p><p>  以下為報(bào)警電路硬件電路圖</p><p><b>  圖3.4 報(bào)警電路</b></p><p><b>  四.系統(tǒng)軟件設(shè)計(jì)</b></p><p>  首先初始化參數(shù);然后掃描鍵

18、盤(pán)看是否有鍵輸入,若有,讀取鍵碼;判斷鍵碼是數(shù)字鍵、清零鍵還是功能鍵(“+”“-”“*”“/”“=”),是數(shù)值鍵則送數(shù)碼管顯示并保存數(shù)值,是清零鍵則做清零處理,是功能鍵則又判斷是“=”還是運(yùn)算鍵,若是“=”則計(jì)算最后結(jié)果并送數(shù)碼管顯示,若是其它功能鍵則不顯示。(其中里面包含了延時(shí)去抖動(dòng)程序)。 </p><p><b>  圖4.1程序流程圖</b></p><

19、p>  4.1鍵盤(pán)掃描子程序設(shè)計(jì)</p><p>  要進(jìn)行數(shù)據(jù)的計(jì)算就必須先進(jìn)行數(shù)據(jù)的輸入,也就必須確定按鍵輸入的數(shù)值是什么,這就需要對(duì)鍵盤(pán)進(jìn)行掃描,從而確定究竟是哪個(gè)鍵按下。</p><p>  對(duì)于鍵盤(pán)的掃描,既可以用行掃描也可以用列掃描,這里采用行掃描的方法來(lái)完成對(duì)鍵盤(pán)的掃描。</p><p>  行掃描就是逐行掃描鍵盤(pán),看是哪一行有鍵按下,再通過(guò)返回

20、的鍵碼來(lái)確定究竟是哪個(gè)按鍵按下。如對(duì)第一行掃描就令P1.0為低,P1口其余為高,這樣若第一行有鍵按下,則P1口的值就會(huì)由0xfe變?yōu)槠渌?,再由這個(gè)值來(lái)確定是哪個(gè)鍵按下。</p><p>  以下為鍵盤(pán)掃描子程序的程序清單。</p><p>  void keyscan() //矩陣鍵盤(pán)</p><p><b>  {</b><

21、;/p><p><b>  P3=0xfe;</b></p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {</b>&

22、lt;/p><p>  Delay_1ms(10);</p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {</b></p>

23、<p><b>  temp=P3;</b></p><p>  switch(temp)</p><p><b>  {</b></p><p>  case 0xee: key=1; break;</p><p>  case 0xde: key=2; break;</p&g

24、t;<p>  case 0xbe: key=3; break;</p><p>  case 0x7e: key=15; break;</p><p><b>  }</b></p><p>  while(temp!=0xf0)</p><p><b>  {</b></

25、p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p><b>  }</b></p><p>  if(key>=1&&key<=3)</p><p><b>  {&l

26、t;/b></p><p>  L1602_char(1,i,key + 48);</p><p><b>  i++;</b></p><p>  ss[b]=key;</p><p><b>  b++;</b></p><p>  Delay_1ms(300);&

27、lt;/p><p><b>  }</b></p><p>  if(key==15)</p><p><b>  {</b></p><p>  L1602_string(1,i++,"/");</p><p><b>  e='/'

28、;;</b></p><p>  A=f(ss,b);</p><p><b>  b=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b>

29、</p><p><b>  P3=0xfd;</b></p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {</b&g

30、t;</p><p>  Delay_1ms(10);</p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {</b></p>

31、;<p><b>  temp=P3;</b></p><p>  switch(temp)</p><p><b>  {</b></p><p>  case 0xed: key=4; break;</p><p>  case 0xdd: key=5; break;</

32、p><p>  case 0xbd: key=6; break;</p><p>  case 0x7d: key=14; break;</p><p><b>  }</b></p><p>  while(temp!=0xf0)</p><p><b>  {</b>&l

33、t;/p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p><b>  }</b></p><p>  if(key>=4&&key<=6)</p><p><b>  

34、{</b></p><p>  L1602_char(1,i,key + 48);</p><p><b>  i++;</b></p><p>  ss[b]=key;</p><p><b>  b++;</b></p><p>  Delay_1ms(300

35、);</p><p><b>  }</b></p><p>  if(key==14)</p><p><b>  {</b></p><p>  L1602_string(1,i++,"*");</p><p><b>  e='*&

36、#39;;</b></p><p>  A=f(ss,b);</p><p><b>  b=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b

37、></p><p><b>  P3=0xfb;</b></p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {<

38、/b></p><p>  Delay_1ms(10);</p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {</b></

39、p><p><b>  temp=P3;</b></p><p>  switch(temp)</p><p><b>  {</b></p><p>  case 0xeb: key=7; break;</p><p>  case 0xdb: key=8; break;&

40、lt;/p><p>  case 0xbb: key=9; break;</p><p>  case 0x7b: key=13; break;</p><p><b>  }</b></p><p>  while(temp!=0xf0)</p><p><b>  {</b&g

41、t;</p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p><b>  }</b></p><p>  if(key>=7&&key<=9)</p><p><b&g

42、t;  {</b></p><p>  L1602_char(1,i,key + 48);</p><p><b>  i++;</b></p><p>  ss[b]=key;</p><p><b>  b++;</b></p><p>  Delay_1ms

43、(300);</p><p><b>  }</b></p><p>  if(key==13)</p><p><b>  {</b></p><p>  L1602_string(1,i++,"-");</p><p><b>  e=

44、9;-';</b></p><p>  A=f(ss,b);</p><p><b>  b=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }<

45、;/b></p><p><b>  P3=0XF7;</b></p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {&

46、lt;/b></p><p>  Delay_1ms(10);</p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {</b>&l

47、t;/p><p><b>  temp=P3;</b></p><p>  switch(temp)</p><p><b>  {</b></p><p>  case 0xe7: key=10; break;</p><p>  case 0xd7: key=0; break

48、;</p><p>  case 0xb7: key=11; break;</p><p>  case 0x77: key=12; break;</p><p><b>  }</b></p><p>  while(temp!=0xf0)</p><p><b>  {</b&

49、gt;</p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p><b>  }</b></p><p>  if(key==12)</p><p><b>  {</b></

50、p><p>  L1602_string(1,i++,"+");</p><p><b>  e='+';</b></p><p>  A=f(ss,b);</p><p><b>  b=0;</b></p><p><b>  }

51、</b></p><p>  if(key==11)</p><p><b>  {</b></p><p>  L1602_string(1,i++,"=");</p><p><b>  e='=';</b></p><p>

52、;  A=f(ss,b);</p><p><b>  b=0;</b></p><p><b>  }</b></p><p>  if(key==11) //=</p><p><b>  {</b></p><p>  H=f(ss,b);&

53、lt;/p><p><b>  b=0;</b></p><p><b>  switch(e)</b></p><p><b>  {</b></p><p>  case '+': result=A+H; break;</p><p> 

54、 case '-': result=A-H; break;</p><p>  case '*': result=A*H; break;</p><p>  case '/': result=A/H; break;</p><p>  default: result=H;</p><p><

55、;b>  }</b></p><p>  L1602_string(1,i++,"=");</p><p>  show(result);</p><p><b>  }</b></p><p>  if(key==10) //清零</p><p>&l

56、t;b>  {</b></p><p>  wcmd(0x01);</p><p>  wcmd(0x80);</p><p><b>  b=0;</b></p><p><b>  i=1;</b></p><p><b>  k=1;<

57、/b></p><p><b>  }</b></p><p>  if(key==0)</p><p><b>  {</b></p><p>  L1602_char(1,i,key + 48);</p><p><b>  i++;</b>&

58、lt;/p><p>  ss[b]=key;</p><p><b>  b++;</b></p><p>  Delay_1ms(300);</p><p><b>  }</b></p><p><b>  }</b></p><p&

59、gt;<b>  } </b></p><p><b>  }</b></p><p>  4.2移位子程序及結(jié)果計(jì)算子程序設(shè)計(jì)</p><p>  輸入數(shù)據(jù)要存儲(chǔ)在一四位數(shù)組內(nèi),而我們鍵入的值是數(shù)據(jù)的高位,后鍵入的值是低位,這樣我們就需要在輸入低位數(shù)值時(shí)將高位數(shù)值從數(shù)組的低位移向數(shù)組的高位,這就是編寫(xiě)移位子程序

60、的目的。</p><p>  對(duì)于結(jié)果計(jì)算子程序,包含加、減、乘、除四種運(yùn)算。以加法運(yùn)算為例,各種運(yùn)算各有其標(biāo)志位來(lái)代表計(jì)算類(lèi)型,當(dāng)加法標(biāo)志位add=1是,就將輸入的兩個(gè)數(shù)據(jù)按照加法進(jìn)行計(jì)算。</p><p>  首先將數(shù)組內(nèi)的數(shù)按照對(duì)應(yīng)的位關(guān)系,將其轉(zhuǎn)化為一個(gè)十進(jìn)制數(shù),這樣我們就得到了加速和被加數(shù)這樣倆個(gè)十進(jìn)制數(shù),從而我們就可以簡(jiǎn)單的將兩個(gè)數(shù)進(jìn)行相加,結(jié)果就是我們所求的數(shù)值。但這個(gè)數(shù)值不

61、能直接顯示到數(shù)碼管上,我們還要對(duì)其進(jìn)行處理,使其變?yōu)閷?duì)應(yīng)進(jìn)位的四個(gè)數(shù)存入數(shù)組內(nèi),以便顯示。既通過(guò)對(duì)結(jié)果數(shù)值分別除以1000、100、10和對(duì)10取余,得到我們想要的四個(gè)數(shù),送顯示子程序顯示。其余減、乘、除的計(jì)算方法與加法的計(jì)算方法一樣,這里不再累述。</p><p>  以下為移位子程序和結(jié)果計(jì)算子程序的程序清單。</p><p>  uint exp(uint m) //位數(shù)函數(shù)&l

62、t;/p><p><b>  {</b></p><p><b>  uint n=1;</b></p><p><b>  while(m)</b></p><p><b>  {</b></p><p><b>  n=n

63、*10;</b></p><p><b>  --m;</b></p><p><b>  }</b></p><p><b>  return n;</b></p><p><b>  }</b></p><p>  

64、uint f(uint g[],uint d)//結(jié)果函數(shù)</p><p><b>  {</b></p><p>  uint m=0,i,j;</p><p>  for (i=0;i<d;++i)</p><p><b>  {</b></p><p><

65、;b>  j=d-i-1;</b></p><p>  m=m+g[i]*(exp(j));</p><p>  } return m;</p><p><b>  }</b></p><p>  uint length(uint z) //判斷得數(shù)長(zhǎng)度函數(shù)</p><p&g

66、t;<b>  {</b></p><p><b>  uint n=1;</b></p><p>  while(z>10)</p><p><b>  {</b></p><p><b>  z=z/10;</b></p><

67、p><b>  n++;</b></p><p><b>  }</b></p><p><b>  return n;</b></p><p><b>  }</b></p><p>  void show(uint h) //顯示得數(shù)函數(shù)&

68、lt;/p><p><b>  {</b></p><p>  uint n,i,dat;</p><p>  n=length(h);</p><p>  for(i=n;i>0;--i)</p><p>  { dat=h/(exp(i-1));</p><p>

69、  L1602_char(2,k++,dat + 48);</p><p>  h=h%(exp(i-1));</p><p><b>  }</b></p><p><b>  }</b></p><p>  4.3顯示子程序設(shè)計(jì)</p><p>  從始至終無(wú)論是輸入的計(jì)

70、算數(shù)據(jù),還是計(jì)算后的結(jié)果值。都存儲(chǔ)在同一數(shù)組dat[ ]中,這樣我們只要在顯示時(shí)一直調(diào)用dat[ ]中的值,就能正確的顯示數(shù)據(jù)。</p><p>  以下為顯示子程序的程序清單。</p><p>  void show(uint h) //顯示得數(shù)函數(shù)</p><p><b>  {</b></p><p>  u

71、int n,i,dat;</p><p>  n=length(h);</p><p>  for(i=n;i>0;--i)</p><p>  { dat=h/(exp(i-1));</p><p>  L1602_char(2,k++,dat + 48);</p><p>  h=h%(exp(i-1))

72、;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  4.4主程序設(shè)計(jì)</b></p><p>  主程序既把以上各子程序串連成一個(gè)整體,使整個(gè)程序循環(huán)運(yùn)行。而在以上程序中也已經(jīng)加入了個(gè)程序之間的連接點(diǎn),首先進(jìn)入程序后就

73、立即進(jìn)入顯示子程序,而顯示子程序內(nèi)又調(diào)用鍵盤(pán)掃描子程序,若有鍵按下,則會(huì)跳轉(zhuǎn)到移位子程序和結(jié)果計(jì)算子程序進(jìn)行相應(yīng)的處理。通過(guò)計(jì)算或移位后,數(shù)組內(nèi)的值發(fā)生改變,顯示的值也會(huì)同時(shí)發(fā)生改變。之后再進(jìn)行鍵盤(pán)掃描,如此反復(fù)運(yùn)行,就構(gòu)成了程序的整體。</p><p><b>  以下為主程序清單。</b></p><p>  void main() //主函數(shù)</p

74、><p><b>  {</b></p><p>  L1602_init();</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  keyscan();</p><p>

75、<b>  }</b></p><p><b>  }</b></p><p>  整體程序清單見(jiàn)附錄二。</p><p><b>  五、調(diào)試及性能分析</b></p><p><b>  5.1調(diào)試步驟</b></p><p>

76、  在焊接好器件后,先不要將芯片插在芯片座上,要先驗(yàn)證先板上電源是否好用,有無(wú)短路等。接上USB電源,用萬(wàn)用表測(cè)量個(gè)芯片座對(duì)應(yīng)電源和地之間的電壓值,觀(guān)察電壓值是否正常。一切正常后方可將芯片插入芯片座,以繼續(xù)測(cè)試其他功能。</p><p>  將芯片插上后,對(duì)各個(gè)模塊進(jìn)行調(diào)試,按鍵是否工作正常,數(shù)碼管是否顯示正常等。編寫(xiě)相關(guān)部分的測(cè)試程序?qū)ζ溥M(jìn)行測(cè)試。</p><p>  各部分硬件檢測(cè)無(wú)誤

77、后,下載程序進(jìn)行整體調(diào)試,一切正常后,結(jié)束調(diào)試過(guò)程。</p><p>  在具體調(diào)試時(shí)首先遇到的問(wèn)題是程序無(wú)法下載進(jìn)入單片機(jī),通過(guò)將電路板接線(xiàn)與原理電路圖接線(xiàn)的對(duì)比發(fā)現(xiàn),串口芯片與單片機(jī)連接的輸入,輸出接反,重新用銅線(xiàn)連接后,依然無(wú)法下載程序。后找到原因是由于下載串口與設(shè)計(jì)封裝不符,用相對(duì)應(yīng)的下載線(xiàn)可以下載。</p><p>  成功下載程序后,發(fā)現(xiàn)LCD顯示不正確,查看后發(fā)現(xiàn)有先沒(méi)有連接

78、,可能是制板時(shí)漏印,連接后顯示正常。</p><p><b>  5.2性能分析</b></p><p>  對(duì)于計(jì)算器的性能,主要的衡量指標(biāo)就在于計(jì)算的精度,本次制作的計(jì)算器性能情況如下:</p><p>  加法運(yùn)算:四位加法運(yùn)算,和值不超過(guò)9999,若超過(guò)上限,則顯示錯(cuò)誤提示E,蜂鳴器報(bào)警提示。</p><p> 

79、 減法運(yùn)算:四位減法運(yùn)算,若結(jié)果為負(fù),對(duì)其取絕對(duì)值。</p><p>  乘法運(yùn)算:積不超過(guò)9999的乘法運(yùn)算,若超出上限,顯示錯(cuò)誤提示E,蜂鳴器報(bào)警提示。</p><p>  除法運(yùn)算:整數(shù)除法,既計(jì)算結(jié)果為整數(shù),若除數(shù)為零,則顯示錯(cuò)誤提示E,蜂鳴器報(bào)警提示。</p><p>  通過(guò)對(duì)實(shí)際性能的分析,可以得到本次設(shè)計(jì)滿(mǎn)足設(shè)計(jì)的要求。</p><

80、;p><b>  六、心得體會(huì)</b></p><p>  通過(guò)本次課程設(shè)計(jì)我真正的自己完成了對(duì)給定要求系統(tǒng)的硬件設(shè)計(jì)、電路設(shè)計(jì)、電路板設(shè)計(jì)、軟件設(shè)計(jì)以及對(duì)成品的調(diào)試過(guò)程。從整個(gè)過(guò)程中學(xué)習(xí)到了很多方面的知識(shí),了解到以往學(xué)習(xí)中自己知識(shí)在某方面的不足之處,是對(duì)以往學(xué)習(xí)科目的一種貫穿和承接,從而能更好的認(rèn)識(shí)和學(xué)習(xí),也對(duì)將來(lái)從事工作大有裨益。</p><p>  在試驗(yàn)

81、過(guò)程中,充分的讓理論和實(shí)踐進(jìn)行了結(jié)合。實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),確實(shí)只有在實(shí)踐中,才能讓理論知識(shí)得以實(shí)現(xiàn),這也是工科所期望的成果,在這次試驗(yàn)里,讓我們更具象的認(rèn)識(shí)理論,對(duì)學(xué)習(xí)有莫大的幫助。</p><p>  從本次課設(shè)中我也看到了自身的很多不足之處,對(duì)知識(shí)的掌握不夠扎實(shí),有一知半解的現(xiàn)象。有時(shí)做事不夠穩(wěn)定,過(guò)于毛躁,不能平心靜氣的去分析所遇到的問(wèn)題和錯(cuò)誤。這在以后的工作和生活中是不可取的,通過(guò)對(duì)自身問(wèn)題的認(rèn)識(shí)與

82、改正相信再遇到同樣問(wèn)題時(shí)會(huì)更好的解決。以后的設(shè)計(jì)實(shí)驗(yàn)也會(huì)更好的完成。</p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 徐維祥、劉旭敏. 單片微型機(jī)原理及應(yīng)用. 大連:大連理工大學(xué)出版社,1996</p><p>  [2] 李光飛、樓然苗、胡佳文、謝象佐. 單片機(jī)課程設(shè)計(jì)與實(shí)例指導(dǎo). 北京: 北京航空航天大學(xué)出版社,2

83、004 </p><p>  [3] 余永權(quán). 89系列FLASH單片機(jī)原理及應(yīng)用. 北京:電子工業(yè)出版社,2002</p><p>  [4] 劉巖川、董玉華、劉忠富、韓志敏.單片機(jī)原理及系統(tǒng)設(shè)計(jì).北京:電子工業(yè)出版社,2014</p><p>  附錄1 系統(tǒng)硬件電路圖</p><p><b>  附錄2 實(shí)物圖</b&g

84、t;</p><p><b>  附錄3 程序清單</b></p><p>  #include<reg51.h></p><p>  #include<intrins.h></p><p>  #define uint unsigned int</p><p>  #d

85、efine uchar unsigned char</p><p>  #define ulong unsigned long</p><p>  uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};</p><p>  uchar i=1,j=0;&

86、lt;/p><p>  uchar key,temp;</p><p><b>  uchar e;</b></p><p>  uint ss[8];</p><p>  uint b=0,A,H,result,k=1;</p><p>  sbit E=P2^3;//1602使能引腳</

87、p><p>  sbit RW=P3^6;//1602讀寫(xiě)引腳</p><p>  sbit RS=P2^4;//1602數(shù)據(jù)/命令選擇引腳</p><p>  void Delay_1ms(uint i)//1ms延時(shí)</p><p><b>  {</b></p><p><b

88、>  uint x,j;</b></p><p>  for (j=0;j<i;j++);</p><p>  for (x=0;x<=148;x++);</p><p><b>  }</b></p><p>  void delay()</p><p><

89、b>  {</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b>&l

90、t;/p><p><b>  _nop_();</b></p><p><b>  }</b></p><p>  bit Busy(void)</p><p><b>  {</b></p><p>  bit busy_flag = 0;</p&g

91、t;<p><b>  RS = 0;</b></p><p><b>  RW = 1;</b></p><p><b>  E = 1;</b></p><p><b>  delay();</b></p><p>  busy_flag

92、 = (bit)(P0 & 0x80);</p><p><b>  E = 0;</b></p><p>  return busy_flag;</p><p><b>  }</b></p><p>  void wcmd(uchar del)</p><p>&

93、lt;b>  {</b></p><p>  while(Busy());</p><p><b>  RS = 0;</b></p><p><b>  RW = 0;</b></p><p><b>  E = 0;</b></p><

94、p><b>  delay();</b></p><p><b>  P0 = del;</b></p><p><b>  delay();</b></p><p><b>  E = 1;</b></p><p><b>  delay

95、();</b></p><p><b>  E = 0;</b></p><p><b>  }</b></p><p>  void wdata(uchar del)</p><p><b>  {</b></p><p>  while(

96、Busy());</p><p><b>  RS = 1;</b></p><p><b>  RW = 0;</b></p><p><b>  E = 0;</b></p><p><b>  delay();</b></p><

97、p><b>  P0 = del;</b></p><p><b>  delay();</b></p><p><b>  E = 1;</b></p><p><b>  delay();</b></p><p><b>  E = 0

98、;</b></p><p><b>  }</b></p><p>  void L1602_init(void)</p><p><b>  {</b></p><p>  wcmd(0x38);</p><p>  Delay_1ms(5);</p>

99、;<p>  wcmd(0x38);</p><p>  Delay_1ms(5);</p><p>  wcmd(0x38);</p><p>  Delay_1ms(5);</p><p>  wcmd(0x38);</p><p>  wcmd(0x08);</p><p>

100、;  wcmd(0x0c);</p><p>  wcmd(0x04);</p><p>  wcmd(0x01);</p><p><b>  }</b></p><p>  void L1602_char(uchar hang,uchar lie,char sign)</p><p><

101、b>  {</b></p><p><b>  uchar a;</b></p><p>  if(hang == 1) a = 0x80;</p><p>  if(hang == 2) a = 0xc0;</p><p>  a = a + lie - 1;</p><p>

102、<b>  wcmd(a);</b></p><p>  wdata(sign);</p><p><b>  }</b></p><p>  void L1602_string(uchar hang,uchar lie,uchar *p)</p><p><b>  {</b>

103、;</p><p>  uchar a,b=0;</p><p>  if(hang == 1) a = 0x80;</p><p>  if(hang == 2) a = 0xc0;</p><p>  a = a + lie - 1;</p><p><b>  while(1)</b><

104、;/p><p><b>  {</b></p><p>  wcmd(a++);</p><p><b>  b++;</b></p><p>  if((*p == '\0')||(b==16)) break;</p><p>  wdata(*p);</

105、p><p><b>  p++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  uint exp(uint m) //位數(shù)函數(shù)</p><p><b>  {</b>&l

106、t;/p><p><b>  uint n=1;</b></p><p><b>  while(m)</b></p><p><b>  {</b></p><p><b>  n=n*10;</b></p><p><b>

107、;  --m;</b></p><p><b>  }</b></p><p><b>  return n;</b></p><p><b>  }</b></p><p>  uint f(uint g[],uint d)//結(jié)果函數(shù)</p>

108、<p><b>  {</b></p><p>  uint m=0,i,j;</p><p>  for (i=0;i<d;++i)</p><p><b>  {</b></p><p><b>  j=d-i-1;</b></p><p

109、>  m=m+g[i]*(exp(j));</p><p>  } return m;</p><p><b>  }</b></p><p>  uint length(uint z) //判斷得數(shù)長(zhǎng)度函數(shù)</p><p><b>  {</b></p><p&g

110、t;<b>  uint n=1;</b></p><p>  while(z>10)</p><p><b>  {</b></p><p><b>  z=z/10;</b></p><p><b>  n++;</b></p>&

111、lt;p><b>  }</b></p><p><b>  return n;</b></p><p><b>  }</b></p><p>  void show(uint h) //顯示得數(shù)函數(shù)</p><p><b>  {</b>&

112、lt;/p><p>  uint n,i,dat;</p><p>  n=length(h);</p><p>  for(i=n;i>0;--i)</p><p>  { dat=h/(exp(i-1));</p><p>  L1602_char(2,k++,dat + 48);</p>&l

113、t;p>  h=h%(exp(i-1));</p><p><b>  }</b></p><p><b>  }</b></p><p>  void keyscan() //矩陣鍵盤(pán)</p><p><b>  {</b></p><p

114、><b>  P3=0xfe;</b></p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {</b></p><

115、;p>  Delay_1ms(10);</p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {</b></p><p><b

116、>  temp=P3;</b></p><p>  switch(temp)</p><p><b>  {</b></p><p>  case 0xee: key=1; break;</p><p>  case 0xde: key=2; break;</p><p> 

117、 case 0xbe: key=3; break;</p><p>  case 0x7e: key=15; break;</p><p><b>  }</b></p><p>  while(temp!=0xf0)</p><p><b>  {</b></p><p&g

118、t;<b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p><b>  }</b></p><p>  if(key>=1&&key<=3)</p><p><b>  {</b></p

119、><p>  L1602_char(1,i,key + 48);</p><p><b>  i++;</b></p><p>  ss[b]=key;</p><p><b>  b++;</b></p><p>  Delay_1ms(300);</p><

120、;p><b>  }</b></p><p>  if(key==15)</p><p><b>  {</b></p><p>  L1602_string(1,i++,"/");</p><p><b>  e='/';</b>&l

121、t;/p><p>  A=f(ss,b);</p><p><b>  b=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p>&l

122、t;p><b>  P3=0xfd;</b></p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {</b></p>

123、<p>  Delay_1ms(10);</p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {</b></p><p>&l

124、t;b>  temp=P3;</b></p><p>  switch(temp)</p><p><b>  {</b></p><p>  case 0xed: key=4; break;</p><p>  case 0xdd: key=5; break;</p><p&g

125、t;  case 0xbd: key=6; break;</p><p>  case 0x7d: key=14; break;</p><p><b>  }</b></p><p>  while(temp!=0xf0)</p><p><b>  {</b></p><

126、p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p><b>  }</b></p><p>  if(key>=4&&key<=6)</p><p><b>  {</b><

127、;/p><p>  L1602_char(1,i,key + 48);</p><p><b>  i++;</b></p><p>  ss[b]=key;</p><p><b>  b++;</b></p><p>  Delay_1ms(300);</p>

128、<p><b>  }</b></p><p>  if(key==14)</p><p><b>  {</b></p><p>  L1602_string(1,i++,"*");</p><p><b>  e='*';</b>

129、;</p><p>  A=f(ss,b);</p><p><b>  b=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p>

130、<p><b>  P3=0xfb;</b></p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {</b></p&g

131、t;<p>  Delay_1ms(10);</p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {</b></p><p&g

132、t;<b>  temp=P3;</b></p><p>  switch(temp)</p><p><b>  {</b></p><p>  case 0xeb: key=7; break;</p><p>  case 0xdb: key=8; break;</p><

133、;p>  case 0xbb: key=9; break;</p><p>  case 0x7b: key=13; break;</p><p><b>  }</b></p><p>  while(temp!=0xf0)</p><p><b>  {</b></p>

134、<p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p><b>  }</b></p><p>  if(key>=7&&key<=9)</p><p><b>  {</b>

135、;</p><p>  L1602_char(1,i,key + 48);</p><p><b>  i++;</b></p><p>  ss[b]=key;</p><p><b>  b++;</b></p><p>  Delay_1ms(300);</p&g

136、t;<p><b>  }</b></p><p>  if(key==13)</p><p><b>  {</b></p><p>  L1602_string(1,i++,"-");</p><p><b>  e='-';</

137、b></p><p>  A=f(ss,b);</p><p><b>  b=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p&

138、gt;<p><b>  P3=0XF7;</b></p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {</b></

139、p><p>  Delay_1ms(10);</p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p>  if(temp!=0xf0)</p><p><b>  {</b></p><

140、p><b>  temp=P3;</b></p><p>  switch(temp)</p><p><b>  {</b></p><p>  case 0xe7: key=10; break;</p><p>  case 0xd7: key=0; break;</p>&

141、lt;p>  case 0xb7: key=11; break;</p><p>  case 0x77: key=12; break;</p><p><b>  }</b></p><p>  while(temp!=0xf0)</p><p><b>  {</b></p>

142、<p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p><b>  }</b></p><p>  if(key==12)</p><p><b>  {</b></p><p&g

143、t;  L1602_string(1,i++,"+");</p><p><b>  e='+';</b></p><p>  A=f(ss,b);</p><p><b>  b=0;</b></p><p><b>  }</b><

144、/p><p>  if(key==11)</p><p><b>  {</b></p><p>  L1602_string(1,i++,"=");</p><p><b>  e='=';</b></p><p>  A=f(ss,b);&

145、lt;/p><p><b>  b=0;</b></p><p><b>  }</b></p><p>  if(key==11) //=</p><p><b>  {</b></p><p>  H=f(ss,b);</p><

146、;p><b>  b=0;</b></p><p><b>  switch(e)</b></p><p><b>  {</b></p><p>  case '+': result=A+H; break;</p><p>  case '-&#

147、39;: result=A-H; break;</p><p>  case '*': result=A*H; break;</p><p>  case '/': result=A/H; break;</p><p>  default: result=H;</p><p><b>  }</

148、b></p><p>  L1602_string(1,i++,"=");</p><p>  show(result);</p><p><b>  }</b></p><p>  if(key==10) //清零</p><p><b>  {<

149、/b></p><p>  wcmd(0x01);</p><p>  wcmd(0x80);</p><p><b>  b=0;</b></p><p><b>  i=1;</b></p><p><b>  k=1;</b></p&g

150、t;<p><b>  }</b></p><p>  if(key==0)</p><p><b>  {</b></p><p>  L1602_char(1,i,key + 48);</p><p><b>  i++;</b></p><

151、;p>  ss[b]=key;</p><p><b>  b++;</b></p><p>  Delay_1ms(300);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  

152、} </b></p><p><b>  }</b></p><p>  void main() //主函數(shù)</p><p><b>  {</b></p><p>  L1602_init();</p><p><b>  while

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論