第一篇:Matlab課程設(shè)計(jì)報(bào)告(簡(jiǎn)單計(jì)算器)
1、設(shè)計(jì)目的
運(yùn)用MATLAB實(shí)現(xiàn)MATLAB的GUI程序設(shè)計(jì)。
2、題目分析
2.1課程設(shè)計(jì)的基本要求:
A.熟悉和掌握MATLAB 程序設(shè)計(jì)方法。B.掌握MATLAB GUI程序設(shè)計(jì)。2.2課程設(shè)計(jì)的內(nèi)容
要求利用MATLAB GUI設(shè)計(jì)實(shí)現(xiàn)一個(gè)圖形用戶界面的計(jì)算器程序,要求實(shí)現(xiàn): A.具有友好的用戶圖形界面。實(shí)現(xiàn)十進(jìn)制數(shù)的加、減、乘、除、乘方、取模等簡(jiǎn)單計(jì)算。
B.科學(xué)計(jì)算函數(shù),包括(反)正弦、(反)余弦、(反)正切、(反)余切、開方、指數(shù)等函數(shù)運(yùn)行。
C.能夠保存上次歷史計(jì)算的答案,顯示答案存儲(chǔ)器中的內(nèi)容。D.有清除鍵,能清除操作。
E.獨(dú)立存儲(chǔ)器功能,使之可以直接輸入存儲(chǔ)器,可與存儲(chǔ)器中的數(shù)值相加減。能夠清除獨(dú)立存儲(chǔ)器中的內(nèi)容。2.3題目分析
本題目通過(guò)MATLAB的GUI程序設(shè)計(jì)較為簡(jiǎn)單,在GUI設(shè)計(jì)中主要用到三種控件,顯示框用到文本編輯框(edit text),說(shuō)明框用到靜態(tài)文本框(Static text),數(shù)字以及運(yùn)算等按鈕用到命令按鈕(push button)。然后再通過(guò)各個(gè)按鈕的回調(diào)函數(shù),實(shí)現(xiàn)簡(jiǎn)單的計(jì)算功能。
3、總體設(shè)計(jì)
首先用MATLAB GUI功能,在繪制一個(gè)靜態(tài)文本框和一個(gè)文本編輯框,以及32個(gè)命令按鈕,調(diào)整好各控件大小、顏色,整體布局如圖所示:
然后通過(guò)雙擊個(gè)按鈕來(lái)改寫其屬性,在m文件中編寫其回調(diào)函數(shù),最后在運(yùn)行調(diào)試。
4、具體設(shè)計(jì) 4.1 各功能界面設(shè)計(jì) GUI設(shè)計(jì)界面:
4.2 各功能模塊實(shí)現(xiàn) 算法設(shè)計(jì):
A.數(shù)字鍵設(shè)計(jì):0—9以及小數(shù)點(diǎn)函數(shù)都一樣,只是參數(shù)不同: global jj textString = get(handles.text1,'String');if(strcmp(textString,'0.')==1)&(jj==0)set(handles.text1,'String','1');else
textString =strcat(textString,'1');set(handles.text1,'String',textString)end jj=0;B.四則運(yùn)算函數(shù):
textString = get(handles.text1,'String');textString =strcat(textString,'+');set(handles.text1,'String',textString)C.科學(xué)計(jì)算函數(shù):
textString = get(handles.text1,'String');if(strcmp(textString,'0.')==1)set(handles.text1,'String','0.');else
a = strread(textString, '%f');a=sin(a);set(handles.text1,'String',a)end 或
textString=handles.text1;textString=sin(str2num(get(handles.text1,'String'))*pi/180);set(handles.text1,'String',num2str(textString))D.退格鍵:通過(guò)取屏幕值,計(jì)算出其字符長(zhǎng)度,然后取其前N-1項(xiàng)的值來(lái)實(shí)現(xiàn)退格: global jj textString = get(handles.text1,'String');if(strcmp(textString,'0.')==1)&(jj==0)set(handles.text1,'String','0.');else
ss=char(textString);l=length(textString);textString=ss(1:l-1);set(handles.text1,'String',textString)end jj=0;E.清屏鍵函數(shù):
set(handles.text1,'String','0.');F.右鍵函數(shù):
gtext('大家好;我是智能機(jī)器人-my name is seven');close(gcf);4.3 各模塊實(shí)現(xiàn)結(jié)果 A.數(shù)字鍵:
B.四則運(yùn)算函數(shù):
C.科學(xué)計(jì)算函數(shù): Sin45的計(jì)算結(jié)果=
經(jīng)過(guò)計(jì)算,這些結(jié)果均與實(shí)際結(jié)果相吻合,計(jì)算器的功能實(shí)現(xiàn)的較為完好。5.2問(wèn)題和解決方法:
a.小數(shù)點(diǎn)可以連續(xù)輸入。解決方法是:用strfind函數(shù)查看文本框里有幾個(gè)小數(shù)點(diǎn),如果已經(jīng)有一個(gè)了,再按小數(shù)點(diǎn)就保持不變。b.按過(guò)運(yùn)算符號(hào)后一個(gè)數(shù)不等于一個(gè)數(shù),比如:輸入1,按等號(hào),會(huì)出來(lái)一個(gè)3,經(jīng)過(guò)長(zhǎng)時(shí)間分析得知,這是由于在按運(yùn)算符號(hào)時(shí),系統(tǒng)記錄了文本框里的數(shù)但沒(méi)有清空,才會(huì)出現(xiàn)這種問(wèn)題。解決方法是再申請(qǐng)一個(gè)不同于加減乘除的另一個(gè)符號(hào),并將按過(guò)運(yùn)算符后記錄的數(shù)值置0。
c.按對(duì)數(shù)函數(shù)鍵時(shí),負(fù)數(shù)也能運(yùn)算,通過(guò)加入if判斷語(yǔ)句來(lái)判斷輸入的值是否為負(fù),若為負(fù)則輸出error.6、心得體會(huì)
通過(guò)本次的MATLAB課程設(shè)計(jì),讓我對(duì)MATLAB尤其是其GUI設(shè)計(jì)的功能有了進(jìn)一步的了解,認(rèn)識(shí)到了它功能的強(qiáng)大。在MATLAB簡(jiǎn)單計(jì)算器的設(shè)計(jì)中,了解了關(guān)于MATLAB圖形用戶界面的部分控件的使用方法;利用MATLAB的GUI提供的很多實(shí)用的控件,方便用于設(shè)計(jì)屬于自己的圖形界面。
7、附錄(源代碼)
function varargout = jisuanqi(varargin)% JISUANQI M-file for jisuanqi.fig
% JISUANQI, by itself, creates a new JISUANQI or raises the existing % singleton*.%
% H = JISUANQI returns the handle to a new JISUANQI or the handle to % the existing singleton*.%
% JISUANQI('CALLBACK',hObject,eventData,handles,...)calls the local % function named CALLBACK in JISUANQI.M with the given input arguments.%
% JISUANQI('Property','Value',...)creates a new JISUANQI or raises the % existing singleton*.Starting from the left, property value pairs are % applied to the GUI before jisuanqi_OpeningFunction gets called.An % unrecognized property name or invalid value makes property application % stop.All inputs are passed to jisuanqi_OpeningFcn via varargin.%
% *See GUI Options on GUIDE's Tools menu.Choose “GUI allows only one % instance to run(singleton)”.%
% See also: GUIDE, GUIDATA, GUIHANDLES % Copyright 2002-2003 The MathWorks, Inc.% Edit the above text to modify the response to help jisuanqi % Last Modified by GUIDE v2.5 04-Dec-2012 17:06:43 % Begin initialization codeDO NOT EDIT
%---Executes just before jisuanqi is made visible.function jisuanqi_OpeningFcn(hObject, eventdata, handles, varargin)% This function has no output args, see OutputFcn.% hObject handle to figure
% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)% Get default command line output from handles structure varargout{1} = handles.output;
function edit1_Callback(hObject, eventdata, handles)% hObject handle to edit1(see GCBO)
% eventdata reservedto be defined in a future version of MATLAB % handles emptyto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)global jj
textString = get(handles.text1,'String');if(strcmp(textString,'0.')==1)&(jj==0)set(handles.text1,'String','1');else
textString =strcat(textString,'1');set(handles.text1,'String',textString)end jj=0;
%---Executes on button press in pushbutton2.function pushbutton2_Callback(hObject, eventdata, handles)% hObject handle to pushbutton2(see GCBO)
% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)global jj
textString = get(handles.text1,'String');
if(strcmp(textString,'0.')==1)&(jj==0)set(handles.text1,'String','3');else
textString =strcat(textString,'3');set(handles.text1,'String',textString)end jj=0;
%---Executes on button press in pushbutton13.function pushbutton13_Callback(hObject, eventdata, handles)% hObject handle to pushbutton13(see GCBO)
% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)global jj
textString = get(handles.text1,'String');if(strcmp(textString,'0.')==1)&(jj==0)set(handles.text1,'String','-');else
textString = get(handles.text1,'String');textString =strcat(textString,'-');set(handles.text1,'String',textString)end jj=0;
%---Executes on button press in pushbutton21.function pushbutton21_Callback(hObject, eventdata, handles)% hObject handle to pushbutton21(see GCBO)
% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)textString = get(handles.text1,'String');%strcmp(textString,'0.')textString=handles.text1;
textString=sin(str2num(get(handles.text1,'String'))*pi/180);set(handles.text1,'String',num2str(textString))%a = strread(textString, '%f')%textString=get(handles.text1,'String')%textString=strcat(textString,'sin')%set(handles.text1,'String',textString)%---Executes on button press in pushbutton23.function pushbutton23_Callback(hObject, eventdata, handles)% hObject handle to pushbutton23(see GCBO)
% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)global jj
textString = get(handles.text1,'String');if(strcmp(textString,'0.')==1)&(jj==0)set(handles.text1,'String','4');else
textString =strcat(textString,'4');set(handles.text1,'String',textString)end jj=0;
%---Executes on button press in pushbutton5.function pushbutton5_Callback(hObject, eventdata, handles)% hObject handle to pushbutton5(see GCBO)
% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)global jj
textString = get(handles.text1,'String');if(strcmp(textString,'0.')==1)&(jj==0)set(handles.text1,'String','6');else
textString =strcat(textString,'6');set(handles.text1,'String',textString)end jj=0;
%---Executes on button press in pushbutton15.function pushbutton15_Callback(hObject, eventdata, handles)% hObject handle to pushbutton15(see GCBO)
% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)global jj
textString = get(handles.text1,'String');if(strcmp(textString,'0.')==1)&(jj==0)set(handles.text1,'String','/');else
textString = get(handles.text1,'String');textString =strcat(textString,'/');set(handles.text1,'String',textString)end jj=0;
%---Executes on button press in pushbutton24.function pushbutton24_Callback(hObject, eventdata, handles)% hObject handle to pushbutton24(see GCBO)
% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)textString = get(handles.text1,'String');%strcmp(textString,'0.')textString=handles.text1;
textString=cos(str2num(get(handles.text1,'String'))*pi/180);set(handles.text1,'String',num2str(textString))%---Executes on button press in pushbutton26.function pushbutton26_Callback(hObject, eventdata, handles)% hObject handle to pushbutton26(see GCBO)
% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)global jj
textString = get(handles.text1,'String');if(strcmp(textString,'0.')==1)&(jj==0)set(handles.text1,'String','7');else
textString =strcat(textString,'7');set(handles.text1,'String',textString)end jj=0;
%---Executes on button press in pushbutton8.function pushbutton8_Callback(hObject, eventdata, handles)% hObject handle to pushbutton8(see GCBO)
% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)global jj
textString = get(handles.text1,'String');
if(strcmp(textString,'0.')==1)&(jj==0)set(handles.text1,'String','9');else
textString =strcat(textString,'9');set(handles.text1,'String',textString)end jj=0;
%---Executes on button press in pushbutton17.function pushbutton17_Callback(hObject, eventdata, handles)% hObject handle to pushbutton17(see GCBO)
% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)textString = get(handles.text1,'String');if(strcmp(textString,'0.')==1)set(handles.text1,'String',')');else
textString =strcat(textString,')');set(handles.text1,'String',textString)end
%---Executes on button press in pushbutton27.function pushbutton27_Callback(hObject, eventdata, handles)% hObject handle to pushbutton27(see GCBO)
% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)textString = get(handles.text1,'String');%strcmp(textString,'0.')textString=handles.text1;
textString=tan(str2num(get(handles.text1,'String'))*pi/180);set(handles.text1,'String',num2str(textString))%---Executes on button press in pushbutton29.function pushbutton29_Callback(hObject, eventdata, handles)% hObject handle to pushbutton29(see GCBO)
% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)
global jj
textString = get(handles.text1,'String');if(strcmp(textString,'0.')==1)&(jj==0)set(handles.text1,'String','0.');else
textString =strcat(textString,'0');set(handles.text1,'String',textString)end jj=0;
%---Executes on button press in pushbutton11.function pushbutton11_Callback(hObject, eventdata, handles)% hObject handle to pushbutton11(see GCBO)
% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)set(handles.text1,'String','0.');
%---Executes on button press in pushbutton19.function pushbutton19_Callback(hObject, eventdata, handles)% hObject handle to pushbutton19(see GCBO)
% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)textString=get(handles.text1,'String')s=eval(textString)
set(handles.text1,'String',s)
%---Executes on button press in pushbutton30.function pushbutton30_Callback(hObject, eventdata, handles)% hObject handle to pushbutton30(see GCBO)
% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)textString = get(handles.text1,'String');%strcmp(textString,'0.')textString=handles.text1;
textString=cot(str2num(get(handles.text1,'String'))*pi/180);set(handles.text1,'String',num2str(textString))%---Executes on button press in pushbutton32.function pushbutton32_Callback(hObject, eventdata, handles)% hObject handle to pushbutton32(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%open('1.bmp')
gtext('大家好;我是智能機(jī)器人-my name is seven');
%------function J_Callback(hObject, eventdata, handles)% hObject handle to J(see GCBO)
% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)close(gcf);
8、參考書目:
[1]《MATLAB語(yǔ)言及其在電子信息工程中的應(yīng)用》 王洪元主編 清華大學(xué)出版社
[2] 《MATLAB中GUI的應(yīng)用》 王洪元主編 清華大學(xué)出版社
第二篇:java課程設(shè)計(jì)報(bào)告—計(jì)算器
1--計(jì)算器 Java實(shí)習(xí)報(bào)告
目錄
一、課程設(shè)計(jì)目的.................................................................................................................2
二、課程設(shè)計(jì)任務(wù)..................................................................................................................2
2.1、設(shè)計(jì)任務(wù)................................................................................................................2
2.2、課程設(shè)計(jì)要求:....................................................................................................2
2.3、需求分析................................................................................................................2
三、開發(fā)工具與平臺(tái).............................................................................................................3
3.1、開發(fā)工具................................................................................................................3
3.2、開發(fā)平臺(tái)................................................................................................................3
四、設(shè)計(jì)思路..........................................................................................................................4
4.1、界面設(shè)計(jì).................................................................................................................4
4.2.1、邏輯設(shè)計(jì).............................................................................................................4
4.2.2、程序流程圖...........................................................................................................5
4.2.3、主要代碼展示及說(shuō)明............................................................................................5
4.3、程序測(cè)試............................................................................................................10
五、實(shí)驗(yàn)小結(jié)........................................................................................................................11
六、附錄(程序代碼)..........................................................................................................12
頁(yè)
第 1--計(jì)算器 Java實(shí)習(xí)報(bào)告
一、課程設(shè)計(jì)目的
1、熟練掌握java面向?qū)ο缶幊獭?/p>
2、選擇合適的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)需求。
3、熟練使用各種控制結(jié)構(gòu)。
4、GUI組件、事件處理技術(shù)。
二、課程設(shè)計(jì)任務(wù)
2.1、設(shè)計(jì)任務(wù)
設(shè)計(jì)一個(gè)簡(jiǎn)易的計(jì)算器,可以進(jìn)行四則運(yùn)算:加、減、乘、除等(限于十進(jìn)制下)
程序要求:
(1)應(yīng)具有相應(yīng)的界面,可參考Windows操作系統(tǒng)自帶的計(jì)算器界面。(2)操作符號(hào)定為:“+”,“-”,“*”,“/”,“+/-”等。(按國(guó)際慣例設(shè)計(jì))(3)用戶通過(guò)點(diǎn)擊程序界面上按鈕,實(shí)現(xiàn)數(shù)字、運(yùn)算符的輸入操作。(4)以上部分為必須完成的內(nèi)容。選作部分:
(1)具有操作符號(hào)“1/x”,“sqrt”(開方),“.”(小數(shù)功能)等。
2.2、課程設(shè)計(jì)要求:
(1)應(yīng)用自己所學(xué)課程知識(shí)完成對(duì)計(jì)算器的基本任務(wù)。
(2)查閱相關(guān)資料,學(xué)習(xí)和掌握項(xiàng)目中涉及的新知識(shí),提高自學(xué)能力。
(3)通過(guò)應(yīng)用java程序編寫計(jì)算器來(lái)提升自己對(duì)簡(jiǎn)單的圖形界面有一定的掌握和了解。
2.3、需求分析
1.設(shè)計(jì)的計(jì)算器可以完成加法、減法、乘法、除法的簡(jiǎn)單運(yùn)算。2.實(shí)現(xiàn)一些簡(jiǎn)單的擴(kuò)展運(yùn)算,如:正負(fù)號(hào)、倒數(shù)、退格、清零等功能。
頁(yè)
第 2--計(jì)算器 Java實(shí)習(xí)報(bào)告3.添加小數(shù)點(diǎn)功能,用以實(shí)現(xiàn)浮點(diǎn)型數(shù)據(jù)的計(jì)算。
4.使用布局管理器設(shè)計(jì)一個(gè)計(jì)算器的界面,使用事件監(jiān)聽器處理數(shù)據(jù)的輸入,并完成相關(guān)的計(jì)算。
三、開發(fā)工具與平臺(tái)
3.1、開發(fā)工具
Microsoft Windows 7旗艦版
3.2、開發(fā)平臺(tái)
JDK1.6.0-02 和UE編譯器
頁(yè)
第 3--計(jì)算器 Java實(shí)習(xí)報(bào)告
四、設(shè)計(jì)思路
4.1、界面設(shè)計(jì):(如圖3-1)
圖3-1
4.2.1、邏輯設(shè)計(jì):
(1)根據(jù)所設(shè)計(jì)出來(lái)的界面,首先要設(shè)計(jì)其GUI界面,總體界面有一個(gè)文本框,20個(gè)按鈕,總體界面用BorderLayout布局,文本框放置在最NORTH,然后0到9以及+,-,*,/等按鈕放置到一個(gè)面板Panel中,完成界面設(shè)計(jì)。
(2)設(shè)計(jì)計(jì)算流程,首先點(diǎn)擊數(shù)字按鈕時(shí),將按鈕數(shù)值添加到文本框當(dāng)中,并將該數(shù)值保存到一個(gè)字符串中,再次點(diǎn)擊數(shù)字按鈕時(shí),將之前保存的字符串與新的數(shù)值拼接起來(lái),再添加到文本框當(dāng)中,直到點(diǎn)擊運(yùn)算符按鈕時(shí),將文本框當(dāng)中的字符串保存在一個(gè)字符串變量中,然后重置文本框內(nèi)容,將運(yùn)算符號(hào)顯示到文本框中,隨后輸入第二個(gè)計(jì)算數(shù)據(jù)時(shí),用同樣的辦法保存數(shù)據(jù),最后通過(guò)控制“=”運(yùn)算符先將字符串?dāng)?shù)據(jù)轉(zhuǎn)化成雙精度類型,然后計(jì)算出結(jié)果并顯示到文本框當(dāng)中。
(3)基本運(yùn)算設(shè)計(jì)完成以后則開始考慮其他個(gè)別功能的實(shí)現(xiàn),例如倒數(shù)、清零、退格等功能的實(shí)現(xiàn),清零直接重置文本框內(nèi)容,退格功能則采用substring函數(shù)截取字符串長(zhǎng)度。
頁(yè)
第 4--計(jì)算器 Java實(shí)習(xí)報(bào)告
4.2.2、程序流程圖:
4.2.3、主要代碼展示及說(shuō)明: 總體代碼的設(shè)計(jì):
程序采用繼承windowadapter類,新建Jframe窗體,利用數(shù)組來(lái)定義JBotton按鈕,同時(shí)利用數(shù)組注冊(cè)監(jiān)聽,采用4行5列網(wǎng)格布局,完成計(jì)算器界面的基本設(shè)置,在窗體的正常關(guān)閉方面,采用匿名類實(shí)現(xiàn)窗體的正常關(guān)閉。最后對(duì)按鈕進(jìn)行計(jì)算分析,分別設(shè)定輸入數(shù)據(jù)的A類、運(yùn)算符控制的Opertion類,退格功能的BackSpace類、計(jì)算結(jié)果的Result類等等,一步步實(shí)現(xiàn)計(jì)算器的基本功能!
(1)類A的設(shè)計(jì)(數(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(“/”))
頁(yè)
第 5--計(jì)算器 Java實(shí)習(xí)報(bào)告
}
} Jtext.setText(s);else { if(flag2){
Jtext.setText(s);
flag2=false;} else
Jtext.setText(a+s);}
功能解釋:程序開始時(shí),程序初始化文本框的內(nèi)容為“0.”,點(diǎn)擊數(shù)字按鈕,則調(diào)用類A,首先用a來(lái)獲取當(dāng)前文本框內(nèi)容,s來(lái)獲取按鈕數(shù)值,然后進(jìn)行判斷,若a的值為上述代碼的值則輸出s的值,再次點(diǎn)擊數(shù)字按鈕時(shí),再次調(diào)用A類,此時(shí)a的值為上次輸入的s值,第一個(gè)if語(yǔ)句不滿足,執(zhí)行下個(gè)if語(yǔ)句if(flag2),flag2初始值為false,該語(yǔ)句的功能是在執(zhí)行了“=”號(hào)按鈕時(shí),防止新的數(shù)字按鈕的值合并到到已經(jīng)得出的結(jié)果上,例如:12+12=24,此時(shí)再點(diǎn)擊數(shù)字按鈕3時(shí),則文本框內(nèi)容被重置,輸出數(shù)值3,而不是243,如果if(flag2)不滿足,則將字符串a(chǎn)和s合并并輸出,得出第一個(gè)要計(jì)算的數(shù)據(jù)。
(2)類Opertion的設(shè)計(jì):(運(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;}
頁(yè)
第 6--計(jì)算器 Java實(shí)習(xí)報(bào)告 }
功能解釋:當(dāng)點(diǎn)擊運(yùn)算符控制按鈕時(shí),首先將運(yùn)算符的數(shù)值賦值給cal(初值為空),緊接著進(jìn)行判斷,flag1初值為ture,該類的作用為在點(diǎn)擊運(yùn)算符按鈕時(shí),將計(jì)算的第一個(gè)數(shù)據(jù)保存在x字符串變量當(dāng)中,然后將文本框內(nèi)容重置為點(diǎn)擊的運(yùn)算符的數(shù)值,類的結(jié)尾將flag1賦值為false,防止再次點(diǎn)擊運(yùn)算符按鈕時(shí)改變了x的值。
(附:此時(shí)文本框內(nèi)容為運(yùn)算符的值,輸入第二個(gè)計(jì)算數(shù)據(jù)時(shí),點(diǎn)擊數(shù)字按鈕,則再次調(diào)用A類,此時(shí)滿足A類中第一個(gè)if語(yǔ)句,文本框內(nèi)容被重置為數(shù)字按鈕的值,接下來(lái)與獲取第一個(gè)計(jì)算數(shù)據(jù)步驟一樣,直到點(diǎn)擊“=”號(hào)運(yùn)算符為止!)
(3)類Result的設(shè)計(jì):(計(jì)算并輸出結(jié)果)
class Result implements ActionListener //計(jì)算并顯示結(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(“/”))
頁(yè)
第 7--計(jì)算器 Java實(shí)習(xí)報(bào)告
} {
if(num2==0)
Jtext.setText(“除數(shù)不能為0”);
else
{
result=num1/num2;
String s1=Double.toString(result);
Jtext.setText(s1);
} }
flag1=true;
flag2=true;} 功能解釋:首先定義兩個(gè)Double型num1,num2,將之前保存的第一個(gè)計(jì)算數(shù)據(jù)x強(qiáng)制轉(zhuǎn)換為Double型后賦值給num1,接著用字符串變量y來(lái)獲取當(dāng)前文本框的內(nèi)容,即第二個(gè)計(jì)算數(shù)據(jù)的值,同樣再將其強(qiáng)制轉(zhuǎn)換Double型后賦值給num2,然后進(jìn)行運(yùn)算符判斷,對(duì)cal的值進(jìn)行比較,然后進(jìn)行相應(yīng)的計(jì)算,將計(jì)算的結(jié)果轉(zhuǎn)換成字符串后將其輸出到文本框中,在類的最后將flag1、flag2賦值為true,作用是將計(jì)算的結(jié)果當(dāng)作第二次計(jì)算的數(shù)據(jù)進(jìn)行再運(yùn)算,即將結(jié)果重新賦值給x作為第一個(gè)計(jì)算數(shù)據(jù)!(附:在此類中還考慮了當(dāng)除數(shù)為零的情況。)
(4)類BackSpace的設(shè)計(jì):(功能類—退格)
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);} }
頁(yè)
第 8--計(jì)算器 Java實(shí)習(xí)報(bào)告
功能解釋:這是計(jì)算器附加功能的實(shí)現(xiàn),這里只介紹退格功能,像正負(fù)號(hào)、求倒數(shù)、清零等功能相似,所以就不再一一介紹。首先獲取退格按鈕的命令值賦給s,然后獲取當(dāng)前文本框的內(nèi)容,即輸入的數(shù)據(jù),將其賦給s1,接著進(jìn)行判斷,利用substring函數(shù)將s1字符串截取為從第一個(gè)字符至倒數(shù)第二個(gè)字符為止的字符串并重新賦值給s1,再將其輸出到文本框,實(shí)現(xiàn)退格的功能。
第 9
頁(yè) 10--計(jì)算器 Java實(shí)習(xí)報(bào)告
4.3、程序測(cè)試
1.簡(jiǎn)單的運(yùn)算:(以加法為例:123+456)
分析:計(jì)算的結(jié)果為579.0,為雙精度型,計(jì)算的結(jié)果被設(shè)置在文本框的最右端,該計(jì)算器的一個(gè)特點(diǎn)是可直接在文本框中輸入數(shù)據(jù)以及進(jìn)行更改。
2.倒數(shù)的運(yùn)算:(以123為例)
分析:輸出的結(jié)果如圖所示,倒數(shù)功能實(shí)現(xiàn),計(jì)算時(shí),不僅是結(jié)果,輸入的數(shù)據(jù)同樣可以先實(shí)現(xiàn)倒數(shù)功能后再進(jìn)行相應(yīng)的計(jì)算,沒(méi)有影響!
3.退格的運(yùn)算:(以123為例)
分析:輸出的結(jié)果如圖所示,本計(jì)算器退格鍵有一個(gè)特點(diǎn)是,就算是是計(jì)算后得出的結(jié)果也能實(shí)現(xiàn)退格,缺點(diǎn)是不能很好的處理小數(shù)點(diǎn)的問(wèn)題,因?yàn)樾?shù)點(diǎn)也是字符串的一部分。
頁(yè)
第 10--計(jì)算器 Java實(shí)習(xí)報(bào)告
4.正負(fù)號(hào)的運(yùn)算:(以123為例)
分析:輸出的結(jié)果如圖所示,正負(fù)號(hào)添加能夠很好的實(shí)現(xiàn),但可以進(jìn)行一些改進(jìn),比如在計(jì)算過(guò)程當(dāng)中直接點(diǎn)擊負(fù)號(hào)運(yùn)算符輸入負(fù)數(shù)進(jìn)行計(jì)算!
5.總體分析:
該計(jì)算器基本運(yùn)算沒(méi)有問(wèn)題,清零、正負(fù)號(hào)、求倒數(shù)、退格功能都能很好的實(shí)現(xiàn),總體能完成一個(gè)計(jì)算器的基本功能,但仍有許多地方需要改進(jìn),比如小數(shù)點(diǎn)的實(shí)現(xiàn)所存在的一些問(wèn)題,雖然在基本的運(yùn)算過(guò)程當(dāng)中不會(huì)造成太大影響,但這依然不能認(rèn)為是一個(gè)很好的計(jì)算器,同時(shí),在另一方面,該計(jì)算器還沒(méi)能很好的實(shí)現(xiàn)連續(xù)計(jì)算的功能,必須每次按下等號(hào)按鈕計(jì)算出結(jié)果后才能用產(chǎn)生的結(jié)果接著進(jìn)行下一次的計(jì)算,改進(jìn)的方法是在運(yùn)算符上同時(shí)注冊(cè)Result類,讓運(yùn)算符同時(shí)擁有計(jì)算結(jié)果的功能。
五、實(shí)驗(yàn)小結(jié)
本次課程設(shè)計(jì)到此算是告一段落了,經(jīng)過(guò)這次的學(xué)習(xí),我學(xué)到了很多東西,在此基礎(chǔ)上更加鞏固了自己對(duì)java的認(rèn)識(shí)與了解。
在做本項(xiàng)目是時(shí)候,會(huì)遇到很多小問(wèn)題,比如說(shuō),在整個(gè)運(yùn)算過(guò)程中要如何確保輸入的計(jì)算數(shù)據(jù)哪個(gè)是第一個(gè)計(jì)算數(shù)據(jù)的,哪個(gè)是第二個(gè)計(jì)算
頁(yè)
第 11--計(jì)算器 Java實(shí)習(xí)報(bào)告數(shù)據(jù)的,同時(shí)也要區(qū)分運(yùn)算符,因?yàn)樵撚?jì)算器程序應(yīng)用的都是利用字符串來(lái)完成計(jì)算的,而且不能重復(fù)輸出運(yùn)算符,更不能將運(yùn)算符錯(cuò)誤的存儲(chǔ)在了第一個(gè)計(jì)算數(shù)據(jù)的數(shù)值中,也得考慮到萬(wàn)一不小心重復(fù)點(diǎn)擊了運(yùn)算符按鈕會(huì)不會(huì)造成第一個(gè)計(jì)算數(shù)據(jù)的重新賦值等等問(wèn)題,最后想到利用布爾類型來(lái)很好的控制運(yùn)算符的應(yīng)用!
此次課程設(shè)計(jì)讓我更了解熟悉了Java中的圖形用戶界面和它的編程方式。在完成課題的過(guò)程中也不斷充實(shí)了自己,學(xué)習(xí)到了很多以前沒(méi)有學(xué)習(xí)到的知識(shí),收獲很大。最大的收獲就是對(duì)大學(xué)學(xué)習(xí)的總結(jié)和培養(yǎng)了解決困難的信心和能力,使我對(duì)所學(xué)知識(shí)能夠融會(huì)貫通,又不斷豐富了新知識(shí)。Java計(jì)算器設(shè)計(jì)使得我們對(duì)所學(xué)的專業(yè)課有了更為深刻的認(rèn)識(shí),使得知識(shí)得到了鞏固和提高。
在接下來(lái)的時(shí)間里,我覺(jué)得我要更加努力的往深一層次的方面看齊,了解更多有關(guān)java的知識(shí),對(duì)java有更深一步的了解,我會(huì)一步一步的走下去!
六、附錄(程序代碼)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(“計(jì)算器-趙磊”);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“,”-“,”退格
頁(yè)
第 12--計(jì)算器 Java實(shí)習(xí)報(bào)告“,”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(//采用匿名類實(shí)現(xiàn)窗口的正常關(guān)閉 new WindowAdapter() 頁(yè) 第 13--計(jì)算器 Java實(shí)習(xí)報(bào)告 { 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;} } 頁(yè) 第 14--計(jì)算器 Java實(shí)習(xí)報(bào)告 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);} 頁(yè) 第 15--計(jì)算器 Java實(shí)習(xí)報(bào)告 } class Result implements ActionListener //計(jì)算并顯示結(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方法 { 頁(yè) 第 16--計(jì)算器 Java實(shí)習(xí)報(bào)告 } } TheCalculator count=new TheCalculator();count.init(); 頁(yè) 第 17 大連民族學(xué)院2007級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 機(jī)電信息工程學(xué)院 單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 完成日期:2010年5月31日 系: 專 業(yè): 班 級(jí): 設(shè)計(jì)題目: 學(xué)生姓名: 指導(dǎo)教師: 多功能簡(jiǎn)易計(jì)算器 大連民族學(xué)院2007級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 目 錄 一、設(shè)計(jì)任務(wù)和性能指標(biāo)......................................................................2 1.1設(shè)計(jì)任務(wù)..............................................................................................................................2 1.2性能指標(biāo)..............................................................................................................................2 二.設(shè)計(jì)方案.............................................................................................2 三.系統(tǒng)硬件設(shè)計(jì).....................................................................................3 3.1單片機(jī)最小系統(tǒng)......................................................................................3 3.2鍵盤接口電路.....................................................................................................................3 3.3數(shù)碼管顯示電路.................................................................................................................4 3.4錯(cuò)誤報(bào)警電路.....................................................................................................................5 四、系統(tǒng)軟件設(shè)計(jì)..................................................................................6 4.1鍵盤掃描子程序設(shè)計(jì)..........................................................................................................6 4.2移位子程序及結(jié)果計(jì)算子程序設(shè)計(jì)................................................................................10 4.3顯示子程序設(shè)計(jì)...............................................................................................................12 4.4主程序設(shè)計(jì).......................................................................................................................13 五、調(diào)試及性能分析............................................................................13 5.1調(diào)試步驟...........................................................................................................................13 5.2性能分析...........................................................................................................................14 六、心得體會(huì)........................................................................................14 參考文獻(xiàn)................................................................................................14 附錄1 系統(tǒng)硬件電路圖.......................................................................15 附錄2 程序清單.................................................................................16 大連民族學(xué)院2007級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 一、設(shè)計(jì)任務(wù)和性能指標(biāo) 1.1設(shè)計(jì)任務(wù) 利用單片機(jī)及外圍接口電路(鍵盤接口和顯示接口電路)設(shè)計(jì)制作一個(gè)計(jì)算器,用LED顯示計(jì)算數(shù)值及結(jié)果。 要求用Protel 畫出系統(tǒng)的電路原理圖(要求以最少組件,實(shí)現(xiàn)系統(tǒng)設(shè)計(jì)所要求的功能),印刷電路板(要求布局合理,線路清晰),繪出程序流程圖,并給出程序清單(要求思路清晰,盡量簡(jiǎn)潔,主程序和子程序分開,使程序有較強(qiáng)的可讀性)。1.2性能指標(biāo) 1.2.3.4.5.加法:四位加法,計(jì)算結(jié)果若超過(guò)四位則顯示計(jì)算錯(cuò)誤 減法:四位減法,計(jì)算結(jié)果若小于零則顯示計(jì)算錯(cuò)誤 乘法:個(gè)位數(shù)乘法 除法:整數(shù)除法 有清零功能,計(jì)算錯(cuò)誤報(bào)警 二.設(shè)計(jì)方案 按照系統(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)用最多。 鍵盤電路采用4*4矩陣鍵盤電路。 顯示模塊采用4枚共陽(yáng)極數(shù)碼管和74ls273鎖存芯片構(gòu)成等器件構(gòu)成。 錯(cuò)誤報(bào)警電路采用5V蜂鳴器。 大連民族學(xué)院2007級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 三.系統(tǒng)硬件設(shè)計(jì) 3.1單片機(jī)最小系統(tǒng) 單片機(jī)最小系統(tǒng)就是支持主芯片正常工作的最小電路部分,包括主控芯片、復(fù)位電路和晶振電路。 主控芯片選取STC89C52RC芯片,因其具有良好的性能及穩(wěn)定性,價(jià)格便宜應(yīng)用方便。 晶振選取11.0592MHz,晶振旁電容選取30pF。 采用按鍵復(fù)位電路,電阻分別選取100Ω和10K,電容選取10μF。以下為單片機(jī)最小系統(tǒng)硬件電路圖。 單片機(jī)最小系統(tǒng)硬件電路 3.2鍵盤接口電路 計(jì)算器所需按鍵有: 數(shù)字鍵:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’ 大連民族學(xué)院2007級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 功能鍵:’+’, ’-‘ , ’*’, ’/ ’ , ’ = ’, ’ C(清零)’ 共計(jì)16個(gè)按鍵,采用4*4矩陣鍵盤,鍵盤的行和列之間都有公共端相連,四行和四列的8個(gè)公共端分別接P1.0~P1.7,這樣掃描P1口就可以完成對(duì)矩陣鍵盤的掃描,通過(guò)對(duì)16個(gè)按鍵進(jìn)行編碼,從而得到鍵盤的口地址,對(duì)比P1口德掃描結(jié)果和各按鍵的地址,我們就可以得到是哪個(gè)鍵按下,從而完成鍵盤的功能。 以下為鍵盤接口電路的硬件電路圖 鍵盤接口電路 3.3數(shù)碼管顯示電路 采用4位數(shù)碼管對(duì)計(jì)算數(shù)據(jù)和結(jié)果的顯示,這里選取共陽(yáng)數(shù)碼管,利用NPN三極管對(duì)數(shù)碼管進(jìn)行驅(qū)動(dòng),為了節(jié)省I/O資源,采取動(dòng)態(tài)顯示的方法來(lái)顯示計(jì)算數(shù)據(jù)及結(jié)果。 利用74273鎖存器來(lái)實(shí)現(xiàn)數(shù)碼管的動(dòng)態(tài)顯示,P0口輸出顯示值,P2.4為段選口,控制273鎖存器的時(shí)鐘引腳,從而得到對(duì)數(shù)碼管輸入數(shù)據(jù)的控制。 P2.0~P2.3用來(lái)作為位選端,控制哪幾位數(shù)碼管進(jìn)行顯示。 以下為數(shù)碼顯示電路的硬件電路圖 大連民族學(xué)院2007級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 數(shù)碼顯示電路硬件電路圖 3.4錯(cuò)誤報(bào)警電路 錯(cuò)誤報(bào)警電路就是在計(jì)算結(jié)果出現(xiàn)錯(cuò)誤時(shí)或輸入數(shù)據(jù)出現(xiàn)錯(cuò)誤時(shí),發(fā)出聲音警報(bào),提示使用者錯(cuò)誤出現(xiàn)。 這里就采用5V蜂鳴器作為報(bào)警設(shè)備,利用PNP三極管對(duì)蜂鳴器進(jìn)行驅(qū)動(dòng),有P2.5對(duì)其進(jìn)行控制,這樣在出現(xiàn)錯(cuò)誤的同時(shí)用P2.5輸出低,就可以使蜂鳴器工作,完成報(bào)警任務(wù)。 以下為報(bào)警電路硬件電路圖 大連民族學(xué)院2007級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 報(bào)警電路硬件電路圖 系統(tǒng)整體硬件電路圖見(jiàn)附錄一 四、系統(tǒng)軟件設(shè)計(jì) 4.1鍵盤掃描子程序設(shè)計(jì) 要進(jìn)行數(shù)據(jù)的計(jì)算就必須先進(jìn)行數(shù)據(jù)的輸入,也就必須確定按鍵輸入的數(shù)值是什么,這就需要對(duì)鍵盤進(jìn)行掃描,從而確定究竟是哪個(gè)鍵按下。 對(duì)于鍵盤的掃描,既可以用行掃描也可以用列掃描,這里采用行掃描的方法來(lái)完成對(duì)鍵盤的掃描。 行掃描就是逐行掃描鍵盤,看是哪一行有鍵按下,再通過(guò)返回的鍵碼來(lái)確定究竟是哪個(gè)按鍵按下。如對(duì)第一行掃描就令P1.0為低,P1口其余為高,這樣若第一行有鍵按下,則P1口的值就會(huì)由0xfe變?yōu)槠渌担儆蛇@個(gè)值來(lái)確定是哪個(gè)鍵按下。 以下為鍵盤掃描子程序的程序清單。 uchar keyscan(){ int i; P1=0xfe; temp=P1; temp=temp&0xf0;大連民族學(xué)院2007級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 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級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 } 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級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 } } 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級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 } 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é)果計(jì)算子程序設(shè)計(jì) 輸入數(shù)據(jù)要存儲(chǔ)在一四位數(shù)組內(nèi),而我們鍵入的值是數(shù)據(jù)的高位,后鍵入的值是低位,這樣我們就需要在輸入低位數(shù)值時(shí)將高位數(shù)值從數(shù)組的低位移向數(shù)組的高位,這就是編寫移位子程序的目的。 對(duì)于結(jié)果計(jì)算子程序,包含加、減、乘、除四種運(yùn)算。以加法運(yùn)算為例,各種運(yùn)算各有其標(biāo)志位來(lái)代表計(jì)算類型,當(dāng)加法標(biāo)志位add=1是,就將輸入的兩個(gè)數(shù)據(jù)按照加法進(jìn)行計(jì)算。 首先將數(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ù)值不能直接顯示到數(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ì)算方法一樣,這里不再累述。 以下為移位子程序和結(jié)果計(jì)算子程序的程序清單。 void left(uchar rx,uchar date){ switch(rx) { case 1:dat[0]=date;break;大連民族學(xué)院2007級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 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級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 for(k=j-1;k>=0;k--) { if(dat[k]==0){dat[k]=10;} } } } if(dat[0]==0){dat[0]=10;} } 4.3顯示子程序設(shè)計(jì) 從始至終無(wú)論是輸入的計(jì)算數(shù)據(jù),還是計(jì)算后的結(jié)果值。都存儲(chǔ)在同一數(shù)組dat[ ]中,這樣我們只要在顯示時(shí)一直調(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級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 4.4主程序設(shè)計(jì) 主程序既把以上各子程序串連成一個(gè)整體,使整個(gè)程序循環(huán)運(yùn)行。而在以上程序中也已經(jīng)加入了個(gè)程序之間的連接點(diǎn),首先進(jìn)入程序后就立即進(jìn)入顯示子程序,而顯示子程序內(nèi)又調(diào)用鍵盤掃描子程序,若有鍵按下,則會(huì)跳轉(zhuǎn)到移位子程序和結(jié)果計(jì)算子程序進(jìn)行相應(yīng)的處理。通過(guò)計(jì)算或移位后,數(shù)組內(nèi)的值發(fā)生改變,顯示的值也會(huì)同時(shí)發(fā)生改變。之后再進(jìn)行鍵盤掃描,如此反復(fù)運(yùn)行,就構(gòu)成了程序的整體。 以下為主程序清單。 void main(){ num=0; while(1) { display(); } } 整體程序清單見(jiàn)附錄二。 五、調(diào)試及性能分析 5.1調(diào)試步驟 在焊接好器件后,先不要將芯片插在芯片座上,要先驗(yàn)證先板上電源是否好用,有無(wú)短路等。接上USB電源,用萬(wàn)用表測(cè)量個(gè)芯片座對(duì)應(yīng)電源和地之間的電壓值,觀察電壓值是否正常。一切正常后方可將芯片插入芯片座,以繼續(xù)測(cè)試其他功能。 將芯片插上后,對(duì)各個(gè)模塊進(jìn)行調(diào)試,按鍵是否工作正常,數(shù)碼管是否顯示正常等。編寫相關(guān)部分的測(cè)試程序?qū)ζ溥M(jìn)行測(cè)試。 各部分硬件檢測(cè)無(wú)誤后,下載程序進(jìn)行整體調(diào)試,一切正常后,結(jié)束調(diào)試過(guò)程。 在具體調(diào)試時(shí)首先遇到的問(wèn)題是程序無(wú)法下載進(jìn)入單片機(jī),通過(guò)將電路板接線與原理電路圖接線的對(duì)比發(fā)現(xiàn),串口芯片與單片機(jī)連接的輸入,輸出接反,重新用銅線連接后,依然無(wú)法下載程序。后找到原因是由于下載串口與設(shè)計(jì)封裝不符,用相對(duì)應(yīng)的下載線可以下載。 成功下載程序后,發(fā)現(xiàn)數(shù)碼管顯示不正確,查看后發(fā)現(xiàn)有先沒(méi)有連接,可能是制板時(shí)漏印,連接后顯示正常。大連民族學(xué)院2007級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 5.2性能分析 對(duì)于計(jì)算器的性能,主要的衡量指標(biāo)就在于計(jì)算的精度,本次制作的計(jì)算器性能情況如下: 加法運(yùn)算:四位加法運(yùn)算,和值不超過(guò)9999,若超過(guò)上限,則顯示錯(cuò)誤提示E,蜂鳴器報(bào)警提示。 減法運(yùn)算:四位減法運(yùn)算,若結(jié)果為負(fù),對(duì)其取絕對(duì)值。 乘法運(yùn)算:積不超過(guò)9999的乘法運(yùn)算,若超出上限,顯示錯(cuò)誤提示E,蜂鳴器報(bào)警提示。 除法運(yùn)算:整數(shù)除法,既計(jì)算結(jié)果為整數(shù),若除數(shù)為零,則顯示錯(cuò)誤提示E,蜂鳴器報(bào)警提示。 通過(guò)對(duì)實(shí)際性能的分析,可以得到本次設(shè)計(jì)滿足設(shè)計(jì)的要求。 六、心得體會(huì) 通過(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)從事工作大有裨益。 從本次課設(shè)中我也看到了自身的很多不足之處,對(duì)知識(shí)的掌握不夠扎實(shí),有一知半解的現(xiàn)象。有時(shí)做事不夠穩(wěn)定,過(guò)于毛躁,不能平心靜氣的去分析所遇到的問(wèn)題和錯(cuò)誤。這在以后的工作和生活中是不可取的,通過(guò)對(duì)自身問(wèn)題的認(rèn)識(shí)與改正相信再遇到同樣問(wèn)題時(shí)會(huì)更好的解決。以后的設(shè)計(jì)實(shí)驗(yàn)也會(huì)更好的完成。 參考文獻(xiàn) [1] 徐維祥、劉旭敏.單片微型機(jī)原理及應(yīng)用.大連:大連理工大學(xué)出版社,1996 [2] 李光飛、樓然苗、胡佳文、謝象佐.單片機(jī)課程設(shè)計(jì)與實(shí)例指導(dǎo).北京: 北京航空航天大學(xué)出版社,2004 [3] 余永權(quán).89系列FLASH單片機(jī)原理及應(yīng)用.北京:電子工業(yè)出版社,2002 [4] 李群芳,黃建.單片機(jī)微型計(jì)算機(jī)與接口技術(shù).北京:電子工業(yè)出版社,2001 [5] 樓然苗、李光飛.51系列單片機(jī)設(shè)計(jì)實(shí)例.北京:北京航空航天大學(xué)出版社,2003 大連民族學(xué)院2007級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 附錄1 系統(tǒng)硬件電路圖 大連民族學(xué)院2007級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 附錄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級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 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級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 } 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級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 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級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 { 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級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 } 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級(jí)電子信息工程專業(yè)單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告 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 基于單片機(jī)的簡(jiǎn)易計(jì)算器設(shè)計(jì) 基于單片機(jī)的簡(jiǎn)易計(jì)算器設(shè)計(jì) 一、設(shè)計(jì)任務(wù)和性能指標(biāo) 1.1設(shè)計(jì)任務(wù) 利用單片機(jī)及外圍接口電路(鍵盤接口和顯示接口電路)設(shè)計(jì)制作一個(gè)計(jì)算器,用四位一體數(shù)碼管顯示計(jì)算數(shù)值及結(jié)果。要求用Protel 畫出系統(tǒng)的電路原理圖(要求以最少組件,實(shí)現(xiàn)系統(tǒng)設(shè)計(jì)所要求的功能),繪出程序流程圖,并給出程序清單(要 求思路清晰,盡量簡(jiǎn)潔,主程序和子程序分開,使程序有較強(qiáng)的可讀性)。1.2性能指標(biāo) 1加法:能夠計(jì)算四位以內(nèi)的數(shù)的加法。2減法:能計(jì)算四位數(shù)以內(nèi)的減法。3乘法:能夠計(jì)算兩位數(shù)以內(nèi)的乘法。 4除法:能夠計(jì)算四位數(shù)的乘法 5有清零功能,能隨時(shí)對(duì)運(yùn)算結(jié)果和數(shù)字輸入進(jìn)行清零。 二、系統(tǒng)設(shè)計(jì)方案 按照系統(tǒng)設(shè)計(jì)的功能的要求,初步確定設(shè)計(jì)系統(tǒng)由單片機(jī)主控模塊、四位一體數(shù)碼管顯示模塊、鍵掃描接口電路共三個(gè)主要模塊組成。主控芯片使用51系列AT89C51單片機(jī),采用高性能的靜態(tài)80C51設(shè)計(jì),它由先進(jìn)工藝制造,并帶有非易失性Flash程序存儲(chǔ)器。它是一種高性能、低功耗的8位COMS微處理芯片,市場(chǎng)應(yīng)用最多。 鍵盤電路采用4*4矩陣鍵盤電路。 顯示模塊采用四位一體共陽(yáng)極數(shù)碼管和SN74LS244鎖存芯片構(gòu)成等器件構(gòu)成。 三、硬件系統(tǒng)設(shè)計(jì) 1.單片機(jī)最小系統(tǒng) 單片機(jī)最小系統(tǒng)就是支持主芯片正常工作的最小電路部分,包括主控芯片、復(fù)位電路和晶振電路。 主控芯片選取STC89C51RC芯片,因其具有良好的性能及穩(wěn)定性,價(jià)格便宜應(yīng)用方便。 晶振選取11.0592MHz,晶振旁電容選取30pF。 采用按鍵復(fù)位電路,電阻分別選取100Ω和10K,電容選取10μF。單片機(jī)最小系統(tǒng)硬件電路圖如圖(1)所示。 圖(1)單片機(jī)最小系統(tǒng) 2.鍵盤接口電路 計(jì)算器所需按鍵有: 數(shù)字鍵:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’ 功能鍵:’+’, ’-‘ , ’*’, ’/ ’ , ’ = ’, ’ C(清零)’ 共計(jì)16個(gè)按鍵,采用4*4矩陣鍵盤,鍵盤的行和列之間都有公共端相連,四行采用端口P0.0~P0.3,四列采用端口P3.0~P3.3,通過(guò)8個(gè)端口的的高低電平完成對(duì)矩陣鍵盤的控制。通過(guò)對(duì)16個(gè)按鍵進(jìn)行編碼,從而得到鍵盤的口地址,對(duì)比P1口德掃描結(jié)果和各按鍵的地址,我們就可以得到是哪個(gè)鍵按下,從而完成鍵盤的功能。 3.?dāng)?shù)碼管顯示電路 采用4位一體的數(shù)碼管對(duì)計(jì)算數(shù)據(jù)和結(jié)果進(jìn)行顯示,這里選取共陽(yáng)數(shù)碼管,利用NPN三極管對(duì)數(shù)碼管進(jìn)行驅(qū)動(dòng),為了節(jié)省I/O資源,采取動(dòng)態(tài)顯示的方法來(lái)顯示計(jì)算數(shù)據(jù)及結(jié)果。 利用SN74LS244N鎖存器來(lái)實(shí)現(xiàn)數(shù)碼管的動(dòng)態(tài)顯示,P1口輸出顯示值,P2.0~P2.3為位選端口。通過(guò)鎖存器對(duì)段選信號(hào)的鎖存,最終得到對(duì)數(shù)碼管輸入數(shù)據(jù)的控制。 以下為數(shù)碼顯示電路的硬件電路圖,左圖為數(shù)碼管驅(qū)動(dòng)電路,右圖為段選信號(hào)鎖存電路。 四.軟件設(shè)計(jì)部分 根據(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è)計(jì)好后,在KEIL上面進(jìn)行仿真,把仿真得到的文件下載到Proteus里面進(jìn)行仿真,得到Proteus仿真電路圖如下所示: 圖(2) 計(jì)算器Proteus仿真電路圖 五.硬件電路焊接及調(diào)試 根據(jù)電路圖紙,焊接好硬件電路,把程序下載到單片機(jī)芯片,接通好電源,進(jìn)行調(diào)試。在焊接好器件后,先不要將芯片插在芯片座上,要先驗(yàn)證先板上電源是否好用,有無(wú)短路等。接上USB電源,用萬(wàn)用表測(cè)量個(gè)芯片座對(duì)應(yīng)電源和地之間的電壓值,觀察電壓值是否正常。一切正常后方可將芯片插入芯片座,以繼續(xù)測(cè)試其他功能。 將芯片插上后,對(duì)各個(gè)模塊進(jìn)行調(diào)試,按鍵是否工作正常,數(shù)碼管是否顯示正常等。編寫相關(guān)部分的測(cè)試程序?qū)ζ溥M(jìn)行測(cè)試。 各部分硬件檢測(cè)無(wú)誤后,下載程序進(jìn)行整體調(diào)試,一切正常后,結(jié)束調(diào)試過(guò)程。 用所設(shè)計(jì)的單片機(jī)進(jìn)行數(shù)字計(jì)算,顯示結(jié)果與任務(wù)要求一致,焊接電路符合要求。六.課程設(shè)計(jì)心得 兩周的時(shí)間,終于把單片機(jī)課程設(shè)計(jì)搞完了。整個(gè)體會(huì)還是比較多的。首先是題目的選擇,各方面的原因,自己還是想選個(gè)簡(jiǎn)單點(diǎn)的題目,不過(guò)最后選來(lái)選去,還是選擇了計(jì)算器。由于自己對(duì)單片機(jī)編程還不是很熟悉,結(jié)果在設(shè)計(jì)的時(shí)候遇到了一系列問(wèn)題,程序總是調(diào)試部處理,不過(guò)還好,最后在同學(xué)的幫助下終于把程序調(diào)試出來(lái)了,雖然程序設(shè)計(jì)實(shí)現(xiàn)的功能與老師要求的不盡相同,不過(guò)勉強(qiáng)還算可以。從這里我知道了基本知識(shí)的重要性。其實(shí)進(jìn)行程序設(shè)計(jì)的時(shí)候主要是對(duì)各功能模塊的把握。計(jì)算器里面最難的一部分是矩陣鍵盤的掃描和編碼,那個(gè)費(fèi)了很大力氣。 另外一點(diǎn)就是硬件焊接調(diào)試部分。焊接的時(shí)候到時(shí)輕松,一個(gè)下午就焊接好了,然后是調(diào)試部分。調(diào)試花費(fèi)的時(shí)間還是比較長(zhǎng)的。不過(guò)有了上個(gè)學(xué)期數(shù)字電路焊接調(diào)試的經(jīng)驗(yàn),這次單片機(jī)調(diào)試還算是比較順利。我也是從電路板的正負(fù)電源檢測(cè)起,一步一步來(lái),最終得到了想要的結(jié)果。調(diào)試的時(shí)候主要遇到了兩個(gè)問(wèn)題。一個(gè)是鍵盤總是沒(méi)有反應(yīng),為了這個(gè)自己調(diào)試了很久,前前后后把電路板檢查了幾次,最后才發(fā)現(xiàn)是鍵盤本身的問(wèn)題,和同學(xué)們換了個(gè)好鍵盤才行。另一個(gè)問(wèn)題是總是顯示不出來(lái)1、4、7這三個(gè)數(shù)字。檢測(cè)來(lái)檢測(cè)去,發(fā)現(xiàn)來(lái)是在測(cè)試最小系統(tǒng)時(shí)在一個(gè)位選端接了高電平,對(duì)位選信號(hào)產(chǎn)生了影響。當(dāng)把那個(gè)高電平去掉后,終于得到了正確的結(jié)果。 總的來(lái)說(shuō)這次課程設(shè)計(jì)達(dá)到了完成了基本任務(wù),達(dá)到了基本要求。通過(guò)親身對(duì)程序設(shè)計(jì)和電路焊接調(diào)試的體會(huì),自己對(duì)單片機(jī)有了進(jìn)一步的了解,單片機(jī)編程能力也得到了提高。電路板的焊接與調(diào)試,使自己電路調(diào)試的方法和思想進(jìn)一步加強(qiáng)了。這次單片機(jī)課程設(shè)計(jì)應(yīng)該說(shuō)是比較成功的。 參考文獻(xiàn): 【1】徐維祥、劉旭敏:,《單片微型機(jī)原理及應(yīng)用》,大連理工大學(xué)出版社,1996年。【2】李光飛、樓然苗、胡佳文、謝象佐.,《單片機(jī)課程設(shè)計(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ā)與實(shí)踐》,電子工業(yè)出版社,2009年。 MATLAB通信原理課程設(shè)計(jì)報(bào)告 目 錄 1課題名稱.....................................................................................................................1 2課程設(shè)計(jì)的方案和基本原理.....................................................................................1 2.1信息論基本計(jì)算...............................................................................................1 2.2數(shù)字信號(hào)基帶傳輸系統(tǒng)...................................................................................1 3課程設(shè)計(jì)步驟.............................................................................................................3 3.1信息論基本計(jì)算的設(shè)計(jì)步驟...........................................................................3 3.2數(shù)字信號(hào)基帶傳輸系統(tǒng)的設(shè)計(jì)步驟...............................................................3 4課程設(shè)計(jì)結(jié)果和結(jié)果分析論證.................................................................................4 4.1信息論的基本運(yùn)算結(jié)果...................................................................................4 4.2數(shù)字信號(hào)基帶傳輸系統(tǒng)的設(shè)計(jì)結(jié)果...............................................................6 5、心得體會(huì)................................................................................................................11 6附件...........................................................................................................................11 6.1信息論基本計(jì)算.............................................................................................11 6.2數(shù)字信號(hào)基帶傳輸系統(tǒng).................................................................................14 7 評(píng)分表......................................................................................錯(cuò)誤!未定義書簽。 1課題名稱 (1)信息論基本計(jì)算。 (3)數(shù)字信號(hào)基帶傳輸系統(tǒng)設(shè)計(jì) 2課程設(shè)計(jì)的方案和基本原理 2.1信息論基本計(jì)算 2.1.1平均信息量:平均每個(gè)符號(hào)所能提供的信息量。 H(X)。 2.1.2離散信道容量:信道容量是信道所能傳送的最大的信息量。C=maxI(X;Y)R=I(X;Y)=H(X)-H(XY)2.1.3信源編碼過(guò)程:Huffman編碼的意義是,用最少的編碼長(zhǎng)度來(lái)表達(dá)符號(hào)的信息。為了使平均碼長(zhǎng)度最小,將發(fā)生概率較大的符號(hào)用比較短的碼組來(lái)表示,將發(fā)生概率較小的符號(hào)用較長(zhǎng)的碼組實(shí)現(xiàn),以得到最佳的變長(zhǎng)編碼,減少冗余度,提高系統(tǒng)傳輸?shù)男省?/p> 2.2數(shù)字信號(hào)基帶傳輸系統(tǒng) 2.2.1數(shù)字基帶信號(hào)的碼型:由于數(shù)字基帶信號(hào)是數(shù)字信息的電脈沖表示,不同形式的基帶信號(hào)(又稱為碼型)有不同的頻譜結(jié)構(gòu)和功率譜分布。不同的碼型有不同的優(yōu)點(diǎn),常用的碼型有單/雙極性碼、非歸零/歸零碼、數(shù)字雙相碼(曼徹斯特碼)、密勒碼、AMI碼、HDB3碼。 2.2.2單/雙極性碼:?jiǎn)螛O性碼是用電平1來(lái)表示二元信息中的‘1’,用電平0來(lái)表示二元信息中的0,電平在整個(gè)碼元的持續(xù)時(shí)間里保持不變,記做NRZ碼。雙極性碼與單極性碼的區(qū)別僅在于它用電平-1來(lái)表示二元信息中的‘0’。 2.2.3非歸零/歸零碼:歸零碼與非歸零碼的區(qū)別僅在于,非歸零碼在整個(gè)碼元持續(xù)時(shí)間內(nèi)保持電平值不變,而歸零碼的碼元持續(xù)時(shí)間的前一半時(shí)間內(nèi)保持,而后一半時(shí)間內(nèi)回到0.1 2.2.4數(shù)字雙相碼(曼徹斯特碼):此種碼型采用在一個(gè)碼元的持續(xù)時(shí)間中央時(shí)刻從0到1的跳變來(lái)表示1,從1到0的跳變來(lái)表示0。或者與之相反用在一個(gè)碼元的持續(xù)時(shí)間中央時(shí)刻從0到1的跳變來(lái)表示0,從1到0的跳變來(lái)表示1。 2.2.5密勒碼:該碼型是雙相碼的變型。它采用碼元中央時(shí)刻跳變表示信息1即前半時(shí)間的電平和前一碼元的后半時(shí)間的電平相同,中間跳變。遇到信息0做如下處理:首先對(duì)0的碼元在整個(gè)持續(xù)時(shí)間內(nèi)保持同一電平值,其次若此0的前一信息是一則碼元的電平同前面信息1的碼元后半時(shí)間電平相同,若前一信息為0,則與前面碼元的電平相反。 2.2.6 AMI碼、HDB3碼: AMI碼是傳號(hào)交替反轉(zhuǎn)碼。其編碼規(guī)則是將消息碼中的“1”交替變成“+1”和“-1”,將消息碼中的“0”仍保持為“0”。HDB3碼的全稱是3階高密度雙極性碼。首先將信息碼變換成AMI碼,然后檢查AMI碼中連0的情況,沒(méi)有發(fā)現(xiàn)4個(gè)以上連0的碼元串時(shí)碼型不需變換,仍為AMI碼的形狀。若發(fā)現(xiàn)4個(gè)以上連0的碼元串時(shí),則根據(jù)相應(yīng)規(guī)則把第四個(gè)0變換成相應(yīng)符號(hào)。 2.2.7碼型的功率譜分布:數(shù)字基帶信號(hào)一般是隨機(jī)信號(hào),因此分析隨機(jī)信號(hào)的頻譜特性要用功率諾密度來(lái)分析。一般來(lái)說(shuō),求解功率譜是一件相當(dāng)困難的事,但由于上述幾種碼型比較簡(jiǎn)單,我們可以求出其功率譜密度函數(shù)。 對(duì)單極性非歸零碼、單極性歸零碼、雙極性非歸零碼和雙極性歸零碼這4種碼。由于統(tǒng)計(jì)的獨(dú)立性,課由由功率譜公式畫出功率譜波形圖。數(shù)字雙相碼的功率相關(guān)公式如下:“y=sin(pi*x/2);y=y./(pi*x/2);y(1)=1;mache=sin(pi*x/2).*sin(pi*x/2);mache=mache.*y;mache=mache.*y”。密勒碼的相關(guān)功率公式如下: “x=x*pi;miler=(23-2*cos(x)-22*cos(2*x)-12*cos(3*x)+5*cos(4*x)+12*cos(5*x)+2*cos(6*x)-8*cos(7*x)+2*cos(8*x))./(17+8*cos(8*x));t=x.*x;miler=miler./t;” 對(duì)于AMI碼和HDB3碼的功率譜函數(shù),則需要進(jìn)行實(shí)際的碼型進(jìn)行分析。 3課程設(shè)計(jì)步驟 3.1信息論基本計(jì)算的設(shè)計(jì)步驟 3.1.1信源平均信息量的計(jì)算(以高斯分布的信源為例): 通過(guò)系統(tǒng)產(chǎn)生一個(gè)高斯隨機(jī)信源,再求出它的平均信息量。3.1.2離散信道容量的計(jì)算(以輸入符號(hào)等概分布為例): 編寫hmessage函數(shù)求出平均互信息,編寫dmessage函數(shù),求出離散信息熵,調(diào)用hmessage函數(shù)和dmessage函數(shù)得出hf和hx,最后信道容量c=hx-hf。3.1.3信源編碼過(guò)程(以Huffman編碼為例): 先編寫huffman函數(shù),對(duì)系列排序并求出huffman編碼。調(diào)用huffman函數(shù)和dmessage函數(shù),得出編碼后的碼字。 3.2數(shù)字信號(hào)基帶傳輸系統(tǒng)的設(shè)計(jì)步驟 3.2.1單/雙極性歸零/非歸零碼:先對(duì)原始碼型進(jìn)行相應(yīng)的碼型變換,畫出碼型子圖,再由功率譜公式畫出功率譜波形圖。 3.2.2數(shù)字雙相碼:先進(jìn)行碼型變換,再畫出功率譜,功率相關(guān)公式如下:“y=sin(pi*x/2);y=y./(pi*x/2);y(1)=1;mache=sin(pi*x/2).*sin(pi*x/2);mache=mache.*y;mache=mache.*y”。 3.2.3密勒碼:密勒碼的相關(guān)功率公式如下: “x=x*pi;miler=(23-2*cos(x)-22*cos(2*x)-12*cos(3*x)+5*cos(4*x)+12*cos(5*x)+2*cos(6*x)-8*cos(7*x)+2*cos(8*x))./(17+8*cos(8*x));t=x.*x;miler=miler./t;” 3.2.4AMI碼:編寫AMI函數(shù),求的AMI碼型變換。編寫t2f函數(shù),功能是將時(shí)域信號(hào)做傅里葉變換到頻域。為了求AMI碼的功率譜密度,編寫AMIpower函數(shù),該函數(shù)中又調(diào)用了t2f函數(shù)。3.2.5HDB3碼:編寫HDb3函數(shù)和t2f函數(shù),分別實(shí)現(xiàn)HDb3編碼和傅里葉變換。調(diào)用HDb3函數(shù)和t2f函數(shù),得出原序列圖、編碼后的序列圖和功率譜圖。 4課程設(shè)計(jì)結(jié)果和結(jié)果分析論證 4.1信息論的基本運(yùn)算結(jié)果 4.1.1信源平均信息量的計(jì)算(以高斯分布的信源為例): 圖4.1.1連續(xù)信源平均信息量 4.1.2離散信道容量的計(jì)算(以輸入符號(hào)等概分布為例)4 圖4.1.2離散信道容量 信道容量為信源的平均信息量減去互信息量。 4.1.3信源編碼過(guò)程(以Huffman編碼為例) 圖4.1.3 huffman編碼 哈弗曼編碼是把出現(xiàn)概率較大的用較短的碼元來(lái)實(shí)現(xiàn),概率出現(xiàn)較小的用較長(zhǎng)的碼元實(shí)現(xiàn)。4.2數(shù)字信號(hào)基帶傳輸系統(tǒng)的設(shè)計(jì)結(jié)果 4.2.1單極性非歸零碼及其功率譜 圖4.2.1單極性非歸零碼碼型和功率譜 輸入的序列是x=[1 1 0 1 0 0 1 0 1 0 0 1],輸出的序列是y=[1 1 0 1 0 0 1 0 1 0 0 1]經(jīng)編碼規(guī)則驗(yàn)證是正確的。功率譜顯示,碼型的功率分布有分段性,并以某些頻率為中心。 4.2.2單極性歸零碼及其功率譜 圖4.2.2單極性歸零碼碼型和功率譜 由圖可知,輸入的序列是x=[1 1 0 1 0 0 1 0 1 0 0 1],輸出的序列是y=[10 10 00 10 00 00 10 00 10 00 00 10] 經(jīng)編碼規(guī)則驗(yàn)證是正確的。功率譜顯示,碼型的功率分布有分段性,并以某些頻率為中心。 4.2.3雙極性非歸零碼及其功率譜 圖4.2.3雙極性非歸零碼碼型和功率譜 由圖可知輸入的序列為x=[1 1 0 1 0 0 1 0 1 0 0 1],輸出的序列為y=[1 1-1 1-1-1 1-1 1-1-1 1], 經(jīng)編碼規(guī)則驗(yàn)證是正確的。功率譜顯示,碼型的功率分布有分段性,并以某些頻率為中心。 4.2.4雙極性歸零碼及其功率譜密度 圖4.2.4雙極性歸零碼碼型和功率譜 由圖可知,輸入序列為x=[1 1 0 1 0 0 1 0 1 0 0 1],輸出序列為y=[10 10-10 10-10-10 10-10 10-10-10 10]。經(jīng)編碼規(guī)則驗(yàn)證是正確的。功率譜顯示,碼型的功率分布有分段性,并以某些頻率為中心。 4.2.5數(shù)字雙相碼及其功率譜 圖4.2.5數(shù)字雙相碼碼型和功率譜 由圖可知,輸入的序列為x=[1 1 0 1 0 0 1 0 1 0 0 1],輸出的序列為y=[10 10 01 10 01 01 10 01 10 01 01 10].功率譜顯示,碼型的功率分布有分段性。 4.2.6密勒碼及其功率譜 圖4.2.6密勒碼碼型和功率譜 信息的輸入序列是x=[1 1 0 1 0 0 1 0 1 0 0 1]。 4.2.7 AMI碼及其功率譜 圖4.2.7AMI碼碼型和功率譜 輸入序列是x=[1 1 0 1 0 0 1 0 1 0 0 1]。 4.2.8 HDB3碼及其功率譜 圖4.2.8 HDB3碼碼型和功率譜 由此圖的功率譜與AMI碼的功率譜比較可知,HDB3碼與AMI碼是相似的,HDB3碼是AMI碼的變形。 5、心得體會(huì) 6附件 6.1信息論基本計(jì)算 6.1.1、信源平均信息量的計(jì)算(高斯分布的信源)x=randn(1,100000);%產(chǎn)生N(0,1)高斯源 px=1/sqrt(2*pi)*exp(-(x-1).^2/2);%計(jì)算概率 l=-mean(log2(px))%計(jì)算熵 6.1.2、編程實(shí)現(xiàn)離散信道容量的計(jì)算(以輸入符號(hào)等概分布為例)function r=dmessage(x,n)%參數(shù)x表示概率矩陣,n是符號(hào)的數(shù)目 r=0;for i=1:n r=r-x(i)*log(x(i))/log(2);end disp('此離散信源的平均信息量為:');r %直接在命令窗口中調(diào)用dmessage函數(shù),也可以在其它函數(shù)中調(diào)用 dmessage([0.25,0.25,0.25,0.25],4) 6.1.3、離散信道容量的計(jì)算 %求互信息的函數(shù)文件如下 function r=hmessage(x,f,nx,my)%x為輸出的信源分布,f為轉(zhuǎn)移概率矩陣,nx為輸出的符號(hào)可選個(gè)數(shù) %my為輸出的符號(hào)個(gè)數(shù) sum=0;for i=1:nx for j=1:my 11 %通過(guò)式子p(x,y)=p(x)p(y/x)來(lái)求p(x,y),用t表示 t=f(i,j)*x(i);%求平均互信息量 if t~=0 sum=sum-t*log(f(i,j))/log(2);end;end;end;r=sum;disp('平均互信息量為:');%利用函數(shù)dmessage來(lái)求信源的熵,利用函數(shù)hmessage來(lái)求平均互信息量 x=[0.25,0.25,0.25,0.25];f1=[1/2,1/4,1/4,0,0,0 0,1/2,1/4,1/4,0,0 0,0,1/2,1/4,1/4,0 0,0,0,1/2,1/4,1/4,];hf1=hmessage(x,f1,4,6);hx=dmessage(x,4);c1=hx-hf1 %信道容量 6.1.4、哈弗曼編碼的實(shí)現(xiàn) p=[1/4,1/4,1/4,1/8,1/8];[h,l]=huffman1(p)%哈弗曼編碼的實(shí)現(xiàn)函數(shù)如下 function [h,l]=huffman(p)if(length(find(p<0))~=0)error('Not a prob,negative component');end if(abs(sum(p)-1)>10e-10)error('Not a prob.vector,component do not add to 1')end n=length(p);q=p;12 m=zeros(n-1,n);for i=1:n-1 [q,l]=sort(q);m(i,:)=[l(1:n-i+1),zeros(1,i-1)];q=[q(1)+q(2),q(3:n),1];end for i=1:n-1 c(i,:)=blanks(n*n);end c(n-1,n)='0';c(n-1,2*n)='1';for i=2:n-1 c(n-i,1:n-1)=c(n-i+1,n*(find(m(n-i+1,:)==1))-(n-2):n*(find(m(n-i+1,:)==1)));c(n-i,n)='0';c(n-i,n+1:2*n-1)=c(n-i,1:n-1);c(n-i,2*n)='1';for j=1:i-1 c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,n*(find(m(n-i+1,:)==j+1)-1)+1:n*find(m(n-i+1,:)==j+1));end;end for i=1:n h(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n);ll(i)=length(find(abs(h(i,:))~=32));end l=sum(p.*ll);%在命令窗口或M文件里調(diào)用haffman函數(shù) p=[1/2,1/4,1/8,1/16,1/16];[h,l]=huffman(p) 6.2數(shù)字信號(hào)基帶傳輸系統(tǒng) 6.2.1、單極性非歸零碼以及功率譜的實(shí)現(xiàn) function y=djx(x)%本函數(shù)實(shí)現(xiàn)將輸入的一段二進(jìn)制代碼編碼為相應(yīng)的單極性非歸零碼輸出 %輸入x為二進(jìn)制碼,輸出y為編好的碼 %給出計(jì)算每一個(gè)碼元的點(diǎn)數(shù),因?yàn)槲覀冎挥杏秒x散的點(diǎn)來(lái)得出連續(xù)的函數(shù)表示 grid=300;t=0:1/grid:length(x);for i=1:length(x)if(x(i)==1)for j=1:grid y((i-1)*grid+j)=1;end else for j=1:grid y((i-1)*grid+j)=0;end end end y=[y,x(i)];M=max(y);m=min(y);subplot(2,1,1);plot(t,y);hold on;axis([0,i,m-0.1,M+0.1]);%采用title命令來(lái)實(shí)現(xiàn)標(biāo)記出各碼元對(duì)應(yīng)的二元信息 title(' 1 1 0 1 0 0 1 0 1 0 0 1 ');fs=100;x=1:1/fs:5;y=sin(pi*x);y=y./(pi*x);14 y(1)=1;dan1=y.*y;dan1=dan1/4;subplot(2,1,2);subplot(2,1,2);plot(x,dan1);axis([1,4,0,0.015]);title('單極性非歸零碼的功率譜');%函數(shù)調(diào)用t=[1 1 0 1 0 0 1 0 1 0 0 1];djx(t); 6.2.2、單極性歸零碼及其功率譜實(shí)現(xiàn) function y=djxglm(x)grid=200;t=0:1/grid:length(x);for i=1:length(x)if(x(i)==1)for j=1:grid/2 y(grid/2*(2*i-2)+j)=1;y(grid/2*(2*i-1)+j)=0;end else for j=1:grid/2 y(grid*(i-1)+j)=0;end end end y=[y,x(i)];M=max(y);m=min(y);subplot(2,1,1);plot(t,y);axis([0,i,m-0.1,M+0.1]);title(' 1 1 0 1 0 0 1 15 0 1 0 0 1 ');fs=50;x=1:1/fs:5;y=sin(pi*x);y=y./(pi*x);y(1)=2;dan2=y.*y;dan2=dan2/4;subplot(2,1,2);plot(x,dan2);axis([1,5,0,0.05]);title('單極性歸零碼的功率譜');%在命令窗口或M文件中調(diào)用函數(shù) t=[1 1 0 1 0 0 1 0 1 0 0 1];djxglm(t); 6.2.3、雙極性非歸零碼及其功率譜的實(shí)現(xiàn) function y=sjx(x)%本函數(shù)實(shí)現(xiàn)將輸入的一段二進(jìn)制代碼編碼為相應(yīng)的雙極性非歸零碼輸出 %輸入x為二進(jìn)制碼,輸出y為編好的碼 grid=300;t=0:1/grid:length(x);for i=1:length(x)if(x(i)==1)for j=1:grid y((i-1)*grid+j)=1;end else for j=1:grid y((i-1)*grid+j)=-1;end 16 end end y=[y,x(i)];M=max(y);m=min(y);subplot(2,1,1);plot(t,y);axis([0,i,m-0.1,M+0.1]);%采用title命令來(lái)實(shí)現(xiàn)標(biāo)記出各碼元對(duì)應(yīng)的二元信息 title(' 1 1 0 1 0 0 1 0 1 0 0 1 ');fs=100;x=1:1/fs:5;y=sin(pi*x);y=y./(pi*x);y(1)=1;dan1=y.*y;dan1=dan1/4;subplot(2,1,2);plot(x,dan1);axis([1,4,0,0.02]);title('雙極性非歸零碼的功率譜');%在命令窗口或M文件中調(diào)用函數(shù) t=[1 1 0 1 0 0 1 0 1 0 0 1];sjx(t); 6.2.4、雙極性歸零碼及其功率譜的實(shí)現(xiàn) function y=sjxglm(x)%本函數(shù)實(shí)現(xiàn)將輸入的一段二進(jìn)制代碼編碼為相應(yīng)的雙極性歸零碼輸出%輸入x為二進(jìn)制碼,輸出y為編好的碼 grid=300;t=0:1/grid:length(x);for i=1:length(x)17 if(x(i)==1)for j=1:grid/2 y(grid/2*(2*i-2)+j)=1;y(grid/2*(2*i-1)+j)=0;end else for j=1:grid/2 y(grid/2*(2*i-2)+j)=-1;y(grid/2*(2*i-1)+j)=0;end end end y=[y,x(i)];M=max(y);m=min(y);subplot(2,1,1);plot(t,y);axis([0,i,m-0.1,M+0.1]);%采用title命令來(lái)實(shí)現(xiàn)標(biāo)記出各碼元對(duì)應(yīng)的二元信息title(' 1 1 0 1 0 0 1 0 1 0 0 1 ');fs=50;x=1:1/fs:5;y=sin(pi*x);y=y./(pi*x);y(1)=2;dan2=y.*y;dan2=dan2/4;subplot(2,1,2);plot(x,dan2);axis([1,5,0,0.025]);title('雙極性歸零碼的功率譜');%在命令窗口或M文件中調(diào)用函數(shù) t=[1 1 0 1 0 0 1 0 1 0 0 1];sjxglm(t); 6.2.5、數(shù)字雙相碼及其功率譜的實(shí)現(xiàn) function y=szsxm(x)%本函數(shù)實(shí)現(xiàn)將輸入的一段二進(jìn)制代碼編碼為相應(yīng)的數(shù)字雙相碼輸出 %輸入x為二進(jìn)制碼,輸出y為編好的碼 grid=300;t=0:1/grid:length(x);for i=1:length(x)if(x(i)==1)for j=1:grid/2 y(grid/2*(2*i-2)+j)=1;%用從1到0的電平跳變來(lái)表示‘1’ y(grid/2*(2*i-1)+j)=0;end else for j=1:grid/2 y(grid/2*(2*i-2)+j)=0;%用從0到1的電平跳變來(lái)表示‘0’ y(grid/2*(2*i-1)+j)=1;end end end y=[y,x(i)];M=max(y);m=min(y);subplot(2,1,1);plot(t,y);axis([0,i,m-0.1,M+0.1]);%采用title命令來(lái)實(shí)現(xiàn)標(biāo)記出各碼元對(duì)應(yīng)的二元信息 title(' 1 1 0 1 0 0 1 0 1 0 0 1 ');fs=100;x=1:1/fs:5;19 y=sin(pi*x/2);y=y./(pi*x/2);y(1)=1;mache=sin(pi*x/2).*sin(pi*x/2);mache=mache.*y;mache=mache.*y;subplot(2,1,2);plot(x,mache);axis([1,5,0,0.5]);title('數(shù)字雙相碼的功率譜');%在命令窗口或M文件中調(diào)用函數(shù) t=[1 1 0 1 0 0 1 0 1 0 0 1];szsxm(t); 6.2.6、密勒碼及其功率譜的實(shí)現(xiàn) function y=mlm(x)%該函數(shù)實(shí)現(xiàn)密勒編碼,輸入碼序列為x grid=100;t=0:1/grid:length(x);%定義時(shí)間序列 i=1;%由于第一碼元的編碼不定,我們直接給出 if(x(i)==1)for j=1:grid/2 y(grid/2*(2*i-2)+j)=0;%前半時(shí)間為0 y(grid/2*(2*i-1)+j)=1;%后半時(shí)間為1 end else for j=1:grid%若輸入0 y(grid*(i-1)+j)=0;%碼元持續(xù)時(shí)間內(nèi)為0 end end for i=2:length(x)%開始進(jìn)行密勒編碼 if(x(i)==1)%若輸入信息為1 for j=1:grid/2 y(grid/2*(2*i-2)+j)=y(grid/2*(2*i-3)+grid/4);%前半時(shí)間與前一碼元后半時(shí)間值相同 y(grid/2*(2*i-1)+j)=1-y(grid/2*(2*i-2)+j);%后半時(shí)間與前半時(shí)間相反 end else if(x(i-1)==1)%反之,若前一信息為1,輸入為0 for j=1:grid y(grid*(i-1)+j)=y(grid/2*(2*i-3)+grid/4);%所有時(shí)間與前一碼元后半時(shí)間值相同 end else%前一信息為0 for j=1:grid y(grid*(i-1)+j)=1-y(grid/2*(2*i-3)+grid/4);%所有時(shí)間與前一碼元后半時(shí)間值相反 end end end end y=[y,y(i*grid)];M=max(y);m=min(y);subplot(2,1,1);plot(t,y);axis([0,i,m-0.1,M+0.1]);%采用title命令來(lái)實(shí)現(xiàn)標(biāo)記出各碼元對(duì)應(yīng)的二元信息 title(' 1 1 0 1 0 0 1 0 1 0 0 1 ');fs=100;x=1:1/fs:5;x=x*pi;miler=(23-2*cos(x)-22*cos(2*x)-12*cos(3*x)+5*cos(4*x)+12*cos(5*x)+2*c 21 os(6*x)-8*cos(7*x)+2*cos(8*x))./(17+8*cos(8*x));t=x.*x;miler=miler./t;miler(1)=0.2;x=x/pi;subplot(2,1,2);plot(x,miler);axis([1,5,0,0.3]);title('密勒碼的功率譜')%下面是mlm函數(shù)的調(diào)用 t=[1 1 0 1 0 0 1 0 1 0 0 1];mlm(t); 6.2.7、AMI碼及其功率譜的實(shí)現(xiàn) *t2f.m文件:傅里葉變換 function X=t2f(x,dt)X=fftshift(fft(x))*dt; function y=AMI(x)grid=300;t=0:1/grid:length(x);i=1;if(x(i)==1)for j=1:grid y(j)=1;h=1;end else for j=1:grid y(j)=0;end end for i=2:length(x)if(x(i)==1)if h==1 for j=1:grid y(grid*(i-1)+j)=-1;h=-1;end else if h==-1 for j=1:grid y(grid*(i-1)+j)=1;h=1;end end end else for j=1:grid y(grid*(i-1)+j)=0;end end end y=[y,x(i)];M=max(y);m=min(y);subplot(2,1,1);plot(t,y);axis([0,i,m-0.1,M+0.1]);%采用title命令來(lái)實(shí)現(xiàn)標(biāo)記出各碼元對(duì)應(yīng)的二元信息title(' 1 1 0 1 0 0 1 0 1 0 0 1 ');Rt=0.5;k=14;N=2^k;L=64;M=N/L;Rb=2;Ts=1/Rb dt=Ts/L;df=1/(N*dt)T=N*dt Bs=N*df/2;t=[-T/2+dt/2:dt:T/2];f=[-Bs+df/2:df:Bs];Ep=zeros(size(f));for ii=1:50 n=1;while rem(n,2)~=0, a=round(rand(1,M));n=length(find(a==1));end bb=find(a==1);cc=bb(1:2:length(bb));b=a; b(cc)=-ones(size(cc));ami=zeros(1,N);for tt=1:Rt*Ts/dt;ami(tt+[0:M-1]*L)=b;end AMI=t2f(ami,dt);P=AMI.*conj(AMI)/T;Ep=(Ep*(ii-1)+P)/ii;end aa=30+10*log10(Ep+eps);subplot(2,1,2);plot(f,aa);axis([-5,+5,-50,50]);title('AMI功率譜密度')%AMI函數(shù)的調(diào)用 t=[1 1 0 1 0 0 1 0 1 0 0 1];AMI(t); 6.2.8、HDB3碼及其功率譜的實(shí)現(xiàn) function X=t2f(x,dt)X=fftshift(fft(x))*dt;*HDB3_encoding.m文件: function [changed_hdb3]=Hdb3_encoding(pcm)last_V=-1;last_one=-1;M=length(pcm);changed_hdb3=zeros(size(pcm));count=0;for i=1:M if(pcm(i)==1)changed_hdb3(i)=-last_one;last_one=changed_hdb3(i);count=0;else count=count+1; if(count==4)count=0;changed_hdb3(i)=-last_V;last_V=changed_hdb3(i);if(i>4)if(changed_hdb3(i)*last_one==-1)changed_hdb3(i-3)=changed_hdb3(i);end end last_one=changed_hdb3(i);end end end %函數(shù)調(diào)用 clear all close all k=input(‘取樣點(diǎn)數(shù)=2^k,k=[4]’);if isempty(k), k=14;end N=2^k;L=64;M=N/L;Rb=1;Ts=1/Rb;dt=Ts/L;df=1/(N*dt);T=N*dt;Bs=N*df/2;t=[-T/2+dt/2:dt:T/2];f=[-Bs+df/2:df:Bs];Ep=zeros(size(f));for ii=1:30 a=rand(1,M)>0.75;b=Hdb3_encoding(a);hdb=zeros(L,M);init=zeros(L,M);for loop=1:L/2 init(loop,:)=a;end for loop=1:L/2 hdb(loop,:)=b;end hdb=reshape(hdb,1,N);init=reshape(init,1,N);HDB=t2f(hdb,dt);P=HDB.*conj(HDB)/T;Ep=(Ep*(ii-1)+P)/ii;end init figure(9)subplot(3,1,1)plot(t,init,'m')grid on axis([0,T/10,-1.5,1.5])set(gca,'XTick',[0:1:T/10])xlabel('t(Tb)')ylabel('s(t)')title(‘原始序列’)subplot(3,1,2)plot(t,hdb,'b')grid on axis([0,T/10,-1.5,1.5])set(gca,'XTick',[0:1:T/10])xlabel('t(Tb)')ylabel('s(t)')title(‘HDB3編碼序列’)subplot(3,1,3)aa=30+10*log10(Ep+eps);plot(f,aa,'r')grid on axis([-5,5,-50,50])xlabel('f(Rb)')ylabel('Ps(f)')title(‘HDB3碼功率譜密度’)第三篇:?jiǎn)纹瑱C(jī)計(jì)算器課程設(shè)計(jì)報(bào)告
第四篇:?jiǎn)纹瑱C(jī)計(jì)算器課程設(shè)計(jì)報(bào)告
第五篇:MATLAB通信原理課程設(shè)計(jì)報(bào)告