CC语言实现的数据结构课程设计的计算器堆栈

CC语言实现的数据结构课程设计的计算器堆栈
CC语言实现的数据结构课程设计的计算器堆栈

C、C++语言实现的数据结构课程设计的计算器(堆栈)

/*

// 我真诚地保证:

// 我自己独立地完成了整个程序从分析、设计到编码的所有工作。

// 如果在上述过程中,我遇到了什么困难而求教于人,那么,我将在程序实习报告中// 详细地列举我所遇到的问题,以及别人给我的提示。

// 我的程序里中凡是引用到其他程序或文档之处,

// 例如教材、课堂笔记、网上的源代码以及其他参考书上的代码段,

// 我都已经在程序的注释里很清楚地注明了引用的出处。

// 我从未没抄袭过别人的程序,也没有盗用别人的程序,

// 不管是修改式的抄袭还是原封不动的抄袭。

// 我编写这个程序,从来没有想过要去破坏或妨碍其他计算机系统的正常运转。

// <李雷阳>

*/

/********************************************************************

用堆栈做的计算器程序*

创建者:李雷阳*

创建时间:2011.03.12 *

最后修改时间:2011.03.15 *

/********************************************************************

/********************************************************************

本程序功能:实现用堆栈处理计算表达式

具体内容:

I: 如果算式里面有计算式不应该出现的字符,则将其智能略去

如:将(1.4a54+2f.6)*3.09s+4ff看成(1.454+2.6)*3.09+4

II: 检查括号是否匹配,如果匹配,再检查是否出现在合法位置

如:(8*(7-4)不匹配,以及65*(72+98)(70-45)匹配但是不合法

III: 检查计算数与计算符号的数量是否合格

如:+23-4* 、23-4*、+23-4 等等

IV: 检查输入小数的时候小数点是否输入过多以及智能改正

如:将3....2*10+8 看成3.2*10+8

V: 检查连续输入大于两个符号时候是否能智能修改,“不能”

则-> 对于3+-2 给出判断结果:输入有误

VI: 接V:如果判断能够改正,则------------------------------->

将4++++++++++++5看成4+5并计算

VII:检测“0”是否出现在分母上

【下边是检测数据,检测结果与期望结果吻合】

【注:输入数据结尾没有“#”,以为在我的程序里面要它没用】

()*2+3# 期望结果:输入有误

(3+3)*3+1*(1+3)-3/2+3*3# 期望结果:29.5

1+2*(4-5)+45# 期望结果:44.000000

(1.454+2.6)*3.09+4# 期望结果:16.5269

(1.4a54+2f.6)*3.09s+4ff# 期望结果:16.5269

(56-23)/8-4# 期望结果:0.125

34+p(u89-12.3)k/3# 期望结果:59.5667

89.5*749+25)# 期望结果:输入有误

89.5*749+25# 期望结果:67060.500000

(8*(7-4)# 期望结果:输入有误

65*(72+98)(70-45) # 期望结果:输入有误

6*# 期望结果:输入有误

)5+3(# 期望结果:输入有误

(3+)(4)# 期望结果:输入有误

3....2*10+8# 期望结果:40

+23-4*# 期

望结果:输入有误

23-4*# 期望结果:输入有误

+23-4# 期望结果:输入有误

3+-2# 期望结果:输入有误

4+++++++++++++++5# 期望结果:9

********************************************************************/

/********************************************************************

* 程序中所用到的头文件*

********************************************************************/

#include<iostream>

#include<cstring>

using namespace std;

/********************************************************************

* 宏定义*

********************************************************************/

#define MAX_LENGHT 50

//预先假设计算字符串最多有500个字符

#define MAX 10

//一般情况下输入要计算的数不会超过10位

/********************************************************************

* 自定义函数*

********************************************************************/

bool isOperand(char ch);

//检查是否为操作数

int priority( char op);

//设置操作等级并返回操作符op的等级

template <class Stack_type>

//用计算符号op计算数字number_1 和number_2

Stack_type caculate( char op, const Stack_type number_1, const Stack_type number_2 );

char *mark(char string[]);

//将符号和数字放在同一个堆栈里面时,两个数字可能会连在一起,导致无法区分//哪个是第一个数哪个是第二个数,这里我用了小方法,就是在每个数字后边加个//字母a来将两个连着的数字区分开

char *parsing(char A_string[]);

//将将传入的中缀计算字符串A_string转化成后缀计算字符串并返回一个指针

float result(char A_string[]);

//计算用函数“char *parsing(char A_string[]);”转化过的后缀计算字符串的值bool check(char A_string[]);

/*自定义堆栈*/

template<class Type>class Stack;

template<class Type>

class StackNode

{

friend class Stack<Type>;

private:

Type data;

StackNode<Type> *link;

StackNode(Type D=0,StackNode<Type> *L=NULL):link(L),data(D){}

};

template<class Type>

class Stack

{

public:

Stack():_top(NULL),NumItem(0){}

void push(Type item);

void pop(); //Type pop();

Type top();

void MakeEmpty();

bool empty();

private:

int NumItem;

StackNode<Type> *_top;

};

template<class Type>

void Stack<Type>::push(Type item)

{

_top=new StackNode<Type>(item,_top);

NumItem++;

}

template<class Type>

void Stack<Type>::pop()

{

StackNode<Type> *p;

p=_top;

_top=_top->link;

delete p;

NumItem--;

}

template<class Type>

Type Stack<Type>::top()

{

return _top->data;

}

template<class Type>

bool Stack<Type>::

empty()

{

return _top==NULL;

}

template<class Type>

void Stack<Type>::MakeEmpty()

{

delete _top;

}

/********************************************************************

* 主函数*

********************************************************************/

int main()//主函数

{

char inputString0[MAX_LENGHT];

//定义输入的字符串

int i=1;

char inputString[MAX_LENGHT];

//为了不改变输入的字符串,用来充当计算过程中的inputString0

while(1){

if(i){puts("请输入计算式,以“#”号结束(如:65*(72+98)*(70-45)#)");i=0;} cout <<">>";

gets( inputString0 );

//从键盘接收输入的计算字符串inputString0

strcpy( inputString , inputString0 );

//为了不改变输入的字符串inputString0,用inputString来充当计算过程中的

//inputString0.以后计算用到计算字符串的时候都将inputString传递,而原始字符串//inputString0不变

if(check(inputString)==false)

{

cout <<"输入有误!"<<endl;

//exit(0);

}

else

{

strcpy( inputString , mark(inputString) );

//进行标记inputString并且返回赋值给inputString

strcpy( inputString , parsing(inputString) );

//将【经过处理】的中缀计算字符串返回并且赋值给inputString

cout <<">>="<<result(inputString)<<endl<<endl; //计算最终的结果

}

}

return 0;

}

/********************************************************************

*函数名称:isOperand *

*函数表述: 检查ch是否为操作数*

*输入值:char ch *

*返回值:检查ch是否为操作数,是则返回1,否则返回0 * ********************************************************************/

bool isOperand(char ch)

{

bool ret;

//ret :标记是否为操作数

switch(ch)

{

case '+':

case '-':

case '*':

case '/':

case '(':

case ')':

ret = false;

//ret=0 :ch不是操作数

break;

default :

ret = true;

//ret=1 :ch是操作数

break;

}

return ret;

}

/******************************************************************** *函数名称:priority *

*函数表述: 为操作符op (+、-、*、/)设置操作等级并返回操作符op的等级* *输入值:char op *

*返回值:返回操作符op的等级*

********************************************************************/

int priority(char op)

{

int p;

//p表示操作符号的等级

switch(op)

{

case '+':case '-':

p = 1;

break;

case '*':case '/':

p = 2;

break;

default:

p = 0;

break;

}

return p;

}

/******************************************************************** *函数名称:mark *

*函数表述: 在每个数字后边添加a *

*输入值:char string[

] *

*返回值:返回添加字符a后的字符串*

********************************************************************/

char *mark(char string[])

{

int i;

int j;

int lenght = strlen(string);

//lenght :输入的计算字符串string[]的长度

char A_string[MAX_LENGHT];

//添加字母a 之后的新字符串,MAX_LENGHT初步宏定义为500,基本上已经足够了

for(i = 0,j = 0; i < lenght;)

//从计算字符串string[]的第0为开始搜索到全部搜索过为止

{

if( isOperand(string[i]) || string[i]=='(' )

//如果string[i]是数字或者“(”,则直接复制给新字符串A_string[i]

A_string[j++] = string[i++];

else if(string[i]==')')

//如果string[i]是“)”,则前边一定是数字的最后边,

{

A_string[j++] = 'a';

//此时给那个数字最后添加一个作为标记的符号“a”

A_string[j++] = string[i++];

//这个是将右括号复制给A_string

A_string[j++] = string[i++];

//这里赋值是因为任何计算中,右括号后边第一个一定是计算符号,不用判断是否为数//字了,(因为这个函数的用途:见函数表述)所以这里直接复制给A_string

}

else

{

A_string[j++] = 'a';

//这个就不解释了,上边解释过了

A_string[j++] = string[i++];

}

}

if( isOperand(A_string[j]) )

A_string[j++] = 'a';

//这里的原因是:当字符串的后边有一个数字,比如:A+B的时候,B后边没有操作符

//号了,就不能正常给数字B后边添加字母a了

A_string[j] = '\0';

//最后一定要给新的字符串一个结尾符

return A_string;

}

/******************************************************************** *函数名称:parsing *

*函数表述: 将中缀字符串转化为后缀计算字符串* *输入值:char A_string[] *

*返回值:返回转化完的后缀计算字符串*

********************************************************************/

char *parsing(char A_string[])

{

int i;

int j;

char ch_0;

char ch_1;

int lenght = strlen(A_string);

//输入的计算字符串的长度

char B_string[MAX_LENGHT];

Stack <char>setStack ;

for( i = 0, j = 0; i < lenght; i ++)

{

ch_0 = A_string[i];

if( isOperand(ch_0) )

//如果是操作数,则直接赋值给B_string

B_string[j++] = ch_0;

else

{

if( ch_0 == '(' )

//左括号的时候--------

{

setStack.push(ch_0);

//左括号直接压栈

}

else if( ch_0 == ')' )

//右括号的时候--------

{

while( !setStack.empty() )

{

ch_0 = setStack.top(); setStack.pop();

//弹出栈的最上边元素

if( ch_0 == '(' )

break;

else

B_string[j+

+] = ch_0;

//只要没有遇到左括号,就一直弹出栈内元素

}

}

else

//既不是左括号右不是右括号的时候---------

{

if( !setStack.empty() )

//如果栈不是空的话

{

do

{

ch_1 = setStack.top(); setStack.pop();

//弹出栈的最上边元素

if( priority( ch_0 ) <= priority( ch_1 ) )

//当想入栈的元素级别小于栈内顶元素运算级别时

{

B_string[j++] = ch_1;

//弹出栈顶元素

if(setStack.empty())

//当栈内没有元素了的时候,就不用比较了,直接入栈跳出去就OK了{

setStack.push(ch_0);

break;

}

}

else

{

setStack.push(ch_1);

//如果想入栈的元素的优先级别大于栈顶元素级别,

//则将取出的元素和它都压入栈内

setStack.push(ch_0);

break;

}

}while( !setStack.empty() );

}

else

//如果是空的话,就不用比较栈内元素和要入栈的元素级别了,直接入栈

{

setStack.push(ch_0);

}

}

}

}

while( !setStack.empty() )

//当栈内还有元素的时候,一起将所有元素弹出

{

B_string[j++] = setStack.top(); setStack.pop();

}

B_string[j] = '\0';

//给B_string加结尾符

return B_string;

}

/********************************************************************

*函数名称:caculate *

*函数表述: 用计算符 op 计算number_1 和number_2 *

*输入值:op、number_1 、number_2 *

*返回值:用计算符o p 计算number_1 和number_2的结果*

********************************************************************/

template <class Stack_type>

Stack_type caculate( char op, const Stack_type number_1, const Stack_type number_2 ) {

Stack_type temp;

switch(op)

{

case '+':

temp = number_1 + number_2;

break;

case '-':

temp = number_2 - number_1;

//这里很容易出错,一定是栈下边减去栈上边的

break;

case '*':

temp = number_1 * number_2;

break;

case '/':

temp = number_2 / number_1;

//这里很容易出错,一定是栈下边除以栈上边的

break;

}

return temp;

}

/**********************************************************

用这种写法也可以,但是这样的话会有一个waring,所以没有这样写

**********************************************************/

/*

template <class Stack_type>

Stack_type caculate( char op, const Stack_type number_1, const Stack_type number_2 ) {

switch(op)

{

case '+':

return number_1 + number_2;

case '-':

return number_2 - number_1;//这里很容易出错,一定是栈下边减去栈上边的

case '*':

return number_1 * number_2;

case '/':

return number_2 / number_1;//这

里很容易出错,一定是栈下边除以栈上边的

}

}

*/

/********************************************************************

*函数名称:result *

*函数表述: 计算后缀计算字符串*

*输入值:char A_string[] *

*返回值:后缀计算字符串的结果*

********************************************************************/

float result( char A_string[])

{

int i, j, k;

Stack <float> setStack;

//数字栈/*接下来先把A_string[]里面的所有数字用浮点型堆栈setStack储存起来*/ char numString[MAX];

//用atof将它转为float型再保存在堆栈里,一般情况下输入的数字不会大于10^10 float numNumber;

//用atof将numString转化后传给numNumber,将float型numNumber压入栈中方便计算

float temp[2];

//接收需要计算的时候从栈里面弹出来的那两个float型元素

float sum;

//sum存储temp[0] 和temp[1] 的计算结果

for(i = 0, j = 0, k = 0; i < strlen(A_string); i ++)

{

if( isOperand(A_string[i]) && A_string[i]!='a' )

//当正在读取的是数字并且没有读完这个数字的所有位数的时候,

{

numString[j++] = A_string[i];

//将正在读取的数字元素复制给numString

}

else

{

numString[j] = '\0';

//否则,当这个数字的所有位都读进numString[]的时候,给numString[]结尾标志,numNumber = atof(numString);

//并且将它转换为float型,用float型的numNumber接收

if(A_string[i]=='a')

//如果是因为遇到数字结尾标记字母“a”而进入else的话,将它直接压入堆栈,因为//此时这个数字后边的一定也是数字,而不是操作符。

{

setStack.push(numNumber);

j = 0;

//从新记录下一个数字字符串

}

else

//否则的话,如果A_string[i]!='a',则是因为遇到了操作符进入这里的,那么就需

{

//要进行弹出并且计算了

if( !setStack.empty())

//这个为了严禁才写的,不过一般情况下进入这里就不能是空的

{

temp[0] = setStack.top();setStack.pop();

temp[1] = setStack.top();setStack.pop();

}

sum = caculate( A_string[i], temp[0], temp[1] );

//计算结果,用操作符A_string[i]计算temp[0] 和temp[1]

setStack.push(sum);

//将结果压栈

}

}

}

return sum;

}

/********************************************************************

*函数名称:check *

*函数表述: 检查输入的字符串A_string[]是否合法*

*输入值:A_string[] *

*返回值:合法则返回true,否则返回false *

********************************************************************/

bool check(char A_string[])

{

char B_string[MAX_LENGHT];

int i,j;

char c, d;

int length = strlen(A_string);

int sign = 0;

int numSumbers = 0;

int opeSumbers = 0;

/*将除了数字、+、-、*、/、(、)、. 以外的过滤一下*/

for(i = 0, j = 0; i <= length - 1 ; i++ )

{

c = A_string[i];

if ( c>='0'&&c<='9' || !((c-'+')*(c-'-')*(c-'*')*(c-'/')*(c-'(')* (c-')')*(c-'.')))

{

if ( c == '(' )sign ++;

else if (c ==')' )sign --;

else if ( c>='0'&&c<='9' );

else if ( c == '.' ){if( A_string[i-1] == '.') continue;}//小数点是否重复了,比如65 (5)

else if ( c == B_string[j-1] ) continue; //计算符号点是否重复了,比如65++++++5

//比如写:2++4这种重复写运算符的情况,或者2...4+2*3这种重复写多个小数点的情况else opeSumbers ++;

if ( sign < 0 ) return false;//括号是否出现右括号比左括号的多了,如果这样的话直接返回错误信息

else B_string[j++] = c;

}

}

B_string[j] = '\0';

/*接下来统计计算数字有多少个*/

length = strlen(B_string);

for(i = 0; i <= length - 2 ; i++ )

{

c = B_string[i];

if ( c>='0'&&c<='9' )

{

d = B_string[i+1];

if( !((d-'+')*(d-'-')*(d-'*')*(d-'/')*(d-')') ) )

numSumbers ++;

}

else

{

d = B_string[i+1];

if( c =='(' || c ==')')

if( d =='(' || d ==')')return false;

}

}

if( B_string[i] >='0' && B_string[i] <='9' )numSumbers ++;

/*统计完毕*/

if(sign != 0) return false;//括号是否匹配成对

else if ( numSumbers - opeSumbers != 1 )return false;

length = strlen(B_string);//将修正过的新串返回去

for(i = 0; i < length; i++ )

{

A_string[i] = B_string[i];

}

A_string[i] = '\0';

return true;

}

GUI设计的简易计算器附程序

电子信息工程系实验报告 课程名称:MATLAB 应用 实验项目名称:GUI 计算器设计 实验时间:2012-11-22班级:测控081姓名:学号:810707132实验目的: 1.熟悉MATLAB 的菜单设计方法 2.熟悉MATLAB 的主要控件使用方法 3.熟悉MATLAB 的GUI 设计流程 4.运用MATLAB 的GUI 设计一个简单的计算器 实验环境: MATLAB7.8 实验内容: function varargout =jisuanqi1(varargin)%JISUANQI1M-file for jisuanqi1.fig %JISUANQI1,by itself,creates a new JISUANQI1or raises the existing %singleton*.%%H =JISUANQI1returns the handle to a new JISUANQI1or the handle to %the existing singleton*.%%JISUANQI1('CALLBACK',hObject,eventData,handles,...)calls the local %function named CALLBACK in JISUANQI1.M with the given input arguments.%%JISUANQI1('Property','Value',...)creates a new JISUANQI1or raises the %existing singleton*.Starting from the left,property value pairs are %applied to the GUI before jisuanqi1_OpeningFunction gets called.An %unrecognized property name or invalid value makes property application %stop.All inputs are passed to jisuanqi1_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 %Edit the above text to modify the response to help jisuanqi1 %Last Modified by GUIDE v2.505-Dec-201022:24:59 %Begin initialization code -DO NOT EDIT gui_Singleton =1;成 绩: 指导教师(签名):

【高考备考】语文语言表达图文转换之漫画类

高考语文语言表达图文转换之漫画类 ——高考语言表达图文转换之漫画类 漫画以生活为土壤,以画面为契机,在方寸之间展现生活百态。它是浓缩化的生活。其特点是夸张、象征、幽默、讽刺、典型、以小见大。 漫画一般由三部分组成:标题、画面、画中字。其中标题明示或暗示主题,有无并存;画面是漫画主体,也是寓意所在;画中字提示或补充画面,有无并存。 漫画类高考考点:1.描述漫画内容;2.揭示漫画寓意;3.拟定漫画题目。现仅就前两个考点作一梳理点拨。 解题思路上:观察(整体、局部)→分析(原因)→联想(现实)。 答题方法上:描述—整体及局部特征。寓意—抓住画面特征,联系社会现实。 例一:请描述下面漫画的内容并揭示寓意。 步骤一:观察。整体:老鼠,两个人。 局部:老鼠背着“造假商”袋子,大汗淋漓,脑中想“一场虚惊……”。两 个人戴着红袖章,口大张,手中举着写有“假”“打”二字的牌子。 步骤二:分析。原因:原因:只有口号,没有行动。 步骤三:联想。现实:现实:政令执行者搞形式主义。 组织答案如下: (1)描述:图中有一只老鼠和两个人。左边一只老鼠大汗淋漓,背着写有“造假商”字样的包袱跑在路上,旁边两个戴红袖标的人张口大喊,分别手举写有“假”、“打”二字的牌子,老鼠在想:“一场虚惊,原来不是打假啊……”(描述—整体及局部特征) (2)寓意:漫画运用语言的倒置机趣,本为“打假”却成了“假打”,讽刺了叶公好龙的政令实施者。(寓意—抓住画面特征,联系社会现实) 语言表达是高考题的创新基地,以考点为基础,以生活为土壤,大搞创新,派生出种类繁多的新题型。如漫画题中的拟写标题、公益广告词、评析漫画等。万变不离其宗,以不变应万变,掌握要领,便可迎刃而解。 二、高中图文转换专题训练 2.下图是从婴儿期到青年期人际交往发展变化趋势坐标图,请根据要求完成题目。

简单计算器c++课程设计

简单计算器 1 基本功能描述 简单计算器包括双目运算符和单目运算符。双目运算符包含基本的四则运算及乘幂功能,单目运算符包含正余弦、阶乘、对数、开方、倒数等运算。可对输入任意操作数包含小数和整数及正数和负数进行以上的所有运算并能连续运算。出现错误会给出提示,同时包含清除、退格、退出功能以及有与所有按钮相对应的菜单项。 2 设计思路 如图1,是输入数据子函数的流程图。打开计算器程序,输入数据,判断此次输入之前是否有数字输入,如果有,则在之前输入的数字字符后加上现有的数字字符;如果没有,则直接使编辑框显示所输入的数字字符。判断是否继续键入数字,如果是,则继续进行前面的判断,如果否,则用UpdateData(FALSE)刷新显示。 如图2,是整个计算器的流程图。对于输入的算式,判断运算符是双目运算符还是单目运算符。如果是双目运算符,则把操作数存入数组a[z+2]中,把运算符存入b[z+1]中;如果是单目运算符,则把字符串转化为可计算的数字,再进行计算。下面判断运算符是否合法,如果合法,则将结果存入a[0],不合法,则弹出对话框,提示错误。结束程序。

输入一个数字 在之前输入的数字字符后面加上现在的数字字符。 Eg :m_str+=”9”。 直接使编辑框显示所输入的数字字符。 Eg :m_str=”9”。 pass3=1表示已有数字输入 开始 之前是否有数字输入? pass3==1? 继续键入数字? 用UpdateData(FALSE)刷新显示 图1 输入数据子函数流程图 Y N Y N

输入开始 双目运算符 是否每一个操作数都存入a[]数组? 把操作数存入a[z+2],把运算符存入b[z+1]。 单目运算符 将字符串转换 为可计算的数进行运算 运算是否合法? 将结果存入a[0] 弹出对话框提示错误 结束Y Y N N 图2 简单计算器总流程图

简易计算器的设计与实现

沈阳航空航天大学 课程设计报告 课程设计名称:单片机系统综合课程设计课程设计题目:简易计算器的设计与实现 院(系): 专业: 班级: 学号: 姓名: 指导教师: 完成日期:

沈阳航空航天大学课程设计报告 目录 第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再读键盘的行线,如读得的数据与第一次的相同,说明真的有按键按下,程序转入确认哪一键按下的程序,该程序是依次向键盘的列线送低电平,然后读键盘的行线,如果读的值与第一次相同就停止读,此时就会的到键盘的行码与列码

MFC课程设计报告-一个简单的计算器应用程序

设计一个简单的计算器应用程序 一、设计目标与内容 1.了解Windows编程的基础知识,掌握MFC应用程序的基本知识; 2.基本掌握面向对象程序设计的基本思路和方法; 3.掌握用VC++开发应用程序的的一般步骤和方法; 4.能够利用所学的基本知识,设计一个简单的计算器应用程序,实现基本的加、减、乘、除、求平方根,求倒数等基本运算(必须实现的功能),实现求角度的正弦、余弦、正切等基本运算、实现求指数、自然对数、常用对数等基本运算(这部分功能选做)。 5.在程序中注意处理数据和运算符的输入,计算结果的显示。 二,设计要求 1.用VC++进行编码,实现应用程序的功能。注重编码质量,代码要有适当的注释; 2.提交设计报告一份(课程设计任务书、目录、设计的基本思路、设计的步骤及主要代码、心得体会、参考文献)。

一个简单的计算器应用程序 总体设计 能够利用所学的基本知识,设计一个简单的计算器应用程序,实现基本的加、减、乘、除、求平方根,求倒数等基本运算(必须实现的功能),实现求角度的正弦、余弦、正切等基本运算、实现求指数、自然对数、常用对数等基本运算(这部分功能选做)。在程序中注意处理数据和运算符的输入,计算结果的显示。 详细设计 ◆新建工程Counter 新建工程,选择对话框应用程序。 ◆程序运行主界面

图2-1 在对话框内添加相应的控件,分别给编辑框添加三个变量m_N1,m_N2和m_Result。 然后添加一个组合框,在里面添加十二个单选按钮设置第一个单选按钮为组,如图 图2-2 然后给对话框类添加一个int变量Operator用来作相应运算时的标记。 给控件添加相应的函数 1、给单选按钮添加相应的函数 void CCounterDlg::OnRadio1() { Operator=1; } void CCounterDlg::OnRadio2()

基于单片机的简易计算器设计

目录 引言 (1) 第一章设计原理及要求 (2) 1.1设计方案的确定 (2) 1.2系统的设计方案 (2) 1.3系统的设计要求 (2) 第二章硬件模块设计 (4) 2.1单片机AT89C51 (4) 2.1.1 AT89C51芯片的特点 (5) 2.1.2 管脚说明 (5) 2.1.3 振荡器特性 (7) 2.1.4 芯片擦除 (7) 2.2键盘控制模块 (7) 2.2.1 矩阵键盘的工作原理 (8) 2.2.2 键盘电路主要器件介绍 (8) 2.3LCD显示模块 (10) 2.3.1 显示电路 (11) 2.3.2 LCD1602主要技术参数 (11) 2.3.3 引脚功能说明 (11) 2.4运算模块(单片机控制) (12) 第三章软件设计 (14) 3.1功能介绍 (14) 3.2系统流程图 (14) 3.3程序 (16) 第四章系统调试 (17) 4.1软件介绍 (17) 4.1.1 Keil uVision2仿真软件简介 (17) 4.1.2 protues简介 (17)

4.2软件调试 (18) 4.2.1 软件分析及常见故障 (18) 4.2.2 仿真结果演示 (20) 4.3硬件调试 (21) 结束语 (23) 参考文献 (24) 附录 (25) 致谢 (36)

引言 计算工具最早诞生于中国,中国古代最早采用的一种计算工具叫筹策,也被叫做算筹。这种算筹多用竹子制成,也有用木头,兽骨充当材料的,约二百七十枚一束,放在布袋里可随身携带。另外直到今天仍在使用的珠算盘,是中国古代计算工具领域中的另一项发明,明代时的珠算盘已经与现代的珠算盘几乎相同。 17世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的“纳皮尔算筹”,英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加、减、乘、除、乘方和开方运算,甚至可以计算三角函数、指数函数和对数函数。这些计算工具不仅带动了计算器的发展,也为现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具。1642年,年仅19岁的法国伟大科学家帕斯卡引用算盘的原理,发明了第一部机械式计算器,在他的计算器中有一些互相联锁的齿轮,一个转过十位的齿轮会使另一个齿轮转过一位,人们可以像拨电话号码盘那样,把数字拨进去,计算结果就会出现在另一个窗口中,但是它只能做加减运算。1694年,莱布尼兹在德国将其改进成可以进行乘除的计算。此后,一直到20世纪50年代末才有电子计算器的出现。

C语言课程设计 简单计算器程序

课程设计名称:C语言课程设计课程设计题目:简单计算器程序

目录 第1章需求分析 (1) 1.1设计要求 (1) 1.2任务 (1) 第2章总体设计 (2) 2.1设计简介及设计方案论述 (2) 2.2功能模块层次图 (2) 第3章详细设计 (3) 3.3由(后缀)逆波兰表达式计算中缀表达式原理 (8) 3.3.1算法描述 (8) 第4章调试分析 (10) 4.1程序设计中所遇到的错误及犯错的原因 (10) 4.2错误的解决方法 (10) 第5章用户手册 (11) 总结 (15) 参考文献 (16) 附录(程序清单) (17)

第1章需求分析 1.1 设计要求 (1)用 C 语言数据结构实现程序设计; (2)利用结构体、栈、进行相关信息处理; (2)系统的各个功能模块要求用函数的形式实现; (4)界面简单,可操作性高。 1.2任务 (1)定义一个结构体类型数组,输入0~9 及+、--、*等符号的信息,将其信息存储起来; (2)输入简单的加减乘除算术计算式,并在屏幕上显示逆波兰(后缀式)表达式和计算结果; (3)编写代码; (4)程序分析与调试。 说明: 本课程设计将实现一个简单计算器。在功能上尽量模仿windows 的计算器。系统界面不做牵制要求。该程序能实现标准型中+、-、*、/、(、)、.、的混合运算表达式(一般意义上的中缀表达式),将其转换成逆序波兰表达式(后缀表达式)并计算输出结果。在进行运算后可以选择继续运算或者结束当前运算。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。

第2章 总体设计 2.1设计简介及设计方案论述 逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相 关的两个运算对象之间,所以,这种表示法也称为中缀表达式。波兰逻辑学家 J.Lukasiewicz 于 1929 年提出了另一种表示表达式的方法。按此方法,每一运算符都置 于其运算对象之后,故称为后缀表达式。 后缀表达式的优点是显而易见的, 编译器在处理时候按照从左至右的顺序读取逆波 兰表达式,遇到运算对象直接压入堆栈,遇到运算符就从堆栈提取后进的两个对象进行计算,这个过程正好符合了计算机计算的原理。后缀表达式比前缀表达式更加易于转换,并且它的最左面一定为数字,这一点在实 际编程的时候就会体会到它的好处了。 逆波兰表达式有一个更大的优点,就是拆括号,根据运算符的级别将中缀表达式转 换成逆波兰表达式后,运算顺序就已经替代了运算符的级别,这样也避免了括号提高运 算级别的特殊处理。 2.2功能模块层次图 将算术表达式转化为逆波兰表达式 计算逆波兰表达式的值 简单计算器 表 达 式 格 式 转 换 系统 求 值 计 算 系 统

单片机设计简易计算器

简易计算器 Simply Calculator 1 设计思想 此计算器有键盘部分、单片机、显示部分三部分组成,键盘部分主要完成输入功能;单片机主要完成数据处理功能,包括确定按键,完成运算,以及输出数据;显示器部分主要完成单片机输出的显示。 本设计的思路是利用单片机性能好,稳定性强的优点来实现系统的运行。设计大致可以分为三个步骤:第一步,硬件的选取和设计;第二步,程序的设计和调试;第三步,Protues 系统仿真。 硬件是设计的骨骼,不仅关系到设计总体方向的确定,还要综合考虑节能,环保,以及稳定性和经济性等各种因素。因此需要花费大量的时间。硬件的选取最为重要,包括选用的芯片,显示设备的选取,输入设备的选取等。本设计是通过单片机来实现的,因此选用了ATMEGA16单片机作为主体,输入设备选用矩阵键盘。程序是硬件的灵魂,是实现设计的中心环节。本设计使用的程序语言是C语言,在“ICC AVR”中运行,调试,直到运行出正确结果,然后输出后缀名为.HEX格式的文件,以备在Protues中仿真使用。程序是设计的关键,程序的调试需要大量的时间,耐心,还够要有足的细心才能成功。本设计中就出现了大量的错误,经过认真修改,最终才能运行出正确结果。最后的系统仿真是设计是否成功的验证,是设计不可缺少的重要环节。这就要求能掌握Protues的一些基本操作。2原理分析 2.1矩阵键盘的扫描 图2.1 矩阵键盘图

如图2.1所示,单片机的8个I/O口和矩阵键盘相连,用8个I/O口来控制矩阵键盘的16个按键是非常有意思的,首先我们设置单片机的PD0—PD7为输出,且PD0—PD3依次设置为低电平,而PD4—PD7设置为高电平,然后我们设置PD4—PD7为输入,而PD0—PD3仍然为输出,假如此时M1键按下,则PD0与PD4相连,因为PD0是低电平,而PD4是输入,所以PD4会被拉为低电平,同理,如果M2被按下,则PD5会被拉低,M3按下,PD6会被拉低,M4按下,PD7被拉低。这是判断有无键盘按下的过程,当我们判断是那一个键盘按下时,我们首先设置8个I/O口为输出,输出为FE,即,PD0为低电平,其他全为高电平,然后我们设置PD4—PD7为输入,如果M1被按下,则PD4会比被拉为低电平,此时会变成EE,同理可以知道M2被按下时会变为DE,M3被按下时会变为BE,M4被按下时会变为7E。同理我们可以设置8个I/O口输出FD来检测M5—M8是否被按下,设置8个I/O口输出FC来来检测M9—M12,设置8个I/O口输出F7来检测M13—M16,如果M1—M4没有被按下,就继续检测M4—M8,一次类推,就可以检测出16个按键了。在这次设计中,16个按键M1—M16所对应检测值分别为:EE,DE,BE,7E,ED,DD,BD,7D,EB,DB,BB,7B,E7,D7,B7,77。 2.2 数字显示与计算 本次设计选用的显示器是1602液晶显示器,此液晶显示器能显示32个字符,VSS接地,VDD接电源正极,E为时使能信号,R/W为读写选择端(H/L),RS为数据/命令选择端(H/L),D0—D7为数据I/O口。 首先我们初始化液晶显示器,然后显示出第一个被按下的数,并且使光标右移,如果有第二个数按下,则据继续显示,以此类推,然后把所有显示出来的数换算成一个数,如果按下“+”号,则显示出“+”,并且同理显示出“+”号后面按下的数字,然后调用加子程序,运算出结果,如果按下的是“-”,则调用减子程序,如果按下“*”,则调用乘子程序,如果按下“/”,则调用除子程序。然后再调用显示结果子程序,显示出结果。

语言表达运用之图文转换(全)

语言文字运用之图文转换 考点清单: 在媒体信息交流和传递中,图表是几种重要的表现形式之一,它能直观鲜明、简洁明了地反映事物的发展变化规律或作者的观点态度。常见的图表形式有公司单位的报表、企业厂家生产增长图、工艺生产流程图、实验研究变化曲线图等。简洁的图表包含着大量的文字和数字信息,涉及不同的知识领域。 图文转换综合考查对材料的分析能力,要求从原始材料中筛选信息,进行分析、综合,并运用简明的语言概括出观点。 考纲解读: 图文转换题还是考查语言运用中的压缩、概括 和表达,是对学生观察能力、理解能力、语言表达 能力的考查。 考查容: 图文转换题要求考生根据图表中的有关容,分 析有关材料,辨别或挖掘某些隐含性信息,或对材 料进行综合性评价,题目类型主要分三类: 一、表文类 解读及技巧: 图表解读流程:图表---观察认读---分析理解---归纳概括---文字表达。 1.认真审题,明确要求 注意表头和表注的文字,弄清楚图表说明的对象和比较的角度,以及题目中对句式的要求和字数的限制。 2.仔细认读图表,全面准确捕捉信息 A认真观察图表,找出图表中所含的信息:比较对象、比较项目、各种数据及变化特点等。具体而言,图表式的要兼顾图表的各个要素,坐标曲线图要抓住曲线变化的规律,柱状、饼状图要抓住各要素的比例分配及变化情况,生产流程图要抓住事理的时空、逻辑顺序等。 B 重视数据变化。 C 注重图表细节,如图表下的“注”等。 3.表达用词 表明增长趋势:“增长(加)了”“增加到”“增长了xx倍”“与同期相比,增长……”等。 表明下降趋势:“减少了\到(百分数\分数)”,注意其后不能用倍数。 表示程度围的概念:“近一半(约50%)”“大部分(比例约在55%~70%)”“绝大多数(比例占70%以上)”“所有”“约几成”等。 根据图表数据变化规律来选用词语表达。 4.检查答案

简易计算器课程设计

评阅教师评语:课程设计成绩 考勤成绩 实做成绩 报告成绩 总评成绩指导教师签名: 课程设计报告 论文题目基于ARM的简易计算器设计 学院(系):电子信息与自动化学院 班级:测控技术与仪器 学生姓名:同组同学: 学号:学号: 指导教师:杨泽林王先全杨继森鲁进时间:从2013年 6 月10 日到2013年 6 月28 日 1

目录 1、封面—————————————————————P1 2、目录—————————————————————P2 3、前言—————————————————————P3 4、关键字————————————————————P3 5、原理与总体方案————————————————P3 6、硬件设计———————————————————P6 7、调试—————————————————————P10 8、测试与分析——————————————————P11 9、总结—————————————————————P13

10、附件—————————————————————P14 前言 近几年,随着大规模集成电路的发展,各种便携式嵌入式设备,具有十分广阔的市场前景。嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分。通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板。事实上,所有带有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是是由单个程序实现整个控制逻辑。在嵌入式系统中,数据和命令通过网络接口或串行口经过ARM程序处理后,或显示在LCD上,或传输到远端PC上。 本文通过周立功的LPC2106芯片完成的简易计算器,正是对嵌入式应用的学习和探索。 一、摘要: 计算器一般是指“电子计算器”,是能进行数学运算的手持机器,拥有集成电路芯片。对于嵌入式系统,以其占用资源少、专用性强,在汽车电子、航空和工控领域得到了广泛地应用。本设计就是先通过C语言进行相应程序的编写然后在ADS中进行运行最后导入PROTUES进行仿真。最后利用ARM中的LPC2106芯片来控制液晶显示器和4X4矩阵式键盘,从而实现简单的加、减、乘、除等四则运算功能。 关键字:中断,扫描,仿真,计算 二、原理与总体方案: 主程序在初始化后调用键盘程序,再判断返回的值。若为数字0—9,则根据按键的次数进行保存和显示处理。若为功能键,则先判断上次的功能键,根据代号执行不同功能,并将按键次数清零。程序中键盘部分使用行列式扫描原理,若无键按下则调用动态显示程序,并继续检测键盘;若有键按下则得其键值,并通过查表转换为数字0—9和功能键与清零键的代号。最后将计算结果拆分成个、十、百位,再返回主程序继续检测键盘并显示;若为清零键,则返回主程序的最开始。 电路设计与原理:通过LPC2106芯片进行相应的设置来控制LCD显示器。 而通过对键盘上的值进行扫描,把相应的键值通过MM74C922芯片进行运算从而

简易计算器的设计

一、功能实现:利用1602液晶显示器实现整数和小数的加法、减法、乘法、除法、开根号的运算。第一行显示输入的数据,第二行显示运算结果。 二、Proteus仿真图

三、操作说明:每次运算完后必须按一下清零键,该系统才会重新开始执行。 四、程序: #include #include #define int unsigned int #define char unsigned char void inti(); //初始化

void delay(); //延时 void anjian(); //按键显示数字和符号,第一个数存在a内 void sheji(); //设计显示完后的参数 void jsab(); //存储两个输入数 void jisuanxs(); //计算显示 void chufa(); //除法计算部分 void chengfa(); //乘法计算部分 void jianfa(); //减法计算部分 void jiafa(); //加法计算部分 void kaigenhao(); //开根号运算部分 void benshenxs(); //一个数本事显示 void leijixiaoshudian(); //小数点的累计 void fenli(); //计算后的结果分离,以便于显示 void ql(); //清屏 void xshuju(char shuju); //写数据 void xzhiling(char zhiling); //写指令 //char num[]="I LOVE YOU"; 显示在屏幕上 int sz[]={'0','1','2','3','4','5','6','7','8','9','+','-','*','/','=','.'}; char xs[]="ENRRO"; sbit e=P2^2; sbit rs=P2^0; sbit rw=P2^1; sbit key0=P2^6; sbit key1=P2^7; sbit key2=P3^0; sbit key3=P3^1; sbit key4=P3^2; sbit key5=P3^3; sbit key6=P3^4; sbit key7=P3^5; sbit key8=P3^6; sbit key9=P3^7; sbit key10=P1^3; sbit key11=P1^4; sbit key12=P1^5; sbit key13=P1^6; sbit key14=P1^7; sbit qingling=P1^0; sbit key15=P1^1; sbit key16=P1^2; int fuhao,num,m,n,q,w,s,fuhao1,fuhao2,fuhao3,fuhao4,fuhao5,xiaoshu,cishu1,cishu2; int i,g,j,p; int t,f,h; float a,b,c,d;

语言表达运用之图文转换全

语言文字运用之图文转换考点清单:简洁明了在媒体信息交流和传递中,图表是几种重要的表现形式之一,它能直观鲜明、企业厂常见的图表形式有公司单位的报表、地反映事物的发展变化规律或作者的观点态度。简洁的图表包含着大量的文字和实验研究变化曲线图等。家生产增长图、工艺生产流程图、数字信息,涉及不同的知识领域。图文转换综合考查对材料的分析能力,要求从原始材料中筛选信息,进行分析、综合,并运用简明的语言概括出观点。 考纲解读:图文转换题还是考查语言运用中的压缩、概括和表达,是对学生观察能力、理解能力、语言表达能力的考查。 考查内容: 图文转换题要求考生根据图表中的有关内容,分析有关材料,辨别或挖掘某些隐含性信息,或对材料进行综合性评价,题目类型主要分三类: 一、表文类 解读及技巧: 图表解读流程:图表---观察认读---分析理解---归纳概括---文字表达。 1.认真审题,明确要求 注意表头和表注的文字,弄清楚图表说明的对象和比较的角度,以及题目中对句式的要求和字数的限制。 2.仔细认读图表,全面准确捕捉信息 A认真观察图表,找出图表中所含的信息:比较对象、比较项目、各种数据及变化特点等。具体而言,图表式的要兼顾图表的各个要素,坐标曲线图要抓住曲线变化的规律,柱状、饼状图要抓住各要素的比例分配及变化情况,生产流程图要抓住事理的时空、逻辑顺序等。 B 重视数据变化。 C 注重图表细节,如图表下的“注”等。 3.表达用词 表明增长趋势:“增长(加)了”“增加到”“增长了xx倍”“与同期相比,增长……”等。表明下降趋势:“减少了\到(百分数\分数)”,注意其后不能用倍数。 表示程度范围的概念:“近一半(约50%)”“大部分(比例约在55%~70%)”“绝大多数(比例占70%以上)”“所有”“约几成”等。 根据图表数据变化规律来选用词语表达。 4.检查答案 信息是否多余或遗漏缺失、信息推断是否错误、答案是否存在语病。

计算器制作

VB应用程序的设计方法 ——“简易计算器”教学设计 揭阳第一中学卢嘉圳 教学内容:利用所学知识制作Visual Basic程序“简易计算器” 教学目标:能熟练运用CommandButton控件及TextBox控件进行Visual Basic(以下简称VB)程序的设计,能熟练运用条件语句编写代码 教学重点:运用开发VB程序一般过程的思路来开发“简易计算器” 教学难点:分析得出实现“简易计算器”各运算功能的算法。 教材分析: 当我刚开始进行程序设计的教学时,便感觉比较难教。这是因为程序设计本身枯燥、严谨,较难理解,而且学生大多数都是初学者,没有相应的知识基础。对于《程序设计实例》,我们选用的教材是广东教育出版社出版的《信息技术》第四册,该书采用的程序设计语言是VB,而学生是仅学过了一点点简单的QB编程之后就进入《程序设计实例》的学习的。 教材为我们总结了设计VB程序的一般步骤:创建用户界面;设置控件属性;编写事件程序代码;运行应用程序。我总结了一下,其实VB程序设计可分为设计用户界面及编写程序代码两个环节。 教学过程: 一、引入新课 任务:让学生按照书上提示完成一个非常简单的VB程序——“计算器”(仅包含开方、平方、求绝对值功能)的制作。 目的:加强对CommandButton控件及TextBox控件的掌握,复习对开方、求绝对值函数的使用。 引入本节课的学习任务:设计一个简易计算器,包含加、减、乘、除、开方、平方等运算。程序界面可参考下图。 具体功能为:在Text1中输入一个数值,然后单击代表运算符的按钮则运算结果会在text2中显示出来;比如在text1中输入一个2,然后按“+”按钮,再输入一个3按“-”按钮,再输入一个-4按“*”按钮,则实际为(2-3)*(-4);最后在text2中显示结果为4。

设计一个简单计算器的C语言课程设计报告

C语言课程设计报告题目:设计一个简单计算器 目录 1. 设计目的 2. 内容

3. 总体设计(有流程图) 4. 源程序编写(附上了运行图) 5. 执行结果 6. 心得体会 一、设计目的 设计一个简单计算器,在功能上功能尽量模拟windows 操作系统中的计算器,系统界面不做强制要求。 全面熟悉、掌握C语言基本知识,掌握C程序设计中的顺序、分支、循环三种结构及数组、函数、指针和文件的操作,把编程和实际结合起来,增强对不同的问题运用和灵活选择合适的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实际问题的能力,规范编程思想,为以后在专业

课程中应用计算机系统解决计算、分析、实验和设计等学习环节打下较扎实的基础。 二、内容 1、程序设计的一般步骤 a、确定数据结构 b、确定算法 C、编程 d、调试 e、总结资料 2、基本要求 a .设计正确,方案合理,能实现相应功能。 b .界面友好,使用方便。 c .程序精炼,结构清晰。 d .设计报告含程序设计说明,用户使用说明,源程序清单及程序框图。 e .上机演示。

三、总体设计(程序设计组成框图、流程图)

四、源程序编与 #in clude #in clude #in clude double jisua n( char a[]) { int i=1,j,k,m,cnt=0,t1=0,t2=0,t3=0; char nibo[50],zha n2[50]; double x,n, l,z=0,zha n3[20]; typedef struct { double d1; int d2; }dd; typedef struct {

简易计算器课程设计

基于单片机的计算器的设计 摘要:本设计是一个实现加减乘除的计算器,它的硬件主要由四部分构成,一个8051单片机芯片,两个八段共阴极数码管,一个4*4键盘,它可以实现一位数的加减乘除运算。 显示部分:采用LED动态显示。 按键部分:采用4*4键盘。采用软件识别键值,并执行相应的操作。 关键词:LED接口;键盘接口;8255A;汇编语言 一、概述 1.1设计要求及任务: (1)设计4*4的键盘,其中10个数字键0~9,其余六个键“+”、“—”、“*”、“/”、“=”、和“C”键; (2)设计两位LED接口电路; (3)实现1位数的简单运算 1.2设计原理 (1)LED显示器接口技术 LED动态显示接口技术 (2)键盘显示技术 逐行(逐列扫描法) 二、系统总体方案和硬件设计 2.1计算器总体思想 显示部分:采用LED动态显示。 按键部分:采用4*4键盘。采用软件识别键值,并执行相应的操作。 执行过程:开机显示零,等待键入数值,当键入数字,经通过数码管显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在数码管上输出运算结果。 图1 系统设计框图

2.2硬件的选择与连接 图二硬件连接总图 2.2.1硬件选择 (1)由于本设计比较简单,因此选用内部含有4KBE2PROM的89C51单片机作为系统的核心。 (2)扩展输入/输出端口 在扩展输入/输出端口时,要求输入口能够缓冲,,输出口能够锁存。常用小规模集成电路芯片74LS244或74LS245等扩展输入端口,用74LS273、74LS373、 74LS377扩展输出端口。这种扩展方法的特点是电路简单,但功能单一、灵活性差。因而常采用中规模的可编程并行接口芯片8255A扩展输入/输出端口。 (3)锁存电路采用74LS373 2.2.2接口设计 (1)单片机与8255A的接口设计 8255A中的数据总线缓冲器为三态双向数据缓冲存储器,用于将8255A的数据线 D0~D7和单片机的数据总线(P0口)连接,实现单片机和接口间的数据传送。 读写控制部件的接口设计 1、/CS为片选信号,接成低电平表示8255A 被选中。/CS与P2.7相连,用P2口的最高位控制8255A是否工作。即将P2.7控制为低电平。 2、RESET-复位信号,高电平有效,接在单片机的RST端。 3、/RD和/WR为读写控制信号,低电平有效。分别将两个端口接单片机的/RD和/WR 4、A1和A0-端口选择信号,分别与单片机的低两位地址线P1.1和P1.0相连。用于选择不同端口。采用74LS373三态锁存器,用于分离P0口第八位地址线,将它的Q0和Q1口接至8255A的地址输入端A0和A1。

单片机简易计算器设计(汇编语言)

KEYBUF EQU 40H ;键号存放单元 ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV KEYBUF,#0 ;初始键号设位0,也可以为任意值 MOV R0,#30H ;显示首地址 MOV R2,#0CH ;计算数据存放单元个数 CLR A QING: MOV @R0,A;将数据存放单元清零 INC R0 DJNZ R2,QING MOV P0,#8FH ;关闭显示 MOV R1,#30H ;将显示首地址存放R1里 ;=============================================== ;五位无符号显示子程序 DIS1: MOV R0,#30H ;把显示数据第一位放在R0里 MOV R2,#04H ;把显示的位码放在R2里 MOV R3,#05H ;把显示的长度放在R3里 DIS2: MOV A,@R0 ANL A,#0FH ;屏蔽显示数据的高四位 MOV B,A MOV A,R2 ANL A,#0FH ;屏蔽位码的高四位 SW AP A ORL A,B MOV P0,A;送总显示数据到P0显示 LCALL DELY4ms ;调用延时4ms INC R0 ;取下一个显示数据 DEC R2 DJNZ R3,DIS2 ;四位显示晚后重新开始显示 ;=================================================== ;键盘扫描子程序 WAIT: MOV P1,#0FFH ;P1口送高电平 CLR P1.0 ;第一行清零 MOV A,P1 ;读P1口 ANL A,#0F0H ;低位屏蔽 XRL A,#0F0H ;判断低位是否有低电平,即判断是否有按键按下 JZ NOKEY1 ;地位有低电平继续扫描,否者跳到第而行去扫描 LCALL DELY10ms ;延时10ms去抖在进行判断是否有按键按下 MOV A,P1 ;继续读P1口 ANL A,#0F0H ;判断低位是否有低电平 CJNE A,#0E0H,NK1 ;如果扫描数据不为0E0H就转到NK1 MOV KEYBUF,#0 ;否者判断为0号键 AJMP DK ;转DK1查表程序

(完整word版)C语言简易计算器课程设计.doc

C语言课程设计报告书题目:简易计算器 院系: 班级: 学号: 姓名:

摘要 该软件为用户提供在windows 系统上的简易计算器,能进行简单的加、减、 乘、除四则运算与混合运算。目的是为了巩固和加深 C 语言课程的基本知识的理 解和掌握,利用 C语言进行基本的软件设计,掌握 C 语言的编程和程序调试 的基本技能,掌握书写程序设计说明文档的能力,提高运用 C 语言解决实际问 题的能力。 关键词: C; 简易计算器 ; 程序 ; 基本算法;混合运算 SUMMARY the software provides a simple calculator in Windows system for users ,can be a simple add,subtract,multiply,divide.The purpose is to consolidate and deepen the basic knowledge of C language courses to understand and master, The use of C language for software design basic, To master the basic skills of C language programming and program debugging, Master the writing program design documentation ability,improve the ability to use C language to solve practical problems.

(完整)基于51单片机的简易计算器设计

(完整)基于51单片机的简易计算器设计 编辑整理: 尊敬的读者朋友们: 这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)基于51单片机的简易计算器设计)的内容能够给您的工作和学习带来便利。同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。 本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)基于51单片机的简易计算器设计的全部内容。

基于单片机的简易计算器设计 摘要 (3) 关键字:80C51 LCD1602 4*4矩阵键盘计算器 (3) 第一章绪论 (4) 1.1 系统开发背景 (4) 1.2 系统开发意义 (4) 1.3 设计目的 (4) 1。4 设计任务 (4) 第二章单片机发展现状 (5) 2。1 目前单片机的发展状况 (5) 2。1。1单片机的应用场合 (6) 2。2 计算器系统现状 (6) 2.3 简易计算器系统介绍 (6) 第三章系统硬件设计及说明 (7) 3。1 系统组成及总体框图 (8) 3.2 AT89S52单片机介绍 (8) 3.3 其它器件介绍及说明 (10) 3.3.1 LCD1602液晶显示 (10) 3.3。2 4*4矩阵扫描按键 (13) 第四章 PROTEUS模拟仿真 (14) 第五章系统硬件设计及说明 (16) 第六章软件设计 (17) 6.1 汇编语言和C语言的特点及选择 (17) 6。2 源程序代码 (17)

摘要 近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,但仅单片机方面的知识是不够的,还应根据具体硬件结构、软硬件结合,来加以完善。 计算机在人们的日常生活中是比较常见的电子产品之一.可是它还在发展之中,以后必将出现功能更加强大的计算机,基于这样的理念,本次设计主要以80C51单片机为控制芯片,用C语言进行编程实现,通过4*4矩阵键盘控制,输出用液晶屏LCD1602显示,该计算器可以实现一般的加减乘除四则混合运算。 关键字:80C51 LCD1602 4*4矩阵键盘计算器

编写一个计算器程序课程设计报告-范例

《金融IT入门-程序设计》 课程设计报告 中国地质大学长城学院XX系2017年月 3 日目录 一.总体概述:二.设计目标:三.程序流程图:四.程序代码:五.* 六.设计体会: 题目:用Python编写简易计算器程序学号:$ 专业: 班级: 姓名: 指导教师:、

一、设计内容--------------------------------------------- - 2 - 1. 课程设计目的:------------------------------------- - 2 - 2.课程设计任务:-------------------------------------- - 2 - 3.创新要求:------------------------------------------ - 2 - 4.设计要求: ------------------------------------------- - 2 - 二、原理与分析------------------------------------------- - 2 - 1.开发的技术及功能------------------------------------ - 3 - 2.设计思路-------------------------------------------- - 3 - 3.设计效果图------------------------------------------ - 3 - 三、设计过程--------------------------------------------- - 3 - 1. 程序思路:----------------------------------------- - 3 - 2.功能实现:------------------------------------------ - 4 - 1)加减乘除求余以及指数运算------------------------ - 4 - 2)其他运算---------------------------------------- - 4 - 3)主要方法说明------------------------------------ - 6 - 4)程序流程图-------------------------------------- - 6 - 3.算法思路:------------------------------------------ - 7 - 4.数据分析:------------------------------------------ - 8 - 四、设计结果与分析---------------------------------------- - 8 - ⒈运行调试-------------------------------------------- - 8 - 1)进行加减乘除求余以及指数运算-------------------- - 8 - 2)求倒-------------------------------------------- - 9 -

相关文档
最新文档