简易计算器的设计与实现
简易计算器——精选推荐

徐州师范大学物电学院课程设计报告课程名称:单片机课程设计题目:简易计算器专业班级:07电科***名:**学生学号:********日期:2010.6.27***师:***摘要 (2)Abstract (2)概述 (2)二、设计方案简述 (4)2.1、功能介绍 (4)2.1.1、基本功能 (4)2.1.2、扩展功能 (4)2.2、总体设计方案 (4)2.2.1、总体设计思路 (4)2.2.2、方案论证与比较 (4)2.2.3、系统组成 (8)三、详细设计 (9)3.1、设计目标和实现方法 (9)3.2、设计 (9)3.2.1、输入模块:键盘扫描 (10)3.2.2、运算模块:单片机控制 (10)3.2.2、显示模块:LCD1602显示 (10)3.3、硬件电路设计 (11)3.3.1、硬件连接 (11)3.4、软件设计 (12)3.5、仿真和调试 (12)3.5.1、 KEIL uVision调试 (13)3.5.2、 Proteus 对于本设计的仿真 (14)3.6、元件的介绍 (15)3.6.1、 MCS-51单片机组成 (15)3.6.2、 MCS-51单片机引脚功能 (16)3.6.3、复位和复位电路 (18)3.6.4、 LCD1602显示器 (18)四、设计结果及分析 (23)4.1、功能和操作 (23)4.2、硬件调试 (23)4.3、技术要点 (23)五、总结 (24)六、参考资料附录主要程序代码本设计采用单片机作为控制芯片,用C语言对其进行编程实现,输入由4*4矩阵式键盘控制,输出采用人性化的LCD1602型液晶实现。
在未进行计算时,它显示一段话,ON/O切换进入计算模式。
对于计算这个部分我采用的是矩阵键盘,10个数字键,一个等于号键,四个符号键,一个清零键,计算最高达到小数点后三位。
由于C语言库函数繁多,所以我采用调用C语言库函数来解决多种运算类型,这样编程更简单,运行起来也更可靠。
简易计算器的制作以及设计毕业论文

简易计算器的制作以及设计毕业论⽂简易计算器的制作及设计毕业论⽂⽬录摘要 (1)Abstract (2)第⼀章绪论 (3)1.1 开发背景 (3)1.2 设计⽬的 (4)第⼆章⽅案论证与设计 (5)2.1设计指标 (5)2.2⽅案论证与设计 (5)第三章硬件模块介绍 (8)3.1主控及运算模块 (8)3.2显⽰模块 (13)3.3输⼊模块 (16)第四章软件设计 (18)4.1主程序的设计 (18)4.2键盘扫描的程序设计 (19)4.3显⽰模块程序设计 (21)4.4运算模块程序设计 (23)第五章仿真及调试 (24)结束语 (25)致谢 (26)参考⽂献 (27)附录⼀:硬件实物图 (28)附录⼆:系统程序 (29)附录三:任务书 (40)附录四:开题报告 (42)附录五:外⽂原⽂与外⽂译⽂ (47)基于AT89C51单⽚机的简易计算器的设计摘要计算器在⼈们的⽇常⽣活中是较为常见的电⼦产品之⼀。
初期的计算器仅仅能实现简单的加减乘除运算,⽽现在⼈们所⼴泛使⽤的科学计算器功能已不再停留于此,除了加减乘除运算外,它还能进⾏乘⽅,开⽅,指数,对数,三⾓函数,反三⾓函数等的存储和运算。
⽽且计算器的种类和模式也在逐渐多样化,如使⽤太阳能电池的计算器,使⽤ASIC制作的计算器,使⽤纯软件设计的计算器和被集成到⼿机、平板电脑等电⼦产品中的计算器。
可以说计算器还正在发展之中⽽且还将有很⼤的发展空间,未来必将出现功能更加强⼤的计算器。
基于这样的理念,本设计以AT89C51单⽚机为核⼼,以软硬件结合的⽅式设计了⼀个简易计算器。
该计算器以4*4矩阵键盘为输⼊⽅式,可以进⾏4位带符号数的加减乘除运算,并在LCD1602液晶显⽰器上显⽰操作过程。
该论⽂详细介绍了整个系统的硬件组成结构、⼯作原理和软件设计思想与流程。
关键词:计算器 AT89C51 LCD1602 矩阵键盘Simple calculator designed based onAT89C51AbstractThe calculator in People's Daily life is one of the most common electronic products. Early computing calculator can only implement simple addition, subtraction, multiplication, and division, but now the scientific calculator which widely used by people’s functions are no longer stay, operation besides addition, subtractio n, multiplication, and division, it can also power, prescribe, index, logarithmic, trigonometric function, inverse trigonometric function such as storage and computation. And the types of the calculator and pattern has also been gradually diversified, such as using solar calculator, using ASIC production calculator, using pure software design of the calculator and be integrated into mobile phones, tablets, and other electronic products in the calculator. We can say that calculators are under development and will also have very big development space, the future will appear more powerful calculators. Based on this idea, I design a simple calculator which use AT89C51 single-chip microcomputer as the core, and use the way that combine the hardware and software. The calculator use 4 * 4 matrix keyboard as input mode, it can carry out four signed several operations of addition,subtraction, multiplication, and division, and it display operation process on the LCD1602 . The paper introduces in detail the system structure, working principle of the hardware and the software design idea and process.key words:calculator AT89C51 LCD1602 matrix keyboard第⼀章绪论1.1 开发背景计算器是⽇常⽣活中⽐较常见的电⼦产品之⼀,它已在数⼗年间遍布千家万户。
制作一个简易计算器——基于AndroidStudio实现

制作⼀个简易计算器——基于AndroidStudio实现⼀个计算器Android程序的源码部分分为主⼲和细节两部分。
⼀、主⼲1. 主⼲的构成计算器的布局事件(即计算器上的按钮、⽂本框)监听实现计算2. 详细解释 假设我们的项⽬名为Calculator,⽽布局名称(Layout Name)为默认的activity_main 。
即设置如下图所⽰: 在这种前提下,有:设置计算器布局的⽂件:Calculator/app/src/main/res/layout/activity_main.xml事件监听和计算实现在同⼀个⽂件⾥:Calculator/app/src/main/java/下的⼀个⼦⽬录⾥的MainActivity.java 即如下图所⽰:计算器布局代码(写在activity_main.xml⽂件⾥):1<?xml version="1.0" encoding="utf-8"?>2<ScrollView xmlns:android="/apk/res/android"3 android:layout_width="fill_parent"4 android:layout_height="wrap_content"5>6<LinearLayout7android:layout_width="fill_parent"8 android:layout_height="fill_parent"9 android:orientation="vertical">10<EditText11android:id="@+id/input"12 android:layout_width="fill_parent"13 android:layout_height="wrap_content"14 android:layout_gravity="center"15 android:editable="false"16 android:hint="@string/shuru"/>1718<EditText19android:id="@+id/output"20 android:layout_width="fill_parent"21 android:layout_height="wrap_content"22 android:layout_gravity="center"23 android:editable="true"24 android:gravity="right"25 android:hint="@string/shuchu"/>2627<RelativeLayout28android:layout_width="fill_parent"29 android:layout_height="wrap_content">3031<Button32android:id="@+id/seven"33 android:layout_width="80dp"34 android:layout_height="70dp"35 android:layout_alignParentLeft="true"36 android:text="@string/seven"37 android:textSize="40sp"/>3839<Button44 android:text="@string/eight"45 android:textSize="40sp"/>4647<Button48android:id="@+id/nine"49 android:layout_width="80dp"50 android:layout_height="70dp"51 android:layout_toRightOf="@id/eight"52 android:text="@string/nine"53 android:textSize="40sp"/>5455<Button56android:id="@+id/add"57 android:layout_width="80dp"58 android:layout_height="70dp"59 android:layout_alignParentRight="true"60 android:layout_toRightOf="@id/nine"61 android:text="@string/add"62 android:textSize="40sp"/>6364<Button65android:id="@+id/four"66 android:layout_width="80dp"67 android:layout_height="70dp"68 android:layout_alignParentLeft="true"69 android:layout_below="@id/seven"70 android:text="@string/four"71 android:textSize="40sp"/>7273<Button74android:id="@+id/five"75 android:layout_width="80dp"76 android:layout_height="70dp"77 android:layout_below="@id/eight"78 android:layout_toRightOf="@id/four"79 android:text="@string/five"80 android:textSize="40sp"/>8182<Button83android:id="@+id/six"84 android:layout_width="80dp"85 android:layout_height="70dp"86 android:layout_below="@id/nine"87 android:layout_toRightOf="@id/five"88 android:text="@string/six"89 android:textSize="40sp"/>9091<Button92android:id="@+id/subtract"93 android:layout_width="80dp"94 android:layout_height="70dp"95 android:layout_alignParentRight="true"96 android:layout_below="@id/add"97 android:layout_toRightOf="@id/six"98 android:text="@string/subtract"99 android:textSize="40sp"/>100101<Button102android:id="@+id/one"103 android:layout_width="80dp"104 android:layout_height="70dp"105 android:layout_alignParentLeft="true" 106 android:layout_below="@id/four"107 android:text="@string/one"108 android:textSize="40sp"/>109110<Button111android:id="@+id/two"112 android:layout_width="80dp"113 android:layout_height="70dp"114 android:layout_below="@id/five"115 android:layout_toRightOf="@id/one" 116 android:text="@string/two"117 android:textSize="40sp"/>118119<Button120android:id="@+id/three"121 android:layout_width="80dp"122 android:layout_height="70dp"123 android:layout_below="@id/six"128<Button129android:id="@+id/multiply"130 android:layout_width="80dp"131 android:layout_height="70dp"132 android:layout_alignParentRight="true" 133 android:layout_below="@id/subtract" 134 android:layout_toRightOf="@id/three" 135 android:text="@string/multiply"136 android:textSize="40sp"/>137138<Button139android:id="@+id/zero"140 android:layout_width="80dp"141 android:layout_height="70dp"142 android:layout_alignParentLeft="true" 143 android:layout_below="@id/one"144 android:text="@string/zero"145 android:textSize="40sp"/>146147<Button148android:id="@+id/clear"149 android:layout_width="80dp"150 android:layout_height="70dp"151 android:layout_below="@id/two"152 android:layout_toRightOf="@id/zero" 153 android:text="@string/clear"154 android:textSize="40sp"/>155156<Button157android:id="@+id/result"158 android:layout_width="80dp"159 android:layout_height="70dp"160 android:layout_below="@id/three"161 android:layout_toRightOf="@id/clear" 162 android:text="@string/result"163 android:textSize="40sp"/>164165<Button166android:id="@+id/divide"167 android:layout_width="80dp"168 android:layout_height="70dp"169 android:layout_alignParentRight="true" 170 android:layout_below="@id/multiply" 171 android:layout_toRightOf="@id/result" 172 android:text="@string/divide"173 android:textSize="40sp"/>174175<Button176android:id="@+id/dot"177 android:layout_width="80dp"178 android:layout_height="70dp"179 android:layout_alignParentLeft="true" 180 android:layout_below="@id/zero"181 android:text="@string/dot"182 android:textSize="40sp"/>183<Button184android:id="@+id/writeButton"185 android:layout_width="wrap_content" 186 android:layout_height="wrap_content" 187 android:layout_alignParentLeft="true" 188 android:layout_below="@id/dot"189 android:text="@string/write"190 android:textSize="40sp"/>191<Button192android:id="@+id/readButton"193 android:layout_width="wrap_content" 194 android:layout_height="wrap_content" 195 android:layout_alignParentRight="true" 196 android:layout_below="@id/dot"197 android:text="@string/read"198 android:textSize="40sp"/>199200<CheckBox201android:id="@+id/appendBox"202 android:text="@string/appendBox"203 android:layout_width="wrap_content" 204 android:layout_height="wrap_content" 205 android:layout_alignParentBottom="true" 206 android:layout_toLeftOf="@+id/divide" 207 android:layout_toStartOf="@+id/divide"212213<EditText214215android:layout_width="match_parent"216 android:layout_height="wrap_content"217 android:id="@+id/textView"/>218219<EditText220221android:layout_width="match_parent"222 android:layout_height="wrap_content"223 android:id="@+id/displayView"/>224225<EditText226android:id="@+id/errorzero"227 android:layout_width="fill_parent"228 android:layout_height="wrap_content"229 android:layout_gravity="center"230 android:editable="false"231 android:gravity="center"232/>233<EditText234android:id="@+id/resultText"235 android:layout_width="fill_parent"236 android:layout_height="wrap_content"237 android:layout_gravity="center"238 android:editable="false"239 android:gravity="left"240 android:text="@string/resultText"241/>242</LinearLayout>243</ScrollView>View Code事件监听和实现计算代码(写在MainActivity.java⽂件⾥)1package com.example.lenovo.calculator;2345import android.app.Activity;6import android.content.Context;7import android.os.Bundle;8import android.view.View;9import android.view.View.OnClickListener;10import android.widget.Button;11import android.widget.CheckBox;12import android.widget.EditText;1314import java.io.FileInputStream;15import java.io.FileNotFoundException;16import java.io.FileOutputStream;17import java.io.IOException;1819public class MainActivity extends Activity {20/**21 * Called when the activity is first created.22*/23private EditText output = null;24private EditText input = null;25private Button btn0 = null;26private Button btn1 = null;27private Button btn2 = null;28private Button btn3 = null;29private Button btn4 = null;30private Button btn5 = null;31private Button btn6 = null;32private Button btn7 = null;33private Button btn8 = null;34private Button btn9 = null;35private Button btnadd = null;36private Button btnsubtract = null;37private Button btnmultiply = null;38private Button btndivide = null;39private Button btnclear = null;40private Button btnresult = null;41private Button btndot = null;46private Button writeButton = null;47private Button readButton = null;48private CheckBox appendBox = null;49private EditText textView = null;50private EditText displayView = null;51public String FILE_NAME = "fileDemo.txt";525354private String str = "";//保存数字55private String strold = "";//原数字56private char act = ' ';//记录“加减乘除等于”符号57private int count = 0;//判断要计算的次数,如果超过⼀个符号,先算出来⼀部分58private Float result = null;//计算的输出结果59private Boolean errBoolean = false;//有错误的时候为true,⽆错为false60private Boolean flagBoolean = false;//⼀个标志,如果为true,可以响应运算消息,如果为false,不响应运算消息,只有前⾯是数字才可以响应运算消息 61private Boolean flagDot = false; //⼩数点标志位62636465 @Override66public void onCreate(Bundle savedInstanceState) {67super.onCreate(savedInstanceState);68 setContentView(yout.activity_main);6970 output = (EditText) findViewById(R.id.output);71 input = (EditText) findViewById(R.id.input);7273 errorzero = (EditText) findViewById(R.id.errorzero);74 resultText = (EditText) findViewById(R.id.resultText);75 writeButton = (Button) findViewById(R.id.writeButton);76 readButton = (Button) findViewById(R.id.readButton);77 textView = (EditText) findViewById(R.id.textView);78 displayView = (EditText) findViewById(R.id.displayView);79 appendBox = (CheckBox) findViewById(R.id.appendBox);8081 btn0 = (Button) findViewById(R.id.zero);82 btn1 = (Button) findViewById(R.id.one);83 btn2 = (Button) findViewById(R.id.two);84 btn3 = (Button) findViewById(R.id.three);85 btn4 = (Button) findViewById(R.id.four);86 btn5 = (Button) findViewById(R.id.five);87 btn6 = (Button) findViewById(R.id.six);88 btn7 = (Button) findViewById(R.id.seven);89 btn8 = (Button) findViewById(R.id.eight);90 btn9 = (Button) findViewById(R.id.nine);91 btnadd = (Button) findViewById(R.id.add);92 btnsubtract = (Button) findViewById(R.id.subtract);93 btnmultiply = (Button) findViewById(R.id.multiply);94 btndivide = (Button) findViewById(R.id.divide);95 btnclear = (Button) findViewById(R.id.clear);96 btnresult = (Button) findViewById(R.id.result);97 btndot = (Button) findViewById(R.id.dot);98//设置按钮侦听事件99 btn0.setOnClickListener(listener);100 btn1.setOnClickListener(listener);101 btn2.setOnClickListener(listener);102 btn3.setOnClickListener(listener);103 btn4.setOnClickListener(listener);104 btn5.setOnClickListener(listener);105 btn6.setOnClickListener(listener);106 btn7.setOnClickListener(listener);107 btn8.setOnClickListener(listener);108 btn9.setOnClickListener(listener);109//执⾏运算110 btnadd.setOnClickListener(listener);111 btnsubtract.setOnClickListener(listener);112 btnmultiply.setOnClickListener(listener);113 btndivide.setOnClickListener(listener);114 btnclear.setOnClickListener(listener);115 btnresult.setOnClickListener(listener);116117 btndot.setOnClickListener(listener);118119 writeButton.setOnClickListener(writelistener);120 readButton.setOnClickListener(readlistener);121122123// ATTENTION: This was auto-generated to implement the App Indexing API.124// See https://g.co/AppIndexing/AndroidStudio for more information.125 }130public void onClick(View v) {131// TODO Auto-generated method stub132switch (v.getId()) {133//输⼊数字134case R.id.zero:135 num(0);136break;137case R.id.one:138 num(1);139break;140case R.id.two:141 num(2);142break;143case R.id.three:144 num(3);145break;146case R.id.four:147 num(4);148break;149case R.id.five:150 num(5);151break;152case R.id.six:153 num(6);154break;155case R.id.seven:156 num(7);157break;158case R.id.eight:159 num(8);160break;161case R.id.nine:162 num(9);163break;164165case R.id.dot:166 dot();167break;168//执⾏运算169case R.id.add:170 add();171break;172case R.id.subtract:173 sub();174break;175case R.id.multiply:176 multiply();177break;178case R.id.divide:179 divide();180break;181case R.id.clear:182 clear();183break;184//计算结果185case R.id.result:186 result();187if (!errBoolean && flagBoolean) {188 output.setText(String.valueOf(result));189 }190 resultText.setText(strold + act + str + "=" + result+" "); 191break;192193default:194break;195196 }197 input.setText(strold + act + str);198 output.setText(String.valueOf(result));199200201 }202 };203204private OnClickListener writelistener = new OnClickListener() {205 @Override206public void onClick(View view) {207//textView.setText("");208209 FileOutputStream fos = null;214 fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE); 215 }216 String text = resultText.getText().toString();217 fos.write(text.getBytes());218 textView.setText("⽂件写⼊成功,写⼊长度:" + text.length()); 219//resultText.setText("");220221 } catch (FileNotFoundException e) {222 e.printStackTrace();223 } catch (IOException e) {224 e.printStackTrace();225 }226finally {227if (fos != null)228try {229 fos.flush();230 fos.close();231 } catch (IOException e) {232 e.printStackTrace();233 }234 }235 }236 };237private OnClickListener readlistener = new OnClickListener() {238 @Override239public void onClick(View view) {240241 displayView.setText("");242 FileInputStream fis = null;243try {244 fis = openFileInput(FILE_NAME);245if (fis.available() == 0) {246return;247 }248byte[] readBytes = new byte[fis.available()];249while (fis.read(readBytes) != -1) {250251 }252 String text = new String(readBytes);253 displayView.setText(text);254 textView.setText("⽂件读取成功,写⼊长度:" + text.length()); 255256 } catch (FileNotFoundException e) {257 e.printStackTrace();258 } catch (IOException e) {259 e.printStackTrace();260 }261262 }263 };264265private void dot() {266// TODO Auto-generated method stub267268if (!flagDot) {269 str = str + ".";270 flagBoolean = false;271 flagDot = true;272 }273 }274275private void clear() {276// TODO Auto-generated method stub277 str = strold = "";278 count = 0;279 act = ' ';280 result = null;281 flagBoolean = false;282 flagDot = false;283 input.setText(strold + act + str);284 output.setText("");285 errorzero.setText("");286 displayView.setText("");287 textView.setText("");288 resultText.setText("");289 }290291private void divide() {292// TODO Auto-generated method stub293if (flagBoolean) {299300private void multiply() {301// TODO Auto-generated method stub 302if (flagBoolean) {303 check();304 act = '*';305 flagBoolean = false;306 }307 }308309private void sub() {310// TODO Auto-generated method stub 311if (flagBoolean) {312 check();313 act = '-';314 flagBoolean = false;315 }316 }317318private void add() {319// TODO Auto-generated method stub 320if (flagBoolean) {321 check();322 act = '+';323 flagBoolean = false;324 }325 }326327private void check() {328// TODO Auto-generated method stub 329if (count >= 1) {330 result();331 str = String.valueOf(result);332 }333 strold = str;334 str = "";335 count++;336 flagDot = false;337 errorzero.setText("");338 }339340//计算输出结果341private void result() {342// TODO Auto-generated method stub 343if (flagBoolean) {344 Float a, b;345346 a = Float.parseFloat(strold);347 b = Float.parseFloat(str);348349if (b == 0 && act == '/') {350 clear();351 errorzero.setText("除数不能为零!"); 352//output.setText("除数不能为零!"); 353354355//errBoolean=true;356 }357358359if (!errBoolean) {360switch (act) {361case '+':362 result = a + b;363break;364case '-':365 result = a - b;366break;367case '*':368 result = a * b;369break;370case '/':371 result = a / b;372break;373374default:375break;376 }377 }383private void num(int i) {384// TODO Auto-generated method stub385 str = str + String.valueOf(i);386 flagBoolean = true;387 errorzero.setText("");388 }389390 }View Code⼆、细节 仅仅将主⼲部分代码copy下来并不能运⾏程序,因为主⼲代码调⽤了⼀些⽂件的代码,这些⽂件就是我们所说的细节。
单片机实践简易计算器实验报告

单片机实践简易计算器实验报告本次实验的目的是通过单片机实现一个简易计算器,实现加减乘除四则运算。
在实验过程中,我们使用了STC89C52单片机,通过编写程序实现计算器的功能。
实验步骤:1. 确定硬件电路连接我们需要确定硬件电路连接。
本次实验使用的是STC89C52单片机,需要将其与LCD1602液晶屏、4x4矩阵键盘、蜂鸣器等硬件连接。
具体连接方式如下:STC89C52单片机:P0口:连接LCD1602液晶屏的数据线D0-D7P1口:连接LCD1602液晶屏的控制线RS、RW、EP2口:连接4x4矩阵键盘的行线R1-R4P3口:连接4x4矩阵键盘的列线C1-C4P4口:连接蜂鸣器2. 编写程序接下来,我们需要编写程序实现计算器的功能。
程序主要分为以下几个部分:(1)LCD1602液晶屏初始化(2)4x4矩阵键盘扫描(3)计算器功能实现(4)LCD1602液晶屏显示结果3. 调试程序编写完程序后,我们需要进行调试。
在调试过程中,我们需要注意以下几点:(1)检查硬件连接是否正确(2)检查程序是否有语法错误(3)检查程序是否能够正常运行4. 实验结果经过调试,我们成功实现了一个简易计算器。
在使用过程中,用户可以通过4x4矩阵键盘输入数字和运算符,计算器会自动进行计算,并在LCD1602液晶屏上显示结果。
同时,计算器还具有清零、退格等功能,方便用户进行操作。
总结:通过本次实验,我们学习了单片机的基本原理和编程方法,掌握了如何使用单片机实现一个简易计算器。
同时,我们还学习了如何进行硬件电路连接和程序调试,提高了我们的实践能力和动手能力。
简易计算器的设计

学号:课程设计题目简易计算器的设计学院自动化专业电气工程及其自动化班级姓名指导教师2014 年1月9日课程设计任务书学生姓名:专业班级:指导教师:工作单位:自动化学院题目: 简易计算器的设计初始条件:用8086CPU、8255A并行通信接口、七段LED数码管接口、小键盘控制电路接口、外围电路芯片及元器件实现一个简易计算器,完成相应的程序编写。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)可进行2位十进制的加减乘除法运算。
(2)键盘输入数据,同时LED数码管显示,模拟计算器的工作。
(3)键盘上要求有0~9数字键,+、-、×、÷、=功能键,清除键C。
(4)撰写课程设计说明书。
内容包括:摘要、目录、正文、参考文献、附录(程序清单)。
正文部分包括:设计任务及要求、方案比较及论证、软件设计说明(软件思想,流程,源程序设计及说明等)、程序调试说明和结果分析、课程设计收获及心得体会。
时间安排:12月26日----- 12月 28 日查阅资料及方案设计12月29日----- 1 月 2 日编程1 月 3日----- 1 月 7日调试程序1 月 8日----- 1 月 9日撰写课程设计报告指导教师签名:年月日系主任(或责任教师)签名:年月日目录摘要 (1)1设计的任务及要求 (2)2方案的设计 (3)2.1方案设计论证 (3)2.2方案概述与原理硬件电路图 (3)3系统模块与功能 (5)3.18086CPU芯片 (5)3.2 8255A 并行通信接口芯片 (5)3.3 译码电路 (6)3.4 小键盘电路 (6)3.5 四位七段 LED 数码管显示电路 (7)4软件设计框图与程序 (8)4.1计算器系统程序总体流程图 (8)4.2 模块程序流程图与程序 (8)4.2.1流程图 (8)4.2.2键盘扫描流程图 (9)4.3输入运算 (10)4.3.1输入运算的流程图 (10)4.3.2输入运算程序 (10)4.4显示部分 (11)4.4.1显示部分流程图 (11)4.4.2显示部分程序 (12)5系统仿真 (14)6小结与体会 (15)参考文献 (16)附录:设计源程序 (17)本科生课程设计成绩评定表摘要这次微机原理的课程设计的题目是简易计算器的设计,设计一个可以实现2位十进制加减乘除运算功能的电路,并用LED显示出来。
c51的简易计算器(已通过实测)初学者参考

清零键
功能键
状态清零
根据上次功能键和输 入的数据计算结果
本次功能 键?
结果送显示缓冲 结果送显示缓冲
等待数值输入
等待数值输入
数值送显示缓冲
结果送显示缓冲 等待数值输入
LCD 显示
5
五 硬软件的调试及方法
我个人遇到的主要问题出现在 LCD1602 上,要不是我自己买了块新的 LCD 恐怕我的结 论,就只能在软件仿真实现了。
下面是源代码: #include<reg51.h> #define CLEARSCREEN
LCD_write_command(0x01)
8
#define uint unsigned int #define uchar unsigned char
/**************定义接口************************/
{
if(n<10)//键值小于 10
{
t1=t1*10+n;
LCD_write_command(0x00);//写命令语句
LCD_write_dat(mayuan[n]);//写数据函数
}
else
{
if(n==10){LCD_init();t1=0;t2=0,t=0;k=1;}
else{
if(n<15){
t=t2*t1; break; case 13: t=t2-t1; break; case 14: t=t2+t1; break; } if(t<=9){ LCD_write_command(0x00); LCD_write_dat(t+48);} if(t>9) {
六 实验结果与性能达标
基于51单片机简易计算器课程设计报告

基于51单片机简易计算器课程设计报告
基于51单片机简易计算器课程设计报告
1. 研究背景
•计算器是人们日常生活和工作中常用的工具之一。
•通过设计简易计算器,可以加深学生对51单片机的理解和应用。
2. 目标和需求
•设计一个基于51单片机的简易计算器,能够进行基本的四则运算和开方运算。
•要求计算器能够显示输入和计算结果。
•要求计算器具备简单的界面和操作。
3. 设计方案
•使用51单片机作为计算器的控制核心。
•通过键盘输入数字和运算符,并显示在液晶屏上。
•根据输入的运算符,进行相应的计算,并将结果显示在液晶屏上。
4. 硬件设计
•使用51单片机作为主控芯片。
•连接液晶屏模块,用于显示输入和计算结果。
•连接键盘模块,用于输入数字和运算符。
5. 软件设计
•使用C语言进行编程。
•设计主程序,包括初始化、输入处理和计算输出等功能。
•设计函数,实现基本的四则运算和开方运算。
6. 实验结果
•成功设计并实现了基于51单片机的简易计算器。
•可以正常进行基本的四则运算和开方运算。
•输入和计算结果能够准确显示在液晶屏上。
7. 总结与展望
•通过设计这个简易计算器,学生对51单片机的理解和应用能力有了提高。
•下一步可以考虑增加更多的功能,如科学计算和数据存储等。
以上是本次基于51单片机简易计算器课程设计的报告。
通过这个实验,学生对51单片机的应用能力得到了提升,进一步增强了对计算器的理解。
在未来的课程设计中,可以进一步拓展功能,提升计算器的实用性和功能性。
单片机设计实验报告简单计算器的设计

目录1.总体方案选择 (2)1.1 实验要求: (2)1.2方案设计 (2)2.硬件原理电路图的设计及分析 (3)2.1主控模块 (3)2.1.1 STC89C52单片机主要特性 (3)2.1.2 STC89C52单片机管脚图 (4)2.1.3 STC89C52单片机的中断系统 (5)2.1.4 STC89C52单片机的定时/计数器 (5)2.2矩阵键盘模块设计: (5)2.2.1矩阵键盘原理介绍 (5)2.2.2矩阵键盘电路设计 (6)2.3 LCD液晶显示器简介 (7)2.3.1液晶模块简介 (7)2.3.2液晶显示部分与89S52的接口 (8)3系统软件设计 (10)3.1系统软件流程图 (10)3.2系统整体原理图 (11)4.系统调试 (12)4.1硬件调试 (12)4.2软件调试 (12)4.3调试结果 (13)5.心得体会131.总体方案选择1) 1.1 实验要求:2)通过小键盘实现数据的输入, 并在LED数码管上显示3)实现+、-、*、/4)在LED数码管上显示结果并有清零, 退出功能1.2方案设计本系统以STC89C52单片机为控制核心, 对系统进行初始化, 主要完成对键盘的响应、液晶显示灯功能的控制, 起到总控和协调各模块之间工作的作用。
单片机通过检测键盘读取使用者按下对用功能的按键, 然后通过单片机内部运放把运算的结果显示在液晶屏幕上。
图1-1系统结构框图本系统结构如图1-1所示, 本设计可分为以下模块: 单片机主控模块、键盘模块、功率放大模块、闹铃模块、按键设置模块。
下面对各个模块的设计方案逐一进行论证分析。
2.硬件原理电路图的设计及分析2.1主控模块STC89C52有40个引脚, 4个8位并行I/O口, 1个全双工异步串行口, 同时内含5个中断源, 2个优先级, 2个16位定时/计数器。
STC89C52的存储器系统由4K的程序存储器(掩膜ROM), 和128B的数据存储器(RAM)组成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
沈阳航空航天大学课程设计报告课程设计名称:单片机系统综合课程设计课程设计题目:简易计算器的设计与实现院(系):专业:班级:学号:姓名:指导教师:完成日期:沈阳航空航天大学课程设计报告目录第1章总体设计方案 (1)1.1设计内容 (1)1.2设计原理 (1)1.3设计思路 (2)1.4实验环境 (2)第2章详细设计方案 (3)2.1硬件电路设计 (3)2.2主程序设计 (7)2.2功能模块的设计与实现 (8)第3章结果测试及分析 (11)3.1结果测试 (11)3.2结果分析 (11)参考文献 (12)附录1 元件清单 (13)附录2 总电路图 (14)附录3 程序代码 (15)第1章总体设计方案1.1 设计内容本设计是基于51系列的单片机进行的十进制计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除1位无符号数字的简单四则运算,并在6位8段数码管上显示相应的结果。
设计过程在硬件与软件方面进行同步设计。
硬件方面从功能考虑,首先选择内部存储资源丰富的8751单片机,输入采用4×4矩阵键盘。
显示采用6位8段共阳极数码管动态显示。
软件方面从分析计算器功能、流程图设计,再到程序的编写进行系统设计。
编程语言方面从程序总体设计以及高效性和功能性对C语言和汇编语言进行比较分析,最终选用汇编语言进行编程,并用protel99se涉及硬件电路。
1.2 设计原理在该课程设计中,主要用到一个8751芯片和串接的共阳数码管,和一组阵列式键盘。
作为该设计的主要部分,下面将对它们的原理及功能做详细介绍和说明。
1)提出方案以8751为核心,和数码管以及键盘用实验箱上已有的器件实现计算器的功能。
2) 总体方案实现(1)要解决键值得读入。
先向键盘的全部列线送低电平,在检测键盘的行线,如果有一行为低电平,说明可能有按键按下,则程序转入抖动检测---就是延时10ms再读键盘的行线,如读得的数据与第一次的相同,说明真的有按键按下,程序转入确认哪一键按下的程序,该程序是依次向键盘的列线送低电平,然后读键盘的行线,如果读的值与第一次相同就停止读,此时就会的到键盘的行码与列码查表可的键值。
并且将键值送入缓冲区。
(2)计算。
从缓冲区中取出数据按照括号配匹算法解决符号优先级问题,如果有键值为“F”则清空缓冲区跳至开始处,否则调用汇编指令进行计算,结果送入缓冲区。
(3)显示。
从缓冲区中取出数据查找段码表,将段码送入段码管。
1.3 设计思路采用汇编语言程序设计的方法结合硬件电路设计方法,利用Lab6000实验箱上已有芯片来实现计算器的各项功能。
1.4 实验环境硬件环境:Lab6000实验箱,PC机。
软件环境:WA VE应用软件。
第2章详细设计方案2.1 硬件电路设计1)单片机8751P0口作为存储器地址线的低8位,p2口作为地址线的高8位,采用定时器0作为键盘抖动时的10ms延时,采用外部设备与存储器统一编制方式。
如图2.1所示。
图2.1 单片机8751图2)8段共阳极数码管图为八段共阳极数码管的引脚图,从左到右数码管的段码分别为a,b,c,d,e,f,g 和小数点dp,高电平时点亮,这八位分别74LS374的Q0~Q7接,作为数码管的段码锁存器,其CPU访问地址位09004。
下边为位选端和阳极端,6个位选端分别与另一片74LS374的Q0~Q5,与此同时为了体现总线的复用性和硬件电路的简单性这6位位选线作为键盘的列线,CPU访问地址为09002H。
如图2.2所示。
图2.2 共阳极8段数码管图3)键盘键盘可分为两类:编码键盘和非编码键盘。
编码键盘是较多按键(20个以上)和专用驱动芯片的组合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。
通用计算机使用的标准键盘就是编码键盘。
当系统功能比较复杂,按键数量很多时,采用编码键盘可以简化软件设计。
但大多数智能仪器和电子产品的按键数目都不太多(20个以内),为了降低成本和简化电路通常采用非编码键盘。
非编码键盘的接口电路有设计者根据需要自行决定,按键信息通过接口软件来获取。
本课题需要的是16个按键,故选择用非编码键盘。
键盘的行线与一片74LS245相连接作为键盘的扫描码,其CPU访问地址09001H。
如图2.3所示。
图2.3 简易计算器数据输入键盘图4)74LS37474LS374是地址锁存器,一片用来锁存键盘,数码管的地址,另一片用来锁存数码管的段码。
如图2.4所示。
图2.4 74LS374图5)74LS24574LS245用来读取键盘的行码A0-A3分别与键盘的行线相连接;B0-B7分别与数据总线相连接。
如图2.5所示。
图2.5 74LS245图6)UNL2003AUNL2003A相当于7个非门IN输入OUT输出,其中IN端接键盘的列线,OUT 端接数码管。
如图2.6所示。
图2.6 ULN2003A图2.2 主程序设计主程序模块是边检测边显示的模块,一旦有按键按下(无论是按键抖动还是真的有按键按下)就转入键值读取模块,如果没有按键按下或是已经从键值读取模块返回,就继续从一个以30H为首地址的缓冲区中取出数据并转换成数码管的段码显示出来。
主模块是一个死循环函数没有结束直至人为终止。
主程序流程图如图2.7所示。
开始检测从缓冲区中读数据否查表取段码显示有键按下是结束图2.7 主程序流程图2.2 功能模块的设计与实现1)键值读取模块。
键只读取模块是,当主模块中有按键时,才被调用的。
其功能是首先延时10ms 已消除键盘抖动,继续读写,若读得的数据与主模块中的键值一样则真的有按键按下,若是“F”键则清空缓冲区若是“E”键则调用计算模块,否则将键值写入缓冲区返回主函数。
流程图如2.8所示。
延时10ms读取键值有键按下是结束开始F 键E 键延时10ms按键放开否清空缓冲区是调用计算函数是缓冲区加一将键值存入否否2)计算模块计算模块是从缓冲区中取得数据并且压栈,如遇到“*”或是“/”就出栈同时进行乘除运算;至到遇到等号为止,再从栈中取得数据进行加减运算。
并将计算的结果送入缓冲区中。
具体流程图如图2.9所示。
开始结束从缓冲区中取数计算取完结果写入缓冲区是否图2.8 键值读取模块图图2.9 计算模块图程下载与硬件测试第3章结果测试及分析3.1 结果测试计算器实现了0 –F内的加减乘除法运算,并将表达式以及结果显示在六位八段数码管上,其中A键为加号,B键为减号,C键为乘号D键为除号,F键为清零,还可以实现表达式的运算,例如1+2*3/4-5=-2.75的表达式。
3.2 结果分析键值的读取是本次课程设计最关键的一部分,因为只有从键盘取得数据才能进行计算和显示,否则该题目无法继续进行下去,按键的读取逻辑方面并不是很难,但是边读取边显示就显得不那么简单了,所以存在一个延时问题。
延时得当则读取和显示可完美结合。
计算也是一个很关键部分,本来想做一个任意位数的任意数学表达式的计算器可是由于时间限制,只能完成了计算任意数学表达式计算器。
显示模块比较简单实现起来也比较容易。
签。
参考文献参考文献[1]王爱英.计算机组成与设计[M]. 北京:教育出版社,2003[2]杨素行.微型计算机系统原理及应用[M]. 北京:清华大学出版社,1996[3]张雪兰.汇编语言程序设计[M]. 北京:清华大学出版社,2006[4]龚尚福.微机原理与接口技术[M]. 西安:西安电子科技大学出版社,2003[5]王中民.微型计算机原理[M]. 西安:西安电子科技大学出版社,2003[6]沈美明,温冬婵.IBM-PC汇编语言程序设计[M]. 北京:清华大学出版社,2001附录1元件清单名称数量(个)型号备注电阻 68段数码管 6 DPY开关24 BUTTON单片机 1 8751与非门 3电源 3电容 3 30pf(2个),10uf(1个) 晶振 1 CRYSTAL芯片 5 74LS系列ULN2003A74LS138,74LS245,74LS373(2)74LS374附 录2 总电路图123456A BCD654321D C BA TitleN umber R evisio nSize BD ate:15-Ju l-2014Sh eet of File:E:\单片机\单片机课设\硬件电路图\计算器.D db D raw n B y:7410852C LEA R 963=+--*/D 03Q 02D 14Q 15D 27Q 26D 38Q 39D 413Q 412D 514Q 515D 617Q 616D 718Q 719O E 1C LK 11U 674LS37412345678a b c d e f g h a b c de f gh910L612345678a b c d e f g h ab c de f g h910L512345678a b c d e f g h ab c de f g h910L412345678a b c d e f g h ab c de f g h910L312345678a b c d e f g h a b c d e f g h 910L212345678a b c d e f g habcd e f gh910L1IN 11IN 22IN 33IN 44IN 55IN 66IN 77C OMMO N8C LA MP9O UT 710O UT 611O UT 512O UT 413O UT 314O UT 215O UT 116U 5U LN 2003A (16)MO NN EX TLA STTR A CEST EP H ER E EX EC R 1R 210K R 310K R 410KV CCA 02A 13A 24A 35A 46A 57A 68A 79B 018B 117B 216B 315B 414B 513B 612B 711E 19D IR1U 474LS245O E1C LK 111D 32D 43D 74D 85D 136D 147D 178D 181Q 22Q 53Q 64Q 95Q 126Q 157Q 168Q19U 374LS374(20)EA /VP31X 119X 218R ESE T9R D 17W R 16INT 012INT 113T014T115P101P112P123P134P145P156P167P178P0039P0138P0237P0336P0435P0534P0633P0732P2021P2122P2223P2324P2425P2526P2627P2728PS EN29A LE/P 30TX D 11R XD 10U 18051A 1B 2C3E14E25E36Y 015Y 114Y 213Y 312Y 411Y 510Y 69Y 77U 774LS138123U 8A 74LS00123U 9A74LS00123U 10A74LS00123U 11A 74LS02123U 12A 74LS02D 03Q 02D 14Q 15D 27Q 26D 38Q 39D 413Q 412D 514Q 515D 617Q 616D 718Q 719O E 1LE11U 274LS373V CCU 13C RY ST ALR ESE TA NC 322uf C 130pf C 230pfR 610K V CCR 510KV CC B 0B 1B 2B 3B 4B 5B 6B 7B 0B 1B 2B 3B 4B 5B 6B 7B 0B 1B 2B 3B 4B 5B 6B 7B 0B 1B 2B 3B 4B 5B 6B 7B 0B 1B 2B 3B 4B 5B 6B 7B 0B 1B 2B 3B 4B 5B 6B 7B 0B 1B 2B 3B 4B 5B 6B 7B 0B 1B 2B 3B 4B 5B 6B 7B 0B 1B 2B 3B 4B 5B 6B 7B 0B 1B 2B 3B 4B 5B 6B 7A 2A 1A 0A 0A 1A 2W R R D 10K附录3 程序代码ORG 0000HLJMP MAINORG 000BHLJMP INTORG 00FFHMAIN:MOV R7,#30HMOV R6,#00HCALL RESETJMP MAINRESET:MOV A,R7MOV R0,AMOV R1,#01HMOV A,#06HSUBB A,R6JB PSW.7,MAXMOV A,R6XRL A,#00HJZ CCMOV A,R6MOV R3,AJMP LOOP5MAX:MOV R3,#06HLOOP5:MOV A,@R0MOV R5,ACALL CHACKTABLECALL DISPLAYMOV A,R1RL AMOV R1,ADEC R0DJNZ R3,LOOP5 CC:MOV DPTR,#09004HMOV A,#00HMOVX @DPTR,AMOV R1,#00HCALL READXRL A,#0FHJZ RESETCALL CHACKJMP RESETRETCHACK:CALL DELAYMOVX A,@DPTRMOV R2,Axrl A,R0JZ HA VEAJMP CHACKHA VE:MOV R1,#0FBH LOOP:CALL READxrl A,R2JZ EQUALMOV A,R1RL AMOV R1,AAJMP LOOPEQUAL:CALL DELAYCALL DELAY LOOP2:MOVX A,@DPTRXRL A,#0FHJZ LOOP3JMP LOOP2LOOP3:CALL CHACKTABCALL CHACKTABLECALL RESOLVERETCHACKTAB:MOV DPTR,#TABMOV A,#00HMOV R5,#00HLOOP4:RL AMOV R4,AMOVC A,@A+DPTRXRL A,R1JNZ NEXTMOV A,R4INC AMOVC A,@A+DPTRXRL A,R0JNZ NEXTAJMP ENDDNEXT:INC R5MOV A,R5SJMP LOOP4ENDD:RETCHACKTABLE:MOV DPTR,#TABLEMOV A,R5MOVC A,@A+DPTRMOV R4,ARETDISPLAY:MOV DPTR,#09002HMOV A,R1MOVX @DPTR,AMOV DPTR,#09004HMOV A,R4MOVX @DPTR,AMOV R2,#0FFHDJNZ R2,$RETREAD:MOV DPTR,#09002HMOV A,R1MOVX @DPTR,AMOV DPTR,#09001HMOVX A,@DPTRMOV R0,ARETRESOLVE:INC R7MOV A,R7MOV R0,AMOV A,R5INC R6MOV @R0,AMOV A,R5XRL A,#0FHJZ CLEARMOV A,R5XRL A,#0EHJZ MJMP MMM:LCALL JISUANG MM:RETCLEAR:LJMP MAINDELAY:MOV TH0,#3CHMOV TL0,#0B0HMOV TMOD,#01HSETB EASETB ET0SETB TR0JB TR0,$JMP RRRINT:CLR TR0RETIRRR:RETTAB:DW 0DF0EH,0DF0DH,0EF0DH,0F70DH,0DF0BH,0EF0BH,0F70BH DW 0DF07H,0EF07H,0F707H,0FB07H,0FB0BH,0FB0DH,0FB0EH DW 0F70EH,0EF0EHTABLE:DB 3FH,06H, 5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H, 7CH,39H,5EH,79H,71HJISUANG:MOV R0,#31HMOV R1,#50HCHENGCHU:MOV A,@R0XRL A,#0CHJZ CHENGMOV A,@R0XRL A,#0DHJZ CHENGMOV A,@R0XRL A,#0EHJZ OVERMOV A,@R0MOV @R1,AINC R0INC R1JMP CHENGCHUCHENG:MOV A,@R0MOV R3,ADEC R1MOV A,@R1MOV R2,AINC R0MOV A,@R0INC R0MOV R4,ACALL MATHMOV A,R5MOV @R1,AINC R1MOV A,R5MOV @R1,AJMP CHENGCHU CHU:MATH:MOV A,R3XRL A,#0AHJZ ADDDMOV A,R3XRL A,#0BHJZ SUBBBMOV A,R3XRL A,#0CHJZ MULLJMP OVER ADDD:MOV A,R2ADD A,R4MOV R5,AJMP RETT SUBBB:MOV A,R2SUBB A,R4MOV R5,AJMP RETT MULL:MOV A,R2MOV B,R4MUL ABMOV R5,ARETT:RETOVER:INC R0MOV A,#0EHMOV @R1,AMOV R1,#50H LOOP8:MOV A,@R1XRL A,#0EHJZ ENDD1INC R1MOV A,@R1XRL A,#0EHJZ ENDD1DEC R1MOV A,@R1MOV R2,AINC R1MOV A,@R1MOV R3,AINC R1MOV A,@R1MOV R4,ACALL MATHMOV A,R5MOV @R1,AJMP LOOP8 ENDD1:DEC R1MOV A,@R1MOV @R0,AINC R7INC R6RETEND沈阳航空航天大学课程设计报告课程设计总结:通过这次课程设计,我进一步加深了对单片机的了解。