简易计算器设计报告样本
简易计算器的设计报告
1. 方案根据计算器的功能要求,选择AT89C51为主控机,通过扩展必要的外围接口电路,实现对计算器的设计。
外部主要由4*4矩阵键盘和一个液晶显示屏构成,内部由一块AT89C51单片机构成。
计算器电路包括四个部分:选用LCD作为显示部分,矩阵键盘作为输入部分,运算模块,单片机控制部分。
模块图如图1.2所示。
图1.2 方案二模块图1.1整体设计根据简易计算器的功能和指标要求,本设计系统选用MCS-51系列单片机AT89C51为主控机。
通过扩展必要的外围接口电路,实现对简易计算器的设计。
计算器电路包括三个部分:显示电路、4*4键扫描电路、单片机微控制电路。
具体设计如下:(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用七段数码管显示数据和结果。
(2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可。
(3)执行过程:开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果。
(4)错误提示:当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在七段数码管上提示错误。
线路原理框图如图1.3所示。
图1.3 线路原理框图2电路设计原理2.1键盘接口电路计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。
矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为4×4个。
vb 简易计算器实验报告
简易计算器课程设计报告一、实验目的:模拟计算器的功能。
系统启动后, 先清屏, 再在显示屏右侧显示0字样, 系统仅接收数字键、加减乘除键、退格键、C键(复位)、=或回车键、ESC键(退出系统)作为有效按键, 其余按键不响应。
按键后屏幕显示效果要达到一般计算器显示屏的同样效果。
不要求设计一般计算器上都具有的M功能。
二、实验设计内容及思想:首先, 创建一个主体框架: 建立程序的主要界面后, 系统自动生成界面的主要窗口生成代码。
对于每个按钮的的代码段中, 分别添加事件触发的处理代码。
分别设立三个显示屏, 第一个显示屏作为“被加数”框, 第二个显示屏作为“加数”框, 第三个显示屏则作为输出框。
四则运算时直接采用计算表达式。
所以, 优先级和运算规则皆宜考虑在内。
在进行除法运算时, 若遇到除数为0, 则运用条件语句执行, 并在输出显示屏上输出“E”。
三角函数、指数、对数、整除、取余等运算, 也是运用类似手法。
考虑到计算器的操作简便性, 所以加入了复位和退出按钮。
三、源程序文件:Private Sub Command1_Click()Dim x As IntegerDim y As Integerx = Text1.Texty = Text2.TextText3.Text = x + yEnd SubPrivate Sub Command10_Click()Dim x As Integerx = Text1.TextText3.Text = Cos(x)End SubPrivate Sub Command11_Click()Dim x As Integerx = Text1.TextText3.Text = Tan(x)End SubPrivate Sub Command12_Click()Dim x As Integerx = Text1.TextText3.Text = Atn(x)End SubPrivate Sub Command13_Click() Dim x As IntegerDim y As Integerx = Text1.Texty = Text2.TextText3.Text = x ^ yEnd SubPrivate Sub Command14_Click() Dim x As Integerx = Text1.TextIf x <= 0 ThenText3.Text = "输入错误"ElseText3.Text = Log(x)End IfEnd SubPrivate Sub Command15_Click() Text3.Text = "此按钮仅作装饰用" End SubPrivate Sub Command2_Click() Dim x As IntegerDim y As Integerx = Text1.Texty = Text2.TextText3.Text = x - yEnd SubPrivate Sub Command3_Click() Dim x As IntegerDim y As Integerx = Text1.Texty = Text2.TextText3.Text = x * yEnd SubPrivate Sub Command4_Click() Dim x As IntegerDim y As Integerx = Text1.Texty = Text2.TextIf y = 0 ThenText3.Text = "E"ElseText3.Text = x / yEnd IfEnd SubPrivate Sub Command5_Click()Dim x As IntegerDim y As Integerx = Text1.Texty = Text2.TextText3.Text = x \ yEnd SubPrivate Sub Command6_Click()Dim x As IntegerDim y As Integerx = Text1.Texty = Text2.TextText3.Text = x Mod yEnd SubPrivate Sub Command7_Click()Text1.Text = ""Text2.Text = ""Text3.Text = " 0" End SubPrivate Sub Command8_Click()EndEnd SubPrivate Sub Command9_Click()Dim x As Integerx = Text1.TextText3.Text = Sin(x)End Sub源代码截图:四、运行结果演示: 加法演示:减法演示: 乘法演示:除法演示:能够整除: 不能够整除:除数为零:。
简单计算器实验报告
简单计算器实验报告简单计算器实验报告引言:在现代社会,计算器已经成为人们生活中不可或缺的工具之一。
无论是在学校、办公室还是家庭,计算器都扮演着重要的角色。
本实验旨在设计和构建一个简单的计算器,并通过实验验证其功能和准确性。
实验步骤:1. 设计计算器的外观和功能:我们首先对计算器进行了外观设计,选择了简洁、易于使用的界面。
然后确定了计算器的基本功能,包括加法、减法、乘法和除法。
2. 选择合适的硬件和软件:为了构建计算器,我们选择了合适的硬件和软件。
硬件方面,我们选用了一块Arduino开发板、液晶显示屏和按键。
软件方面,我们使用了Arduino编程语言。
3. 连接硬件和编写代码:我们将液晶显示屏和按键与Arduino开发板连接起来,并编写了相应的代码。
代码中包括了计算器的逻辑运算和界面显示。
4. 测试计算器的功能和准确性:在完成硬件连接和代码编写后,我们对计算器进行了测试。
我们输入了一系列的算术表达式,包括简单的加减乘除运算,以及复杂的多步运算。
通过与手动计算的结果进行对比,我们验证了计算器的功能和准确性。
实验结果:经过多次测试,我们的计算器表现出了良好的功能和准确性。
无论是简单的加法还是复杂的多步运算,计算器都能够正确地给出结果。
液晶显示屏清晰地显示了算术表达式和计算结果,而按键的响应速度也非常迅速。
讨论:虽然我们的计算器在功能和准确性方面表现出色,但仍有一些改进的空间。
首先,我们可以增加更多的功能,如开方、求余等。
其次,我们可以改进界面设计,使其更加美观和易于使用。
此外,我们还可以考虑加入更强大的处理器和更大的内存,以提高计算器的性能。
结论:通过本次实验,我们成功设计和构建了一个简单的计算器,并验证了其功能和准确性。
计算器在各种算术运算中表现出色,并且具有清晰的界面和快速的响应速度。
然而,我们也意识到计算器仍有改进的空间,包括增加更多功能和改进界面设计。
总的来说,本次实验为我们深入了解计算器的原理和构造提供了宝贵的经验。
简易计算器实验报告
简易计算器实验报告简易计算器实验报告引言:计算器是我们日常生活中常用的工具之一。
它可以帮助我们进行简单的数学运算,提高计算的效率。
在本次实验中,我们将设计并制作一台简易计算器,通过实践来掌握计算器的原理和工作原理。
实验目的:1. 了解计算器的基本原理和工作原理;2. 掌握计算器的设计和制作方法;3. 提高动手能力和创造力。
实验材料:1. 电路板;2. 按键;3. LED显示屏;4. 电容;5. 电阻;6. 电源。
实验步骤:1. 连接电路板和电源,确保电路板能够正常工作;2. 将按键连接到电路板上,用于输入数字和运算符;3. 连接LED显示屏,用于显示计算结果;4. 添加电容和电阻,用于控制电路的稳定性和电流;5. 调试电路,确保计算器能够正确运行。
实验结果:经过一番调试,我们成功制作出了一台简易计算器。
它可以进行基本的加减乘除运算,并且在LED显示屏上显示结果。
通过按键输入数字和运算符,我们可以进行各种运算,从而得到我们想要的结果。
这台计算器虽然简单,但是它的实用性和便携性都非常高。
实验分析:在本次实验中,我们主要学习了计算器的基本原理和工作原理。
计算器是通过按键输入数字和运算符,然后经过电路的计算和控制,最终在显示屏上显示结果。
在电路中,电容和电阻的作用是为了保证电路的稳定性和电流的控制。
通过这个实验,我们更加深入地了解了计算器的内部结构和工作原理。
实验总结:通过本次实验,我们成功制作了一台简易计算器,并且对计算器的原理和工作原理有了更深入的了解。
实验过程中,我们不仅提高了动手能力和创造力,还培养了解决问题的能力。
计算器作为一种常见的工具,它的设计和制作过程并不复杂,但是它的实用性和便携性却非常高,为我们的生活带来了很大的便利。
未来展望:通过这次实验,我们对计算器的原理和工作原理有了初步的了解。
在未来,我们可以进一步深入研究计算器的更高级功能和更复杂的电路设计。
同时,我们也可以将这种简易计算器的设计思想应用到其他领域,如电子设备、机器人等,从而提高我们的创造力和创新能力。
简易计算器报告
tong datain[35..0]
dataout[27..0]
inst9
XOR inst19
模块说明: 当乘法符号的上升沿的时候读入反馈的结果 (包括数据及正负号) 并输出到
data1 、data1_pn; 当乘法符号的下降沿的时候读入数据 (包括数据及正负号) 并输出到 data2 、
data2_pn 。并进行计算,结果的数据由乘法器计算得到;结果的正负号即为两个 相乘数据的正负号取异或。
data1_pn:outstd_logic; data2_pn:outstd_logic
); end entity mul; architecturebehaveof mul is signal temp1:std_logic; signal temp2:std_logic; begin process(reset,clk) begin if(reset='0')then
data2_pn 。并进行计算,结果的数据由除法器计算得到;结果的正负号即为两个 相除数据的正负号取异或。
数据为保留两位小数,输出的当成被除数的数乘上 100。
3.乘或除数据选择输出模块:
7
tt
reset pn1 pn2 res1[27..0] res2[27..0] clk1 clk2
inst6
6.加减运算模块:
add
clk reset data[27..0] data_pn
dout[27..0] dout_pn
inst11
模块说明:
由于上一级已考虑加减情况,此模块只需实现加法运算。 A+B 有四种情况:
1、A>0,B>0 输出数据 A+B,正负号为正
简单计算器设计报告
简单计算器设计报告045一、基本功能描述通过文本编辑框实现基本整数的加减乘除运算二、设计思路如下图是整个程序进行的流程图, 基本方法是在ItemText文本编辑框输入字符, 程序对字符进行判断, 若输入不是数字则提示错误。
输入正常时, 通过下拉框ComboBox_InsertString选择相应运算符。
点击等号IDC_OK, 即可得出运算结果。
操作简便, 算法简单。
三、软件设计1、设计步骤打开Microsoft Visual C++ 6.0,在文件中点击新建, 在弹出框内选择MFC AppWizard[exe]工程, 输入工程名zhoutong及其所在位置, 点击确定将弹出MFC AppWizard-step 1对话框, 选择基本对话框, 点击完成MFC AppWizard就建立了一个基于对话窗口的程序框架四、主要程序分析1.字符判定函数BOOL IsInt(TCHAR*str) {int i=atoi(str);TCHAR strtemp[256]; wsprintf(strtemp,"%i",i); if(strcmp(str,strtemp)!=0) {return FALSE;}Else{return TRUE;}}3、该函数通过atoi把文本编辑框读取的字符转换为数字, 再通过wsprintf把转换数字转换为字符, 通过strcmp比较原字符和转换得来的字符。
如相同返回true,不通则返回false.4、运算符选择程序BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam){HWND hwndComboOP=GetDlgItem(hwnd,IDC_COMBOOP);ComboBox_InsertString(hwndComboOP,-1,TEXT("+"));ComboBox_InsertString(hwndComboOP,-1,TEXT("-"));ComboBox_InsertString(hwndComboOP,-1,TEXT("*"));ComboBox_InsertString(hwndComboOP,-1,TEXT("/"));return TRUE;}通过ComboBox_InsertString插入要输入的运算符5、主程序字符获取TCHAR str1[256];TCHAR str2[256];GetDlgItemText(hwnd,IDC_EDIT1,str1,sizeof(str1));GetDlgItemText(hwnd,IDC_EDIT2,str2,sizeof(str2));调用子程序判断输入是否为数字if(IsInt(str1)==FALSE){MessageBox(hwnd,TEXT("第一个数不是合法整数"),TEXT("错误"),MB_OK|MB_ICONERROR); return;}if(IsInt(str2)==FALSE){MessageBox(hwnd,TEXT("第二个数不是合法整数"),TEXT("错误"),MB_OK|MB_ICONERROR); return;}将输入字符转换为数字int i1=atoi(str1);int i2=atoi(str2);int i3=0;获取运算符HWND hwndComboOp=GetDlgItem(hwnd,IDC_COMBOOP);int curIndex=ComboBox_GetCurSel(hwndComboOp);运算switch(curIndex){case 0:{i3=i1+i2;}break;case 1:{i3=i1-i2;}break;case 2:{i3=i1*i2;}break;case 3:{i3=i1/i2;}break;}运算结果转换为字符TCHAR str3[256];itoa(i3,str3,10);输出运算结果SetDlgItemText(hwnd,IDC_EDIT3,str3);}break;退出程序case IDC_EXIT:{exit(0);}break;五、结果分析六、该计算器只能实现简单的整数运算, 不能对小数分数进行运算。
51单片机简易计算器设计报告
51单片机简易计算器设计报告
本文将介绍51单片机简易计算器的设计报告。
该计算器通过
16位的LCD显示屏实现了基本计算功能,包括加、减、乘、除、取反、开方等。
1. 硬件设计
该计算器的核心部件是STC89C52单片机。
STC89C52是一种
高性能、低功耗的8位单片机,拥有8KB的Flash程序存储器和128字节的内部RAM,可提供多种功能和通讯接口。
通过
I/O口与LCD模块通讯,实现输出功能。
该计算器使用16位的LCD显示屏,显示范围为-99.99~99.99,共有6个数字位。
显示屏使用了ST7920控制器,可通过串行、并行等多种方式控制。
2. 软件设计
该计算器的软件设计主要包括三部分:键盘扫描,计算功能和LCD显示。
键盘扫描:该计算器采用4x5矩阵键盘,通过程序对键盘进行扫描,实现对不同按键的检测。
计算功能:该计算器可以实现基本的四则运算、取反、开方等功能。
对于四则运算,通过栈来实现计算,将运算符压入栈中,然后将操作数从栈中取出进行计算。
LCD显示:该计算器使用16位的LCD显示屏,通过程序控制数据和命令的传输,将计算结果显示在LCD屏幕上。
3. 总结
通过对51单片机简易计算器的设计报告,可以看出该计算器实现了基本的计算功能,通过硬件设计和软件设计相结合,将计算器的功能实现得十分完整。
该计算器的设计初步掌握了51单片机的应用,有助于后续项目的开展。
简易计算器设计报告
1602液晶显示计算器设计报告2016年10月一、摘要计算器是人们的日常生活最常见的电子产品之一,应用广泛,功能强大。
本次我们小组设计制作了一个简易计算器,能够在-9999999~9999999的范围内进行整数、小数的四则运算运算,并求解ax+e x=b类型方程。
该计算器以AT89C51单片机芯片作为核心,采4*4矩阵键盘作为输入,将数据输入单片机内部处理,用LCD1602工业字符液晶显示出运算和结果。
进行显示。
经过检验能够实现预设功能,具有很高的实用价值。
关键词:单片机;简易计算器;AT89C51;LCD1602。
本设计具有以下功能:1、能够实现-9999999~9999999范围内整数,小数的基本运算(超出范围后报错)。
2、储存运算结果,掉电不丢失。
3、实现6位及以上有效数字。
4、解ax+e x=b方程。
5、能够连续运算,即上次运算结果作为下次的输入。
6、能够在一次操作中连续运算。
二、方案论证方案描述:方案一:以51单片机为核心,4*4矩阵键盘输入,数码管显示输入数字和运算结果。
方案二:以51单片机为核心,4*4矩阵键盘输入,LCD1602显示输入数字和运算结果。
方案比较与选择:LCD1602作为一个成熟的产品,使用简单,模式固定,便于移植到各种类型的程序,又有微功耗、体积小、显示内容丰富超薄轻巧等优点,而数码管虽然亮度高,但是操作复杂、能耗高、且不能显示符号,本设计对亮度要求不是特别高,故采用方案二。
三、解方程算法ax+e x=b为非线性方程,采用牛顿法迭代求解。
原理是利用泰勒公式在X0处展开,且展开到一阶,即f(X)=f(X0)+(X- X0)f’(X0),求解X=X1= X0-f(X0)/f’(X0),进而推出Xn+1=Xn-f(Xn)/f’(Xn)。
通过迭代,这个式子必然在f(x)=0的时候收敛,进而得到方程的解。
四、电路与程序系统组成:电源系统,复位电路,晶振电路,4*4矩阵键盘,独立按键,STC80C52,LCD1602。
简单计算器课程设计报告
简单计算器课程设计报告目录1.基本功能描述 (1)2.设计思路 (1)2.1相关说明 (1)2.2各块流程图 (2)3.软件设计 (7)3.1 设计步骤 (7)3.2 界面设计 (9)3.2.1添加图标 (9)2.2.2添加控件 (10)3.2.3添加菜单 (12)3.3 关键功能的实现 (14)4.结论与心得体会 (16)5.参考文献 (18)6.思考题 (18)7.附录 (20)7.1调试报告 (20)7.2测试结果 (21)7.3关键源代码 (23)简单计算器1.基本功能描述该简单计算器主要实现了双目运算和单目运算功能。
双目运算符包含基本的四则运算及乘幂功能,单目运算符主要包含正余弦,阶乘,对数,开方,倒数等运算,同时也包含角度制的转换、科学型与标准型的转换、输出设计者信息、清除、退格、退出功能。
简单计算器可对输入的任意操作数,包括小数和整数及正数和负数进行上述各种运算并能实现连续运算,并且能在出现错误时给出相应提示。
同时也可以操作与运算按钮相对应的菜单项。
2.设计思路2.1相关说明1)相关的变量标志位:m_num:与编辑框相关联的变量num1:作为临时变量储存当时按下的按钮值num2:作为临时变量储存编辑框的值m_hudu:角度制的标志位,为0时为弧度m_jiao:角度转换的临时变量point:bool值,小数点有无标志位,当值为ture时为有小数点dianhou:小数点后位数记录位danshuang:单双目运算符标志位zhengfu:bool值,作为正负数标志位,当为ture时为正数2)主要功能设计简述:该简单计算器的重难点主要在一个编辑框要实现输入和输出的显示,小数的实现,正负数的交替输入,退格时数的实现,单双目运算符的不同如何实现等方面。
其中单目运算符sin、cos、tan等要考虑角度转换,之后的运算和其他单目运算符没有差别,基于以上的考虑,想到必须对相关的操作进行相应的标志位,具体的如上列举。
计算器设计实验报告
计算器设计实验报告计算器设计实验报告第一部分:引言计算器是一种广泛应用于日常生活和工作中的电子设备。
它能够进行基本的数学运算,如加减乘除,以及更复杂的科学计算,如对数、三角函数等。
本实验旨在设计一个简单的计算器,以了解计算器的工作原理,并通过实践来提高我们的电子设计和编程能力。
第二部分:设计思路在设计计算器之前,我们首先需要确定所需的功能和要使用的技术。
基于我们的目标是设计一个简单的计算器,我们决定使用数字显示屏、按键和微控制器来实现。
数字显示屏是用于显示计算结果和用户输入的设备,我们选择了七段数码管作为显示器。
按键则用于接收用户输入的数字和操作符。
微控制器是计算器的核心部件,它负责接收按键输入,进行计算,并将结果显示在数码管上。
第三部分:实验步骤1. 硬件设计我们首先设计了数字显示屏的电路。
通过连接七段数码管和相应的电阻,我们能够控制数码管的亮灭,从而显示不同的数字和符号。
接下来,我们设计了按键的电路。
每个按键都与微控制器的引脚相连,当按键被按下时,引脚会接收到一个电平信号,微控制器通过检测引脚状态来确定用户的输入。
2. 软件编程在硬件设计完成后,我们开始编写微控制器的程序。
程序的主要任务是接收按键输入,并根据用户的操作进行相应的计算。
首先,我们设置了一个变量来存储用户的输入,然后通过检测按键状态来更新这个变量。
当用户按下数字键时,程序将数字添加到变量中;当用户按下操作符键时,程序将根据当前的操作符和变量进行相应的计算。
最后,程序将计算结果显示在数码管上。
我们使用了一个函数来将计算结果转换为七段数码管的控制信号,并通过相应的引脚将信号发送到数码管。
第四部分:实验结果经过一段时间的设计和调试,我们成功地完成了计算器的制作。
它能够准确地接收用户的输入,并进行相应的计算。
计算结果也能够正确地显示在数码管上。
我们进行了一系列测试来验证计算器的功能和性能。
测试包括基本的加减乘除运算,以及一些复杂的科学计算,如对数和三角函数。
简易计算器实验报告
简易计算器实验报告一、实验目的本次实验的目的是设计并实现一个简易计算器,能够进行基本的四则运算(加、减、乘、除),以及处理括号的优先级运算,提高对程序设计和逻辑思维的理解与应用能力。
二、实验原理1、四则运算的优先级规则在数学运算中,先计算括号内的表达式,然后按照先乘除后加减的顺序进行计算。
乘除法的优先级高于加减法,如果在同一级运算中,按照从左到右的顺序进行。
2、数据结构的选择使用栈(Stack)数据结构来存储操作数和运算符。
栈具有先进后出的特点,非常适合处理表达式中的括号和优先级。
3、算法思路首先,将输入的表达式进行解析,将数字和运算符分别存储到不同的栈中。
然后,根据运算符的优先级进行计算,将计算结果重新压入栈中,直到表达式计算完毕。
三、实验设备及环境1、编程工具:选择了 Python 语言作为主要的编程工具,使用PyCharm 集成开发环境进行代码编写和调试。
2、操作系统:Windows 10 操作系统。
四、实验步骤1、定义数据结构定义两个栈,一个用于存储操作数(operandStack),一个用于存储运算符(operatorStack)。
2、表达式解析遍历输入的表达式字符串,将数字转换为整数并压入操作数栈,将运算符压入运算符栈。
遇到左括号直接压入运算符栈,遇到右括号则进行括号内的运算。
3、运算处理当运算符栈不为空时,取出栈顶的运算符和两个操作数进行计算。
根据运算符的优先级进行相应的运算,将结果压入操作数栈。
4、最终结果当表达式解析完毕后,操作数栈中的唯一元素即为表达式的计算结果。
五、代码实现```pythonclass SimpleCalculator:def __init__(self):selfoperandStack =selfoperatorStack =def calculate(self, expression):for char in expression:if charisdigit():selfoperandStackappend(int(char))elif char in '+/()':if char =='(':selfoperatorStackappend(char)elif char ==')':while selfoperatorStack-1!='(':operator = selfoperatorStackpop()operand2 = selfoperandStackpop()operand1 = selfoperandStackpop()result = selfperformOperation(operand1, operand2, operator)selfoperandStackappend(result)selfoperatorStackpop()else:while selfoperatorStack and selfhasHigherPrecedence(selfoperatorStack-1, char):operator = selfoperatorStackpop()operand2 = selfoperandStackpop()operand1 = selfoperandStackpop()result = selfperformOperation(operand1, operand2, operator)selfoperandStackappend(result)selfoperatorStackappend(char)while selfoperatorStack:operator = selfoperatorStackpop()operand2 = selfoperandStackpop()operand1 = selfoperandStackpop()result = selfperformOperation(operand1, operand2, operator)selfoperandStackappend(result)return selfoperandStackpop()def hasHigherPrecedence(self, op1, op2):if op1 in '/' and op2 in '+':return Trueelif op1 in '+' and op2 in '+':return Falseelif op1 in '/' and op2 in '/':return Falsereturn Falsedef performOperation(self, operand1, operand2, operator):if operator =='+':return operand1 + operand2elif operator =='':return operand1 operand2elif operator =='':return operand1 operand2elif operator =='/':if operand2 == 0:raise ValueError("除数不能为 0")return operand1 / operand2if __name__ =="__main__":calculator = SimpleCalculator()expression ="2 + 3 (4 1) / 2"result = calculatorcalculate(expression)print("计算结果:", result)```六、实验结果与分析1、测试用例及结果输入表达式:"2 + 3 4",计算结果:14输入表达式:"(2 + 3) 4",计算结果:20输入表达式:"5 2 3",计算结果:-1输入表达式:"10 / 2 + 1",计算结果:62、结果分析对于简单的四则运算表达式,计算器能够正确计算出结果。
51单片机简易计算器设计报告(一)
51单片机简易计算器设计报告(一)背景介绍在数字化时代,计算器作为一种简单易用的工具,越来越得到人们的关注和热爱。
而基于51单片机的简易计算器,不仅可以成为一种学习电子技术的手段,还具有满足简单计算需求的实用性。
设计思路本计算器采用键盘输入和数码管输出的电路设计,为用户提供加、减、乘、除、小数点、退位以及等于等功能。
1.键盘输入采用矩阵键盘的方式,将所有按键按行列排列,并利用51单片机中断方式来读取键值。
2.计算处理通过编写相应的程序代码,计算出用户输入的两个数值及操作符的结果,并将结果存储在数据缓存器中,最后将其输出至数码管。
3.数码管显示根据计算结果的数据类型,将其经过相应的转换处理后,通过数码管将结果输出至用户。
设计技术1.软件编写软件编写方面,采用汇编语言进行编写,代码总长度为2.2KB 左右。
其中,以中断方式读取键值、实现数值存储与判断、计算处理、数码管的结果输出等作为关键点进行编写。
2.硬件搭建硬件搭建方面,需要按照电路图进行搭建,并将51单片机与相关周边电路进行连接。
根据设计思路,将键盘、数码管、电源、指示灯等设备按照需求进行连接。
可改进之处虽然 51单片机的简易计算器的搭建能够满足基本计算需求,但其在以下几方面还有可改进之处:•添加计算科学函数,如三角函数、对数函数等。
•改进操作方式,使其更加符合人体工程学原理。
•添加储存器,使用户能够将计算结果进行存储和调用。
总结通过本次对基于51单片机的简易计算器的设计与实现,我们深入了解了电子技术的基本概念和硬件搭建原理,并了解到了简单嵌入式系统的工作原理。
虽然该计算器在功能和效率方面还有待改进,但对于初学者来说,其对于电子技术的学习和实验还是很有价值和意义的。
•编写的汇编代码过于繁琐,可考虑使用高级语言编写以提高效率和易读性。
•在电路搭建时需注意布线的合理性,尽量避免出现干扰和信号损失的问题。
综上所述,基于51单片机的简易计算器的设计和实现虽存在一些不足,但还是很有价值的。
实验01 简易计算器设计
实验1简易计算器设计一、实验目的1、掌握事件结构的编程2、掌握字符串与数字的相互转化3、掌握条件结构的编程4、生成exe文件二、实验要求利用LabVIEW的事件结构编写一个简单的计算器程序,实现加、减、乘、除等运算,并能对计算结果进行清除,前面板按钮及布局如下图所示。
图1 计算机界面要求最后创建项目,生成exe可执行文件。
三、实验设备1、计算机2、安装LabVIEW软件(版本不限,本实验指导书以2018版为例)四、实验说明1、程序流程图图2 程序流程图2、设计思路计数器界面中每个按键相当于一个布尔输入控件,共17个;计算结果的显示为一个字符串显示控件。
每次按键触发一个按键事件,利用LabVIEW的事件响应结构对每个按键进行响应,实现要求的简易计算器功能。
表1 布尔输入控件的说明前面板除了17个布尔输入控件外,还包含输入数据的输入临时值控件、输入1、输入2、存储操作运算符的运算符临时值控件、运算结果和过程显示,过程显示充当计算器的显示器。
3、算法流程图包括程序初始化、运算符判断、数据存储与运算、显示等。
图3 算法流程图五、实验过程1、前面板设计打开IabVIEW2018软件,新建一个VI,并命名为虚拟计算器。
在前面板上右击,在布尔控件中选择“确定按钮”;右击,打开显示项,去掉标签;调整按键到合适的大小;再拷贝16个按键,排列好,C键和±键还需要调整一下大小;修改各按键的布尔文本;双击各按键到后面板中修改各自的标签,例如将布尔文本为1的按键标签改为“数字1”,将布尔文本为+的按键标签改为“加”,以方便编程时识别各按键。
再设置一个字符串显示控件,用来显示运算数值、运算符号和运算结果,修改标签为“过程显示”;还需要设置5个字符串显示控件,标签分别为“输入临时值”、“输入1”、“输入2”、“运算符临时值”、“运算结果”。
得到如下图所示的计算器前面板、后面板。
图4 前面板布局图图4 后面板2、初始化将前面板中的各个显示控件初始化,如图5所示。
简易计算器的设计
简易计算器的设计报告一、课题要求根据所学的单片机知识,设计一简易计算器,要求能进行加减乘除等简单运算。
二、设计方案应用矩阵键盘,LCD1602,Atmega16单片机,利用所学的LED 显示和键盘的输入等知识设计简易计算器。
1、Atmega16单片机的PA 口与键盘相连,实现按键的输入;2、Atmega16单片机的PB 口与液晶显示屏相连,实现LED 的显示。
三、单元模块的设计1、LED 的显示LED 数码显示器是单片机嵌入式系统中经常使用的显示器件LED , 数码显示器有共阳极和共阴极两种结构形式。
此设计所用的LED 数码显示器为LCD1602液晶显示屏。
该液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
该液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA 移动通信工具等众多领域。
在仿真软件的连接中,将LCD1602的4,5,6,10,11,12,13,14的引脚分别与PB 端口相连,7,8,9引脚分别与4,5,6引脚共用一个PB 端口。
(如仿真图所示)LED 显示这一模块所涉及的主要程序如下: while (1){// Place your code here do {result = is_key_pre(); }while (result != 1);keypressed = which_key();result = date_or_ope(keypressed); if (result == 1) {deal_date();} else{deal_ope();} lcd_clear(); display();delay_ms(300); };2、键盘的输入D 714D 613D 512D 411D 310D 29D 18D 07E6R W 5R S 4V S S 1V D D 2V E E3LCD1LM016L在单片机嵌入式系统中,按键和键盘是一个基本和常用的接口,它是构成人机对话通道的一种常用的方式。
基于51单片机简易计算器课程设计报告
基于51单片机简易计算器课程设计报告引言:计算器是现代社会中常见的电子设备之一,它能够帮助人们进行各种数学运算,提高计算效率。
本文将介绍基于51单片机的简易计算器的设计过程及实现方法。
一、设计目标本次设计的目标是实现一个简易计算器,能够进行基本的加减乘除运算,并能够显示计算结果。
通过该设计,旨在加深学生对51单片机的理解,培养其实际操作能力。
二、硬件设计1. 电源模块:采用稳压电源模块,提供稳定的电压给单片机及其他电路模块。
2. 单片机模块:采用51单片机,作为计算器的核心控制模块,负责接收按键输入、进行运算和显示结果。
3. 按键模块:设计合适的按键电路,用于输入数字和操作符。
4. 显示模块:采用数码管或液晶显示屏,显示计算结果。
5. 连接线:将各个模块连接起来,确保信号的传输畅通。
三、软件设计1. 初始化:设置单片机的工作模式、端口方向和初始状态。
2. 按键扫描:通过轮询的方式检测按键是否被按下,若有按键按下则进行相应的处理。
3. 输入处理:根据按键的顺序和操作符的位置进行输入的处理,将输入的数字和操作符分别存储在相应的变量中。
4. 运算处理:根据输入的操作符进行相应的运算,得出计算结果。
5. 结果显示:将计算结果通过数码管或液晶显示屏进行显示。
6. 清零处理:在计算结果显示完毕后,对相关的变量进行清零处理,以便进行下一次的计算。
四、功能实现1. 加法运算:通过按下"+"按键,输入第一个数字,再按下"="按键,输入第二个数字,最后按下"="按键,计算并显示结果。
2. 减法运算:通过按下"-"按键,输入第一个数字,再按下"="按键,输入第二个数字,最后按下"="按键,计算并显示结果。
3. 乘法运算:通过按下"*"按键,输入第一个数字,再按下"="按键,输入第二个数字,最后按下"="按键,计算并显示结果。
简易计算器实训报告(一)
简易计算器实训报告(一)简易计算器实训报告实训目的本次简易计算器实训的目的在于让学生了解python语言的基本语法和运算符,同时通过实践操作,提升学生的编程思维和实际应用能力。
实训内容本次实训内容主要包括以下方面:1.简易计算器的基本功能:加、减、乘、除。
2.计算器的界面设计与功能实现。
3.错误处理与异常捕获。
实训步骤步骤一:设计计算器界面在本次实训中,我们采用tkinter库来设计计算器的用户界面。
具体步骤如下:1.创建一个窗口;2.在窗口中添加各种按钮和文本框,用于输入和显示计算结果;3.将按钮按照功能分类,为每个按钮设置对应的事件处理函数。
步骤二:实现基本计算功能根据下拉菜单中所选的运算符,我们可以对输入的两个数进行相应的计算。
具体实现方法如下:1.在计算器窗口中添加一个下拉菜单,用于选择运算符;2.根据所选运算符,获取相应的输入数据,并调用对应的计算函数;3.将计算结果输出到窗口中。
步骤三:错误处理与异常捕获在实际应用中,我们不能保证用户输入的一定是数字,所以我们需要对输入做一些错误处理。
具体方法如下:1.在获取用户输入时,先对输入的字符串进行判断,如果用户输入不合法,弹出提示窗口;2.对于除数为0等异常情况进行相应的异常捕获处理,避免程序崩溃。
实训总结通过本次实训,我们学习了python语言的基本语法和运算符,并通过实践操作,学习了tkinter库的使用方法。
通过本次实训,我们还深入了解了计算器的界面设计和功能实现过程。
此外,我们也学会了一些常用的错误处理和异常捕获方法。
未来拓展本次实训只是简易计算器的基本实现,还有很多可以拓展的功能,如:1.添加科学记数法、三角函数、对数函数、平方根等高级数学运算;2.设计多个数字输入框,实现多操作数的计算;3.添加历史记录功能,记录用户计算过程和结果;4.将计算器移植到移动设备或网页上,提供更为便捷的计算服务。
5.添加输入历史记录及回显功能,便于用户查错和复查。
基于51单片机简易计算器课程设计报告(一)
基于51单片机简易计算器课程设计报告(一)基于51单片机简易计算器课程设计报告1. 介绍在本次课程设计中,我设计了一个基于51单片机的简易计算器。
本报告将会详细介绍该计算器的设计思路、功能实现以及课程设计中遇到的问题与解决方法。
2. 设计思路功能需求•支持基本的加、减、乘、除运算•具备数字输入与显示功能•具备清零和等于功能•具备连续计算功能硬件设计本计算器的硬件设计主要包括51单片机、LCD显示模块以及按键输入模块。
其中,51单片机负责控制计算器的逻辑,LCD显示模块用于显示计算结果和用户输入,按键输入模块用于接收用户的输入。
软件设计计算器的软件设计主要分为以下几个部分: - 初始化:初始化51单片机、LCD模块以及按键模块。
- 按键扫描:通过扫描按键模块,获取用户的输入。
- 数字输入与显示:根据用户输入,将数字显示在LCD上。
- 运算逻辑:根据用户输入的运算符和数字,执行相应的计算操作,并将结果显示在LCD上。
3. 功能实现初始化在初始化阶段,我们需要初始化51单片机的GPIO口、LCD模块以及按键模块。
具体的初始化代码如下:// 初始化51单片机的GPIO口// 初始化LCD模块// 初始化按键模块按键扫描为了获取用户的输入,我们需要通过按键模块进行扫描。
具体的按键扫描代码如下:// 扫描按键模块// 如果检测到按键按下,则进行相应的处理数字输入与显示当用户按下数字键时,我们将获取到的数字输入缓存起来,并将其显示在LCD上。
具体的数字输入与显示代码如下:// 获取按键输入的数字// 将数字添加到输入缓存// 将输入缓存显示在LCD上运算逻辑当用户按下运算符键时,我们需要根据输入的数字和运算符执行相应的计算操作,并将结果显示在LCD上。
具体的运算逻辑代码如下:// 获取运算符输入// 根据运算符和输入的数字执行相应的计算操作// 将计算结果显示在LCD上清零和等于功能为了提升用户体验,我们还可以添加清零和等于功能。
微机原理简易计算器课程设计报告
. . . .课程设计报告课程设计名称:简易计算器系别:三系学生XX:X梦瑶班级:11通信1班学号:成绩:指导教师:袁静开课时间:2013-2014学年1学期一.设计题目简易计算器二.主要内容1、采用模块化程序结构设计软件,可将整个软件分成若干功能模块。
2、画出程序流程图。
3、根据流程图,编写源程序。
4、上机调试程序。
三.具体要求1、利用BIOS和DOS的中断来设计一个计算器,要求在屏幕上显示一个主菜单,提示用户输入相应的数字键,分别执行加、减、乘、除四种计算功能和结束程序的功能。
2、利用BIOS中断的10号功能调用来设置显示方式。
3、利用DOS中断的01号和02号子功能来完成键盘接收,结果显示。
四.进度安排五.成绩评定考核方法:现场验收(占50%),课程设计报告(占50%)。
考核内容:学习态度(出勤情况,平时表现等)、方案合理性、程序编制质量、演示效果、设计报告质量。
成绩评定:优,良,中,及格,不及格。
特别说明:如发现抄袭,按照不及格处理。
目录前言41、设计题目52、设计内容62.1 基本内容62.2 主要功能63、设计原理及方案73.1 总体方案73.2 程序流程图83.2.1 主程序83.2.2 计算子程序103.3 系统模块详细设计113.3.1 界面设置113.3.2 算法选择设置123.3.3 数制转换设置134.汇编源程序代码165、调试运行结果255.1 操作说明255.2 调试运行结果256、心得体会287、参考文献30前言课程设计是培养和锻炼学生在学习完本门课后综合应用所学理论知识,解决实际工程设计和应用问题的能力的重要教学环节。
它具有动手、动脑和理论联系实际的特点,是培养在校工科大学生理论联系实际、敢于动手、善于动手和独立自主解决设计实践中遇到的各种问题能力的一个重要教学环节。
计算器在我们日常生活中应用是相当普遍的,可以说它已经成为现代社会生活不可或缺的一部分。
本次课程设计就是根据微机原理与接口的相关知识,利用BIOS和DOS的中断来设计一个简易计算器,能够实现加减乘除四则运算,并在屏幕上显示一个主菜单,提示用户输入相应的数字键,分别执行加、减、乘、除四种计算功能和结束程序的功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1602液晶显示计算器设计报告10月一、摘要计算器是人们寻常生活最常用电子产品之一,应用广泛,功能强大。
本次咱们小组设计制作了一种简易计算器,可以在-9999999~9999999范畴内进行整数、x=b类型方程。
该计算器以AT89C51单片机芯片小数四则运算运算,并求解ax+e作为核心,采4*4矩阵键盘作为输入,将数据输入单片机内部解决,用LCD1602工业字符液晶显示出运算和成果。
进行显示。
通过检查可以实现预设功能,具备很高实用价值。
核心词:单片机;简易计算器;AT89C51;LCD1602。
本设计具备如下功能:1、可以实现-9999999~9999999范畴内整数,小数基本运算(超过范畴后报错)。
2、储存运算成果,掉电不丢失。
3、实现6位及以上有效数字。
4、解ax+e x=b方程。
5、可以持续运算,即上次运算成果作为下次输入。
6、可以在一次操作中持续运算。
二、方案论证方案描述:方案一:以51单片机为核心,4*4矩阵键盘输入,数码管显示输入数字和运算成果。
方案二:以51单片机为核心,4*4矩阵键盘输入,LCD1602显示输入数字和运算成果。
方案比较与选取:LCD1602作为一种成熟产品,使用简朴,模式固定,便于移植到各种类型程序,又有微功耗、体积小、显示内容丰富超薄轻巧等长处,而数码管虽然亮度高,但是操作复杂、能耗高、且不能显示符号,本设计对亮度规定不是特别高,故采用方案二。
三、解方程算法ax+e x=b为非线性方程,采用牛顿法迭代求解。
原理是运用泰勒公式在X0处展开,且展开到一阶,即f(X)=f(X0)+(X- X0)f’(X0),求解X=X1= X0-f(X0)/f’(X0),进而推出Xn+1=Xn-f(Xn)/f’(Xn)。
通过迭代,这个式子必然在f(x)=0时候收敛,进而得到方程解。
四、电路与程序系统构成:电源系统,复位电路,晶振电路,4*4矩阵键盘,独立按键,STC80C52,LCD1602。
详细设计如下:1、复位电路S17 1K2、键盘电路3、晶振电路4、1602显示屏1602 5、STC89C52电路6、电源电路系统软件与流程图:1)、总流程图使用阐明:1、接入电源,按下电源开关后进入上次关闭时界面(计算或解方程界面)。
2、计算时,输入数字和符号,按等号键输出成果,超过运算范畴则报错,按AC 键退出;3、解方程时,先输入参数a,b,按等号键确认,后输出ax+e x=b解。
按任意键继续解方程。
4、在任意时刻短按mode键进入菜单界面,按1进入计算界面,按2进入解方程界面。
5、长按mode键为记忆功能,即显示上次计算成果。
测试方案及成果:1、菜单界面2、加法运算3、减法运算4、乘法运算5、除法运算6、持续运算7、上次运算成果作为下次输入8、报错9、解方程10、记忆功能参照书目《新概念51单片机C语言教程》电子工业出版社附录源代码://键盘接P3,1602接P0,STC89C58RC//by-FCY -10#include<reg52.h> //单片机头文献#include<math.h>#include<stdio.h>#include<stdlib.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define RdCommand 0x01 //定义ISP操作命令#define PrgCommand 0x02#define EraseCommand 0x03#define Error 1#define Ok 0#define WaitTime 0x01 //定义CPU等待时间sfr ISP_DATA=0xe2;//寄存器声明sfr ISP_ADDRH=0xe3;sfr ISP_ADDRL=0xe4;sfr ISP_CMD=0xe5;sfr ISP_TRIG=0xe6;sfr ISP_CONTR=0xe7;sbit lcden=P1^1;//定义1602能使端和数据命令选取端sbit lcdrs=P1^0;sbit lcden=P3^4; //TX开发板调试sbit lcdrs=P3^5;sbit dula=P2^6;sbit wela=P2^7;*/sbit mode=P1^2; //定义功能键sbit led=P1^5; //定义1602背光Kuchar time; //定义中断计时时间char cnumf[14];char csign[5]={'.','+','-','*','/'}; //定义整数,小数,符号数组float num1,num2;//定义运算数字uchar key_value,sign_value=11,fun_value=1; //定义键值,符号值,功能值void delay(uint z); //函数声明uchar keyscan();void function_choose();void write_com(uchar com);void write_data(uchar date);void memoryread();float num_input();float num_input0();void num_output(float num);void display(int s,char str[16],uchar l);/*===========延时函数===========*/void delay(uint z)//延时z毫秒uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*===========键盘扫描函数=========*/ uchar keyscan(){uchar num=100,temp;TR0=1;//计时开始while(num==100)//只有有键按下时候才跳出{P3=0xfe;temp=P3;temp=temp&0xf0;//扫描mode键if(mode==0){delay(10);if(mode==0)delay(500);//按下500毫秒if(mode==0){while (!mode);//等待释放memoryread();//读取记忆}else//短按{while (!mode);function_choose();//功能选取ISP_CONTR=0X20;//系统复位}}//扫描矩阵键盘while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xee:num=7;break;case 0xde:num=8;break;case 0xbe:num=9;break;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xed:num=4;break;break;case 0xbd:num=6;break;case 0x7d:num=12;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xeb:num=1;break;case 0xdb:num=2;break;case 0xbb:num=3;break;case 0x7b:num=13;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:num=0;break;case 0xd7:num=10;break;case 0xb7:num=15;break;case 0x77:num=14;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}}led=0;//亮屏time=0;//有键按下时清零计时return num;}/*=====================数据储存某些=========================*/ //打开ISP,IAP 功能void ISP_IAP_enable(void){EA = 0; //关中断ISP_CONTR = ISP_CONTR & 0x18;// 0001,1000 ISP_CONTR = ISP_CONTR | WaitTime; //写入硬件延时ISP_CONTR = ISP_CONTR | 0x80;//ISPEN=1}//关闭ISP,IAP 功能void ISP_IAP_disable(void){ISP_CONTR = ISP_CONTR & 0x7f; //ISPEN = 0ISP_TRIG = 0x00;EA = 1; //开中断}//公用触发代码void ISPgoon(void){ISP_IAP_enable(); //打开ISP,IAP 功能ISP_TRIG = 0x46; // 触发ISP_IAP命令字节1ISP_TRIG = 0xb9; // 触发ISP_IAP命令字节2_nop_();}//读取数据unsigned char byte_read(unsigned int byte_addr){ISP_ADDRH = (unsigned char)(byte_addr >> 8);//地址赋值ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);ISP_CMD = ISP_CMD & 0xf8; //清除低3位ISP_CMD = ISP_CMD | RdCommand; // 写入读命令ISPgoon(); //触发执行ISP_IAP_disable(); //关闭ISP,IAP功能return (ISP_DATA); // 返回读到数据}//扇区擦除void SectorErase(unsigned int sector_addr){unsigned int iSectorAddr;iSectorAddr = (sector_addr & 0xfe00);//取扇区地址ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);ISP_ADDRL = 0x00;ISP_CMD = ISP_CMD & 0xf8; //清空低3位ISP_CMD = ISP_CMD | EraseCommand; //擦除命令3 ISPgoon(); //触发执行ISP_IAP_disable(); //关闭ISP,IAP功能}//写入数据void byte_write(unsigned int byte_addr,unsigned char original_data) {ISP_ADDRH = (unsigned char)(byte_addr >> 8);//取地址ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);ISP_CMD = ISP_CMD & 0xf8; //清低3位ISP_CMD = ISP_CMD | PrgCommand; //写命令2ISP_DATA = original_data; //写入数据准备ISPgoon(); //触发执行ISP_IAP_disable(); //关闭IAP功能}//储存浮点数函数void memory(float num){char i=13;float a;a=num;sprintf(cnumf,"%14.6f",a);while (cnumf[i]==48||cnumf[i]==46){i=i-1;if(cnumf[i+1]==46)break;}//将浮点数拆提成数组并去除尾数0(或小数点)SectorErase(0x2200);//擦除扇区byte_write(0x2200,i);//储存位数for(;i>=0;i--)byte_write(0x2201+i,cnumf[i]);//储存数组}//读取浮点数函数void memoryread(){char i;i=byte_read(0x2200);//读取位数write_com(0x01);//清屏display(0x80," memory number ",16);write_com(0x80+0x4f);//定位指针为第二行第16位(最后一位)write_com(0x0c);//不显示光标write_com(0x04);//写一种字符指针减一for(;i>=0;i--)//读取数组{cnumf[i]=byte_read(0x2201+i);write_data(cnumf[i]);}write_com(0x06);//还原1602设立:写一种字符指针加一}/*===============1602有关函数===========*///写指令void write_com(uchar com){lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}//写数据void write_data(uchar date){lcdrs=1;P0=date;delay(5);lcden=1;delay(5);lcden=0;delay(5);}//清除某行函数void clear(int s)//光标起始位(第一行0x80,第二行0x80+0x40) {uchar i=0;write_com(s);//定位指针位置write_com(0x06);write_com(0x0c);//不显示光标while(i<=16){write_data(32);i++;}//输入16个空格write_com(s);//指针归位write_com(0x0e);//显示光标}//显示字符函数void display(int s,char str[16],uchar l)//定义显示起点,显示数组,显示字符个数{ int j=0;write_com(s);write_com(0x06);for(j=0;j<l;j++)write_data(str[j]);}/*==============初始化函数===============*/void init(){lcden=0;//写命令模式num1=0;num2=0;//数据清零led=0;//亮屏write_com(0x38);//设立16*2显示,5*7点阵,8位数字据接口write_com(0x0e);//光标不闪烁write_com(0x06);//写字符后指针自动加一write_com(0x01);//显示清零,指针清零write_com(0x80);//指针定位为第一行首位TMOD=0x01;//开定期器T0,并设立为16位定期模式,且启动仅受TR0控制TH0=0x4c;TL0=0x00;//装入初值65536-46080,初值=2^16-计数个数N,N=(计数时长*晶振频率/12)(50ms)EA=1;ET0=1;//打开T0中断容许}/*==============数字输入函数==============*///数字输入函数float num_input(){float num=0;char key,i=1;char sign=1;key=keyscan();if(key==12){ sign=-1;write_data('(');write_data('-');key=keyscan();}//解决负数运算if(key<10){num=0;while(key<10){num=num*10+key;write_data(key+0x30);key=keyscan();}}if (key==10){ write_data(csign[0]);for(key=keyscan();key<10;key=keyscan()) {num=num+key/pow(10,i);write_data(key+0x30);i++;}}if(sign<0)write_data(')');if(key>=11&&key<=14)//如果按下运算符write_data(csign[key-10]);//显示运算符key_value=key;//记录运算符num=sign*num;return num;}//数字输入函数0float num_input0(){float num=num2;//无操作返回num2char key,i=1;key=keyscan();clear(0x80);//清除第一行if(key<10){num=0;while(key<10){num=num*10+key;write_data(key+0x30);key=keyscan();}}if (key==10){ write_data(csign[0]);for(key=keyscan();key<10;key=keyscan()){num=num+key/pow(10,i);write_data(key+0x30);i++;}}if(key>=11&&key<=14)write_data(csign[key-10]);key_value=key;return num;}/*==============数字输出函数==============*/void num_output(float num){int j=0,k=13;//定义输出字符个数memory(num);//储存成果clear(0x80+0x40);//清除第二行write_com(0x80+0x4f);//定位指针为第二行第16位(最后一位)write_com(0x0c);//不显示光标write_com(0x04);//写一种字符指针减一sprintf(cnumf,"%14.6f",num);//将要显示数字转化为数组if(num>=9999999||num<=-9999999)//超过范畴报错{clear(0x80);display(0x80+0x40," Error ",16);while(1);}while (cnumf[k]==48||cnumf[k]==46)//当数组不为0或小数点时{k=k-1;//记录实际数组长度(例如12.100000实际长度为4)if(cnumf[k+1]==46)//检测到小数点跳出break;}for(j=k;j>=0;j--)//显示数字num,不显示尾数零(如12.00000显示为12)write_data(cnumf[j]);write_com(0x06);//还原1602设立:写一种字符指针加一}/*==================功能选取函数==============*/void function_choose(){uchar j=0;while(1){switch(j%2)//页面选取{case 0:display(0x80,"1 calculate > +",16);//显示菜单display(0x80+0x40,"2 advance < -",16);break;case 1:display(0x80,"3 equation > +",16);//显示菜单display(0x80+0x40,"4 information< -",16);break;}fun_value=keyscan();//获取功能值switch(fun_value){case 11:j++;continue;case 12:j--;continue;case 1:break;case 2:break;case 3:break;case 4:break;default:continue;}break;}SectorErase(0x);//擦除扇区byte_write(0x,fun_value);//储存功能值}/*================中断计时================*/ void T0_time()interrupt 1{uchar t;int r;//随机种子TH0=0x4c;TL0=0x00;//重装初值以保证中断正常循环t++;//记录进入该中断次数r++;srand(r);if(t==6)//每0.30s time加一{time++;t=0;}if(time>=200)//1min 灭屏led=1;}/*===============计算函数================*/void calculate(){num2=num_input0();//获取num2,记录运算符,并判断与否为持续运算while(key_value<=14&&key_value>=11)//如果没有输入等号{sign_value=key_value;//转移运算符符号值num1=num_input();//获取num1,记录下一种运算符switch(sign_value){case 11:num2=num2+num1;break;case 12:num2=num2-num1;break;case 13:num2=num2*num1;break;case 14:num2=num2/num1;break;}//计算,将成果赋给num2}if(key_value==15)//如果符号为等号{num_output(num2);//显示运算成果write_com(0x80+0x40);write_data('=');//显示等号}}/*===============高档计算================*/ void advanced(){uchar k=0;float x=0,y=0;float z=0;while(1){display(0x80,"1x^y 3cos 5ln >+",16);//显示菜单display(0x80+0x40,"2sin 4tan 6ra <-",16);k=keyscan();//获取功能值if(k>0&&k<=6){ init();switch(k){case 1:{x=num_input();//获取xwrite_data('^');y=num_input();//获取yz=pow(x,y);}break;case 6:{display(0x80,"rand[",5);x=num_input();//获取xwrite_data(',');y=num_input();//获取ywrite_data(']');write_data('=');//显示等号if(x>y){init();display(0x80+0x40," Error ",16);while(1);}do{z=rand()%((int)x-(int)y-1)+(int)x;num_output(z);k=keyscan();}while(k==15);}continue;case 2:{display(0x80,"sin ",4);x=num_input();//获取xz=sin(x);}break;case 3:{display(0x80,"cos ",4);x=num_input();//获取xz=cos(x);}break;case 4:{display(0x80,"tan ",4);x=num_input();//获取xz=tan(x);}break;case 5:{display(0x80,"ln ",3);x=num_input();//获取xz=log(x);}break;}write_data('=');//显示等号num_output(z);}keyscan();//等待任意键}}/*===================解方程函数================*/ void equation(){ long i=0;float a=0,b=0;float x=20;//定义方程中变量a b xinit();write_data('a');write_data('=');a=num_input();//显示并获取awrite_com(0x80+0x40);write_data('b');write_data('=');b=num_input();//显示并获取bif(floor(a)+floor(b)==fabs(a)+fabs(b)&&a*b!=0)//如果a,b均为正整数{ if(a==1&&b==1)x=0;for(;fabs(a*x+exp(x)-b)>1e-5;i++)//设立精度为10^(-5){x=x-(a*x+exp(x)-b)/(a+exp(x));//牛顿法重要循环x1=x0-f(x)/f'(x) if(i>=1000)//1000次迭代没有达到精度就跳出break;}write_com(0x01);//清屏num_output(x);//第二行显示方程解display(0x80+0x40,"x=",2);//显示"x=''}else{write_com(0x01);//清屏display(0x80+0x40," Error ",16);//报错while(1);//程序停止}display(0x80,"any key continue",16);//第一行显示"any key continue" keyscan();//等待任意键}/*===================主函数================*/void main(){init();while(1){fun_value=byte_read(0x);//读取功能值switch(fun_value){case 1:calculate();break;case 2:advanced();break;case 3:equation();break;case 4:{display(0x80,"made by fcy ",16);display(0x80+0x40," -10-26 ",16);keyscan();}break;default: {SectorErase(0x);//擦除扇区byte_write(0x,1);}//储存功能值}}}。