版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計(jì)簡(jiǎn)易計(jì)算器
- 單片機(jī)課程設(shè)計(jì)-簡(jiǎn)易計(jì)算器
- 單片機(jī)課程設(shè)計(jì)簡(jiǎn)易計(jì)算器
- 單片機(jī)課程設(shè)計(jì)--簡(jiǎn)易計(jì)算器
- 課程設(shè)計(jì)---單片機(jī)簡(jiǎn)易計(jì)算器設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告---簡(jiǎn)易計(jì)算器
- 單片機(jī)課程設(shè)計(jì)報(bào)告-簡(jiǎn)易計(jì)算器
- 單片機(jī)課程設(shè)計(jì)--簡(jiǎn)易數(shù)字計(jì)算器
- 簡(jiǎn)易計(jì)算器單片機(jī)課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)---簡(jiǎn)易計(jì)算器的設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告-- 簡(jiǎn)易計(jì)算器設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--簡(jiǎn)易計(jì)算器的設(shè)計(jì)
- 基于51單片機(jī)簡(jiǎn)易計(jì)算器課程設(shè)計(jì)
- 單片機(jī)計(jì)算器課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--計(jì)算器
- 單片機(jī)課程設(shè)計(jì)-計(jì)算器
- 課程設(shè)計(jì)-單片機(jī)計(jì)算器
- 簡(jiǎn)易計(jì)算器設(shè)計(jì)-單片機(jī)原理及應(yīng)用課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告--簡(jiǎn)易計(jì)算器的設(shè)計(jì)、制作
- 單片機(jī)簡(jiǎn)易計(jì)算器設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論