完整word版基于AT89C51单片机简易计算器的设计_第1页
完整word版基于AT89C51单片机简易计算器的设计_第2页
完整word版基于AT89C51单片机简易计算器的设计_第3页
完整word版基于AT89C51单片机简易计算器的设计_第4页
完整word版基于AT89C51单片机简易计算器的设计_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、广廉海译大学微机原理与单片机课程设计课程设计报告基于51单片机的简易计算器设计学生姓名卓国焕专业电子信息工程所在班级1141学号201411611136指导老师欧触灵日期2016.10.31 2016.11.411单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电 子、科技、通信、汽车、工业等。本设计是基于 51系列单片机来进行 的简单数字计算器设计,可以完成计算器的键盘输入,进行加、减、 乘、除六位整数数范围内的基本四则运算,并在 LEDh显示相应的结 果。软件方面使用C语言编程,并用PROTUE仿真。

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

3、行过程中有错误时,会在 LED上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示 范围时,计算器会在LEDh显示“ CUO” ,提示溢出。三、系统模块组成框图:输入模块51单片机运算模块LED显示模二、硬件设计(一)、总体硬件设计本设计选用AT89C51单片机为主控单元。显示部分:采用LED动 态显示。按键部分:采用4*4集成计算键盘;总电路图:10inLT_:ClCJd詔HC備Al fits?BbrTTflNCAP CAPtLfC CEY51AL KEmDMWlEALC LED-BLUEFS rasRgw SDUNCfA SPEAKERr-丄早PWJ31 M UVIIpuwi

4、a M iMHbPUEUlE PUVUHHIMkl令 BQSB.000B”H 00 sn0 0HPIETtJrmUF7aHPIMTThJPIJPIJ PIJ hrrurj-vra-1CTpasC=b*HEpaim(1) 4X4集成计算键盘PIOPUPI .2P13u 帜:“HH 丁7S9456123C円0FT?P4P1.5集成计算键盘本质上是4X 4矩阵键盘,矩阵键盘采用四条I/O线作为行线,四条I/O线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4X4个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。矩阵键盘的工作原理:计算器的键盘布局如

5、图2所示:一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。矩阵键盘内部电路图如图所示:11厂f 一1 at 11*U1O二 Q1fU1JaiBl(三)、LED显示模块如图RP133PDs37P0 243SP0 3535P0.4634PiX石733PO.Ce-32、P0 7gPOJO3口霍强3SSLRESPAtK-eP1 1/T2EXP3.1ZrXDP1.2P3.2jNTOF1.3P3.3;IHT1PI .4P3.4/TOP1.5P3.5/T1P1.0P3.eAiVRP1.7P3.7/ATSCCfi2单片机最小系统C11nFJI1&XICRYS

6、TALISXTAL1XTAL2InFu辰C3-| gRSTluF民 1lOk20PSEN复位时单片机的初始化操作,只要给 RS引脚加上两个机器周期以上的高电平信号,就可以使STC89C5单片机复位。本次采用的是12M晶振,按钮复位电路。三、软件设计现实生活中人们熟知的计算器,其功能主要如下:1、键盘输入;2、数值显示;3、加、减、乘、除四则运算;针对上述功能,计算器软件程序要完成以下程序的设计:1、键盘输入检测程序2、LED显示程序3、算术运算程序1、程序流程图系统总流程图算术运算程序流程图2、程序清单#in clude#in clude#defi ne uchar un sig ned ch

7、ar#defi ne uint un sig ned int#defi ne ulong un sig ned longsbit wela=卩2人7; /定义端口sbit dula=卩2人6;31long in 1,i n2,out,x; int cn t,i,flag; ucharcodenum=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0 x79,0x71; /LED void delay( uint xms) /显示字模,共阴 延时函数uint j;for(i=xms;i0;i-) for(

8、j=114;j0;j-);void dis play()uchar w1,w2,w3,w4,w5,w6,f=0; long y;if(x=0) /显示六位计时数/显示函数声明if(x=1e6)P 0=0xff; wela=1;P 0=0xf7; wela=0; dula=1;P 0=nu m12; dula=0;dela y(2);P0=0xf; 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=nu m0; dula=0;delay(2);re

9、turn;w仁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;P 0=0xff;wela=1;P 0=0xfe;wela=0;dula=1;P 0=nu mw6;dula=0;dela y(2);if(f=1|w5)f=1;P O=Oxff; wela=1;P 0=0xfd; wela=0; dula=1;P 0=nu mw5; dula=0;dela y(2);if(f=1|w4)f=1;P 0=0xff; wela=1;P 0=0xfb; wela=0; dula=1;

10、P 0=nu mw4; dula=0;dela y(2);if(f=1|w3)f=1;P O=Oxff; wela=1;P 0=0xf7; wela=O; dula=1;P 0=nu mw3; dula=0;dela y(2);if(f=1|w2)f=1;P 0=0xff; wela=1;P 0=0xef; wela=0; dula=1;P 0=nu mw2; dula=0;dela y(2);PO=Oxff; wela=1; PO=Oxdf; wela=O; dula=1;P O=nu mw1; dula=O;dela y(2); elsey=labs(x);if(y=1e5)P 0=0xf

11、f; wela=1;PO=Oxf7; wela=O; dula=1;P O=nu m12; dula=O;dela y(2);PO=Oxf; wela=1; PO=Oxef; wela=O; dula=1;PO=Ox3e; dula=O; delay(2);PO=Oxff; wela=1; PO=Oxdf; wela=O; dula=1; PO=nu mO; dula=O; dela y(2);return;w仁y%10;w2=y/10%10;w3=y/100%10;w4=y/1000%10;w5=y/10000%10; if(f=1|w5)if(f=O)PO=Oxff; wela=1;P O

12、=Oxfe; wela=O; dula=1;PO=Ox4O; dula=O; delay(2);f=1;P O=Oxff; wela=1;P O=Oxfd; wela=O; dula=1;P O=nu mw5; dula=O;dela y(2);if(f=1|w4)if(f=O)P O=Oxff; wela=1;P O=Oxfd; wela=O; dula=1;P0=0x40; dula=0; delay(2);f=1;P O=Oxff; wela=1;P O=Oxfb; wela=O; dula=1;P O=nu mw4; dula=O;dela y(2);if(f=1|w3)if(f=O)

13、P O=Oxff; wela=1;P O=Oxfb; wela=O; dula=1;P0=0x40; dula=O; delay(2);f=1; P O=Oxff; wela=1;P 0=0xf7; wela=O; dula=1;P 0=nu mw3; dula=0;dela y(2);if(f=1|w2)if(f=0)P 0=0xff; wela=1;P 0=0xf7; wela=0; dula=1;P0=0x40; dula=0; delay(2);f=1;PO=Oxff; wela=1;PO=Oxef; wela=O; dula=1;PO=nu mw2; dula=O;dela y(2)

14、;if(f=0)P 0=0xff; wela=1;P 0=0xef; wela=0; dula=1;P 0=0x40; dula=0; delay(2);P0=0xff; wela=1;P0=0xdf; wela=0; dula=1;P0=nu mw1; dula=0; delay(2);/键盘扫描函数void keysca n()uchar temp;P 1=0xfe; temp=P1; temp=te mp&0 xf0;if(te mp !=0xf0)delay(8); temp=P1;temp=te mp&0xf0; if(tem p!=0xf0) temp=P1; switch(te

15、mp) case 0xee: if(cnt6) cnt+; if(flag=0) in 1=i n1*10+7;x=in1; elsein 2=i n2*10+7;x=in2; break; case 0xde: if(cnt6)cnt+;if(flag=0) in 1=i n1*10+8;x=in1; elsein 2=i n2*10+8;x=i n2; break;case 0xbe: if(cnt6)cnt+;if(flag=0) in 1=i n1*10+9;x=in1; elsein 2=i n2*10+9;x=in2; break;case 0x7e: if(cnt!=0&flag

16、=0)cnt=O; flag=4;break;while(tem p!=OxfO)temp=P1; temp=te mp&OxfO;P1=Oxfd;temp=P1;temp=te mp&O xfO;if(te mp !=OxfO)delay(8);temp=P1;temp=te mp&OxfO;if(tem p!=OxfO)temp=P1;switch(te mp)case Oxed: if(cnt6)cnt+;if(flag=O)in 1=i n1*1O+4;x=in1; elsein 2=i n2*10+4;x=in2; break;case Oxdd: if(cnt6)cnt+;if(f

17、lag=0) in 1=i n1*10+5;x=in1; elsein 2=i n2*10+5; x=i n2;break;case Oxbd: if(cnt6)cnt+;if(flag=0) in 1=i n1*10+6;x=in1; elsein 2=i n2*10+6; x=in2; break;case 0x7d: if(cnt!=0&flag=O) cnt=0;flag=3;break;while(tem p!=0xf0)temp=P1;temp=te mp&0xf0;P1=0xfb;temp=P1;temp=te mp&0 xf0;if(te mp !=0xf0)delay(8);

18、 /消除抖动temp=P1;temp=te mp&0xf0;if(tem p!=0xf0)temp=P1;switch(te mp)case 0xeb:if(cnt6)cnt+;if(flag=0)in 1=i n1*10+1;x=in1; elsein2=in 2*10+1;x=in2;break;case 0xdb:if(cnt6)cnt+;if(flag=0)in 1=i n1*10+2;x=in1;elsein2=in 2*10+2; x=i n2;break;case 0xbb:if(cnt6)cnt+;if(flag=0)in 1=i n1*10+3;x=in1; elsein 2

19、=i n2*10+3; x=in2; break; case 0x7 b: if(cnt!=0&flag=0) cnt=0; flag=2; break; while(tem p!=0xf0)temp=P1; temp=te mp&0 xf0;P1=0xf7; temp=P1; temp=te mp&0xf0; if(te mp !=0xf0)证明有键按下,if语句是为了让键盘松开delay(8); temp=P1; temp=te mp&0xf0; if(te mp !=0xf0)/temp=P1; switch(te mp) case 0xe7: cnt=0; in 1=0;in 2=0;

20、out=0; flag=0; x=0;break; case 0xd7: if(cnt6)cnt+;if(flag=0) in 1=i n1*10+0;x=in1; elsein 2=i n2*10+0;x=in2; break;case 0xb7:/如果得到符号位switch(flag)case 1:/out= in1+in2; break;case 2:/out= in 1-i n2; break;case 3:out=i n1*in2;/break;case 4:if(i n2)out=i n1/in2; break;x=out;in 1=0;in 2=0;cnt=0;flag=0;break;case 0x77:/除if(cnt!=0&flag=0) cnt=0;flag=1;break;while(tem p!=0xf0) /等待按键松开temp=P1; temp=te mp&OxfO;void main (),while(1) keysca n(); dis play();/主函数四、设计总结1、软件调试在软件调试的过程中,一开始没有做数值溢出方面的控制, 导致LE显示的输入数据或计算结果与实际不相符。通过多次调试,软件 能够正常运行,基本实现与其功能,通过矩阵键盘输入第一个数据后, 按下所需运算符号后,再次通过矩阵键盘输入第二个数据, 最后按下

温馨提示

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

评论

0/150

提交评论