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

上传人:b**** 文档编号:81967762 上传时间:2022-04-28 格式:DOC 页数:32 大小:355KB
收藏 版权申诉 举报 下载
基于AT89C51单片机简易计算器的设计说明_第1页
第1页 / 共32页
基于AT89C51单片机简易计算器的设计说明_第2页
第2页 / 共32页
基于AT89C51单片机简易计算器的设计说明_第3页
第3页 / 共32页
资源描述:

《基于AT89C51单片机简易计算器的设计说明》由会员分享,可在线阅读,更多相关《基于AT89C51单片机简易计算器的设计说明(32页珍藏版)》请在装配图网上搜索。

1、WORD微机原理与单片机课程设计课程设计报告基于51单片机的简易计算器设计学生卓国焕()专业电子信息工程所在班级1141学号 6指导老师欧触灵日期2016.10.312016.11.4一、设计目的 单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。本设计是基于51系列单片机来进行的简单数字计算器设计,可以完成计算器的键盘输入,进行加、减、乘、除六位整数数围的基本四则运算,并在LED上显示相应的结果。软件方面使用C语言编程,并用PROTUES仿真。二、总体设计与功能介绍根据功能和指标要求,本系统选用MC

2、S-51系列单片机为主控机,实现对计算器的设计。具体设计与功能如下:(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LED 显示数据和结果。(2)另外键盘包括数字键(09)、符号键(+、-、)、清除键和等号键,故只需要16 个按键即可,设计中采用集成的计算键盘。(3)执行过程:开机显示零,等待键入数值,当键入数字,通过LED显示出来,当键入+、-、*、/运算符,计算器在部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LED上输出运算结果。(4)错误提示:当计算器执行过程中有错误时,会在LED上显示相应的提示,如:当输入的数值

3、或计算得到的结果大于计算器的表示围时,计算器会在LED上显示“CUO”,提示溢出。三、系统模块组成框图:输入模块51单片机运算模块LED显示模块二、硬件设计(一)、总体硬件设计本设计选用AT89C51单片机为主控单元。显示部分:采用LED动态显示。按键部分:采用4*4集成计算键盘;总电路图:(1) 44集成计算键盘 集成计算键盘本质上是44矩阵键盘,矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为44个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。矩阵键盘的工作原理:计算器的键盘布局如图2所示

4、:一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。矩阵键盘部电路图如图所示:(三)、LED显示模块如图本设计采用LED共阴数码管来显示输出数据。共阴数码管的每一位都是公共的阴极,只有输入低电平的时候才有可能被点亮,所以位选的时候被选中的位必须是低电平。本设计采用两个74HC573锁存器来驱动数码管,引脚如上图所示。74HC573-1是控制段选的,74HC573-2是控制位选的,P2.6和P2.7端口是锁存使能位,置高电平时锁存器透明(即输入和输出一样),置低电平时锁存。74HC573的八个锁存器都是透明的D 型锁存器,当使能(G)为高时,Q

5、输出将随数据(D)输入而变。当使能为低时,输出将锁存在已建立的数据电平上。输出控制不影响锁存器的部工作,即老数据可以保持,甚至当输出被关闭时,新的数据也可以置入。这种电路可以驱动大电容或低阻抗负载,可以直接与系统总线接口并驱动总线,而不需要外接口。特别适用于缓冲寄存器,I/O 通道,双向总线驱动器和工作寄存器。HC573引脚功能: 引脚号 符号 名称与功能1 OE 3态输出使能输入(低电平)2-9 D0 - D7 数据输入12-19Q0 - Q7 3态锁存输出11 LE 锁存使能输入10 GND 接地(0V)20 VCC 电源电压(四)运算模块(51单片机控制)51 单片机是在一块芯片中集成了

6、CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统与特殊功能寄存器(SFR)。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以与高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以很快地实现运算功能。单片机最小系统复位时单片机的初始化操作,只要给RST引脚加上两个机器周期以上的高电平信号,就可以使

7、STC89C51单片机复位。本次采用的是12M晶振,按钮复位电路。三、软件设计现实生活中人们熟知的计算器,其功能主要如下:1、 键盘输入;2、 数值显示;3、 加、减、乘、除四则运算;针对上述功能,计算器软件程序要完成以下程序的设计:1、 键盘输入检测程序2、 LED显示程序3、 算术运算程序1、程序流程图系统总流程图开始初始化参数初始化LED显示有键输入?读取键码LED显示数字键清零键功能键状态清零输入数值数值送显示缓冲YN等待数值输入结果送显示缓冲根据上次功能键和输入的数据计算结果本次功能键?等待数值输入结果送显示缓冲等待数值输入结果送显示缓冲算术运算程序流程图开始运算符是?加乘减除运算结

8、果溢出?错误信息送显示缓冲数值送显示缓冲YYN2、程序清单#include#include#define uchar unsigned char#define uint unsigned int#define ulong unsigned longsbit wela=P27; /定义端口sbit dula=P26;long in1,in2,out,x;intt,i,flag;uchar code num=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; /LED显示字模,共阴void

9、 delay(uint xms) /延时函数uint j;for(i=xms;i0;i-)for(j=114;j0;j-);void display() /显示函数声明uchar w1,w2,w3,w4,w5,w6,f=0;long y;if(x=0) /显示六位计时数if(x=1e6)P0=0xff;wela=1;P0=0xf7;wela=0;dula=1;P0=num12;dula=0;delay(2);P0=0xff;wela=1;P0=0xef;wela=0;dula=1;P0=0x3e;dula=0;delay(2);P0=0xff;wela=1;P0=0xdf;wela=0;dul

10、a=1;P0=num0;dula=0;delay(2);return;w1=x%10;w2=x/10%10;w3=x/100%10;w4=x/1000%10;w5=x/10000%10;w6=x/100000%10;if(f=1|w6)f=1;P0=0xff;wela=1;P0=0xfe;wela=0;dula=1;P0=numw6;dula=0;delay(2);if(f=1|w5)f=1;P0=0xff;wela=1;P0=0xfd;wela=0;dula=1;P0=numw5;dula=0;delay(2);if(f=1|w4)f=1;P0=0xff;wela=1;P0=0xfb;wel

11、a=0;dula=1;P0=numw4;dula=0;delay(2);if(f=1|w3)f=1;P0=0xff;wela=1;P0=0xf7;wela=0;dula=1;P0=numw3;dula=0;delay(2);if(f=1|w2)f=1;P0=0xff;wela=1;P0=0xef;wela=0;dula=1;P0=numw2;dula=0;delay(2);P0=0xff;wela=1;P0=0xdf;wela=0;dula=1;P0=numw1;dula=0;delay(2);elsey=labs(x);if(y=1e5)P0=0xff;wela=1;P0=0xf7;wela

12、=0;dula=1;P0=num12;dula=0;delay(2);P0=0xff;wela=1;P0=0xef;wela=0;dula=1;P0=0x3e;dula=0;delay(2);P0=0xff;wela=1;P0=0xdf;wela=0;dula=1;P0=num0;dula=0;delay(2);return;w1=y%10;w2=y/10%10;w3=y/100%10;w4=y/1000%10;w5=y/10000%10;if(f=1|w5)if(f=0)P0=0xff;wela=1;P0=0xfe;wela=0;dula=1;P0=0x40;dula=0;delay(2);

13、f=1;P0=0xff;wela=1;P0=0xfd;wela=0;dula=1;P0=numw5;dula=0;delay(2);if(f=1|w4)if(f=0)P0=0xff;wela=1;P0=0xfd;wela=0;dula=1;P0=0x40;dula=0;delay(2);f=1;P0=0xff;wela=1;P0=0xfb;wela=0;dula=1;P0=numw4;dula=0;delay(2);if(f=1|w3)if(f=0)P0=0xff;wela=1;P0=0xfb;wela=0;dula=1;P0=0x40;dula=0;delay(2);f=1;P0=0xff;

14、wela=1;P0=0xf7;wela=0;dula=1;P0=numw3;dula=0;delay(2);if(f=1|w2)if(f=0)P0=0xff;wela=1;P0=0xf7;wela=0;dula=1;P0=0x40;dula=0;delay(2);f=1;P0=0xff;wela=1;P0=0xef;wela=0;dula=1;P0=numw2;dula=0;delay(2);if(f=0)P0=0xff;wela=1;P0=0xef;wela=0;dula=1;P0=0x40;dula=0;delay(2);P0=0xff;wela=1;P0=0xdf;wela=0;dula

15、=1;P0=numw1;dula=0;delay(2);void keyscan() /键盘扫描函数uchar temp;P1=0xfe;temp=P1;temp=temp&0xf0;if(temp!=0xf0)delay(8);temp=P1;temp=temp&0xf0;if(temp!=0xf0)temp=P1;switch(temp)case 0xee:if(cnt6)cnt+;if(flag=0)in1=in1*10+7;x=in1;elsein2=in2*10+7;x=in2;break;case 0xde:if(cnt6)cnt+;if(flag=0)in1=in1*10+8;x

16、=in1;elsein2=in2*10+8;x=in2;break;case 0xbe:if(cnt6)cnt+;if(flag=0)in1=in1*10+9;x=in1;elsein2=in2*10+9;x=in2;break;case 0x7e:if(cnt!=0&flag=0)cnt=0;flag=4;break;while(temp!=0xf0)temp=P1;temp=temp&0xf0; P1=0xfd;temp=P1;temp=temp&0xf0;if(temp!=0xf0)delay(8);temp=P1;temp=temp&0xf0;if(temp!=0xf0)temp=P1

17、;switch(temp)case 0xed:if(cnt6)cnt+;if(flag=0)in1=in1*10+4;x=in1;elsein2=in2*10+4;x=in2;break;case 0xdd:if(cnt6)cnt+;if(flag=0)in1=in1*10+5;x=in1;elsein2=in2*10+5;x=in2;break;case 0xbd:if(cnt6)cnt+;if(flag=0)in1=in1*10+6;x=in1;elsein2=in2*10+6;x=in2;break;case 0x7d:if(cnt!=0&flag=0)cnt=0;flag=3;brea

18、k;while(temp!=0xf0)temp=P1;temp=temp&0xf0; P1=0xfb;temp=P1;temp=temp&0xf0;if(temp!=0xf0)delay(8);/消除抖动temp=P1;temp=temp&0xf0;if(temp!=0xf0)temp=P1;switch(temp)case 0xeb:if(cnt6)cnt+;if(flag=0)in1=in1*10+1;x=in1;elsein2=in2*10+1;x=in2;break;case 0xdb:if(cnt6)cnt+;if(flag=0)in1=in1*10+2;x=in1;elsein2=

19、in2*10+2;x=in2;break;case 0xbb:if(cnt6)cnt+;if(flag=0)in1=in1*10+3;x=in1;elsein2=in2*10+3;x=in2;break;case 0x7b:if(cnt!=0&flag=0)cnt=0;flag=2;break;while(temp!=0xf0) temp=P1;temp=temp&0xf0; P1=0xf7;temp=P1;temp=temp&0xf0;if(temp!=0xf0)delay(8);temp=P1;temp=temp&0xf0;if(temp!=0xf0) /证明有键按下,if语句是为了让键盘

20、松开temp=P1;switch(temp)case 0xe7:cnt=0;in1=0;in2=0;out=0;flag=0;x=0;break;case 0xd7:if(cnt6)cnt+;if(flag=0)in1=in1*10+0;x=in1;elsein2=in2*10+0;x=in2;break;case 0xb7: /如果得到符号位switch(flag)case 1:out=in1+in2;/加break;case 2:out=in1-in2;/减break;case 3:out=in1*in2;/乘break;case 4:if(in2)out=in1/in2;/除break;

21、x=out;in1=0;in2=0;cnt=0;flag=0;break;case 0x77:if(cnt!=0&flag=0)cnt=0;flag=1;break;while(temp!=0xf0) /等待按键松开temp=P1;temp=temp&0xf0; void main() /主函数while(1)keyscan();display();四、设计总结1、软件调试在软件调试的过程中,一开始没有做数值溢出方面的控制,导致LED显示的输入数据或计算结果与实际不相符。通过多次调试,软件能够正常运行,基本实现与其功能,通过矩阵键盘输入第一个数据后,按下所需运算符号后,再次通过矩阵键盘输入第二

22、个数据,最后按下等号,能够正确显示计算结果。如需继续计算,继续按照上述步骤输入数据即可。2、硬件调试(略)3、总结课程设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程。随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在。因此作为计算机专业的学生来说掌握单片机的开发技术是十分重要的。 设计基于单片机设计简易计算器,对于我这个实践中的新手来说,这是一次考验。这次课程设计我学到很多很多的东西,学会了怎么在遇到问题时去解决问题。不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,掌握了一种系统的研究方法,可以进行一些简单的编程。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从而提高自己的实际动手能力和独立思考的能力。同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,还要断学习单片机的相关知识。附录1、加法 15+4结果2、减法 17-73、乘法15*44、除法 100/105、显错 33333*44432 / 32

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!