第一篇:Matlab课程设计报告(简单计算器)
1、设计目的
运用MATLAB实现MATLAB的GUI程序设计。
2、题目分析
2.1课程设计的基本要求:
A.熟悉和掌握MATLAB 程序设计方法。B.掌握MATLAB GUI程序设计。2.2课程设计的内容
要求利用MATLAB GUI设计实现一个图形用户界面的计算器程序,要求实现: A.具有友好的用户图形界面。实现十进制数的加、减、乘、除、乘方、取模等简单计算。
B.科学计算函数,包括(反)正弦、(反)余弦、(反)正切、(反)余切、开方、指数等函数运行。
C.能够保存上次历史计算的答案,显示答案存储器中的内容。D.有清除键,能清除操作。
E.独立存储器功能,使之可以直接输入存储器,可与存储器中的数值相加减。能够清除独立存储器中的内容。2.3题目分析
本题目通过MATLAB的GUI程序设计较为简单,在GUI设计中主要用到三种控件,显示框用到文本编辑框(edit text),说明框用到静态文本框(Static text),数字以及运算等按钮用到命令按钮(push button)。然后再通过各个按钮的回调函数,实现简单的计算功能。
3、总体设计
首先用MATLAB GUI功能,在绘制一个静态文本框和一个文本编辑框,以及32个命令按钮,调整好各控件大小、颜色,整体布局如图所示:
然后通过双击个按钮来改写其属性,在m文件中编写其回调函数,最后在运行调试。
4、具体设计 4.1 各功能界面设计 GUI设计界面:
4.2 各功能模块实现 算法设计:
A.数字键设计:0—9以及小数点函数都一样,只是参数不同: 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.四则运算函数:
textString = get(handles.text1,'String');textString =strcat(textString,'+');set(handles.text1,'String',textString)C.科学计算函数:
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.退格键:通过取屏幕值,计算出其字符长度,然后取其前N-1项的值来实现退格: 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.清屏键函数:
set(handles.text1,'String','0.');F.右键函数:
gtext('大家好;我是智能机器人-my name is seven');close(gcf);4.3 各模块实现结果 A.数字键:
B.四则运算函数:
C.科学计算函数: Sin45的计算结果=
经过计算,这些结果均与实际结果相吻合,计算器的功能实现的较为完好。5.2问题和解决方法:
a.小数点可以连续输入。解决方法是:用strfind函数查看文本框里有几个小数点,如果已经有一个了,再按小数点就保持不变。b.按过运算符号后一个数不等于一个数,比如:输入1,按等号,会出来一个3,经过长时间分析得知,这是由于在按运算符号时,系统记录了文本框里的数但没有清空,才会出现这种问题。解决方法是再申请一个不同于加减乘除的另一个符号,并将按过运算符后记录的数值置0。
c.按对数函数键时,负数也能运算,通过加入if判断语句来判断输入的值是否为负,若为负则输出error.6、心得体会
通过本次的MATLAB课程设计,让我对MATLAB尤其是其GUI设计的功能有了进一步的了解,认识到了它功能的强大。在MATLAB简单计算器的设计中,了解了关于MATLAB图形用户界面的部分控件的使用方法;利用MATLAB的GUI提供的很多实用的控件,方便用于设计属于自己的图形界面。
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('大家好;我是智能机器人-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语言及其在电子信息工程中的应用》 王洪元主编 清华大学出版社
[2] 《MATLAB中GUI的应用》 王洪元主编 清华大学出版社
第二篇:java课程设计报告—计算器
1--计算器 Java实习报告
目录
一、课程设计目的.................................................................................................................2
二、课程设计任务..................................................................................................................2
2.1、设计任务................................................................................................................2
2.2、课程设计要求:....................................................................................................2
2.3、需求分析................................................................................................................2
三、开发工具与平台.............................................................................................................3
3.1、开发工具................................................................................................................3
3.2、开发平台................................................................................................................3
四、设计思路..........................................................................................................................4
4.1、界面设计.................................................................................................................4
4.2.1、逻辑设计.............................................................................................................4
4.2.2、程序流程图...........................................................................................................5
4.2.3、主要代码展示及说明............................................................................................5
4.3、程序测试............................................................................................................10
五、实验小结........................................................................................................................11
六、附录(程序代码)..........................................................................................................12
页
第 1--计算器 Java实习报告
一、课程设计目的
1、熟练掌握java面向对象编程。
2、选择合适的数据结构实现需求。
3、熟练使用各种控制结构。
4、GUI组件、事件处理技术。
二、课程设计任务
2.1、设计任务
设计一个简易的计算器,可以进行四则运算:加、减、乘、除等(限于十进制下)
程序要求:
(1)应具有相应的界面,可参考Windows操作系统自带的计算器界面。(2)操作符号定为:“+”,“-”,“*”,“/”,“+/-”等。(按国际惯例设计)(3)用户通过点击程序界面上按钮,实现数字、运算符的输入操作。(4)以上部分为必须完成的内容。选作部分:
(1)具有操作符号“1/x”,“sqrt”(开方),“.”(小数功能)等。
2.2、课程设计要求:
(1)应用自己所学课程知识完成对计算器的基本任务。
(2)查阅相关资料,学习和掌握项目中涉及的新知识,提高自学能力。
(3)通过应用java程序编写计算器来提升自己对简单的图形界面有一定的掌握和了解。
2.3、需求分析
1.设计的计算器可以完成加法、减法、乘法、除法的简单运算。2.实现一些简单的扩展运算,如:正负号、倒数、退格、清零等功能。
页
第 2--计算器 Java实习报告3.添加小数点功能,用以实现浮点型数据的计算。
4.使用布局管理器设计一个计算器的界面,使用事件监听器处理数据的输入,并完成相关的计算。
三、开发工具与平台
3.1、开发工具
Microsoft Windows 7旗舰版
3.2、开发平台
JDK1.6.0-02 和UE编译器
页
第 3--计算器 Java实习报告
四、设计思路
4.1、界面设计:(如图3-1)
图3-1
4.2.1、逻辑设计:
(1)根据所设计出来的界面,首先要设计其GUI界面,总体界面有一个文本框,20个按钮,总体界面用BorderLayout布局,文本框放置在最NORTH,然后0到9以及+,-,*,/等按钮放置到一个面板Panel中,完成界面设计。
(2)设计计算流程,首先点击数字按钮时,将按钮数值添加到文本框当中,并将该数值保存到一个字符串中,再次点击数字按钮时,将之前保存的字符串与新的数值拼接起来,再添加到文本框当中,直到点击运算符按钮时,将文本框当中的字符串保存在一个字符串变量中,然后重置文本框内容,将运算符号显示到文本框中,随后输入第二个计算数据时,用同样的办法保存数据,最后通过控制“=”运算符先将字符串数据转化成双精度类型,然后计算出结果并显示到文本框当中。
(3)基本运算设计完成以后则开始考虑其他个别功能的实现,例如倒数、清零、退格等功能的实现,清零直接重置文本框内容,退格功能则采用substring函数截取字符串长度。
页
第 4--计算器 Java实习报告
4.2.2、程序流程图:
4.2.3、主要代码展示及说明: 总体代码的设计:
程序采用继承windowadapter类,新建Jframe窗体,利用数组来定义JBotton按钮,同时利用数组注册监听,采用4行5列网格布局,完成计算器界面的基本设置,在窗体的正常关闭方面,采用匿名类实现窗体的正常关闭。最后对按钮进行计算分析,分别设定输入数据的A类、运算符控制的Opertion类,退格功能的BackSpace类、计算结果的Result类等等,一步步实现计算器的基本功能!
(1)类A的设计(数据的输入)
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实习报告
}
} Jtext.setText(s);else { if(flag2){
Jtext.setText(s);
flag2=false;} else
Jtext.setText(a+s);}
功能解释:程序开始时,程序初始化文本框的内容为“0.”,点击数字按钮,则调用类A,首先用a来获取当前文本框内容,s来获取按钮数值,然后进行判断,若a的值为上述代码的值则输出s的值,再次点击数字按钮时,再次调用A类,此时a的值为上次输入的s值,第一个if语句不满足,执行下个if语句if(flag2),flag2初始值为false,该语句的功能是在执行了“=”号按钮时,防止新的数字按钮的值合并到到已经得出的结果上,例如:12+12=24,此时再点击数字按钮3时,则文本框内容被重置,输出数值3,而不是243,如果if(flag2)不满足,则将字符串a和s合并并输出,得出第一个要计算的数据。
(2)类Opertion的设计:(运算符的控制)
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实习报告 }
功能解释:当点击运算符控制按钮时,首先将运算符的数值赋值给cal(初值为空),紧接着进行判断,flag1初值为ture,该类的作用为在点击运算符按钮时,将计算的第一个数据保存在x字符串变量当中,然后将文本框内容重置为点击的运算符的数值,类的结尾将flag1赋值为false,防止再次点击运算符按钮时改变了x的值。
(附:此时文本框内容为运算符的值,输入第二个计算数据时,点击数字按钮,则再次调用A类,此时满足A类中第一个if语句,文本框内容被重置为数字按钮的值,接下来与获取第一个计算数据步骤一样,直到点击“=”号运算符为止!)
(3)类Result的设计:(计算并输出结果)
class Result implements ActionListener //计算并显示结果 { 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实习报告
} {
if(num2==0)
Jtext.setText(“除数不能为0”);
else
{
result=num1/num2;
String s1=Double.toString(result);
Jtext.setText(s1);
} }
flag1=true;
flag2=true;} 功能解释:首先定义两个Double型num1,num2,将之前保存的第一个计算数据x强制转换为Double型后赋值给num1,接着用字符串变量y来获取当前文本框的内容,即第二个计算数据的值,同样再将其强制转换Double型后赋值给num2,然后进行运算符判断,对cal的值进行比较,然后进行相应的计算,将计算的结果转换成字符串后将其输出到文本框中,在类的最后将flag1、flag2赋值为true,作用是将计算的结果当作第二次计算的数据进行再运算,即将结果重新赋值给x作为第一个计算数据!(附:在此类中还考虑了当除数为零的情况。)
(4)类BackSpace的设计:(功能类—退格)
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实习报告
功能解释:这是计算器附加功能的实现,这里只介绍退格功能,像正负号、求倒数、清零等功能相似,所以就不再一一介绍。首先获取退格按钮的命令值赋给s,然后获取当前文本框的内容,即输入的数据,将其赋给s1,接着进行判断,利用substring函数将s1字符串截取为从第一个字符至倒数第二个字符为止的字符串并重新赋值给s1,再将其输出到文本框,实现退格的功能。
第 9
页 10--计算器 Java实习报告
4.3、程序测试
1.简单的运算:(以加法为例:123+456)
分析:计算的结果为579.0,为双精度型,计算的结果被设置在文本框的最右端,该计算器的一个特点是可直接在文本框中输入数据以及进行更改。
2.倒数的运算:(以123为例)
分析:输出的结果如图所示,倒数功能实现,计算时,不仅是结果,输入的数据同样可以先实现倒数功能后再进行相应的计算,没有影响!
3.退格的运算:(以123为例)
分析:输出的结果如图所示,本计算器退格键有一个特点是,就算是是计算后得出的结果也能实现退格,缺点是不能很好的处理小数点的问题,因为小数点也是字符串的一部分。
页
第 10--计算器 Java实习报告
4.正负号的运算:(以123为例)
分析:输出的结果如图所示,正负号添加能够很好的实现,但可以进行一些改进,比如在计算过程当中直接点击负号运算符输入负数进行计算!
5.总体分析:
该计算器基本运算没有问题,清零、正负号、求倒数、退格功能都能很好的实现,总体能完成一个计算器的基本功能,但仍有许多地方需要改进,比如小数点的实现所存在的一些问题,虽然在基本的运算过程当中不会造成太大影响,但这依然不能认为是一个很好的计算器,同时,在另一方面,该计算器还没能很好的实现连续计算的功能,必须每次按下等号按钮计算出结果后才能用产生的结果接着进行下一次的计算,改进的方法是在运算符上同时注册Result类,让运算符同时拥有计算结果的功能。
五、实验小结
本次课程设计到此算是告一段落了,经过这次的学习,我学到了很多东西,在此基础上更加巩固了自己对java的认识与了解。
在做本项目是时候,会遇到很多小问题,比如说,在整个运算过程中要如何确保输入的计算数据哪个是第一个计算数据的,哪个是第二个计算
页
第 11--计算器 Java实习报告数据的,同时也要区分运算符,因为该计算器程序应用的都是利用字符串来完成计算的,而且不能重复输出运算符,更不能将运算符错误的存储在了第一个计算数据的数值中,也得考虑到万一不小心重复点击了运算符按钮会不会造成第一个计算数据的重新赋值等等问题,最后想到利用布尔类型来很好的控制运算符的应用!
此次课程设计让我更了解熟悉了Java中的图形用户界面和它的编程方式。在完成课题的过程中也不断充实了自己,学习到了很多以前没有学习到的知识,收获很大。最大的收获就是对大学学习的总结和培养了解决困难的信心和能力,使我对所学知识能够融会贯通,又不断丰富了新知识。Java计算器设计使得我们对所学的专业课有了更为深刻的认识,使得知识得到了巩固和提高。
在接下来的时间里,我觉得我要更加努力的往深一层次的方面看齐,了解更多有关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实习报告“,”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列的网格布局
Jpan.setLayout(new GridLayout(4,5));
Jtext.setHorizontalAlignment(JTextField.RIGHT);
contain.add(Jtext,”North“);
contain.add(Jpan);
A num=new A();//数据
Result re=new Result();//结果
Opertion op=new Opertion();//运算符
Clear cl=new Clear();//清零
BackSpace back=new BackSpace();//退格
CountDown count_d=new CountDown();//倒数
Strains stra=new Strains();//相反数
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(//采用匿名类实现窗口的正常关闭 new WindowAdapter() 页 第 13--计算器 Java实习报告 { public void windowClosing(WindowEvent e) { System.exit(0); } });} 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(”/“)) 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实习报告 class Clear implements ActionListener //清零功能 { public void actionPerformed(ActionEvent e){ Jtext.setText(”0.“);} } class CountDown implements ActionListener //求倒数类 { 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 //求相反数类 { 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实习报告 } class Result implements ActionListener //计算并显示结果 { 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(”除数不能为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实习报告 } } TheCalculator count=new TheCalculator();count.init(); 页 第 17 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 机电信息工程学院 单片机系统课程设计报告 完成日期:2010年5月31日 系: 专 业: 班 级: 设计题目: 学生姓名: 指导教师: 多功能简易计算器 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 目 录 一、设计任务和性能指标......................................................................2 1.1设计任务..............................................................................................................................2 1.2性能指标..............................................................................................................................2 二.设计方案.............................................................................................2 三.系统硬件设计.....................................................................................3 3.1单片机最小系统......................................................................................3 3.2键盘接口电路.....................................................................................................................3 3.3数码管显示电路.................................................................................................................4 3.4错误报警电路.....................................................................................................................5 四、系统软件设计..................................................................................6 4.1键盘扫描子程序设计..........................................................................................................6 4.2移位子程序及结果计算子程序设计................................................................................10 4.3显示子程序设计...............................................................................................................12 4.4主程序设计.......................................................................................................................13 五、调试及性能分析............................................................................13 5.1调试步骤...........................................................................................................................13 5.2性能分析...........................................................................................................................14 六、心得体会........................................................................................14 参考文献................................................................................................14 附录1 系统硬件电路图.......................................................................15 附录2 程序清单.................................................................................16 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 一、设计任务和性能指标 1.1设计任务 利用单片机及外围接口电路(键盘接口和显示接口电路)设计制作一个计算器,用LED显示计算数值及结果。 要求用Protel 画出系统的电路原理图(要求以最少组件,实现系统设计所要求的功能),印刷电路板(要求布局合理,线路清晰),绘出程序流程图,并给出程序清单(要求思路清晰,尽量简洁,主程序和子程序分开,使程序有较强的可读性)。1.2性能指标 1.2.3.4.5.加法:四位加法,计算结果若超过四位则显示计算错误 减法:四位减法,计算结果若小于零则显示计算错误 乘法:个位数乘法 除法:整数除法 有清零功能,计算错误报警 二.设计方案 按照系统设计的功能的要求,初步确定设计系统由主控模块、显示模块、错误报警模块、键扫描接口电路共四个模块组成,电路系统构成框图如图1.1所示。主控芯片使用51系列AT89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。 键盘电路采用4*4矩阵键盘电路。 显示模块采用4枚共阳极数码管和74ls273锁存芯片构成等器件构成。 错误报警电路采用5V蜂鸣器。 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 三.系统硬件设计 3.1单片机最小系统 单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。 主控芯片选取STC89C52RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便。 晶振选取11.0592MHz,晶振旁电容选取30pF。 采用按键复位电路,电阻分别选取100Ω和10K,电容选取10μF。以下为单片机最小系统硬件电路图。 单片机最小系统硬件电路 3.2键盘接口电路 计算器所需按键有: 数字键:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’ 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 功能键:’+’, ’-‘ , ’*’, ’/ ’ , ’ = ’, ’ C(清零)’ 共计16个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行和四列的8个公共端分别接P1.0~P1.7,这样扫描P1口就可以完成对矩阵键盘的扫描,通过对16个按键进行编码,从而得到键盘的口地址,对比P1口德扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘的功能。 以下为键盘接口电路的硬件电路图 键盘接口电路 3.3数码管显示电路 采用4位数码管对计算数据和结果的显示,这里选取共阳数码管,利用NPN三极管对数码管进行驱动,为了节省I/O资源,采取动态显示的方法来显示计算数据及结果。 利用74273锁存器来实现数码管的动态显示,P0口输出显示值,P2.4为段选口,控制273锁存器的时钟引脚,从而得到对数码管输入数据的控制。 P2.0~P2.3用来作为位选端,控制哪几位数码管进行显示。 以下为数码显示电路的硬件电路图 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 数码显示电路硬件电路图 3.4错误报警电路 错误报警电路就是在计算结果出现错误时或输入数据出现错误时,发出声音警报,提示使用者错误出现。 这里就采用5V蜂鸣器作为报警设备,利用PNP三极管对蜂鸣器进行驱动,有P2.5对其进行控制,这样在出现错误的同时用P2.5输出低,就可以使蜂鸣器工作,完成报警任务。 以下为报警电路硬件电路图 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 报警电路硬件电路图 系统整体硬件电路图见附录一 四、系统软件设计 4.1键盘扫描子程序设计 要进行数据的计算就必须先进行数据的输入,也就必须确定按键输入的数值是什么,这就需要对键盘进行扫描,从而确定究竟是哪个键按下。 对于键盘的扫描,既可以用行扫描也可以用列扫描,这里采用行扫描的方法来完成对键盘的扫描。 行扫描就是逐行扫描键盘,看是哪一行有键按下,再通过返回的键码来确定究竟是哪个按键按下。如对第一行扫描就令P1.0为低,P1口其余为高,这样若第一行有键按下,则P1口的值就会由0xfe变为其他值,再由这个值来确定是哪个键按下。 以下为键盘扫描子程序的程序清单。 uchar keyscan(){ int i; P1=0xfe; temp=P1; temp=temp&0xf0;大连民族学院2007级电子信息工程专业单片机系统课程设计报告 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;大连民族学院2007级电子信息工程专业单片机系统课程设计报告 } 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; } 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 } } 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;大连民族学院2007级电子信息工程专业单片机系统课程设计报告 } 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移位子程序及结果计算子程序设计 输入数据要存储在一四位数组内,而我们键入的值是数据的高位,后键入的值是低位,这样我们就需要在输入低位数值时将高位数值从数组的低位移向数组的高位,这就是编写移位子程序的目的。 对于结果计算子程序,包含加、减、乘、除四种运算。以加法运算为例,各种运算各有其标志位来代表计算类型,当加法标志位add=1是,就将输入的两个数据按照加法进行计算。 首先将数组内的数按照对应的位关系,将其转化为一个十进制数,这样我们就得到了加速和被加数这样俩个十进制数,从而我们就可以简单的将两个数进行相加,结果就是我们所求的数值。但这个数值不能直接显示到数码管上,我们还要对其进行处理,使其变为对应进位的四个数存入数组内,以便显示。既通过对结果数值分别除以1000、100、10和对10取余,得到我们想要的四个数,送显示子程序显示。其余减、乘、除的计算方法与加法的计算方法一样,这里不再累述。 以下为移位子程序和结果计算子程序的程序清单。 void left(uchar rx,uchar date){ switch(rx) { case 1:dat[0]=date;break;大连民族学院2007级电子信息工程专业单片机系统课程设计报告 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; } } 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 for(k=j-1;k>=0;k--) { if(dat[k]==0){dat[k]=10;} } } } if(dat[0]==0){dat[0]=10;} } 4.3显示子程序设计 从始至终无论是输入的计算数据,还是计算后的结果值。都存储在同一数组dat[ ]中,这样我们只要在显示时一直调用dat[ ]中的值,就能正确的显示数据。 以下为显示子程序的程序清单。 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); } 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 4.4主程序设计 主程序既把以上各子程序串连成一个整体,使整个程序循环运行。而在以上程序中也已经加入了个程序之间的连接点,首先进入程序后就立即进入显示子程序,而显示子程序内又调用键盘扫描子程序,若有键按下,则会跳转到移位子程序和结果计算子程序进行相应的处理。通过计算或移位后,数组内的值发生改变,显示的值也会同时发生改变。之后再进行键盘扫描,如此反复运行,就构成了程序的整体。 以下为主程序清单。 void main(){ num=0; while(1) { display(); } } 整体程序清单见附录二。 五、调试及性能分析 5.1调试步骤 在焊接好器件后,先不要将芯片插在芯片座上,要先验证先板上电源是否好用,有无短路等。接上USB电源,用万用表测量个芯片座对应电源和地之间的电压值,观察电压值是否正常。一切正常后方可将芯片插入芯片座,以继续测试其他功能。 将芯片插上后,对各个模块进行调试,按键是否工作正常,数码管是否显示正常等。编写相关部分的测试程序对其进行测试。 各部分硬件检测无误后,下载程序进行整体调试,一切正常后,结束调试过程。 在具体调试时首先遇到的问题是程序无法下载进入单片机,通过将电路板接线与原理电路图接线的对比发现,串口芯片与单片机连接的输入,输出接反,重新用铜线连接后,依然无法下载程序。后找到原因是由于下载串口与设计封装不符,用相对应的下载线可以下载。 成功下载程序后,发现数码管显示不正确,查看后发现有先没有连接,可能是制板时漏印,连接后显示正常。大连民族学院2007级电子信息工程专业单片机系统课程设计报告 5.2性能分析 对于计算器的性能,主要的衡量指标就在于计算的精度,本次制作的计算器性能情况如下: 加法运算:四位加法运算,和值不超过9999,若超过上限,则显示错误提示E,蜂鸣器报警提示。 减法运算:四位减法运算,若结果为负,对其取绝对值。 乘法运算:积不超过9999的乘法运算,若超出上限,显示错误提示E,蜂鸣器报警提示。 除法运算:整数除法,既计算结果为整数,若除数为零,则显示错误提示E,蜂鸣器报警提示。 通过对实际性能的分析,可以得到本次设计满足设计的要求。 六、心得体会 通过本次课程设计我真正的自己完成了对给定要求系统的硬件设计、电路设计、电路板设计、软件设计以及对成品的调试过程。从整个过程中学习到了很多方面的知识,了解到以往学习中自己知识在某方面的不足之处,是对以往学习科目的一种贯穿和承接,从而能更好的认识和学习,也对将来从事工作大有裨益。 从本次课设中我也看到了自身的很多不足之处,对知识的掌握不够扎实,有一知半解的现象。有时做事不够稳定,过于毛躁,不能平心静气的去分析所遇到的问题和错误。这在以后的工作和生活中是不可取的,通过对自身问题的认识与改正相信再遇到同样问题时会更好的解决。以后的设计实验也会更好的完成。 参考文献 [1] 徐维祥、刘旭敏.单片微型机原理及应用.大连:大连理工大学出版社,1996 [2] 李光飞、楼然苗、胡佳文、谢象佐.单片机课程设计与实例指导.北京: 北京航空航天大学出版社,2004 [3] 余永权.89系列FLASH单片机原理及应用.北京:电子工业出版社,2002 [4] 李群芳,黄建.单片机微型计算机与接口技术.北京:电子工业出版社,2001 [5] 楼然苗、李光飞.51系列单片机设计实例.北京:北京航空航天大学出版社,2003 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 附录1 系统硬件电路图 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 附录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];大连民族学院2007级电子信息工程专业单片机系统课程设计报告 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;大连民族学院2007级电子信息工程专业单片机系统课程设计报告 } 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;大连民族学院2007级电子信息工程专业单片机系统课程设计报告 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)大连民族学院2007级电子信息工程专业单片机系统课程设计报告 { 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; } } 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 } 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; } 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 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 基于单片机的简易计算器设计 基于单片机的简易计算器设计 一、设计任务和性能指标 1.1设计任务 利用单片机及外围接口电路(键盘接口和显示接口电路)设计制作一个计算器,用四位一体数码管显示计算数值及结果。要求用Protel 画出系统的电路原理图(要求以最少组件,实现系统设计所要求的功能),绘出程序流程图,并给出程序清单(要 求思路清晰,尽量简洁,主程序和子程序分开,使程序有较强的可读性)。1.2性能指标 1加法:能够计算四位以内的数的加法。2减法:能计算四位数以内的减法。3乘法:能够计算两位数以内的乘法。 4除法:能够计算四位数的乘法 5有清零功能,能随时对运算结果和数字输入进行清零。 二、系统设计方案 按照系统设计的功能的要求,初步确定设计系统由单片机主控模块、四位一体数码管显示模块、键扫描接口电路共三个主要模块组成。主控芯片使用51系列AT89C51单片机,采用高性能的静态80C51设计,它由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。 键盘电路采用4*4矩阵键盘电路。 显示模块采用四位一体共阳极数码管和SN74LS244锁存芯片构成等器件构成。 三、硬件系统设计 1.单片机最小系统 单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。 主控芯片选取STC89C51RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便。 晶振选取11.0592MHz,晶振旁电容选取30pF。 采用按键复位电路,电阻分别选取100Ω和10K,电容选取10μF。单片机最小系统硬件电路图如图(1)所示。 图(1)单片机最小系统 2.键盘接口电路 计算器所需按键有: 数字键:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’ 功能键:’+’, ’-‘ , ’*’, ’/ ’ , ’ = ’, ’ C(清零)’ 共计16个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行采用端口P0.0~P0.3,四列采用端口P3.0~P3.3,通过8个端口的的高低电平完成对矩阵键盘的控制。通过对16个按键进行编码,从而得到键盘的口地址,对比P1口德扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘的功能。 3.数码管显示电路 采用4位一体的数码管对计算数据和结果进行显示,这里选取共阳数码管,利用NPN三极管对数码管进行驱动,为了节省I/O资源,采取动态显示的方法来显示计算数据及结果。 利用SN74LS244N锁存器来实现数码管的动态显示,P1口输出显示值,P2.0~P2.3为位选端口。通过锁存器对段选信号的锁存,最终得到对数码管输入数据的控制。 以下为数码显示电路的硬件电路图,左图为数码管驱动电路,右图为段选信号锁存电路。 四.软件设计部分 根据选题要求,系统编程如下所示: #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); } } 软件设计好后,在KEIL上面进行仿真,把仿真得到的文件下载到Proteus里面进行仿真,得到Proteus仿真电路图如下所示: 图(2) 计算器Proteus仿真电路图 五.硬件电路焊接及调试 根据电路图纸,焊接好硬件电路,把程序下载到单片机芯片,接通好电源,进行调试。在焊接好器件后,先不要将芯片插在芯片座上,要先验证先板上电源是否好用,有无短路等。接上USB电源,用万用表测量个芯片座对应电源和地之间的电压值,观察电压值是否正常。一切正常后方可将芯片插入芯片座,以继续测试其他功能。 将芯片插上后,对各个模块进行调试,按键是否工作正常,数码管是否显示正常等。编写相关部分的测试程序对其进行测试。 各部分硬件检测无误后,下载程序进行整体调试,一切正常后,结束调试过程。 用所设计的单片机进行数字计算,显示结果与任务要求一致,焊接电路符合要求。六.课程设计心得 两周的时间,终于把单片机课程设计搞完了。整个体会还是比较多的。首先是题目的选择,各方面的原因,自己还是想选个简单点的题目,不过最后选来选去,还是选择了计算器。由于自己对单片机编程还不是很熟悉,结果在设计的时候遇到了一系列问题,程序总是调试部处理,不过还好,最后在同学的帮助下终于把程序调试出来了,虽然程序设计实现的功能与老师要求的不尽相同,不过勉强还算可以。从这里我知道了基本知识的重要性。其实进行程序设计的时候主要是对各功能模块的把握。计算器里面最难的一部分是矩阵键盘的扫描和编码,那个费了很大力气。 另外一点就是硬件焊接调试部分。焊接的时候到时轻松,一个下午就焊接好了,然后是调试部分。调试花费的时间还是比较长的。不过有了上个学期数字电路焊接调试的经验,这次单片机调试还算是比较顺利。我也是从电路板的正负电源检测起,一步一步来,最终得到了想要的结果。调试的时候主要遇到了两个问题。一个是键盘总是没有反应,为了这个自己调试了很久,前前后后把电路板检查了几次,最后才发现是键盘本身的问题,和同学们换了个好键盘才行。另一个问题是总是显示不出来1、4、7这三个数字。检测来检测去,发现来是在测试最小系统时在一个位选端接了高电平,对位选信号产生了影响。当把那个高电平去掉后,终于得到了正确的结果。 总的来说这次课程设计达到了完成了基本任务,达到了基本要求。通过亲身对程序设计和电路焊接调试的体会,自己对单片机有了进一步的了解,单片机编程能力也得到了提高。电路板的焊接与调试,使自己电路调试的方法和思想进一步加强了。这次单片机课程设计应该说是比较成功的。 参考文献: 【1】徐维祥、刘旭敏:,《单片微型机原理及应用》,大连理工大学出版社,1996年。【2】李光飞、楼然苗、胡佳文、谢象佐.,《单片机课程设计与实例指导.》,北京航空航天大学出版社,2004年。 【3】余永权,《89系列FLASH单片机原理及应用.》,电子工业出版社,2002。【4】杨恢先、黄辉先,《单片机原理及应用》,人民邮电出版社,2006年。【5】常敏、王涵、范江波,《单片机应用程序开发与实践》,电子工业出版社,2009年。 MATLAB通信原理课程设计报告 目 录 1课题名称.....................................................................................................................1 2课程设计的方案和基本原理.....................................................................................1 2.1信息论基本计算...............................................................................................1 2.2数字信号基带传输系统...................................................................................1 3课程设计步骤.............................................................................................................3 3.1信息论基本计算的设计步骤...........................................................................3 3.2数字信号基带传输系统的设计步骤...............................................................3 4课程设计结果和结果分析论证.................................................................................4 4.1信息论的基本运算结果...................................................................................4 4.2数字信号基带传输系统的设计结果...............................................................6 5、心得体会................................................................................................................11 6附件...........................................................................................................................11 6.1信息论基本计算.............................................................................................11 6.2数字信号基带传输系统.................................................................................14 7 评分表......................................................................................错误!未定义书签。 1课题名称 (1)信息论基本计算。 (3)数字信号基带传输系统设计 2课程设计的方案和基本原理 2.1信息论基本计算 2.1.1平均信息量:平均每个符号所能提供的信息量。 H(X)。 2.1.2离散信道容量:信道容量是信道所能传送的最大的信息量。C=maxI(X;Y)R=I(X;Y)=H(X)-H(XY)2.1.3信源编码过程:Huffman编码的意义是,用最少的编码长度来表达符号的信息。为了使平均码长度最小,将发生概率较大的符号用比较短的码组来表示,将发生概率较小的符号用较长的码组实现,以得到最佳的变长编码,减少冗余度,提高系统传输的效率。 2.2数字信号基带传输系统 2.2.1数字基带信号的码型:由于数字基带信号是数字信息的电脉冲表示,不同形式的基带信号(又称为码型)有不同的频谱结构和功率谱分布。不同的码型有不同的优点,常用的码型有单/双极性码、非归零/归零码、数字双相码(曼彻斯特码)、密勒码、AMI码、HDB3码。 2.2.2单/双极性码:单极性码是用电平1来表示二元信息中的‘1’,用电平0来表示二元信息中的0,电平在整个码元的持续时间里保持不变,记做NRZ码。双极性码与单极性码的区别仅在于它用电平-1来表示二元信息中的‘0’。 2.2.3非归零/归零码:归零码与非归零码的区别仅在于,非归零码在整个码元持续时间内保持电平值不变,而归零码的码元持续时间的前一半时间内保持,而后一半时间内回到0.1 2.2.4数字双相码(曼彻斯特码):此种码型采用在一个码元的持续时间中央时刻从0到1的跳变来表示1,从1到0的跳变来表示0。或者与之相反用在一个码元的持续时间中央时刻从0到1的跳变来表示0,从1到0的跳变来表示1。 2.2.5密勒码:该码型是双相码的变型。它采用码元中央时刻跳变表示信息1即前半时间的电平和前一码元的后半时间的电平相同,中间跳变。遇到信息0做如下处理:首先对0的码元在整个持续时间内保持同一电平值,其次若此0的前一信息是一则码元的电平同前面信息1的码元后半时间电平相同,若前一信息为0,则与前面码元的电平相反。 2.2.6 AMI码、HDB3码: AMI码是传号交替反转码。其编码规则是将消息码中的“1”交替变成“+1”和“-1”,将消息码中的“0”仍保持为“0”。HDB3码的全称是3阶高密度双极性码。首先将信息码变换成AMI码,然后检查AMI码中连0的情况,没有发现4个以上连0的码元串时码型不需变换,仍为AMI码的形状。若发现4个以上连0的码元串时,则根据相应规则把第四个0变换成相应符号。 2.2.7码型的功率谱分布:数字基带信号一般是随机信号,因此分析随机信号的频谱特性要用功率诺密度来分析。一般来说,求解功率谱是一件相当困难的事,但由于上述几种码型比较简单,我们可以求出其功率谱密度函数。 对单极性非归零码、单极性归零码、双极性非归零码和双极性归零码这4种码。由于统计的独立性,课由由功率谱公式画出功率谱波形图。数字双相码的功率相关公式如下:“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”。密勒码的相关功率公式如下: “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;” 对于AMI码和HDB3码的功率谱函数,则需要进行实际的码型进行分析。 3课程设计步骤 3.1信息论基本计算的设计步骤 3.1.1信源平均信息量的计算(以高斯分布的信源为例): 通过系统产生一个高斯随机信源,再求出它的平均信息量。3.1.2离散信道容量的计算(以输入符号等概分布为例): 编写hmessage函数求出平均互信息,编写dmessage函数,求出离散信息熵,调用hmessage函数和dmessage函数得出hf和hx,最后信道容量c=hx-hf。3.1.3信源编码过程(以Huffman编码为例): 先编写huffman函数,对系列排序并求出huffman编码。调用huffman函数和dmessage函数,得出编码后的码字。 3.2数字信号基带传输系统的设计步骤 3.2.1单/双极性归零/非归零码:先对原始码型进行相应的码型变换,画出码型子图,再由功率谱公式画出功率谱波形图。 3.2.2数字双相码:先进行码型变换,再画出功率谱,功率相关公式如下:“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密勒码:密勒码的相关功率公式如下: “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函数,求的AMI码型变换。编写t2f函数,功能是将时域信号做傅里叶变换到频域。为了求AMI码的功率谱密度,编写AMIpower函数,该函数中又调用了t2f函数。3.2.5HDB3码:编写HDb3函数和t2f函数,分别实现HDb3编码和傅里叶变换。调用HDb3函数和t2f函数,得出原序列图、编码后的序列图和功率谱图。 4课程设计结果和结果分析论证 4.1信息论的基本运算结果 4.1.1信源平均信息量的计算(以高斯分布的信源为例): 图4.1.1连续信源平均信息量 4.1.2离散信道容量的计算(以输入符号等概分布为例)4 图4.1.2离散信道容量 信道容量为信源的平均信息量减去互信息量。 4.1.3信源编码过程(以Huffman编码为例) 图4.1.3 huffman编码 哈弗曼编码是把出现概率较大的用较短的码元来实现,概率出现较小的用较长的码元实现。4.2数字信号基带传输系统的设计结果 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]经编码规则验证是正确的。功率谱显示,码型的功率分布有分段性,并以某些频率为中心。 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] 经编码规则验证是正确的。功率谱显示,码型的功率分布有分段性,并以某些频率为中心。 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], 经编码规则验证是正确的。功率谱显示,码型的功率分布有分段性,并以某些频率为中心。 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]。经编码规则验证是正确的。功率谱显示,码型的功率分布有分段性,并以某些频率为中心。 4.2.5数字双相码及其功率谱 图4.2.5数字双相码码型和功率谱 由图可知,输入的序列为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、心得体会 6附件 6.1信息论基本计算 6.1.1、信源平均信息量的计算(高斯分布的信源)x=randn(1,100000);%产生N(0,1)高斯源 px=1/sqrt(2*pi)*exp(-(x-1).^2/2);%计算概率 l=-mean(log2(px))%计算熵 6.1.2、编程实现离散信道容量的计算(以输入符号等概分布为例)function r=dmessage(x,n)%参数x表示概率矩阵,n是符号的数目 r=0;for i=1:n r=r-x(i)*log(x(i))/log(2);end disp('此离散信源的平均信息量为:');r %直接在命令窗口中调用dmessage函数,也可以在其它函数中调用 dmessage([0.25,0.25,0.25,0.25],4) 6.1.3、离散信道容量的计算 %求互信息的函数文件如下 function r=hmessage(x,f,nx,my)%x为输出的信源分布,f为转移概率矩阵,nx为输出的符号可选个数 %my为输出的符号个数 sum=0;for i=1:nx for j=1:my 11 %通过式子p(x,y)=p(x)p(y/x)来求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('平均互信息量为:');%利用函数dmessage来求信源的熵,利用函数hmessage来求平均互信息量 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、哈弗曼编码的实现 p=[1/4,1/4,1/4,1/8,1/8];[h,l]=huffman1(p)%哈弗曼编码的实现函数如下 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文件里调用haffman函数 p=[1/2,1/4,1/8,1/16,1/16];[h,l]=huffman(p) 6.2数字信号基带传输系统 6.2.1、单极性非归零码以及功率谱的实现 function y=djx(x)%本函数实现将输入的一段二进制代码编码为相应的单极性非归零码输出 %输入x为二进制码,输出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)=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命令来实现标记出各码元对应的二元信息 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('单极性非归零码的功率谱');%函数调用t=[1 1 0 1 0 0 1 0 1 0 0 1];djx(t); 6.2.2、单极性归零码及其功率谱实现 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文件中调用函数 t=[1 1 0 1 0 0 1 0 1 0 0 1];djxglm(t); 6.2.3、双极性非归零码及其功率谱的实现 function y=sjx(x)%本函数实现将输入的一段二进制代码编码为相应的双极性非归零码输出 %输入x为二进制码,输出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命令来实现标记出各码元对应的二元信息 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文件中调用函数 t=[1 1 0 1 0 0 1 0 1 0 0 1];sjx(t); 6.2.4、双极性归零码及其功率谱的实现 function y=sjxglm(x)%本函数实现将输入的一段二进制代码编码为相应的双极性归零码输出%输入x为二进制码,输出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命令来实现标记出各码元对应的二元信息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文件中调用函数 t=[1 1 0 1 0 0 1 0 1 0 0 1];sjxglm(t); 6.2.5、数字双相码及其功率谱的实现 function y=szsxm(x)%本函数实现将输入的一段二进制代码编码为相应的数字双相码输出 %输入x为二进制码,输出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的电平跳变来表示‘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的电平跳变来表示‘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命令来实现标记出各码元对应的二元信息 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('数字双相码的功率谱');%在命令窗口或M文件中调用函数 t=[1 1 0 1 0 0 1 0 1 0 0 1];szsxm(t); 6.2.6、密勒码及其功率谱的实现 function y=mlm(x)%该函数实现密勒编码,输入码序列为x grid=100;t=0:1/grid:length(x);%定义时间序列 i=1;%由于第一码元的编码不定,我们直接给出 if(x(i)==1)for j=1:grid/2 y(grid/2*(2*i-2)+j)=0;%前半时间为0 y(grid/2*(2*i-1)+j)=1;%后半时间为1 end else for j=1:grid%若输入0 y(grid*(i-1)+j)=0;%码元持续时间内为0 end end for i=2:length(x)%开始进行密勒编码 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);%前半时间与前一码元后半时间值相同 y(grid/2*(2*i-1)+j)=1-y(grid/2*(2*i-2)+j);%后半时间与前半时间相反 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);%所有时间与前一码元后半时间值相同 end else%前一信息为0 for j=1:grid y(grid*(i-1)+j)=1-y(grid/2*(2*i-3)+grid/4);%所有时间与前一码元后半时间值相反 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命令来实现标记出各码元对应的二元信息 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函数的调用 t=[1 1 0 1 0 0 1 0 1 0 0 1];mlm(t); 6.2.7、AMI码及其功率谱的实现 *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命令来实现标记出各码元对应的二元信息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函数的调用 t=[1 1 0 1 0 0 1 0 1 0 0 1];AMI(t); 6.2.8、HDB3码及其功率谱的实现 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 %函数调用 clear all close all k=input(‘取样点数=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码功率谱密度’)第三篇:单片机计算器课程设计报告
第四篇:单片机计算器课程设计报告
第五篇:MATLAB通信原理课程设计报告