第一篇:單片機(jī)計算器課程設(shè)計報告
基于單片機(jī)的簡易計算器設(shè)計
基于單片機(jī)的簡易計算器設(shè)計
一、設(shè)計任務(wù)和性能指標(biāo)
1.1設(shè)計任務(wù)
利用單片機(jī)及外圍接口電路(鍵盤接口和顯示接口電路)設(shè)計制作一個計算器,用四位一體數(shù)碼管顯示計算數(shù)值及結(jié)果。要求用Protel 畫出系統(tǒng)的電路原理圖(要求以最少組件,實現(xiàn)系統(tǒng)設(shè)計所要求的功能),繪出程序流程圖,并給出程序清單(要 求思路清晰,盡量簡潔,主程序和子程序分開,使程序有較強(qiáng)的可讀性)。1.2性能指標(biāo)
1加法:能夠計算四位以內(nèi)的數(shù)的加法。2減法:能計算四位數(shù)以內(nèi)的減法。3乘法:能夠計算兩位數(shù)以內(nèi)的乘法。
4除法:能夠計算四位數(shù)的乘法
5有清零功能,能隨時對運(yùn)算結(jié)果和數(shù)字輸入進(jìn)行清零。
二、系統(tǒng)設(shè)計方案
按照系統(tǒng)設(shè)計的功能的要求,初步確定設(shè)計系統(tǒng)由單片機(jī)主控模塊、四位一體數(shù)碼管顯示模塊、鍵掃描接口電路共三個主要模塊組成。主控芯片使用51系列AT89C51單片機(jī),采用高性能的靜態(tài)80C51設(shè)計,它由先進(jìn)工藝制造,并帶有非易失性Flash程序存儲器。它是一種高性能、低功耗的8位COMS微處理芯片,市場應(yīng)用最多。
鍵盤電路采用4*4矩陣鍵盤電路。
顯示模塊采用四位一體共陽極數(shù)碼管和SN74LS244鎖存芯片構(gòu)成等器件構(gòu)成。
三、硬件系統(tǒng)設(shè)計
1.單片機(jī)最小系統(tǒng)
單片機(jī)最小系統(tǒng)就是支持主芯片正常工作的最小電路部分,包括主控芯片、復(fù)位電路和晶振電路。
主控芯片選取STC89C51RC芯片,因其具有良好的性能及穩(wěn)定性,價格便宜應(yīng)用方便。
晶振選取11.0592MHz,晶振旁電容選取30pF。
采用按鍵復(fù)位電路,電阻分別選取100Ω和10K,電容選取10μF。單片機(jī)最小系統(tǒng)硬件電路圖如圖(1)所示。
圖(1)單片機(jī)最小系統(tǒng)
2.鍵盤接口電路
計算器所需按鍵有:
數(shù)字鍵:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’
功能鍵:’+’, ’-‘ , ’*’, ’/ ’ , ’ = ’, ’ C(清零)’
共計16個按鍵,采用4*4矩陣鍵盤,鍵盤的行和列之間都有公共端相連,四行采用端口P0.0~P0.3,四列采用端口P3.0~P3.3,通過8個端口的的高低電平完成對矩陣鍵盤的控制。通過對16個按鍵進(jìn)行編碼,從而得到鍵盤的口地址,對比P1口德掃描結(jié)果和各按鍵的地址,我們就可以得到是哪個鍵按下,從而完成鍵盤的功能。
3.?dāng)?shù)碼管顯示電路
采用4位一體的數(shù)碼管對計算數(shù)據(jù)和結(jié)果進(jìn)行顯示,這里選取共陽數(shù)碼管,利用NPN三極管對數(shù)碼管進(jìn)行驅(qū)動,為了節(jié)省I/O資源,采取動態(tài)顯示的方法來顯示計算數(shù)據(jù)及結(jié)果。
利用SN74LS244N鎖存器來實現(xiàn)數(shù)碼管的動態(tài)顯示,P1口輸出顯示值,P2.0~P2.3為位選端口。通過鎖存器對段選信號的鎖存,最終得到對數(shù)碼管輸入數(shù)據(jù)的控制。
以下為數(shù)碼顯示電路的硬件電路圖,左圖為數(shù)碼管驅(qū)動電路,右圖為段選信號鎖存電路。
四.軟件設(shè)計部分
根據(jù)選題要求,系統(tǒng)編程如下所示: #include “reg51.h” sbit P3_0=P3^0;sbit P3_1=P3^1;sbit P3_2=P3^2;sbit P3_3=P3^3;sbit P3_4=P3^4;sbit P3_5=P3^5;sbit P3_6=P3^6;sbit P3_7=P3^7;unsigned char sz[11],xs1[4],xs2[4],sj;int i,cs,bb,t1,t2,fh,s1,s2;void chushihua(){
} void xianshi(unsigned char xs[4]){ int i,j;unsigned char zy;bb=1;xs1[0]=10;xs1[1]=10;xs1[2]=10;xs1[3]=10;xs2[0]=10;xs2[1]=10;xs2[2]=10;xs2[3]=10;t1=0;t2=0;s1=s2=0;fh=0;cs=1;
// zy=0x08;for(i=0;i<4;i++){ P2=(0xff-zy);
P1=sz[xs[i]];
} zy=(zy>>1);for(j=0;j<100;j++);
for(i=0;i<100;i++);return;} unsigned char saomiao(){
int i,j;unsigned char pp;for(i=0;i<1000;i++);P0=0xfe;P3=0x0f;pp=P3;if(P3_0==0)if(P3_1==0)if(P3_2==0)if(P3_3==0)
{P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return 7;} {P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return 8;} {P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return 9;} {P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return 11;} //==========1 P0=0xfd;P3=0x0f;pp=P3;if(P3_0==0){P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return 4;} if(P3_1==0){P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return 5;} if(P3_2==0){P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return 6;} if(P3_3==0){P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return 12;} //==========2 P0=0xfb;P3=0x0f;pp=P3;if(P3_0==0){P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return 1;} if(P3_1==0){P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return 2;} if(P3_2==0){P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return 3;} if(P3_3==0){P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return 13;} //==========3 P0=0xf7;P3=0x0f;
pp=P3;if(P3_0==0)if(P3_1==0)if(P3_2==0)if(P3_3==0)return 10;
{P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return 16;} {P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return 0;} {P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return 15;} {P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return 14;} //===========4 } void chuli(unsigned char x){
int i;if(x==16){
} cs=0;return;if(x>=0 && x<10){ if(bb==1)
{
} if(s1= =4){cs=0;return;} else { for(i=3;i>0;i--)xs1[i]=xs1[i-1];
} xs1[0]=x;s1++;t1=t1*10+x;if(bb==2){
if(s2==4){cs=0;return;} else {
} for(i=3;i>0;i--)xs2[i]=xs2[i-1];xs2[0]=x;s2++;t2=t2*10+x;} } if(x>10)
{
if(bb==1){fh=x;bb=2;return;} if(bb==2){ if(fh==11)t1=t1/t2;
if(fh==12)t1=t1*t2;if(fh==13)t1=t1-t2;if(fh==14)t1=t1+t2;if(t1>=10000){cs=0;return;} else { if(t1>=0 && t1<10)
{xs1[0]=t1;xs1[1]=10;xs1[2]=10;xs1[3]=10;}
if(t1>=10 && t1<100){xs1[0]=t1%10;xs1[1]=t1/10;xs1[2]=10;xs1[3]=10;}
if(t1>=100 && t1<1000)
{xs1[0]=t1%10;xs1[1]=(t1-(t1/100)*100)/10;xs1[2]=t1/100;xs1[3]=10;}
if(t1>=1000 && t1<10000)
{xs1[0]=t1%10;xs1[1]=t1%100/10;xs1[2]=(t1-(t1/1000)*1000)/100;xs1[3]=t1/1000;}
bb=2;
}
}
} s2=0;t2=0;xs2[0]=10;xs2[1]=10;xs2[2]=10;xs2[3]=10;fh=x;} void main(){
sz[0]=0xfc;sz[1]=0x60;sz[2]=0xda;sz[3]=0xf2;sz[4]=0x66;sz[5]=0xb6;sz[6]=0xbe;sz[7]=0xe0;sz[8]=0xfe;sz[9]=0xf6;sz[10]=0x00;cs=0;
for(;;)
{
if(cs==0)chushihua();if(cs==1)sj=saomiao();if(cs==1 && sj!=10)chuli(sj);if(cs==1 &&(bb==1 || bb==2 && s2==0))xianshi(xs1);if(cs==1 &&(bb==2 && s2!=0))xianshi(xs2);
} } 軟件設(shè)計好后,在KEIL上面進(jìn)行仿真,把仿真得到的文件下載到Proteus里面進(jìn)行仿真,得到Proteus仿真電路圖如下所示:
圖(2)
計算器Proteus仿真電路圖
五.硬件電路焊接及調(diào)試
根據(jù)電路圖紙,焊接好硬件電路,把程序下載到單片機(jī)芯片,接通好電源,進(jìn)行調(diào)試。在焊接好器件后,先不要將芯片插在芯片座上,要先驗證先板上電源是否好用,有無短路等。接上USB電源,用萬用表測量個芯片座對應(yīng)電源和地之間的電壓值,觀察電壓值是否正常。一切正常后方可將芯片插入芯片座,以繼續(xù)測試其他功能。
將芯片插上后,對各個模塊進(jìn)行調(diào)試,按鍵是否工作正常,數(shù)碼管是否顯示正常等。編寫相關(guān)部分的測試程序?qū)ζ溥M(jìn)行測試。
各部分硬件檢測無誤后,下載程序進(jìn)行整體調(diào)試,一切正常后,結(jié)束調(diào)試過程。
用所設(shè)計的單片機(jī)進(jìn)行數(shù)字計算,顯示結(jié)果與任務(wù)要求一致,焊接電路符合要求。六.課程設(shè)計心得
兩周的時間,終于把單片機(jī)課程設(shè)計搞完了。整個體會還是比較多的。首先是題目的選擇,各方面的原因,自己還是想選個簡單點(diǎn)的題目,不過最后選來選去,還是選擇了計算器。由于自己對單片機(jī)編程還不是很熟悉,結(jié)果在設(shè)計的時候遇到了一系列問題,程序總是調(diào)試部處理,不過還好,最后在同學(xué)的幫助下終于把程序調(diào)試出來了,雖然程序設(shè)計實現(xiàn)的功能與老師要求的不盡相同,不過勉強(qiáng)還算可以。從這里我知道了基本知識的重要性。其實進(jìn)行程序設(shè)計的時候主要是對各功能模塊的把握。計算器里面最難的一部分是矩陣鍵盤的掃描和編碼,那個費(fèi)了很大力氣。
另外一點(diǎn)就是硬件焊接調(diào)試部分。焊接的時候到時輕松,一個下午就焊接好了,然后是調(diào)試部分。調(diào)試花費(fèi)的時間還是比較長的。不過有了上個學(xué)期數(shù)字電路焊接調(diào)試的經(jīng)驗,這次單片機(jī)調(diào)試還算是比較順利。我也是從電路板的正負(fù)電源檢測起,一步一步來,最終得到了想要的結(jié)果。調(diào)試的時候主要遇到了兩個問題。一個是鍵盤總是沒有反應(yīng),為了這個自己調(diào)試了很久,前前后后把電路板檢查了幾次,最后才發(fā)現(xiàn)是鍵盤本身的問題,和同學(xué)們換了個好鍵盤才行。另一個問題是總是顯示不出來1、4、7這三個數(shù)字。檢測來檢測去,發(fā)現(xiàn)來是在測試最小系統(tǒng)時在一個位選端接了高電平,對位選信號產(chǎn)生了影響。當(dāng)把那個高電平去掉后,終于得到了正確的結(jié)果。
總的來說這次課程設(shè)計達(dá)到了完成了基本任務(wù),達(dá)到了基本要求。通過親身對程序設(shè)計和電路焊接調(diào)試的體會,自己對單片機(jī)有了進(jìn)一步的了解,單片機(jī)編程能力也得到了提高。電路板的焊接與調(diào)試,使自己電路調(diào)試的方法和思想進(jìn)一步加強(qiáng)了。這次單片機(jī)課程設(shè)計應(yīng)該說是比較成功的。
參考文獻(xiàn):
【1】徐維祥、劉旭敏:,《單片微型機(jī)原理及應(yīng)用》,大連理工大學(xué)出版社,1996年。【2】李光飛、樓然苗、胡佳文、謝象佐.,《單片機(jī)課程設(shè)計與實例指導(dǎo).》,北京航空航天大學(xué)出版社,2004年。
【3】余永權(quán),《89系列FLASH單片機(jī)原理及應(yīng)用.》,電子工業(yè)出版社,2002。【4】楊恢先、黃輝先,《單片機(jī)原理及應(yīng)用》,人民郵電出版社,2006年。【5】常敏、王涵、范江波,《單片機(jī)應(yīng)用程序開發(fā)與實踐》,電子工業(yè)出版社,2009年。
第二篇:單片機(jī)計算器課程設(shè)計報告
大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
機(jī)電信息工程學(xué)院
單片機(jī)系統(tǒng)課程設(shè)計報告
完成日期:2010年5月31日
系: 專
業(yè): 班
級: 設(shè)計題目: 學(xué)生姓名: 指導(dǎo)教師:
多功能簡易計算器
大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
目
錄
一、設(shè)計任務(wù)和性能指標(biāo)......................................................................2
1.1設(shè)計任務(wù)..............................................................................................................................2 1.2性能指標(biāo)..............................................................................................................................2 二.設(shè)計方案.............................................................................................2 三.系統(tǒng)硬件設(shè)計.....................................................................................3
3.1單片機(jī)最小系統(tǒng)......................................................................................3 3.2鍵盤接口電路.....................................................................................................................3 3.3數(shù)碼管顯示電路.................................................................................................................4 3.4錯誤報警電路.....................................................................................................................5
四、系統(tǒng)軟件設(shè)計..................................................................................6
4.1鍵盤掃描子程序設(shè)計..........................................................................................................6 4.2移位子程序及結(jié)果計算子程序設(shè)計................................................................................10 4.3顯示子程序設(shè)計...............................................................................................................12 4.4主程序設(shè)計.......................................................................................................................13
五、調(diào)試及性能分析............................................................................13
5.1調(diào)試步驟...........................................................................................................................13 5.2性能分析...........................................................................................................................14
六、心得體會........................................................................................14 參考文獻(xiàn)................................................................................................14 附錄1 系統(tǒng)硬件電路圖.......................................................................15 附錄2 程序清單.................................................................................16
大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
一、設(shè)計任務(wù)和性能指標(biāo)
1.1設(shè)計任務(wù)
利用單片機(jī)及外圍接口電路(鍵盤接口和顯示接口電路)設(shè)計制作一個計算器,用LED顯示計算數(shù)值及結(jié)果。
要求用Protel 畫出系統(tǒng)的電路原理圖(要求以最少組件,實現(xiàn)系統(tǒng)設(shè)計所要求的功能),印刷電路板(要求布局合理,線路清晰),繪出程序流程圖,并給出程序清單(要求思路清晰,盡量簡潔,主程序和子程序分開,使程序有較強(qiáng)的可讀性)。1.2性能指標(biāo)
1.2.3.4.5.加法:四位加法,計算結(jié)果若超過四位則顯示計算錯誤 減法:四位減法,計算結(jié)果若小于零則顯示計算錯誤 乘法:個位數(shù)乘法 除法:整數(shù)除法
有清零功能,計算錯誤報警
二.設(shè)計方案
按照系統(tǒng)設(shè)計的功能的要求,初步確定設(shè)計系統(tǒng)由主控模塊、顯示模塊、錯誤報警模塊、鍵掃描接口電路共四個模塊組成,電路系統(tǒng)構(gòu)成框圖如圖1.1所示。主控芯片使用51系列AT89C52單片機(jī),采用高性能的靜態(tài)80C51設(shè)計,由先進(jìn)工藝制造,并帶有非易失性Flash程序存儲器。它是一種高性能、低功耗的8位COMS微處理芯片,市場應(yīng)用最多。
鍵盤電路采用4*4矩陣鍵盤電路。
顯示模塊采用4枚共陽極數(shù)碼管和74ls273鎖存芯片構(gòu)成等器件構(gòu)成。
錯誤報警電路采用5V蜂鳴器。
大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
三.系統(tǒng)硬件設(shè)計
3.1單片機(jī)最小系統(tǒng)
單片機(jī)最小系統(tǒng)就是支持主芯片正常工作的最小電路部分,包括主控芯片、復(fù)位電路和晶振電路。
主控芯片選取STC89C52RC芯片,因其具有良好的性能及穩(wěn)定性,價格便宜應(yīng)用方便。
晶振選取11.0592MHz,晶振旁電容選取30pF。
采用按鍵復(fù)位電路,電阻分別選取100Ω和10K,電容選取10μF。以下為單片機(jī)最小系統(tǒng)硬件電路圖。
單片機(jī)最小系統(tǒng)硬件電路
3.2鍵盤接口電路
計算器所需按鍵有:
數(shù)字鍵:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’ 大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
功能鍵:’+’, ’-‘ , ’*’, ’/ ’ , ’ = ’, ’ C(清零)’
共計16個按鍵,采用4*4矩陣鍵盤,鍵盤的行和列之間都有公共端相連,四行和四列的8個公共端分別接P1.0~P1.7,這樣掃描P1口就可以完成對矩陣鍵盤的掃描,通過對16個按鍵進(jìn)行編碼,從而得到鍵盤的口地址,對比P1口德掃描結(jié)果和各按鍵的地址,我們就可以得到是哪個鍵按下,從而完成鍵盤的功能。
以下為鍵盤接口電路的硬件電路圖
鍵盤接口電路
3.3數(shù)碼管顯示電路
采用4位數(shù)碼管對計算數(shù)據(jù)和結(jié)果的顯示,這里選取共陽數(shù)碼管,利用NPN三極管對數(shù)碼管進(jìn)行驅(qū)動,為了節(jié)省I/O資源,采取動態(tài)顯示的方法來顯示計算數(shù)據(jù)及結(jié)果。
利用74273鎖存器來實現(xiàn)數(shù)碼管的動態(tài)顯示,P0口輸出顯示值,P2.4為段選口,控制273鎖存器的時鐘引腳,從而得到對數(shù)碼管輸入數(shù)據(jù)的控制。
P2.0~P2.3用來作為位選端,控制哪幾位數(shù)碼管進(jìn)行顯示。
以下為數(shù)碼顯示電路的硬件電路圖
大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
數(shù)碼顯示電路硬件電路圖
3.4錯誤報警電路
錯誤報警電路就是在計算結(jié)果出現(xiàn)錯誤時或輸入數(shù)據(jù)出現(xiàn)錯誤時,發(fā)出聲音警報,提示使用者錯誤出現(xiàn)。
這里就采用5V蜂鳴器作為報警設(shè)備,利用PNP三極管對蜂鳴器進(jìn)行驅(qū)動,有P2.5對其進(jìn)行控制,這樣在出現(xiàn)錯誤的同時用P2.5輸出低,就可以使蜂鳴器工作,完成報警任務(wù)。
以下為報警電路硬件電路圖
大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
報警電路硬件電路圖
系統(tǒng)整體硬件電路圖見附錄一
四、系統(tǒng)軟件設(shè)計
4.1鍵盤掃描子程序設(shè)計
要進(jìn)行數(shù)據(jù)的計算就必須先進(jìn)行數(shù)據(jù)的輸入,也就必須確定按鍵輸入的數(shù)值是什么,這就需要對鍵盤進(jìn)行掃描,從而確定究竟是哪個鍵按下。
對于鍵盤的掃描,既可以用行掃描也可以用列掃描,這里采用行掃描的方法來完成對鍵盤的掃描。
行掃描就是逐行掃描鍵盤,看是哪一行有鍵按下,再通過返回的鍵碼來確定究竟是哪個按鍵按下。如對第一行掃描就令P1.0為低,P1口其余為高,這樣若第一行有鍵按下,則P1口的值就會由0xfe變?yōu)槠渌担儆蛇@個值來確定是哪個鍵按下。
以下為鍵盤掃描子程序的程序清單。
uchar keyscan(){
int i;
P1=0xfe;
temp=P1;
temp=temp&0xf0;大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
while(temp!=0xf0){
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:{rdat++;num=1;left(rdat,num);}
break;
case 0xde:{rdat++;num=2;left(rdat,num);}
break;
case 0xbe:{rdat++;num=3;left(rdat,num);}
break;
case 0x7e:{rdat++;num=4;left(rdat,num);}
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
} } P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0){
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:{rdat++;num=5;left(rdat,num);}
break;
case 0xdd:{rdat++;num=6;left(rdat,num);}
break;大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
}
case 0xbd:{rdat++;num=7;left(rdat,num);}
break;
case 0x7d:{rdat++;num=8;left(rdat,num);}
break;} while(temp!=0xf0){
temp=P1;
temp=temp&0xf0;} }
P1=0xfb;temp=P1;temp=temp&0xf0;while(temp!=0xf0){
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:{rdat++;num=9;left(rdat,num);}
break;
case 0xdb:{rdat++;num=10;left(rdat,num);}
break;
case 0xbb:{equ();}
break;
case 0x7b:{rdat=0;add=0;subb=0;mul=0;div=0;
result=0;
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
}
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
} 大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
} }
P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0){
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:{rdat=0;add=1;subb=0;mul=0;div=0;
for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
}
break;
case 0xd7:{rdat=0;add=0;subb=1;mul=0;div=0;
for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
}
break;
case 0xb7:{rdat=0;add=0;subb=0;mul=1;div=0;
for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
}
break;
case 0x77:{rdat=0;add=0;subb=0;mul=0;div=1;大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
} return num;}
} while(temp!=0xf0){
temp=P1;
temp=temp&0xf0;} }
for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
} break;4.2移位子程序及結(jié)果計算子程序設(shè)計
輸入數(shù)據(jù)要存儲在一四位數(shù)組內(nèi),而我們鍵入的值是數(shù)據(jù)的高位,后鍵入的值是低位,這樣我們就需要在輸入低位數(shù)值時將高位數(shù)值從數(shù)組的低位移向數(shù)組的高位,這就是編寫移位子程序的目的。
對于結(jié)果計算子程序,包含加、減、乘、除四種運(yùn)算。以加法運(yùn)算為例,各種運(yùn)算各有其標(biāo)志位來代表計算類型,當(dāng)加法標(biāo)志位add=1是,就將輸入的兩個數(shù)據(jù)按照加法進(jìn)行計算。
首先將數(shù)組內(nèi)的數(shù)按照對應(yīng)的位關(guān)系,將其轉(zhuǎn)化為一個十進(jìn)制數(shù),這樣我們就得到了加速和被加數(shù)這樣倆個十進(jìn)制數(shù),從而我們就可以簡單的將兩個數(shù)進(jìn)行相加,結(jié)果就是我們所求的數(shù)值。但這個數(shù)值不能直接顯示到數(shù)碼管上,我們還要對其進(jìn)行處理,使其變?yōu)閷?yīng)進(jìn)位的四個數(shù)存入數(shù)組內(nèi),以便顯示。既通過對結(jié)果數(shù)值分別除以1000、100、10和對10取余,得到我們想要的四個數(shù),送顯示子程序顯示。其余減、乘、除的計算方法與加法的計算方法一樣,這里不再累述。
以下為移位子程序和結(jié)果計算子程序的程序清單。
void left(uchar rx,uchar date){
switch(rx)
{
case 1:dat[0]=date;break;大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
void equ(){
int i,j,k;
long int s;
if(add==1){for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
result=result+s;add=0;}
if(subb==1){for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
result=result-s;subb=0;}
if(mul==1){for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
result=result*s;mul=0;
}
if(div==1){for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
result=result/s;div=0;
}
If(result>9999){dat[0]=11;dat[3]=dat[2]=dat[1]=0;}
if(result<=9999)
{
dat[0]=result%10;
dat[1]=(result/10)%10;
dat[2]=(result/100)%10;
dat[3]=(result/1000)%10;
} for(j=3;j>0;j--)
{ if(dat[j]>0)
{
case 2:dat[1]=dat[0],dat[0]=date;break;
case 3:dat[2]=dat[1],dat[1]=dat[0],dat[0]=date;break;
case 4:dat[3]=dat[2],dat[2]=dat[1],dat[1]=dat[0],dat[0]=date;break;
} } 大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
for(k=j-1;k>=0;k--)
{
if(dat[k]==0){dat[k]=10;}
}
}
} if(dat[0]==0){dat[0]=10;} } 4.3顯示子程序設(shè)計
從始至終無論是輸入的計算數(shù)據(jù),還是計算后的結(jié)果值。都存儲在同一數(shù)組dat[ ]中,這樣我們只要在顯示時一直調(diào)用dat[ ]中的值,就能正確的顯示數(shù)據(jù)。
以下為顯示子程序的程序清單。
void display(){
uchar aa;
keyscan();
P2=0x07;
aa=dat[0];
P0=table[aa];
P2=0x27;
delay(3);
P2=0x0b;
aa=dat[1];
P0=table[aa];
P2=0x2b;
delay(3);
P2=0x0d;
aa=dat[2];
P0=table[aa];
P2=0x2d;
delay(3);
P2=0x0e;
aa=dat[3];
P0=table[aa];
P2=0x2e;
delay(3);
} 大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
4.4主程序設(shè)計
主程序既把以上各子程序串連成一個整體,使整個程序循環(huán)運(yùn)行。而在以上程序中也已經(jīng)加入了個程序之間的連接點(diǎn),首先進(jìn)入程序后就立即進(jìn)入顯示子程序,而顯示子程序內(nèi)又調(diào)用鍵盤掃描子程序,若有鍵按下,則會跳轉(zhuǎn)到移位子程序和結(jié)果計算子程序進(jìn)行相應(yīng)的處理。通過計算或移位后,數(shù)組內(nèi)的值發(fā)生改變,顯示的值也會同時發(fā)生改變。之后再進(jìn)行鍵盤掃描,如此反復(fù)運(yùn)行,就構(gòu)成了程序的整體。
以下為主程序清單。
void main(){ num=0;
while(1)
{
display();
} }
整體程序清單見附錄二。
五、調(diào)試及性能分析
5.1調(diào)試步驟
在焊接好器件后,先不要將芯片插在芯片座上,要先驗證先板上電源是否好用,有無短路等。接上USB電源,用萬用表測量個芯片座對應(yīng)電源和地之間的電壓值,觀察電壓值是否正常。一切正常后方可將芯片插入芯片座,以繼續(xù)測試其他功能。
將芯片插上后,對各個模塊進(jìn)行調(diào)試,按鍵是否工作正常,數(shù)碼管是否顯示正常等。編寫相關(guān)部分的測試程序?qū)ζ溥M(jìn)行測試。
各部分硬件檢測無誤后,下載程序進(jìn)行整體調(diào)試,一切正常后,結(jié)束調(diào)試過程。
在具體調(diào)試時首先遇到的問題是程序無法下載進(jìn)入單片機(jī),通過將電路板接線與原理電路圖接線的對比發(fā)現(xiàn),串口芯片與單片機(jī)連接的輸入,輸出接反,重新用銅線連接后,依然無法下載程序。后找到原因是由于下載串口與設(shè)計封裝不符,用相對應(yīng)的下載線可以下載。
成功下載程序后,發(fā)現(xiàn)數(shù)碼管顯示不正確,查看后發(fā)現(xiàn)有先沒有連接,可能是制板時漏印,連接后顯示正常。大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
5.2性能分析
對于計算器的性能,主要的衡量指標(biāo)就在于計算的精度,本次制作的計算器性能情況如下:
加法運(yùn)算:四位加法運(yùn)算,和值不超過9999,若超過上限,則顯示錯誤提示E,蜂鳴器報警提示。
減法運(yùn)算:四位減法運(yùn)算,若結(jié)果為負(fù),對其取絕對值。
乘法運(yùn)算:積不超過9999的乘法運(yùn)算,若超出上限,顯示錯誤提示E,蜂鳴器報警提示。
除法運(yùn)算:整數(shù)除法,既計算結(jié)果為整數(shù),若除數(shù)為零,則顯示錯誤提示E,蜂鳴器報警提示。
通過對實際性能的分析,可以得到本次設(shè)計滿足設(shè)計的要求。
六、心得體會
通過本次課程設(shè)計我真正的自己完成了對給定要求系統(tǒng)的硬件設(shè)計、電路設(shè)計、電路板設(shè)計、軟件設(shè)計以及對成品的調(diào)試過程。從整個過程中學(xué)習(xí)到了很多方面的知識,了解到以往學(xué)習(xí)中自己知識在某方面的不足之處,是對以往學(xué)習(xí)科目的一種貫穿和承接,從而能更好的認(rèn)識和學(xué)習(xí),也對將來從事工作大有裨益。
從本次課設(shè)中我也看到了自身的很多不足之處,對知識的掌握不夠扎實,有一知半解的現(xiàn)象。有時做事不夠穩(wěn)定,過于毛躁,不能平心靜氣的去分析所遇到的問題和錯誤。這在以后的工作和生活中是不可取的,通過對自身問題的認(rèn)識與改正相信再遇到同樣問題時會更好的解決。以后的設(shè)計實驗也會更好的完成。
參考文獻(xiàn)
[1] 徐維祥、劉旭敏.單片微型機(jī)原理及應(yīng)用.大連:大連理工大學(xué)出版社,1996 [2] 李光飛、樓然苗、胡佳文、謝象佐.單片機(jī)課程設(shè)計與實例指導(dǎo).北京: 北京航空航天大學(xué)出版社,2004
[3] 余永權(quán).89系列FLASH單片機(jī)原理及應(yīng)用.北京:電子工業(yè)出版社,2002 [4] 李群芳,黃建.單片機(jī)微型計算機(jī)與接口技術(shù).北京:電子工業(yè)出版社,2001 [5] 樓然苗、李光飛.51系列單片機(jī)設(shè)計實例.北京:北京航空航天大學(xué)出版社,2003 大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
附錄1 系統(tǒng)硬件電路圖 大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
附錄2 程序清單
#include
for(y=110;y>0;y--);}
void display();void main(){ num=0;
while(1)
{
display();
} } void display(){
uchar aa;
keyscan();
P2=0x07;
aa=dat[0];大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
P0=table[aa];
P2=0x27;
delay(3);
P2=0x0b;
aa=dat[1];
P0=table[aa];
P2=0x2b;
delay(3);
P2=0x0d;
aa=dat[2];
P0=table[aa];
P2=0x2d;
delay(3);
P2=0x0e;
aa=dat[3];
P0=table[aa];
P2=0x2e;
delay(3);
} uchar keyscan(){
int i;
P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:{rdat++;num=1;left(rdat,num);}
break;
case 0xde:{rdat++;num=2;left(rdat,num);}
break;
case 0xbe:{rdat++;num=3;left(rdat,num);}
break;大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
}
case 0x7e:{rdat++;num=4;left(rdat,num);}
break;} while(temp!=0xf0){
temp=P1;
temp=temp&0xf0;} } P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0){
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:{rdat++;num=5;left(rdat,num);}
break;
case 0xdd:{rdat++;num=6;left(rdat,num);}
break;
case 0xbd:{rdat++;num=7;left(rdat,num);}
break;
case 0x7d:{rdat++;num=8;left(rdat,num);}
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
} }
P1=0xfb;temp=P1;大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
temp=temp&0xf0;while(temp!=0xf0){
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:{rdat++;num=9;left(rdat,num);}
break;
case 0xdb:{rdat++;num=10;left(rdat,num);}
break;
case 0xbb:{equ();}
break;
case 0x7b:{rdat=0;add=0;subb=0;mul=0;div=0;
result=0;
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
}
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
} }
P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0){
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
{
case 0xe7:{rdat=0;add=1;subb=0;mul=0;div=0;
for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
}
break;
case 0xd7:{rdat=0;add=0;subb=1;mul=0;div=0;
for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
}
break;
case 0xb7:{rdat=0;add=0;subb=0;mul=1;div=0;
for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
}
break;
case 0x77:{rdat=0;add=0;subb=0;mul=0;div=1;
for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
}
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
} 大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
} return num;}
void left(uchar rx,uchar date){
switch(rx)
{
case 1:dat[0]=date;break;
case 2:dat[1]=dat[0],dat[0]=date;break;
case 3:dat[2]=dat[1],dat[1]=dat[0],dat[0]=date;break;
case 4:dat[3]=dat[2],dat[2]=dat[1],dat[1]=dat[0],dat[0]=date;break;
} }
void equ(){ int i,j,k;long int s;
if(add==1){for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
result=result+s;add=0;} if(subb==1){for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
if(s>result){result=s-result;} else result=result-s;subb=0;} if(mul==1){for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
result=result*s;mul=0;
} 大連民族學(xué)院2007級電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計報告
if(div==1){for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
if(s==0)result=10000;
else result=result/s;div=0;
} if(result>9999){dat[0]=11;dat[3]=dat[2]=dat[1]=0;} if(result<=9999){ dat[0]=result%10;dat[1]=(result/10)%10;dat[2]=(result/100)%10;dat[3]=(result/1000)%10;} for(j=3;j>0;j--)
{ if(dat[j]>0)
{
for(k=j-1;k>=0;k--)
{
if(dat[k]==0){dat[k]=10;}
}
}
}
if(dat[0]==0){dat[0]=10;} } 22
第三篇:java課程設(shè)計報告—計算器
1--計算器 Java實習(xí)報告
目錄
一、課程設(shè)計目的.................................................................................................................2
二、課程設(shè)計任務(wù)..................................................................................................................2
2.1、設(shè)計任務(wù)................................................................................................................2
2.2、課程設(shè)計要求:....................................................................................................2
2.3、需求分析................................................................................................................2
三、開發(fā)工具與平臺.............................................................................................................3
3.1、開發(fā)工具................................................................................................................3
3.2、開發(fā)平臺................................................................................................................3
四、設(shè)計思路..........................................................................................................................4
4.1、界面設(shè)計.................................................................................................................4
4.2.1、邏輯設(shè)計.............................................................................................................4
4.2.2、程序流程圖...........................................................................................................5
4.2.3、主要代碼展示及說明............................................................................................5
4.3、程序測試............................................................................................................10
五、實驗小結(jié)........................................................................................................................11
六、附錄(程序代碼)..........................................................................................................12
頁
第 1--計算器 Java實習(xí)報告
一、課程設(shè)計目的
1、熟練掌握java面向?qū)ο缶幊獭?/p>
2、選擇合適的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)需求。
3、熟練使用各種控制結(jié)構(gòu)。
4、GUI組件、事件處理技術(shù)。
二、課程設(shè)計任務(wù)
2.1、設(shè)計任務(wù)
設(shè)計一個簡易的計算器,可以進(jìn)行四則運(yùn)算:加、減、乘、除等(限于十進(jìn)制下)
程序要求:
(1)應(yīng)具有相應(yīng)的界面,可參考Windows操作系統(tǒng)自帶的計算器界面。(2)操作符號定為:“+”,“-”,“*”,“/”,“+/-”等。(按國際慣例設(shè)計)(3)用戶通過點(diǎn)擊程序界面上按鈕,實現(xiàn)數(shù)字、運(yùn)算符的輸入操作。(4)以上部分為必須完成的內(nèi)容。選作部分:
(1)具有操作符號“1/x”,“sqrt”(開方),“.”(小數(shù)功能)等。
2.2、課程設(shè)計要求:
(1)應(yīng)用自己所學(xué)課程知識完成對計算器的基本任務(wù)。
(2)查閱相關(guān)資料,學(xué)習(xí)和掌握項目中涉及的新知識,提高自學(xué)能力。
(3)通過應(yīng)用java程序編寫計算器來提升自己對簡單的圖形界面有一定的掌握和了解。
2.3、需求分析
1.設(shè)計的計算器可以完成加法、減法、乘法、除法的簡單運(yùn)算。2.實現(xiàn)一些簡單的擴(kuò)展運(yùn)算,如:正負(fù)號、倒數(shù)、退格、清零等功能。
頁
第 2--計算器 Java實習(xí)報告3.添加小數(shù)點(diǎn)功能,用以實現(xiàn)浮點(diǎn)型數(shù)據(jù)的計算。
4.使用布局管理器設(shè)計一個計算器的界面,使用事件監(jiān)聽器處理數(shù)據(jù)的輸入,并完成相關(guān)的計算。
三、開發(fā)工具與平臺
3.1、開發(fā)工具
Microsoft Windows 7旗艦版
3.2、開發(fā)平臺
JDK1.6.0-02 和UE編譯器
頁
第 3--計算器 Java實習(xí)報告
四、設(shè)計思路
4.1、界面設(shè)計:(如圖3-1)
圖3-1
4.2.1、邏輯設(shè)計:
(1)根據(jù)所設(shè)計出來的界面,首先要設(shè)計其GUI界面,總體界面有一個文本框,20個按鈕,總體界面用BorderLayout布局,文本框放置在最NORTH,然后0到9以及+,-,*,/等按鈕放置到一個面板Panel中,完成界面設(shè)計。
(2)設(shè)計計算流程,首先點(diǎn)擊數(shù)字按鈕時,將按鈕數(shù)值添加到文本框當(dāng)中,并將該數(shù)值保存到一個字符串中,再次點(diǎn)擊數(shù)字按鈕時,將之前保存的字符串與新的數(shù)值拼接起來,再添加到文本框當(dāng)中,直到點(diǎn)擊運(yùn)算符按鈕時,將文本框當(dāng)中的字符串保存在一個字符串變量中,然后重置文本框內(nèi)容,將運(yùn)算符號顯示到文本框中,隨后輸入第二個計算數(shù)據(jù)時,用同樣的辦法保存數(shù)據(jù),最后通過控制“=”運(yùn)算符先將字符串?dāng)?shù)據(jù)轉(zhuǎn)化成雙精度類型,然后計算出結(jié)果并顯示到文本框當(dāng)中。
(3)基本運(yùn)算設(shè)計完成以后則開始考慮其他個別功能的實現(xiàn),例如倒數(shù)、清零、退格等功能的實現(xiàn),清零直接重置文本框內(nèi)容,退格功能則采用substring函數(shù)截取字符串長度。
頁
第 4--計算器 Java實習(xí)報告
4.2.2、程序流程圖:
4.2.3、主要代碼展示及說明: 總體代碼的設(shè)計:
程序采用繼承windowadapter類,新建Jframe窗體,利用數(shù)組來定義JBotton按鈕,同時利用數(shù)組注冊監(jiān)聽,采用4行5列網(wǎng)格布局,完成計算器界面的基本設(shè)置,在窗體的正常關(guān)閉方面,采用匿名類實現(xiàn)窗體的正常關(guān)閉。最后對按鈕進(jìn)行計算分析,分別設(shè)定輸入數(shù)據(jù)的A類、運(yùn)算符控制的Opertion類,退格功能的BackSpace類、計算結(jié)果的Result類等等,一步步實現(xiàn)計算器的基本功能!
(1)類A的設(shè)計(數(shù)據(jù)的輸入)
class A implements ActionListener { public void actionPerformed(ActionEvent e){
String a = Jtext.getText();
String s = e.getActionCommand();
if(a.equals(“0.”)||a.equals(“+”)||a.equals(“-”)||a.equals(“*”)||a.equals(“/”))
頁
第 5--計算器 Java實習(xí)報告
}
} Jtext.setText(s);else { if(flag2){
Jtext.setText(s);
flag2=false;} else
Jtext.setText(a+s);}
功能解釋:程序開始時,程序初始化文本框的內(nèi)容為“0.”,點(diǎn)擊數(shù)字按鈕,則調(diào)用類A,首先用a來獲取當(dāng)前文本框內(nèi)容,s來獲取按鈕數(shù)值,然后進(jìn)行判斷,若a的值為上述代碼的值則輸出s的值,再次點(diǎn)擊數(shù)字按鈕時,再次調(diào)用A類,此時a的值為上次輸入的s值,第一個if語句不滿足,執(zhí)行下個if語句if(flag2),flag2初始值為false,該語句的功能是在執(zhí)行了“=”號按鈕時,防止新的數(shù)字按鈕的值合并到到已經(jīng)得出的結(jié)果上,例如:12+12=24,此時再點(diǎn)擊數(shù)字按鈕3時,則文本框內(nèi)容被重置,輸出數(shù)值3,而不是243,如果if(flag2)不滿足,則將字符串a(chǎn)和s合并并輸出,得出第一個要計算的數(shù)據(jù)。
(2)類Opertion的設(shè)計:(運(yùn)算符的控制)
class Opertion implements ActionListener { public void actionPerformed(ActionEvent e){
cal=e.getActionCommand();
if(flag1==true)
x=Jtext.getText();
Jtext.setText(cal);
flag1=false;}
頁
第 6--計算器 Java實習(xí)報告 }
功能解釋:當(dāng)點(diǎn)擊運(yùn)算符控制按鈕時,首先將運(yùn)算符的數(shù)值賦值給cal(初值為空),緊接著進(jìn)行判斷,flag1初值為ture,該類的作用為在點(diǎn)擊運(yùn)算符按鈕時,將計算的第一個數(shù)據(jù)保存在x字符串變量當(dāng)中,然后將文本框內(nèi)容重置為點(diǎn)擊的運(yùn)算符的數(shù)值,類的結(jié)尾將flag1賦值為false,防止再次點(diǎn)擊運(yùn)算符按鈕時改變了x的值。
(附:此時文本框內(nèi)容為運(yùn)算符的值,輸入第二個計算數(shù)據(jù)時,點(diǎn)擊數(shù)字按鈕,則再次調(diào)用A類,此時滿足A類中第一個if語句,文本框內(nèi)容被重置為數(shù)字按鈕的值,接下來與獲取第一個計算數(shù)據(jù)步驟一樣,直到點(diǎn)擊“=”號運(yùn)算符為止!)
(3)類Result的設(shè)計:(計算并輸出結(jié)果)
class Result implements ActionListener //計算并顯示結(jié)果 { public void actionPerformed(ActionEvent e){
double num1;
num1=Double.parseDouble(x);
y=Jtext.getText();
double num2;
num2=Double.parseDouble(y);
double result=0;
if(num2!=0)
{
if(cal.equals(“+”))
result=num1+num2;
if(cal.equals(“-”))
result=num1-num2;
if(cal.equals(“*”))
result=num1*num2;
String s1=Double.toString(result);
Jtext.setText(s1);
}
if(cal.equals(“/”))
頁
第 7--計算器 Java實習(xí)報告
} {
if(num2==0)
Jtext.setText(“除數(shù)不能為0”);
else
{
result=num1/num2;
String s1=Double.toString(result);
Jtext.setText(s1);
} }
flag1=true;
flag2=true;} 功能解釋:首先定義兩個Double型num1,num2,將之前保存的第一個計算數(shù)據(jù)x強(qiáng)制轉(zhuǎn)換為Double型后賦值給num1,接著用字符串變量y來獲取當(dāng)前文本框的內(nèi)容,即第二個計算數(shù)據(jù)的值,同樣再將其強(qiáng)制轉(zhuǎn)換Double型后賦值給num2,然后進(jìn)行運(yùn)算符判斷,對cal的值進(jìn)行比較,然后進(jìn)行相應(yīng)的計算,將計算的結(jié)果轉(zhuǎn)換成字符串后將其輸出到文本框中,在類的最后將flag1、flag2賦值為true,作用是將計算的結(jié)果當(dāng)作第二次計算的數(shù)據(jù)進(jìn)行再運(yùn)算,即將結(jié)果重新賦值給x作為第一個計算數(shù)據(jù)!(附:在此類中還考慮了當(dāng)除數(shù)為零的情況。)
(4)類BackSpace的設(shè)計:(功能類—退格)
class BackSpace implements ActionListener { public void actionPerformed(ActionEvent e){
String s = e.getActionCommand();
String s1 = Jtext.getText();
if(s.equals(“退格”))
s1=new String(s1.substring(0,s1.length()-1));
Jtext.setText(s1);} }
頁
第 8--計算器 Java實習(xí)報告
功能解釋:這是計算器附加功能的實現(xiàn),這里只介紹退格功能,像正負(fù)號、求倒數(shù)、清零等功能相似,所以就不再一一介紹。首先獲取退格按鈕的命令值賦給s,然后獲取當(dāng)前文本框的內(nèi)容,即輸入的數(shù)據(jù),將其賦給s1,接著進(jìn)行判斷,利用substring函數(shù)將s1字符串截取為從第一個字符至倒數(shù)第二個字符為止的字符串并重新賦值給s1,再將其輸出到文本框,實現(xiàn)退格的功能。
第 9
頁 10--計算器 Java實習(xí)報告
4.3、程序測試
1.簡單的運(yùn)算:(以加法為例:123+456)
分析:計算的結(jié)果為579.0,為雙精度型,計算的結(jié)果被設(shè)置在文本框的最右端,該計算器的一個特點(diǎn)是可直接在文本框中輸入數(shù)據(jù)以及進(jìn)行更改。
2.倒數(shù)的運(yùn)算:(以123為例)
分析:輸出的結(jié)果如圖所示,倒數(shù)功能實現(xiàn),計算時,不僅是結(jié)果,輸入的數(shù)據(jù)同樣可以先實現(xiàn)倒數(shù)功能后再進(jìn)行相應(yīng)的計算,沒有影響!
3.退格的運(yùn)算:(以123為例)
分析:輸出的結(jié)果如圖所示,本計算器退格鍵有一個特點(diǎn)是,就算是是計算后得出的結(jié)果也能實現(xiàn)退格,缺點(diǎn)是不能很好的處理小數(shù)點(diǎn)的問題,因為小數(shù)點(diǎn)也是字符串的一部分。
頁
第 10--計算器 Java實習(xí)報告
4.正負(fù)號的運(yùn)算:(以123為例)
分析:輸出的結(jié)果如圖所示,正負(fù)號添加能夠很好的實現(xiàn),但可以進(jìn)行一些改進(jìn),比如在計算過程當(dāng)中直接點(diǎn)擊負(fù)號運(yùn)算符輸入負(fù)數(shù)進(jìn)行計算!
5.總體分析:
該計算器基本運(yùn)算沒有問題,清零、正負(fù)號、求倒數(shù)、退格功能都能很好的實現(xiàn),總體能完成一個計算器的基本功能,但仍有許多地方需要改進(jìn),比如小數(shù)點(diǎn)的實現(xiàn)所存在的一些問題,雖然在基本的運(yùn)算過程當(dāng)中不會造成太大影響,但這依然不能認(rèn)為是一個很好的計算器,同時,在另一方面,該計算器還沒能很好的實現(xiàn)連續(xù)計算的功能,必須每次按下等號按鈕計算出結(jié)果后才能用產(chǎn)生的結(jié)果接著進(jìn)行下一次的計算,改進(jìn)的方法是在運(yùn)算符上同時注冊Result類,讓運(yùn)算符同時擁有計算結(jié)果的功能。
五、實驗小結(jié)
本次課程設(shè)計到此算是告一段落了,經(jīng)過這次的學(xué)習(xí),我學(xué)到了很多東西,在此基礎(chǔ)上更加鞏固了自己對java的認(rèn)識與了解。
在做本項目是時候,會遇到很多小問題,比如說,在整個運(yùn)算過程中要如何確保輸入的計算數(shù)據(jù)哪個是第一個計算數(shù)據(jù)的,哪個是第二個計算
頁
第 11--計算器 Java實習(xí)報告數(shù)據(jù)的,同時也要區(qū)分運(yùn)算符,因為該計算器程序應(yīng)用的都是利用字符串來完成計算的,而且不能重復(fù)輸出運(yùn)算符,更不能將運(yùn)算符錯誤的存儲在了第一個計算數(shù)據(jù)的數(shù)值中,也得考慮到萬一不小心重復(fù)點(diǎn)擊了運(yùn)算符按鈕會不會造成第一個計算數(shù)據(jù)的重新賦值等等問題,最后想到利用布爾類型來很好的控制運(yùn)算符的應(yīng)用!
此次課程設(shè)計讓我更了解熟悉了Java中的圖形用戶界面和它的編程方式。在完成課題的過程中也不斷充實了自己,學(xué)習(xí)到了很多以前沒有學(xué)習(xí)到的知識,收獲很大。最大的收獲就是對大學(xué)學(xué)習(xí)的總結(jié)和培養(yǎng)了解決困難的信心和能力,使我對所學(xué)知識能夠融會貫通,又不斷豐富了新知識。Java計算器設(shè)計使得我們對所學(xué)的專業(yè)課有了更為深刻的認(rèn)識,使得知識得到了鞏固和提高。
在接下來的時間里,我覺得我要更加努力的往深一層次的方面看齊,了解更多有關(guān)java的知識,對java有更深一步的了解,我會一步一步的走下去!
六、附錄(程序代碼)import java.awt.*;import javax.swing.*;import java.awt.event.*;
public class TheCalculator extends WindowAdapter
//程序框架繼承自WindowAdapter類 { private JTextField Jtext=new JTextField(“0.”);private JFrame f=new JFrame(“計算器-趙磊”);private String x=“";private String y=”“;private String cal=”“;private boolean flag1=true;private boolean flag2=false;
public void init()//初始化
{
String[] buttonValue = new String[]{”1“,”2“,”3“,”+“,”C“,”4“,”5“,”6“,”-“,”退格
頁
第 12--計算器 Java實習(xí)報告“,”7“,”8“,”9“,”*“,”1/x“,”0“,”+/-“,”.“,”/“,”=“};
Container contain = f.getContentPane();
JPanel Jpan = new JPanel();
JButton[] Jb=new JButton[20];
contain.setLayout(new BorderLayout());//采用4行5列的網(wǎng)格布局
Jpan.setLayout(new GridLayout(4,5));
Jtext.setHorizontalAlignment(JTextField.RIGHT);
contain.add(Jtext,”North“);
contain.add(Jpan);
A num=new A();//數(shù)據(jù)
Result re=new Result();//結(jié)果
Opertion op=new Opertion();//運(yùn)算符
Clear cl=new Clear();//清零
BackSpace back=new BackSpace();//退格
CountDown count_d=new CountDown();//倒數(shù)
Strains stra=new Strains();//相反數(shù)
for(int i = 0;i { Jb[i] = new JButton(buttonValue[i]); Jpan.add(Jb[i]); if(i==3 || i==8 || i==13 || i==18) Jb[i].addActionListener(op); if(i==0 || i==1 || i==2 || i==5 || i==6 || i==7|| i==10 || i==11 || i==12 || i==15 || i==17) Jb[i].addActionListener(num); if((i==3||i==4||i==8||i==9)||((i>12)&&(i<=19))&&i!=15) Jb[i].setForeground(new Color(255, 0, 0)); else Jb[i].setForeground(new Color(0, 0, 255));//控制按鈕字體顏色 } Jb[4].addActionListener(cl); Jb[9].addActionListener(back); Jb[14].addActionListener(count_d); Jb[16].addActionListener(stra); Jb[19].addActionListener(re); f.setSize(320,240); f.setVisible(true); f.addWindowListener(//采用匿名類實現(xiàn)窗口的正常關(guān)閉 new WindowAdapter() 頁 第 13--計算器 Java實習(xí)報告 { public void windowClosing(WindowEvent e) { System.exit(0); } });} class A implements ActionListener //輸入數(shù)據(jù) { public void actionPerformed(ActionEvent e){ String a = Jtext.getText(); String s = e.getActionCommand(); if(a.equals(”0.“)||a.equals(”+“)||a.equals(”-“)||a.equals(”*“)||a.equals(”/“)) Jtext.setText(s); else { if(flag2) { Jtext.setText(s); flag2=false; } else Jtext.setText(a+s); } } } class Opertion implements ActionListener { public void actionPerformed(ActionEvent e){ cal=e.getActionCommand(); if(flag1==true) x=Jtext.getText(); Jtext.setText(cal); flag1=false;} } 頁 第 14--計算器 Java實習(xí)報告 class Clear implements ActionListener //清零功能 { public void actionPerformed(ActionEvent e){ Jtext.setText(”0.“);} } class CountDown implements ActionListener //求倒數(shù)類 { public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); String s1 = Jtext.getText(); if(s.equals(”1/x“)) s1 = new String(”“+1/Double.parseDouble(s1)); Jtext.setText(s1);} } class Strains implements ActionListener //求相反數(shù)類 { public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); String s1 = Jtext.getText(); if(s.equals(”+/-“)) s1=new String(”“+(0-Double.parseDouble(s1))); Jtext.setText(s1);} } class BackSpace implements ActionListener //退格功能 { public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); String s1 = Jtext.getText(); if(s.equals(”退格“)) s1=new String(s1.substring(0,s1.length()-1)); Jtext.setText(s1);} 頁 第 15--計算器 Java實習(xí)報告 } class Result implements ActionListener //計算并顯示結(jié)果 { public void actionPerformed(ActionEvent e){ double num1; num1=Double.parseDouble(x); y=Jtext.getText(); double num2; num2=Double.parseDouble(y); double result=0; if(num2!=0) { if(cal.equals(”+“)) result=num1+num2; if(cal.equals(”-“)) result=num1-num2; if(cal.equals(”*“)) result=num1*num2; String s1=Double.toString(result); Jtext.setText(s1); } if(cal.equals(”/“)) { if(num2==0) Jtext.setText(”除數(shù)不能為0"); else { result=num1/num2; String s1=Double.toString(result); Jtext.setText(s1); } } flag1=true; flag2=true;} } public static void main(String[] args)//main方法 { 頁 第 16--計算器 Java實習(xí)報告 } } TheCalculator count=new TheCalculator();count.init(); 頁 第 17 單片機(jī)課程設(shè)計報告 ? 課程名稱:單片機(jī)原理及接口課程設(shè)計 ? 題目:基于 ? 學(xué)院:電氣信息學(xué)院 ? 專業(yè)班級:測控技術(shù)與儀器 ? 姓名:江讓 ? 學(xué)號: ? 指導(dǎo)老師:劉升老師 ? 時間: C51單片機(jī)的ADC0809數(shù)模轉(zhuǎn)換103班1090640772013/1/16 單片機(jī)課程設(shè)計報告 題目:小直流電機(jī)調(diào)速實驗 教學(xué)單位: 機(jī) 電 工 程 系 專業(yè): 機(jī)械設(shè)計制造及其自動化 班級: 0803班學(xué)號: 0811050342姓名: 程懷虎 2011 年 11月 (以下內(nèi)容用宋體,五號,單倍行距)第四篇:單片機(jī)課程設(shè)計報告
第五篇:單片機(jī)課程設(shè)計報告