基于AT89C51单片机简易计算器的设计.doc
《基于AT89C51单片机简易计算器的设计.doc》由会员分享,可在线阅读,更多相关《基于AT89C51单片机简易计算器的设计.doc(30页珍藏版)》请在咨信网上搜索。
《微机原理与单片机课程设计》课程设计报告 基于51单片机的简易计算器设计 学生姓名 卓国焕(13432891614) 专业 电子信息工程 所在班级 1141 学号 201411611136 指导老师 欧触灵 日期 2016.10.31——2016.11.4 一、设计目的 单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。本设计是基于51系列单片机来进行的简单数字计算器设计,可以完成计算器的键盘输入,进行加、减、乘、除六位整数数范围内的基本四则运算,并在LED上显示相应的结果。软件方面使用C语言编程,并用PROTUES仿真。 二、总体设计及功能介绍 根据功能和指标要求,本系统选用MCS-51系列单片机为主控机,实现对计算器的设计。具体设计及功能如下: (1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LED 显示数据和结果。 (2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可,设计中采用集成的计算键盘。 (3)执行过程:开机显示零,等待键入数值,当键入数字,通过LED显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LED上输出运算结果。 (4)错误提示:当计算器执行过程中有错误时,会在LED上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LED上显示“CUO”,提示溢出。 三、系统模块组成框图: 输入模块 51单片机 运算模块 LED显示模块 二、硬件设计 (一)、总体硬件设计 本设计选用AT89C51单片机为主控单元。显示部分:采用LED动态显示。按键部分:采用4*4集成计算键盘; 总电路图: (1) 4×4集成计算键盘 集成计算键盘本质上是4×4矩阵键盘,矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。 矩阵键盘的工作原理: 计算器的键盘布局如图2所示:一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。 矩阵键盘内部电路图如图所示: (三)、LED显示模块 如图 本设计采用LED共阴数码管来显示输出数据。共阴数码管的每一位都是公共的阴极,只有输入低电平的时候才有可能被点亮,所以位选的时候被选中的位必须是低电平。 本设计采用两个74HC573锁存器来驱动数码管,引脚如上图所示。74HC573-1是控制段选的,74HC573-2是控制位选的,P2.6和P2.7端口是锁存使能位,置高电平时锁存器透明(即输入和输出相同),置低电平时锁存。 74HC573的八个锁存器都是透明的D 型锁存器,当使能(G)为高时,Q 输出将随数据(D)输入而变。当使能为低时,输出将锁存在已建立的数据电平上。输出控制不影响锁存器的内部工作,即老数据可以保持,甚至当输出被关闭时,新的数据也可以置入。这种电路可以驱动大电容或低阻抗负载,可以直接与系统总线接口并驱动总线,而不需要外接口。特别适用于缓冲寄存器,I/O 通道,双向总线驱动器和工作寄存器。 HC573引脚功能: 引脚号 符号 名称及功能 1 OE 3态输出使能输入(低电平) 2-9 D0 - D7 数据输入 12-19 Q0 - Q7 3态锁存输出 11 LE 锁存使能输入 10 GND 接地(0V) 20 VCC 电源电压 (四)运算模块(51单片机控制) 51 单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。 单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以很快地实现运算功能。 单片机最小系统 复位时单片机的初始化操作,只要给RST引脚加上两个机器周期以上的高电平信号,就可以使STC89C51单片机复位。本次采用的是12M晶振,按钮复位电路。 三、软件设计 现实生活中人们熟知的计算器,其功能主要如下: 1、 键盘输入; 2、 数值显示; 3、 加、减、乘、除四则运算; 针对上述功能,计算器软件程序要完成以下程序的设计: 1、 键盘输入检测程序 2、 LED显示程序 3、 算术运算程序 1、程序流程图 系统总流程图开始 初始化参数 初始化LED显示 有键输入? 读取键码 LED显示 数字键 清零键 功能键 状态清零 输入数值 数值送显示缓冲 Y N 等待数值输入 结果送显示缓冲 根据上次功能键和输入的数据计算结果 本次功能键? 等待数值输入 结果送显示缓冲 等待数值输入 结果送显示缓冲 算术运算程序流程图 开始 运算符是? 加 乘 减 除 运算结果溢出? 错误信息送显示缓冲 数值送显示缓冲 Y Y N 2、程序清单 #include<reg52.h> #include<math.h> #define uchar unsigned char #define uint unsigned int #define ulong unsigned long sbit wela=P2^7; //定义端口 sbit dula=P2^6; long in1,in2,out,x; int cnt,i,flag; uchar code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //LED显示字模,共阴 void delay(uint xms) //延时函数 { uint j; for(i=xms;i>0;i--) for(j=114;j>0;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=num[12]; 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=num[0]; 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=num[w6]; dula=0; delay(2); } if(f==1||w5) { f=1; P0=0xff; wela=1; P0=0xfd; wela=0; dula=1; P0=num[w5]; dula=0; delay(2); } if(f==1||w4) { f=1; P0=0xff; wela=1; P0=0xfb; wela=0; dula=1; P0=num[w4]; dula=0; delay(2); } if(f==1||w3) { f=1; P0=0xff; wela=1; P0=0xf7; wela=0; dula=1; P0=num[w3]; dula=0; delay(2); } if(f==1||w2) { f=1; P0=0xff; wela=1; P0=0xef; wela=0; dula=1; P0=num[w2]; dula=0; delay(2); } P0=0xff; wela=1; P0=0xdf; wela=0; dula=1; P0=num[w1]; dula=0; delay(2); } else { y=labs(x); if(y>=1e5) { P0=0xff; wela=1; P0=0xf7; wela=0; dula=1; P0=num[12]; 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=num[0]; 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); } f=1; P0=0xff; wela=1; P0=0xfd; wela=0; dula=1; P0=num[w5]; 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=num[w4]; 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; wela=1; P0=0xf7; wela=0; dula=1; P0=num[w3]; 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=num[w2]; 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=1; P0=num[w1]; 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(cnt<6) { cnt++; if(flag==0) { in1=in1*10+7; x=in1; } else { in2=in2*10+7; x=in2; } } break; case 0xde: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+8; x=in1; } else { in2=in2*10+8; x=in2; } } break; case 0xbe: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+9; x=in1; } else { in2=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; switch(temp) { case 0xed: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+4; x=in1; } else { in2=in2*10+4; x=in2; } } break; case 0xdd: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+5; x=in1; } else { in2=in2*10+5; x=in2; } } break; case 0xbd: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+6; x=in1; } else { in2=in2*10+6; x=in2; } } break; case 0x7d: if(cnt!=0&&flag==0) { cnt=0; flag=3; } break; } 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(cnt<6) { cnt++; if(flag==0) { in1=in1*10+1; x=in1; } else { in2=in2*10+1; x=in2; } } break; case 0xdb: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+2; x=in1; } else { in2=in2*10+2; x=in2; } } break; case 0xbb: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+3; x=in1; } else { in2=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语句是为了让键盘松开 { temp=P1; switch(temp) { case 0xe7: cnt=0; in1=0; in2=0; out=0; flag=0; x=0; break; case 0xd7: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+0; x=in1; } else { in2=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; } 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显示的输入数据或计算结果与实际不相符。通过多次调试,软件能够正常运行,基本实现与其功能,通过矩阵键盘输入第一个数据后,按下所需运算符号后,再次通过矩阵键盘输入第二个数据,最后按下等号,能够正确显示计算结果。如需继续计算,继续按照上述步骤输入数据即可。 2、硬件调试(略) 3、总结 课程设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程。随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在。因此作为计算机专业的学生来说掌握单片机的开发技术是十分重要的。 设计基于单片机设计简易计算器,对于我这个实践中的新手来说,这是一次考验。这次课程设计我学到很多很多的东西,学会了怎么在遇到问题时去解决问题。不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,掌握了一种系统的研究方法,可以进行一些简单的编程。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从而提高自己的实际动手能力和独立思考的能力。同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,还要断学习单片机的相关知识。 附录 1、加法 15+4 结果 2、减法 17-7 3、乘法15*4 4、除法 100/10 5、显错 33333*444 30- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 AT89C51 单片机 简易 计算器 设计
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【xrp****65】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【xrp****65】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【xrp****65】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【xrp****65】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文