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

上传人:b****2 文档编号:2964570 上传时间:2023-05-05 格式:DOCX 页数:14 大小:81.43KB
下载 相关 举报
基于ATC单片机简易计算器的设计.docx_第1页
第1页 / 共14页
基于ATC单片机简易计算器的设计.docx_第2页
第2页 / 共14页
基于ATC单片机简易计算器的设计.docx_第3页
第3页 / 共14页
基于ATC单片机简易计算器的设计.docx_第4页
第4页 / 共14页
基于ATC单片机简易计算器的设计.docx_第5页
第5页 / 共14页
基于ATC单片机简易计算器的设计.docx_第6页
第6页 / 共14页
基于ATC单片机简易计算器的设计.docx_第7页
第7页 / 共14页
基于ATC单片机简易计算器的设计.docx_第8页
第8页 / 共14页
基于ATC单片机简易计算器的设计.docx_第9页
第9页 / 共14页
基于ATC单片机简易计算器的设计.docx_第10页
第10页 / 共14页
基于ATC单片机简易计算器的设计.docx_第11页
第11页 / 共14页
基于ATC单片机简易计算器的设计.docx_第12页
第12页 / 共14页
基于ATC单片机简易计算器的设计.docx_第13页
第13页 / 共14页
基于ATC单片机简易计算器的设计.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

《基于ATC单片机简易计算器的设计.docx》由会员分享,可在线阅读,更多相关《基于ATC单片机简易计算器的设计.docx(14页珍藏版)》请在冰点文库上搜索。

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

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

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

一、设计目的2

二、总体设计及功能介绍2

三、硬件设计3

四、软件设计4

五、设计总结17

参考文献:

19

一、设计目的

单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。

本设计是基于51系列单片机来进行的简单数字计算器设计,可以完成计算器的键盘输入,进行加、减、乘、除六位无符号数范围内的基本加减运算,并在LED上显示相应的结果。

软件方面使用C语言编程,并用PROTUES仿真,通过硬件实现功能。

二、总体设计及功能介绍

根据功能和指标要求,本系统选用MCS-51系列单片机为主控机,实现对计算器的设计。

具体设计及功能如下:

(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LED显示数据和结果。

(2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16个按键即可,设计中采用集成的计算键盘。

(3)执行过程:

开机显示零,等待键入数值,当键入数字,通过LED显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LED上输出运算结果。

三、硬件设计

本设计选用AT89C51单片机为主控单元。

显示部分:

采用LED动态显示。

按键部分:

采用4*4集成计算键盘;

总电路图:

实物图:

四、软件设计

现实生活中人们熟知的计算器,其功能主要如下:

1、键盘输入;

2、数值显示;

3、加、减、乘、除四则运算;

针对上述功能,计算器软件程序要完成以下程序的设计:

1、键盘输入检测程序

2、LED显示程序

3、算术运算程序

1、程序流程图

2、程序清单

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

*实验名称:

六位无符号数加减法简易计算器

*连接方式:

P0口---段选

*138译码器的A、B、C---P2.2、P2.3、P2.4

*P1口---矩阵键盘

*键盘:

789+

*456-

*123

*CLR0=

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

#include

//宏定义类型

#defineucharunsignedchar

#defineuintunsignedint

//--定义使用的IO口--//

#defineDUANP0

#defineKEYP1

sbitWEIA=P2^2;

sbitWEIB=P2^3;

sbitWEIC=P2^4;

//段码表

ucharcodeDUANMA[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0--9

//显示的八位数据

ucharxianshi[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

//第一个数据,第二个数据,得到的数据,符号

longnum[4]={0,0,0,0};

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

*函数名称:

Delay

*作用:

毫秒延时

*参数:

延时毫秒

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

voidDelay(uintx)

{

uinti,j;

for(i=x;i>0;i--)

for(j=110;j>0;j--);

}

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

*函数名称:

Kbscan

*作用:

矩阵键盘扫描

*返回值:

按键行列数对应的十六进制数据

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

ucharKbscan(void)

{

ucharsccode,recode;

KEY=0xf0;

Delay

(1);

if(KEY!

=0xf0)

{

Delay

(2);

if(KEY!

=0xf0)

{

sccode=KEY&0xf0;

KEY=0x0f;

Delay

(1);

recode=(KEY&0x0f)|sccode;

KEY=0x0f;

Delay

(1);

while(KEY!

=0x0f);

returnrecode;

}

}

return0;

}

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

*函数名称:

Keyval

*作用:

键值解码

*返回值:

按键对应功能值

*10表示+,11表示-,12表示*,13表示/,14表示CLR,15表示=

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

ucharKeyval(void)

{

ucharkey;

ucharkeyval=16;//无按键

key=Kbscan();

switch(key)

{

case0xee:

keyval=7;break;

case0xde:

keyval=8;break;

case0xbe:

keyval=9;break;

case0x7e:

keyval=10;break;//+

case0xed:

keyval=4;break;

case0xdd:

keyval=5;break;

case0xbd:

keyval=6;break;

case0x7d:

keyval=11;break;//-

case0xeb:

keyval=1;break;

case0xdb:

keyval=2;break;

case0xbb:

keyval=3;break;

case0x7b:

keyval=12;break;//*

case0xe7:

keyval=14;break;//CLR

case0xd7:

keyval=0;break;

case0xb7:

keyval=15;break;//=

case0x77:

keyval=13;break;///

default:

break;

}

returnkeyval;

}

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

*函数名称:

Ewu

*作用:

计算功能实现

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

voidEwu(void)

{

uchargetkey,i;

getkey=Keyval();

if(getkey<10)//按下的是数字

{

if(num[3]==0)//没有符号,表示输入第一个数

{

if(num[0]<100000)//五位数时还可以再输入一位

num[0]=num[0]*10+getkey;

}

if(num[3]!

=0)//有符号,输入第二个数

{

if(num[1]<100000)//五位数时还可以再输入一位

num[1]=num[1]*10+getkey;

}

}

if(getkey>9&&getkey<16)//特殊按键按下

{

if(getkey==10)//+

{

num[3]=1;

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

{

xianshi[i]=0x00;

}

}

if(getkey==11)//-

{

num[3]=2;

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

{

xianshi[i]=0x00;

}

}

if(getkey==12)//*

{

num[3]=3;

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

{

xianshi[i]=0x00;

}

}

if(getkey==13)///

{

num[3]=4;

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

{

xianshi[i]=0x00;

}

}

if(getkey==14)//CLR

{

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

{

num[i]=0;//清除数据

}

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

{

xianshi[i]=0x00;

}

}

if(getkey==15)//=

{

switch(num[3])

{

case1:

num[2]=num[0]+num[1];break;

case2:

num[2]=num[0]-num[1];break;

case3:

num[2]=num[0]*num[1];break;//

case4:

num[2]=num[0]/num[1];break;//

default:

break;

}

num[0]=num[2];

num[1]=0;

num[2]=0;

num[3]=0;

}

}

}

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

*函数名称:

Display

*作用:

数码管显示

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

voidDisplay(void)

{

uchari;

longDIS;

if(num[3]==0)//显示第一个数或者最终结果

DIS=num[0];

if(num[3]!

=0)//显示第二个数

DIS=num[1];

if(DIS==0)

xianshi[7]=DUANMA[0];

if(DIS>0)

{

for(i=8;i>0;i--)

{

if(DIS>0)

{

xianshi[i-1]=DUANMA[(uchar)(DIS%10)];

DIS=DIS/10;

}

}

xianshi[0]=0x00;

}

if(DIS<0)

{

DIS=DIS*(-1);

Delay

(1);

for(i=8;i>0;i--)

{

if(DIS>0)

{

xianshi[i-1]=DUANMA[(uchar)(DIS%10)];

DIS=DIS/10;

}

}

xianshi[0]=0x40;//显示负号

}

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

{

switch(i)

{

case0:

WEIA=0;WEIB=0;WEIC=0;break;

case1:

WEIA=1;WEIB=0;WEIC=0;break;

case2:

WEIA=0;WEIB=1;WEIC=0;break;

case3:

WEIA=1;WEIB=1;WEIC=0;break;

case4:

WEIA=0;WEIB=0;WEIC=1;break;

case5:

WEIA=1;WEIB=0;WEIC=1;break;

case6:

WEIA=0;WEIB=1;WEIC=1;break;

case7:

WEIA=1;WEIB=1;WEIC=1;break;

}

//发送段码

DUAN=xianshi[i];

Delay

(1);

DUAN=0x00;//消隐

}

}

voidmain(void)

{

while

(1)

{

Ewu();

Display();

}

}

五、设计总结

通过课程设计,我掌握了计算器的工作原理以及设计方法,我通过对计算器的几个模块的深入理解,我掌握了计算器的组成和制作过程,并通过自己的努力,制作出了自己的计算器,提高了我的动手能力和实践能力,同时我对单片机有了更深入的理解,也学会了使用单片机的方法,加深了对课本知识的进一步理解。

加强了我思考和解决问题的能力,认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准!

在设计过程中,经常会遇到一些问题,就是心里想老着这样的接法可以行得通,但实际接上电路,总是实现不了。

所以这几天不管是吃饭还是睡觉,脑子里总是想着如何解决这些问题,功夫不负有心人,我通过认真思考,请教同学,查找资料,最后终于熟练掌握了基本理论知识,而且领悟诸多平时学习难以理解掌握的较难知识,学会了如何思考的思维方式,找到了设计的灵感。

在寻找答案的过程中,我学到了很多平时缺少的东西,对于理论知识学习不够扎实的我深感“书到用时方恨少”!

认真思考才能找到出路,当初没有思路,诚如举步维艰,茫茫大地,不见道路。

在对理论知识梳理掌握之后,茅塞顿开,柳暗花明,思路如泉涌,高歌“条条大路通罗马”。

顿悟,没有思考便无出路,雨后才能见彩虹。

失败是成功之母。

不经历多次调试,是不可能得到完好的程序的。

至善至美,是人类永恒的追求。

但是,不从忘却“金无足赤,人无完人”,我们换种思维方式,去恶亦是至善,改错亦为至美。

在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。

最终的调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。

实践课诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门思辨课,给了我许多道,给了我很多思,给了我莫大的空间。

至于建议,一言以蔽之,大学教育当如此。

我是一个急性子的人,看到那么复杂知识,我就不想做了,不过为了搞好课程设计,我硬是耐心完成每一个细节,我坚持一天呆在实验室10多个小时,虽然晚上眼睛比较酸痛,但是我感觉值。

这么多天的努力没有白费,我最后很好的完成了任务,很有成就感!

我相信我在以后的生活和学习中会更耐心,更认真的!

参考文献:

[1]陈冬云等.ATmega128单片机原理与开发指导.机械工业出版社,2006

[2]李群芳等.单片微型计算机及接口技术(第二版).电子工业出版社,2005

[3]周航慈.单片机程序设计基础.北航出版社,2005

[4]何立民.MCS-51单片机应用系统设计.北航出版社,2002

[5]马潮.高档8位单片机ATmega128原理与开发应用指南.北京航空航天大学出版社,2004

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2