计算器模拟系统设计

上传人:沈*** 文档编号:167837844 上传时间:2022-11-06 格式:DOC 页数:25 大小:247KB
收藏 版权申诉 举报 下载
计算器模拟系统设计_第1页
第1页 / 共25页
计算器模拟系统设计_第2页
第2页 / 共25页
计算器模拟系统设计_第3页
第3页 / 共25页
资源描述:

《计算器模拟系统设计》由会员分享,可在线阅读,更多相关《计算器模拟系统设计(25页珍藏版)》请在装配图网上搜索。

1、计算器模拟系统设计姓 名: 学 号: 专业班级: 指导老师: 所在学院: 2010年7月5日摘要本设计是利用MCS-51系列单片机完成计算器数字输入、显示以及简单计算的模拟系统设计,该模拟系统可以完成对计算器的数字信息的输入并且显示在相应的LED上,可以进行简单的四则运算。这次做的课程设计先是利用proteus软件将电路路画出来,然后利用c语言进行编写程序,再在keil软件下进行程序的修改和调试,生成可以在proteus软件下能执行的程序,然后又在proteus软件下进行很长时间的调试,其中请教了老师和同学,终于完成了这次课程设计的内容。单片机是一种特殊的计算机,它是在一块半导体芯片上集成了C

2、PU、存储器RAM、ROM以及输入与输出接口电路,这种芯片习惯上被称为单片机(Single Chip Microcomputer)。单片机具有:性能价格比最佳、控制功能强、抗干扰能力强和环境适应能力强等众多优点,使单片机得到广泛推广,目前已成为测量控制应用系统中的优选机种和新电子产平的关键部件。在众多的单片机中,MCS-51系列单片机具有系统结构完整、特殊功能寄存器规范化以及指令系统的控制功能强等特色,使其成为单片机中的主流机型。我做的计算器模拟系统是44键盘,分别表示09、/ 、和清零键CL,能够显示8位的数字,开机远行时,数码管最低位显示为“0”,其余位全部不显示,第一次按下时,显示“D1

3、”;第二次按下时,显示“D1D2”;第三次按下时,显示“D1D2D3”,可以进行加减乘除四则运算。在指导老师的指导下,完成了这次课程设计,基本上符合了课程设计的要求。目录1 概述32 系统总体方案及硬件设计3 2.1 系统框图32.2 总体电路设计43 软件设计5 3.1程序流程图5 3.2键盘程序的设计6 3.3四则运算程序94 Proteus软件仿真9 4.1数据的输入9 4.2加法计算10 4.3乘法仿真115课程设计体会11参考文献11附1:源程序代码12附2:计算器模拟系统电路图251 概述采用单片机设计一个计算器模拟系统,完成计算器数字输入、显示以及简单计算的模拟系统设计,该模拟系

4、统可以完成对计算器的数字信息的输入并且显示在相应的LED上,可以进行简单的加法计算。输入完毕要求有声音提示。具体要求:(1)要求模拟的计算器至少显示8位数字,开机运行时,只有数码管最低位显示为“0”,其余位全部不显示;(2)设计44键盘,分别表示09、/ 、和清零键CL,输入的数字从设计的键盘输入;(3)第一次按下时,显示“D1”;第二次按下时,显示“D1D2”;第三次按下时,显示“D1D2D3”,8个全显示完毕,再按下按键下时,给出“嘀”提示音;(4)可以对计算结果小于256的两个无符号数进行加法运算,并显示计算结果。对于、/、和的运算为提高部分;(5)编写程序,用proteus软件进行仿真

5、。报告中给出操作过程及运行效果图。2 系统总体方案及硬件设计2.1 系统框图电路由下列部分组成:时钟电路、复位电路、LED显示,其中电路以8051 单片机为中心。由于用proteus软件可以不需要时钟电路和复位电路,所以没有画出来。时钟电路复位电路键盘单片机数码显示图1 系统基本框图2.2总体电路设计用8051单片机设计的总体电路图如图2。电路图的设计直接影响到程序的编写,所以电路图的设计是这次课程设计的第一步,而且电路图设计的好坏也将影响到程序编写的难易程度。我所采用的是用P3.0P3.7作为键盘是输入口用,用P1.0P1.7和P2.0P2.7作为是单片机的输出口,而根据8051单片机P2口

6、的结构特点,必须接上拉电阻,所以接了一串口的电阻。因为输入口和输出口都已经够用,所以可以不用P0口。图2总体电路图2.3 键盘设计键盘是由若干个按键组成的开关矩阵,是一种廉价的输入设备。这里用的是44的矩阵式键盘,电路原理图如图3所示,44键盘的8根列线分别与P3.0P3.7口相连。每当有键按下时,所按得键值可以通过四位一体的共阴极LED数码管显示出来。当键盘上没有键闭合时,所有的行线与列线断开,4根列线都呈高电平。当键盘上某一个键闭合时,则该键所对应的列线与行线短接,则列线的电平由行线的电位决定。为了便于说明键盘的扫描方式,把根列线编为Y0、Y1、Y2、Y3,4根行线编为X0、X1、X2、X

7、3,若使行线X0为低电平,其余X1,X2都为高电平,读列线状态。如果Y0,Y1,Y2均为高电平,则X0这一行上没有闭合键;如果读出的列线状态不全为高电平,则为低电平的列线与X0相交处的键处于闭合状态。如果X0这一行上没有闭合键,再使X1为低电平,重复上面的操作。通过自己的设计,画出了键盘如图3。图3键盘图3 软件设计3.1程序流程图:程序流程图是我们在设计程序之前去程序的一个总是设计思路,我们在编写程序之前要认真的想好流程图然后再编写程序,在设计程序时也是要根据流程图的思路仔细编写。开始有无键盘闭合 Y调用显示子程序延迟 N二次调用显示子程序延迟有键闭合否 N Y判断闭合键键号入栈闭合键释放否

8、调用显示子程序延时6ms Y键入键号到A返回图4程序流程图3.2键盘程序的设计矩阵键盘的结构与工作原理:矩阵键盘显然比独立键盘要复杂一些,识别也要复杂一些,图3中列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,列线所接的I/O口则作为输入。当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,通过读入输入线的状态就可得知是否有键按下了。用C语言编写的程序如下:void main(void) TMOD=0x01; TH0=(65536-4000) / 256; TL0=(65536-4000) % 256; TR0=1; ET

9、0=1; EA=1; while(1) P3=0xff; P3_4=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=7; break; case 0x0d: key=8; break; case 0x0b: key=9; break; case 0x07: key=10; break; if(key=10) ccflag=1; cccc=4; if (key

10、=0) & (key10) keypos+; /按键次数 if(keypos1) if(ccflag!=1) dataa=dataa*10+key; sum=dataa; else datab=datab*10+key; sum=datab; else if(ccflag!=1) dataa=key; sum=dataa; else datab=key; sum=datab; else keypos=8; alarmflag=1; temp=P3; P1_0=P1_0; temp=temp & 0x0f; while(temp!=0x0f) temp=P3; temp=temp & 0x0f;

11、 alarmflag=0; /按键是否释放3.3四则运算程序 利用C语言实现加减乘除运算比汇编语言要简单的多,所以这次编程采用C语言比用汇编要简单。 if(cccc=1) sum=dataa+datab;/实现加运算 if(cccc=2) sum=dataa-datab; /实现减运算 if(cccc=3) sum=dataa*datab; /实现乘运算 if(cccc=4) sum=dataa/datab; /实现除运算 4 Proteus软件仿真4.1 数据的输入将“0401010525.hex”导入到8051中,开机远行时,数码管最低位显示为“0”,其余位全部不显示,第一次按下时,显示“

12、D1”;第二次按下时,显示“D1D2”;第三次按下时,显示“D1D2D3”。Proteus软件仿真的图如图5图5 Proteus软件仿真图4.2加法计算利用Proteus软件进行加法计算,第一个加数为3000,第二加数为700,仿真的结果的图如图6。图6 仿真的结果图4.3乘法仿真利用Proteus软件进行乘法计算,被乘数为2000,乘数为90,仿真的结果的图如图7。图7仿真的结果图5 课程设计体会一个星期的课程设计结束了,从中我学到了很多东西且感悟良多,体会到了课本联系实际,学以至用,设计思想,实际动手能力都有所提高.在老师的辛勤的指导下,最后我们顺利地完成了这次的课程设计.看见到课本所学知

13、识得以应用,心中满是欢喜,满是激动.这次课程设计让我的实际动手能力得到了大大的锻炼,让我解决实际问题的能力得到了大大的提高,并对本专业的课程充满了浓厚的兴趣,及对以后的学习充满了信心,决定在以后的学习生活中加强练习,端正心态,迎接新的挑战.在一个星期后的今天我已明白课程设计对我来说的意义,它不仅仅是让我们把所学的理论知识与实践相结合起来,提高自己的实际动手能力和独立思考的能力,更重要的是同学间的团结,虽然我们这次花去的时间比别人多,但我相信我们得到的也会更多!参考文献1单片机原理及应用技术 余发山 主编 中国矿业大学出版社28051单片机实践与应用 吴金戍 沈庆阳 编著 清华大学出版社3单片机

14、应用系统设计与实践 陈奥初,窦振中 编著 北京航空航天大学出版社4MCS51单片机综合系统及其设计开发 张凯,马忠梅 编著 科学出版社5单片微型计算机原理应用及接口技术 张迎新 编著 国防工业出版社附:计算器模拟系统电路图附1 源程序代码#include unsigned char code dispcode=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00; unsigned char code dispbitcode=0xfe,0xfd,0xfb,0xf7,0xef,0

15、xdf,0xbf,0x7f; unsigned char dispbuf8=0,16,16,16,16,16,16,16; unsigned char dispbitcount; unsigned char temp; unsigned char i,j; unsigned char key; unsigned char keypos;unsigned char cccc;unsigned long int dataa;unsigned long int datab; unsigned long int sum=0; bit alarmflag;bit ccflag=0; void main(

16、void) TMOD=0x01; TH0=(65536-4000) / 256; TL0=(65536-4000) % 256; TR0=1; ET0=1; EA=1; while(1) P3=0xff; P3_4=0; temp=P3; temp=temp & 0x0f; /dataa=temp; if (temp!=0x0f) / for(i=50;i0;i-) / for(j=200;j0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: k

17、ey=7; break; case 0x0d: key=8; break; case 0x0b: key=9; break; case 0x07: key=10; break; if(key=10) ccflag=1; cccc=4; if (key=0) & (key10) keypos+; if(keypos0;i-); / dispbuf0=key; if(keypos1) if(ccflag!=1) dataa=dataa*10+key; sum=dataa; else datab=datab*10+key; sum=datab; else if(ccflag!=1) dataa=ke

18、y; sum=dataa; else datab=key; sum=datab; else keypos=8; alarmflag=1; temp=P3; P1_0=P1_0; temp=temp & 0x0f; while(temp!=0x0f) temp=P3; temp=temp & 0x0f; alarmflag=0; P3=0xff; P3_5=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) /for(i=50;i0;i-) / for(j=200;j0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0

19、x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=4; break; case 0x0d: key=5; break; case 0x0b: key=6; break; case 0x07: key=11; break; if(key=11) ccflag=1; cccc=3; if (key=0) & (key10) keypos+; if(keypos1) if(ccflag!=1) dataa=dataa*10+key; sum=dataa; else datab=datab*10+key; sum=datab; el

20、se if(ccflag!=1) dataa=key; sum=dataa; else datab=key; sum=datab; else keypos=8; alarmflag=1; temp=P3; P1_0=P1_0; temp=temp & 0x0f; while(temp!=0x0f) temp=P3; temp=temp & 0x0f; alarmflag=0; P3=0xff; P3_6=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) /for(i=50;i0;i-) /for(j=200;j0;j-); temp=P3; temp=

21、temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=1; break; case 0x0d: key=2; break; case 0x0b: key=3; break; case 0x07: key=12; break; if(key=12) ccflag=1; cccc=2; if (key=0) & (key10) keypos+; if(keypos1) if(ccflag!=1) dataa=dataa*10+key; sum=dataa; else datab=dat

22、ab*10+key; sum=datab; else if(ccflag!=1) dataa=key; sum=dataa; else datab=key; sum=datab; else keypos=8; alarmflag=1; temp=P3; P1_0=P1_0; temp=temp & 0x0f; while(temp!=0x0f) temp=P3; temp=temp & 0x0f; alarmflag=0; P3=0xff; P3_7=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) /for(i=50;i0;i-) /for(j=20

23、0;j0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=0; break; case 0x0d: key=13; break; case 0x0b: key=14; break; case 0x07: key=15; break; if(key=15) ccflag=1; cccc=1; if(key=13) ccflag=0; cccc=0; dispbitcount=0; temp=0; key=0; keypos=0; dataa

24、=0; datab=0; sum=0; alarmflag=0; if(key=14) if(cccc=1) sum=dataa+datab; if(cccc=2) sum=dataa-datab; if(cccc=3) sum=dataa*datab; if(cccc=4) sum=dataa/datab; if (key=0) & (key10) keypos+; if(keypos1) if(ccflag!=1) dataa=dataa*10+key; sum=dataa; else datab=datab*10+key; sum=datab; else if(ccflag!=1) da

25、taa=key; sum=dataa; else datab=key; sum=datab; else keypos=8; alarmflag=1; temp=P3; P1_0=P1_0; temp=temp & 0x0f; while(temp!=0x0f) temp=P3; temp=temp & 0x0f; alarmflag=0; void t0(void) interrupt 1 using 0 TH0=(65536-4000) / 256; TL0=(65536-4000) % 256; P2=dispbitcodedispbitcount; P0=dispcodedispbufd

26、ispbitcount; dispbitcount+; if (dispbitcount=8) dispbitcount=0; if (dispbitcount0) dispbuf0=sum%10; dispbuf1=sum%100/10; dispbuf2=sum%1000/100; dispbuf3=sum%10000/1000; dispbuf4=sum%100000/10000; dispbuf5=sum%1000000/100000; dispbuf6=sum%10000000/1000000; dispbuf7=sum/10000000; if(sum10) dispbuf1=16;if(sum100) dispbuf2=16;if(sum1000) dispbuf3=16;if(sum10000) dispbuf4=16;if(sum100000) dispbuf5=16;if(sum1000000) dispbuf6=16;if(sum10000000) dispbuf7=16; 附2 计算器模拟系统电路图图8 计算器模拟系统电路图- 24 -

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