基于51单片机的数码管简易计算器

  • 格式:doc
  • 大小:232.50 KB
  • 文档页数:9

下载文档原格式

  / 24
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于51/52单片机的简易计算器制作

11级自动化2班

王栎斐宋为为闫巨东

一、题目利用单片机芯片STC89C52、四位八段共阳数码管及已制作好的电路板等器件设计制作一个计算器。

二、任务与要求要求计算器能实现加减乘除四种运算具体如下

1. 加法:四位整数加法计算结果若超过八位则显示计算错误

2. 减法:四位整数减法计算结果若超过八位则显示计算错误

3. 乘法:多位整数乘法计算结果若超过四位则显示计算错误

4. 除法:整数除法

5. 有清除功能

三、课程设计简述

总体设计思路简述

1.按照系统设计的功能的要求初步确定设计系统由主控模块、显示模块、键扫描接口电路共三个模块组成。主控芯片使用STC89C52单片机。

2.键盘电路采用4*4矩阵键盘电路。

3.显示模块采用共阳极数码管构成。

四、硬件电路

五、软件编程部份

#include

#define uchar unsigned char

#define uint unsigned int

//uchar code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};

//共阴极

// 0 1 2 3 4 5 6 7 8 9 熄灭-

//uchar code loc[]={0xff,0xfe,0xfd,0xfb,0xf7};

//uchar code ero[]={0x79,0x50,0x5c};

uchar code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x40};

//共阳极

uchar code loc[]={0x00,0x80,0x40,0x20,0x10};

uchar code ero[]={~0x79,~0x50,~0x5c};

uint n=0,n1=0,n2=0; //赋初值

uchar flag=0; //计算类型选择关键字

void delay(int t);

void display(int n);

void error();

main()

{

while(1)

{

uchar temp;

//第一行检测

P3=0xfe;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

temp=P3;

temp=temp&0xfe;

if(temp!=0xfe)

{

temp=P3;

switch(temp)

{

case 0xee:n1=0;n2=0;n=0;flag=0;break; //清零

case 0xde:n1=10*n1+0;n=n1;break;

case 0xbe: if(flag==1)n=n2+n1; //=

if(flag==2)n=n2-n1;

if(flag==3)n=n2*n1;

if(flag==4)n=n2/n1;

n1=0;

break;

case 0x7e: // +

n2=n1;n1=0;

flag=1;break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

//扫描第二行

P3=0xfd;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xed:n1=10*n1+1;n=n1;break; //4

case 0xdd:n1=10*n1+2;n=n1;break; //5

case 0xbd:n1=10*n1+3;n=n1;break; //6

case 0x7d:// -

n2=n1;n1=0;

flag=2;break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

//扫描第三行

P3=0xfb;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xeb:n1=10*n1+4;n=n1;break;

case 0xdb:n1=10*n1+5;n=n1;break;

case 0xbb:n1=10*n1+6;n=n1;break;

case 0x7b: // *

n2=n1;n1=0;

flag=3;break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

//扫描第四行

P3=0xf7;

temp=P3;

temp=temp&0xf0;