计算器设计实验报告

  • 格式:doc
  • 大小:569.50 KB
  • 文档页数:12

1

计算器设计实验报告

指导老师:张永安

组长:潘文帅

成员:宋王庆 郭肖男 常跃 2 计算器设计实验报告

一、 实验目的

1、 通过实验了解计算器的程序代码。

2、 能看懂计算器的电路原理图。

3、 锻炼学生的动手实践能力。

二、 实验内容

设计一个简易的计算器,完成0~9999整数的一次加减乘除运算,减法运算结果可以实现计算结果的负数显示,除法运算结果为0~999并保留两位小数。

三、 实验设备

序号 名字 型号 数量 备注

1 单片机 AT89S51 1 双列直插

2 40腿双列直插底座 1 供单片机用

3 电容 104 2

4 晶振 12M 1

5 电容 30P 2

6 电解电容 10UF 1

7 电阻 10K 1

8 电阻 1K 1

9 发光二极管 3mm红 1

10 8位排阻 1K(102) 1

11 按键 12*12*6 1

12 电池盒 五号三连 1

13 电阻 4.7K 9

14 数码管 0.5寸四联共阴 2

15 按键 6*6*6 16

16 三极管 9012 9

17 蜂鸣器 5V直流 1 3 四、 实验说明

1. 计算器电板图

2. 计算器引脚原理图

4 3. 程序代码

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

程序名称: 计算器设计

功能: 完成0~9999整数的一次加减乘除运算,

减法运算结果可以实现计算结果的负数显示,

除法运算结果为0~999并保留两位小数,

按键音,

设有清零键,

首位零不显示,

其它的显示"E"

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

#include

unsigned char code XIANSHI[]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f,

0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};

unsigned char code XIANSHIXIAOSHUDIAN[]={0xbf,0x86,0xdb,0xcf,0xe6,

0xed,0xfd,0x87,0xff,0xef,

0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};//带小数点//

unsigned char code XIANSHIWRONG[]={0x00,0x00,0x00,0x00,0x79};//错误时的显示//

unsigned char code SAOMIAO[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//共阴极扫描码表格//

unsigned char DANYUAN[8]={0,0,0,0,0,0,0,0};

unsigned long CUNZHI;

unsigned long SHU[2]={0,0};

unsigned char k,key,m,n;

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

SIGN 存运算符(+、-、*、/)

FLAG 用第几个数组,(出现非运算符前为0,出现运算符后为1)

WRONG 输入多于4个时错误标志位 (0对、1错)

COUNT 输入0~9数字的个数

SIZE 减数大于被减数时为1

SIGNCOUNT 输入运算符的个数

XIAOSHU 存一位小数的值

DIVKEY 运算除法时置为1

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

unsigned char SIGN,FLAG,WRONG,COUNT,SIZE,SIGNCOUNT,XIAOSHU[2],DIVKEY;

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

程序名称:显示程序

入口参数:无 5 功能:实现将CUNZHI中的值进行动态数码显示

局部变量:i,j,q

全局变量:CUNZHI,DANYUAN[0],DANYUAN[1],DANYUAN[2],DANYUAN[3]

所用端口功能:P1口送显示码

P2口公共端扫描

返回值:无

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

void disp(void)

{ unsigned char i,j,p,q;

/**************错误时的显示*************/

if(WRONG==1)

{ for(i=0;i<5;i++)

{ P1=XIANSHIWRONG[i];

P2=SAOMIAO[i];

for(j=6;j>0;j--) //动态显示延时程序//

for(q=248;q>0;q--);

}

}

else

{ if(DIVKEY==1)

{ DANYUAN[0]=XIAOSHU[1];

DANYUAN[1]=XIAOSHU[0];

DANYUAN[2]=CUNZHI%10;

DANYUAN[3]=CUNZHI/10%10;

DANYUAN[4]=CUNZHI/100%10;

DANYUAN[5]=CUNZHI/1000%10;

for(p=5;p>2;p--)

{ if(DANYUAN[p]==0)

DANYUAN[p]=16;

else break;

}

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

{ if(i==2) //倒数第三位为小数位//

{ P1=XIANSHIXIAOSHUDIAN[DANYUAN[i]];

}

else

{

P1=XIANSHI[DANYUAN[i]];

}

P2=SAOMIAO[i];

for(j=6;j>0;j--) //动态显示延时程序//

for(q=248;q>0;q--);

} 6 }

else

{

DANYUAN[0]=CUNZHI%10;

DANYUAN[1]=CUNZHI/10%10;

DANYUAN[2]=CUNZHI/100%10;

DANYUAN[3]=CUNZHI/1000%10;

/*******************首位为零不显示*************/

for(p=3;p>0;p--) //首位为零不显示//

{ if(DANYUAN[p]==0)

DANYUAN[p]=16;

else break;

}

/**************为负数时的显示*****************/

if(SIZE==1) //为负数第五位数码管显示"-"//

{ DANYUAN[4]=17;

}

else //第五位数码管不显示//

{ DANYUAN[4]=16;

}

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

{ P1=XIANSHI[DANYUAN[i]];

P2=SAOMIAO[i];

for(j=6;j>0;j--) //动态显示延时程序//

for(q=248;q>0;q--);

}

}

}

}

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

程序名称:处理程序

入口参数:key

功能:实现加减乘除运算

全局变量:key、CUNZHI、SHU[0]、SHU[1]、FLAG、SIGN

返回值:无

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

void CHULI(key)

{

unsigned char i,j;

/*****************声音“嘀”*****************/

TR0=1;

for(i=200;i>0;i--) //延时100ms// 7 for(j=248;j>0;j--);

TR0=0;

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

if(key==15) //按键为清除键//

{ CUNZHI=0;

SHU[0]=0;

SHU[1]=0;

COUNT=0;

WRONG=0;

SIZE=0;

SIGNCOUNT=0;

XIAOSHU[0]=0;

XIAOSHU[1]=0;

DIVKEY=0;

}

else if((key>=0)&&(key<=9)) //按键为数字键//

{ COUNT++; //按下的数字键的次数//

/*****************加权运算*****************/

SHU[FLAG]=SHU[FLAG]*10+key; //加权运算//

CUNZHI=SHU[FLAG];

}

else if((key>=10)&&(key<=13)) //按键为运算键//