计算器设计实验报告
- 格式: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)) //按键为运算键//