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

下载本文档

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

文档简介

常州工学院学士学位设计目录第一部分设计任务与调研…………3第二部分设计说明……………………4第三部分设计成果……………………11第四部分结束语………………………15第五部分致谢…………16第六部分参考文献…………………17

第一部分设计任务与调研近几年单片机技术的发展很快,其中电子产品的更新速度迅猛。计算器是日常生活中比较的常见的电子产品之一。科技的进步告别了以前复杂的模拟电路,一块几厘米平方的单片机可以省去很多繁琐的电路。现在应用较广泛的是科学计算器,与我们日常所用的简单计算器有较大差别,除了能进行加减乘除,科学计算器还可以进行正数的四则运算和乘方、开方运算,具有指数、对数、三角函数、反三角函数及存储等计算功能。计算器的未来是小型化和轻便化,现在市面上出现的使用太阳能电池的计算器,使用ASIC设计的计算器,如使用纯软件实现的计算器等,未来的智能化计算器将是我们的发展方向,更希望成为应用广泛的计算工具。1.1主要任务本设计是以AT89S52单片机为核心的计算器模拟系统设计,输入采用4×6矩阵键盘,可以进行加、减、乘、除9位带符号数字运算,并在LCD1602上显示结果。1.2设计思路本设计是基于AT89C51单片机的简单运用,设计一个简单的计算器,利用keil进行编程调试,然后利用Protel99se进行仿真,能够实现加,减,乘,除的简单运算。

第二部分设计说明2.1硬件电路2.1.1硬件电路结构框图AT89C51单片机AT89C51单片机显示模块按键输入模块显示模块按键输入模块图2图2—1硬件电路结构框图2.1.2AT89C51介绍图2—图2—2AT89C51芯片引脚图1)微处理器该单片机中有一个8位的微处理器,与通用的微处理器基本相同,同样包括了运算器和控制器两部分,只是增加了面向控制的处理功能,不仅可处理数据,还可以进行位变量的处理。2)数据存储器片内为18个字节,2片外最多可外扩至64k字节,用来存储程序在运行期间的工作变量、运算的中间结果、数据暂存和缓冲、标志位等,所以称为数据存储器。3)程序存储器由于受集成度限制,片内只读存储器一般容量较小,如果片内的只读存储器的容量不够,则需要扩展片外的只读存储器,片外最多可外扩至64k字节。4)中断系统具有5个中断源,2个中断优先权5)定时器/计数器片内有2个16位的定时器/计数器,具有四种工作方式6)串行口1个全双工的串行口,具有四种工作方式。可用来进行串行通讯,扩展并行I/O口,甚至与多个单片机相连接构成多机系统,从而使单片机的功能更强且应用更广。7)I/O口4个并行8位I/O口8)特殊功能寄存器共有21个,用于对片内的各功能的部件进行管理、控制、监视。实际上是一些控制寄存器和状态寄存器,是一个具有特殊功能的RAM区。由上可见,AT89C51单片机的硬件结构具有功能部件种类全,功能强等特点。特别值得一提的是该单片机CPU中的微处理器实际上是一个完整的1位微计算机。这个1位微计算机有自己的CPU、位寄存器、I/O口和指令集。其在开关决策、逻辑电路仿真、过程控制方面非常有效;而8位机在数据采集、运算处理方面有明显的长处。MCS-51单片机中8位机和1位机的硬件资源复合在一起,二者相辅相成,它是单片机技术上的一个突破,也是MCS-51单片机在设计上的精美之处。2.1.3引脚说明MCS-51是标准的40引脚双列直插式集成电路芯片,引脚分布可参照单片机引脚。P0.0~P0.7P0口8位双向线(在引脚的32~39号端子);P1.0~P1.7P1口8位双向线(在引脚的1~8号端子);P2.0~P2.7P2口8位双向线(在引脚的21~28号端子);P3.0~P3.7P3口8位双向线(在引脚的10~17号端子)。(1)P0口有三个功能:(1)外部扩展存储器时,当作数据总线(如图中的D0~D7为数据总线接口)(2)外部扩展存储器时,当作地址总线(如图中的A0~A7为地址总线接口)(3)不扩展时,可作一般的I/O口使用,但内部无上拉电阻,作为输入输出时应在外部接上拉电阻。(2)P1口功能P1口只作I/O口使用,其内部有上拉电阻。(3)P2口功能1、扩展外部存储器时,当作地址总线使用;2、作一般I/O口使用,其内部有上拉电阻。(4)P3口功能1、除了作为I/O口使用外(其内部有上拉电阻),还有一些特殊功能,由特殊寄存器来设置。2、当作为输入时,上拉电阻将其电位拉高,若输入为低电平则可提供电流源,所以如果P0口作为输入时,或处在高阻抗状态,只有外接一个上拉电阻才能有效。(5)ALE/PROG地址锁存控制信号在系统扩展时,ALE用于控制把P0口的输出低8位地址送锁存器锁存起来,以实现低位地址和数据的隔离。PROG为编程脉冲的输入端,在AT89C51单片机内部有一个4kB的程序存储器(ROM),ROM的作用就是用来存放用户需要执行的程序。我们如何把编写好的程序存入这个ROM中的呢?实际上是通过编程脉冲输入采能写进去,而这个脉冲的输入端口就是PROG。(6)PSEN外部程序存储器读选通信号在读外部ROM时PSEN低电平有效,以实现外部ROM单元的读操作:1、内部ROM读取时,PSEN不动作;2、外部ROM读取时,在每个机器周期会动作两次;3、外部RAM读取时,两个PSEN脉冲被跳过不会输出;4、外接ROM时,与ROM的OE脚相接。(7)EA/VPP访问程序存储器控制信号1、接高电平时:CPU读取内部程序存储器(ROM)2、接低电平时:CPU读取外部程序存储器(ROM)。8031单片机内部是没有ROM的,因此在应用8031单片机时,这个脚时一直接低电平的。(8)RST复位信号当输入的信号连续2个机器周期以上高电平时即为有效,用以完成单片机的复位初始化操作,当复位后程序计数器PC=0000H,即复位后将从程序存储器的0000H单元读取第一条指令码。(9)XTAL1和XTAL2外接晶振引脚。当使用芯片内部时钟时,此二引脚用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。(10)VCC电源+5V输入(11)GND接地2.1.4按键模块设计矩阵式按键输入模块,其特点是:电路和软件稍复杂,但相比之下,当键数越多时,越节约I/O口,比较节省资源键盘可分为两类:编码键盘和非编码键盘。编码键盘是较多按键(20个以上)和专用驱动芯片的组合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。通用计算机使用的标准键盘就是编码键盘。在智能仪器中,使用并行接口芯片8279或串行接口芯片HD7279均可以组成编码键盘,同时还可以兼顾数码管的显示驱动,其相关的接口电路和接口软件均可在芯片资料中得到。当系统功能比较复杂,按键数量很多时,采用编码键盘可以简化软件设计。但大多数智能仪器和电子产品的按键数目都不太多(20个以内),为了降低成本和简化电路通常采用非编码键盘。非编码键盘的接口电路有设计者根据需要自行决定,按键信息通过接口软件来获取图2—图2—3编码键盘电路2.1.5显示模块设计本设计采用的是LCD1602液晶显示屏。模块内部自带字符发生存储器(CGROM),字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是(41H),显示时模块把代码41H发给液晶模块,我们就能在液晶上看到字母“A”。1602液晶模块内部的控制器共有11条控制指令,丰富的指令可以完成液晶的时序控制、工作方式式设置和数据显示等LCD的特点:(1)低压微功耗;(2)平板型结构;(3)被动显示型(无眩光,不刺激人眼,不会引起眼睛疲劳);(4)显示信息量大(因为像素可以做得很小);(5)易于彩色化(在色谱上可以非常准确的复现);(6)无电磁辐射(对人体安全,利于信息保密);(7)长寿命(这种器件几乎没有什么劣化问题,因此寿命极长,但是液晶背光寿命有限,不过背光部分可以更换)图2图2—4LCD液晶显示屏2.2软件电路2.2.1键盘扫描的程序设计键盘扫描子程序,首先读出P1的低四位,然后读出P1口的高四位。然后键值并显示缓存。然后将键如的值转换为ASCII码然后就可以软件来设置硬件按键各个键代表的内容。读键程序使用的是反转法读键,不管键盘矩阵的规模大小,均进行两次读键。第一次所有行线均输出低电平,从所有读入键盘信息(列信息);第二次所有列线均输出低电平,从所有行线读入键盘信息(行信息)。数字键按下则将相应的数字送入缓存区,功能键按下则执行相应的程序2.2.2显示模块的程序设计显示模块程序首先要对显示模块进行初始化;然后控制光标的位置;定义液晶显示的控制端口,用SBIT指令完成;然后设置清屏、关闭显示、归位、开显示、显示位置的首地址等等。图2—5程序运行流程图图2—5程序运行流程图2.2.4加减乘除子运算流程图

否是输出结果c运算C=a+b;c=a-b;C=a*b;c=a/b‘=’键按下?赋值完成后把缓冲区清零,防止下次输入影响结果sscanf(temp,"%d",&b);for(s=0;s<8;s++)图2—5加减乘除子运算流程图把第一个数据赋值给a,并把标志位置1,到下一个数据输入时可以跳转赋值给bsscanf(temp,"%d",&a)firstflag==0?(输入数值的是第一个数据?)否是复位i=0矩阵赋值'+'==num'*'==num'/'==num'='==numa=0;b=0

否是输出结果c运算C=a+b;c=a-b;C=a*b;c=a/b‘=’键按下?赋值完成后把缓冲区清零,防止下次输入影响结果sscanf(temp,"%d",&b);for(s=0;s<8;s++)图2—5加减乘除子运算流程图把第一个数据赋值给a,并把标志位置1,到下一个数据输入时可以跳转赋值给bsscanf(temp,"%d",&a)firstflag==0?(输入数值的是第一个数据?)否是复位i=0矩阵赋值'+'==num'*'==num'/'==num'='==numa=0;b=0第三部分设计成果仿真图程序#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<stdio.h>#defineKeyPortP1#defineDataPortP0//定义数据端口程序中遇到DataPort则用P0替换sbitLATCH1=P2^2;//定义锁存使能端口段锁存sbitLATCH2=P2^3;//位锁存unsignedcharcodedofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值0~9//unsignedcharcodedofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsignedcharTempData[8];//存储显示值的全局变量externunsignedcharTempData[8];//存储显示值的全局变量externunsignedcharcodedofly_DuanMa[10];//显示函数,用于动态扫描数码管输入参数FirstBit表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。Num表示需要显示的位数,如需要显示99两位数值则该值输入2//按键扫描函数,返回扫描键值//unsignedcharKeyScan(void);//键盘扫描函数,使用行列反转扫描法//按键值处理函数,返回扫键值//unsignedcharKeyPro(void);voidDisplay(unsignedcharFirstBit,unsignedcharNum);//定时器初始化子程序//voidInit_Timer0(void);//uS延时函数,含有输入参数unsignedchart,无返回值unsignedchar是定义无符号字符变量,其值的范围是0~255这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5uS//voidDelayUs2x(unsignedchart);//mS延时函数,含有输入参数unsignedchart,无返回值unsignedchar是定义无符号字符变量,其值的范围是0~255这里使用晶振12M,精确延时请使用汇编//voidDelayMs(unsignedchart);//主程序//main(){unsignedcharnum,i,sign;//数值unsignedchartemp[8];//最大输入8个bitfirstflag;inta=0,b=0;unsignedchars;Init_Timer0();//初始化定时器0while(1)//主循环{num=KeyPro();//扫描键盘if(num!=0xff)//如果扫描是按键有效值则进行处理{if(i==0)//输入是第一个字符的时候需要把改行清空,方便观看{for(s=0;s<8;s++)//赋值完成后把缓冲区清零,防止下次输入影响结果TempData[s]=0;}if(('+'==num)||(i==8)||('-'==num)||('x'==num)||('/'==num)||('='==num))//输入数字最大值8,输入符号表示输入结束{i=0;//计数器复位if(firstflag==0)//如果是输入的第一个数据,赋值给a,并把标志位置1,到下一个数据输入时可以跳转赋值给b{sscanf(temp,"%d",&a);//从一个字符串输入到变量firstflag=1;}elsesscanf(temp,"%d",&b);for(s=0;s<8;s++)//赋值完成后把缓冲区清零,防止下次输入影响结果temp[s]=0;if(num!='=')//判断当前符号位并做相应处理sign=num;//如果不是等号记下标志位else{firstflag=0;//检测到输入=号,判断上次读入的符合switch(sign){case'+':a=a+b;break;case'-':a=a-b;break;case'x':a=a*b;break;case'/':a=a/b;break;default:break;}sprintf(temp,"%d",a);//打印十进制到临时缓冲区for(s=0;s<8;s++)//由于打印的是ASCII码值{if(temp[s]==0)//所以需要转换,如果为0表示null数码管上则不能显示,所以赋值0TempData[s]=0;elseif(temp[s]==0x2d)//表示负号,数码管显示负号0x40TempData[s]=0x40;elseTempData[s]=dofly_DuanMa[temp[s]-'0'];//其他0-9负号则进行ASCII到数字处理,如当前是'3',用'3'-'0'=3//'3'的16进制是0x33,'0'的16进制是0x30}sign=0;a=b=0;//用完后所有数据清零for(s=0;s<8;s++)temp[s]=0;}}elseif(i<16){temp[i]=num+'0';TempData[i]=dofly_DuanMa[num];//输出数据i++;//输入数值累加}}}}//按键扫描函数,返回扫描键值//unsignedcharKeyScan(void)//键盘扫描函数,使用行列反转扫描法{unsignedcharcord_h,cord_l;//行列值中间变量KeyPort=0x0f;//行线输出全为0cord_h=KeyPort&0x0f;//读入列线值if(cord_h!=0x0f)//先检测有无按键按下{DelayMs(10);//去抖if((KeyPort&0x0f)!=0x0f){cord_h=KeyPort&0x0f;//读入列线值KeyPort=cord_h|0xf0;//输出当前列线值cord_l=KeyPort&0xf0;//读入行线值while((KeyPort&0xf0)!=0xf0);//等待松开并输出return(cord_h+cord_l);//键盘最后组合码值}}return(0xff);//返回该值}unsignedcharKeyPro(void){switch(KeyScan()){case0x7e:return1;break;//0按下相应的键显示相对应的码值case0x7d:return2;break;//1case0x7b:return3;break;//2case0x77:return'+';break;//3case0xbe:return4;break;//4case0xbd:return5;break;//5case0xbb:return6;break;//6case0xb7:return'-';break;//7case0xde:return7;break;//8case0xdd:return8;break;//9case0xdb:return9;break;//acase0xd7:return'x';break;//bcase0xee:return0;break;//ccase0xed:return'.';break;//dcase0xeb:return'=';break;//ecase0xe7:return'/';break;//fdefault:return0xff;break;}}//显示函数,用于动态扫描数码管输入参数FirstBit表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。Num表示需要显示的位数,如需要显示99两位数值则该值输入2//voidDisplay(unsignedcharFirstBit,unsignedcharNum){staticunsignedchari=0;DataPort=0;//清空数据,防止有交替重影LATCH1=1;//段锁存LATCH1=0;DataPort=dofly_WeiMa[i+FirstBit];//取位码LATCH2=1;//位锁存LATCH2=0;DataPort=TempData[i];//取显示数据,段码LATCH1=1;//段锁存LATCH1=0;i++;if(i==Num)i=0;}//定时器初始化子程序//voidInit_Timer0(void){TMOD|=0x01;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响//TH0=0x00;//给定初值//TL0=0x00;EA=1;//总中断打开ET0=1;//定时器中断打开TR0=1;//定时器开关打开}//定时器中断子程序//voidTimer0_isr(void)interrupt1{TH0=(65536-2000)/256;//重新赋值2msTL0=(65536-2000)%256;Display(0,8);}//uS延时函数,含有输入参数unsignedchart,无返回值unsignedchar是定义无符号字符变量,其值的范围是0~255这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5uS//voidDelayUs2x(unsignedchart){while(--t);}//mS延时函数,含有输入

温馨提示

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

评论

0/150

提交评论