基于单片机简易计算器的设计样本_第1页
基于单片机简易计算器的设计样本_第2页
基于单片机简易计算器的设计样本_第3页
基于单片机简易计算器的设计样本_第4页
基于单片机简易计算器的设计样本_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

《微机原理与单片机课程设计》课程设计报告基于51单片机的简易计算器设计学生姓名卓国焕()专业电子信息工程所在班级1141学号指导老师欧触灵日期2023.10.31——2023.11.4一、设计目的单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。本设计是基于51系列单片机来进行的简朴数字计算器设计,可以完毕计算器的键盘输入,进行加、减、乘、除六位整数数范围内的基本四则运算,并在LED上显示相应的结果。软件方面使用C语言编程,并用PROTUES仿真。二、总体设计及功能介绍根据功能和指标规定,本系统选用MCS-51系列单片机为主控机,实现对计算器的设计。具体设计及功能如下:(1)由于要设计的是简朴的计算器,可以进行四则运算,为了得到较好的显示效果,采用LED显示数据和结果。(2)此外键盘涉及数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16个按键即可,设计中采用集成的计算键盘。(3)执行过程:开机显示零,等待键入数值,当键入数字,通过LED显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LED上输出运算结果。(4)错误提醒:当计算器执行过程中有错误时,会在LED上显示相应的提醒,如:当输入的数值或计算得到的结果大于计算器的表达范围时,计算器会在LED上显示“CUO”,提醒溢出。三、系统模块组成框图:输入模块51单片机输入模块51单片机运算模块运算模块LED显示模块LED显示模块二、硬件设计(一)、总体硬件设计本设计选用AT89C51单片机为主控单元。显示部分:采用LED动态显示。按键部分:采用4*4集成计算键盘;总电路图: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晶振,按钮复位电路。三、软件设计现实生活中人们熟知的计算器,其功能重要如下:键盘输入;数值显示;加、减、乘、除四则运算;针对上述功能,计算器软件程序要完毕以下程序的设计:键盘输入检测程序LED显示程序算术运算程序1、程序流程图系统总流程图SHAPE开始初始化参数初始化LED显示有键输入?开始初始化参数初始化LED显示有键输入?读取键码LED显示数字键清零键功能键状态清零输入数值数值送显示缓冲YN等待数值输入结果送显示缓冲根据上次功能键和输入的数据计算结果本次功能键?等待数值输入结果送显示缓冲等待数值输入结果送显示缓冲算术运算程序流程图开始开始运算符是?加乘减除运算结果溢出?错误信息送显示缓冲数值送显示缓冲YYN2、程序清单#include<reg52.h>#include<math.h>#defineucharunsignedchar#defineuintunsignedint#defineulongunsignedlongsbitwela=P2^7; //定义端口sbitdula=P2^6;longin1,in2,out,x;intcnt,i,flag;ucharcodenum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //LED显示字模,共阴voiddelay(uintxms)//延时函数{ uintj; for(i=xms;i>0;i--) for(j=114;j>0;j--);}voiddisplay() //显示函数声明{ ucharw1,w2,w3,w4,w5,w6,f=0; longy; 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); }}voidkeyscan() //键盘扫描函数{ uchartemp; P1=0xfe; temp=P1; temp=temp&0xf0; if(temp!=0xf0) { delay(8); temp=P1; temp=temp&0xf0; if(temp!=0xf0) { temp=P1; switch(temp) { case0xee: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+7; x=in1; } else { in2=in2*10+7; x=in2; } } break; case0xde: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+8; x=in1; } else { in2=in2*10+8; x=in2; } } break; case0xbe: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+9; x=in1; } else { in2=in2*10+9; x=in2; } } break; case0x7e: 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) { case0xed: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+4; x=in1; } else { in2=in2*10+4; x=in2; } } break; case0xdd: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+5; x=in1; } else { in2=in2*10+5; x=in2; } } break; case0xbd: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+6; x=in1; } else { in2=in2*10+6; x=in2; } } break; case0x7d: 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) { case0xeb: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+1; x=in1; } else { in2=in2*10+1; x=in2; } } break; case0xdb: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+2; x=in1; } else { in2=in2*10+2; x=in2; } } break; case0xbb: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+3; x=in1; } else { in2=in2*10+3; x=in2; } } break; case0x7b: 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) { case0xe7: cnt=0; in1=0; in2=0; out=0; flag=0; x=0; break; case0xd7: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+0; x=in1; } else { in2=in2*10+0; x=in2; } } break; case0xb7: //假如得到符号位 switch(flag) { case1: out=in1+in2; //加 break; case2: out=in1-in2; //减 break; case3: out=in1*in2; //乘 break; case4: if(in2) out=in1/in2; //除 break; } x=out; in1=0; in2

温馨提示

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

评论

0/150

提交评论