简易计算器(共20页)_第1页
简易计算器(共20页)_第2页
简易计算器(共20页)_第3页
简易计算器(共20页)_第4页
简易计算器(共20页)_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上成绩 齐鲁理工学院课程设计说明书题 目 简易计算器设计 课 程 名 称 单片机原理及应用 二 级 学 院 机电工程学院 专 业 电气工程及其自动化 班 级 2014级 学 生 姓 名 王军可 学 号 2 指 导 教 师 王艳玲 设计起止时间:2014 年12月5日至 2014年12月16日 目 录简易计算器设计摘要:近年来,单片机以其体积小、价格廉、面向控制等独特优点,在各种工业控制、仪器仪表、设备、产品的自动化、智能化方面获得了广泛的应用。与此同时,单片机应用系统的可靠性成为人们越来越关注的重要课题。影响可靠性的因素是多方面的,如构成系统的元器件本身的可靠性、系统本

2、身各部分之间的相互耦合因素等。其中系统的抗干扰性能是系统可靠性的重要指标。本设计采用AT89C51芯片,实现了利用单片机进行了一个简单计算器设计。允许对输入数据进行加减乘除运算及LCD 显示。实例所设计的计算器是用LCD1602显示的,当然也可以用其他的器件显示,如LED 显示屏,这样就可以显示出更多的字符。科技的进步告别了以前复杂的模拟电路,一块几厘米平方的单片机可以省去很多繁琐的电路。现在应用较广泛的是科学计算器,但在市场还是需要简易计算器,因为其价格低廉,设计简单,使用方便被广泛的运用于我们的日常生活之中。 关键词:AT89C51 LCD1602 单片机 LED1 设计思路 本次课程设计

3、的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。比如,十进制数的加减乘除四则运算。我们曾经学习过两个具体数字进行加减法运算,但是对于简单计算器用汇编语言实现难点在于寄存器所存的数据较少,很难实现多位数的四则运算,C语言确有着解决汇编语言的优点,所以选用C语言完成该程序的制作,首先运用单片机AT89C51扫描4*4矩阵键盘,从而实现按键的输入功能,键盘的输入是按照每行的电平扫描,并判断按下数字键之后是否有符号键,如果没有则在原数之后添加数字,如果按下符号接收符号后数据,并判断是否有等号键按下,如果按下,则调用运算函数和输出结果。2 原件功能

4、 2.1 运算模块AT89C51AT89C51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以进行很快地实现运算功能,如图所示:2.2 AT

5、89S51的引脚功能VCC:供电电压GND:接地P0口:P0口为一个8位漏级开路双向I/O口,每个管脚可吸收8TTL门电流。当P1口的管脚写“1”时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FLASH编程时,P0口作为原码输入口,当FLASH进行校验时,P0输出原码,此时P0外部电位必须被拉高。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入“1”后,电位被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位

6、地址接收P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚电位被内部上拉电阻拉高,且作为输入。作为输入时,P2口的管脚电位被外部拉低,将输出电流,这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉的优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流,当P3口写入“1

7、”后,它们被内部上拉为高电平,并用作输入。作为输入时,由于外部下拉为低电平,P3口将输出电流(ILL),也是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,如下所示:P3.0,P3.1串行输出口, P3.2、P3.3 外部中断,P3.4记时器0外部输入,P3.5记时器1外部输入,P3.6外部数据存储器写选通,P3.7外部数据存储器读选通,P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 PSEN 29 :该引是外部程序存储器的选通信号输出端。当AT89C51由外部程序存储器取指令或常数时,每个机器周期输

8、出2个脉冲即两次有效。但访问外部数据存储器时,将不会有脉冲输出。EA/Vpp 31 :外部访问允许端。当该引脚访问外部程序存储器时,应输入低电平。要使AT89S51只访问外部程序存储器(地址为0000H-FFFFH),这时该引脚必须保持低电平。对Flash存储器编程时,用于施加Vpp编程电压。 2.3 AT89C51的基本操作 AT89C51复位引脚RST/VP通过片内一个施密特触发器(抑制噪声作用)与片内复位电路相连,施密特触发器的输出在每一个机器周期由复位电路采样一次。当振荡电路工作,并且在RST引脚上加一个至少保持2个机器周期的高电平时,就能使AT89C51完成一次复位。 复位不影响RA

9、M的内容。复位后,PC指向0000H单元,使单片机从起始地址0000H单元开始重新执行程序。所以,当单片机运行出错或进入死循环时,可按复位键重新启动。3 键盘输入当无按键闭合时,P10P13 与P14P17 之间开路;当有键闭合时,与闭合键相连的两条I/O 口线之间短路。判断有无按键按下的方法是:第一步,置列线P14P17 为输入状态,从行线P10P13 输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。第二步,行线轮流输出低电平,从列线P14P17 读入数据,若有某一列为低电平,则对应行线上有键按下。综合一二两步的结果,可确定按键编号。但是键闭合一次只能进行一次键功能操作,因

10、此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式。为此,我们引入了矩阵键盘的应用,采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率,如图所示:键盘介绍:每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。键盘的一端(列线)通过电阻接VCC,而接地是通过

11、程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。4 液晶模块简介4.1 LCD1602简介及引脚功能 字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。 主要技术参数:显示容量:16×2个字符芯片,工作电压:4.55.5V,工作电流:2.0mA(5.0V),模块最佳工作电压:5

12、.0V,字符尺寸:2.95×4.35(W×H)mm第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低

13、电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。 LCD1602仿真图5 程序流程图与总原理图5.1 流程图 系统程序流程图 LCD显示流程图预设数据显示开始开始系统初始化LCD初始化功能设置调整指针指向下一行LCD初始化显示结束?显示指针指向下一行处理按键值显示RAM区清 N待显示数据送缓冲判断当前状态 Y结束LCD显示5.2 仿真原理图6 结论 经过近两个周的努力,我终于顺利完成了简易计算器的制作。刚开始,我们头绪不是很清楚,不知道从哪里入手,但通过老师前两天的4*4键盘和液晶显示屏使用的讲解,渐渐的有了一些头绪,上网查资料、确定

14、基本设计方案、对AT89C51芯片功能进行查找、调试、仿真等,经历了一次次的困难,却积累了很多宝贵的经验。在整个设计的过程中遇到的问题主要有以下三点,第一:基础知识掌握的不牢固,主要表现在一些常用的电路的形式和功能不清楚,对书本上的内容理解不够透彻。第二:对一些常用的应用软件缺少应用,体现在画电路图和系统的仿真的时候,对这些软件的操作不熟练,浪费了很多时间。第三:相关知识掌握的不够全面,缺少系统设计的经验,不论的程序图片还是程序都出错了很多次,走了许多弯路。这次的实训让我学到了很多,也学会到了要怎么样去面对困难,不要对知识一知半截,要有的求实的能力,在现在信息爆炸的时代,只要你愿意去探索,去寻

15、找有什么是理解不了的呢,用心才是最主要的,通过这次我要更加的明确自己。更要注重自己在各方面的锻炼能力,把握机会。这次的课程设计非常感谢对我严厉的辅导老师,是她让我成长,也感谢帮助我走出困惑的同学,在日后的学习中,我会勤思考,打好扎实的理论知识。参考文献:1 郑燕.陈小艳.朱成彪.C语言程序设计J. 东北大学出版社,2014,7(1)2 张毅刚. 单片机原理及应用J . 高等教育出版社,2015,9(5)致谢: 这次课程设计中我最大的体会就是进一步认识到了理论联系实践的重要性,一份耕耘,一份收获。通过短短两周时间的设计,让我明白科学的思维方法和学习方法是多么重要,只有这样才能够有很高的效率,才能

16、够让自己的工作更完美,设计图中经历了许多困难,感谢老师与小组同学的帮助,使得这次设计得以进行并完成,再次十分感谢老师与小组同学。附录A 程序编写#include <reg51.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include "LCD1602.h"void shortdelay(uchar i)/短延时 for(;i>0;i-);/长延时void longdelay(uint i) uint

17、j; for(;i>0;i-) for(j=100;j>0;j-);/延时程序void delay(int i)int j; for(;i>0;i-) for(j=0;j<100;j+);/初试状态void io_init()P1=0xff;/-键盘扫描部分-/ unsigned char key_scan() unsigned char key; unsigned char temp; uint flag; io_init(); P1=0xf0; flag=0;loop: temp=P10xf0; while(temp) P1=0xfe; delay(1); if(P

18、1&0xfe)!=0xfe) switch(P1) case 0xee: key=0x11;flag=1;break; case 0xde: key=0x12;flag=1;break; case 0xbe: key=0x13;flag=1;break; case 0x7e: key=0x14;flag=1;break; if(flag) goto exit; else P1=0xfd; delay(1); if(P1&0xfd)!=0xfd) switch(P1) case 0xed: key=0x21;flag=1;break; case 0xdd: key=0x22;fl

19、ag=1;break; case 0xbd: key=0x23;flag=1;break; case 0x7d: key=0x24;flag=1;break; if(flag) goto exit; else P1=0xfb; delay(1); if(P1&0xfb)!=0xfb) switch(P1) case 0xeb: key=0x31;flag=1;break; case 0xdb: key=0x32;flag=1;break; case 0xbb: key=0x33;flag=1;break; case 0x7b: key=0x34;flag=1;break; if(fla

20、g) goto exit; else P1=0xf7; delay(1); if(P1&0xf7)!=0xf7) switch(P1) case 0xe7: key=0x41;flag=1;break; case 0xd7: key=0x42;flag=1;break; case 0xb7: key=0x43;flag=1;break; case 0x77: key=0x44;flag=1;break; exit: return key; if(temp=0) goto loop; /-键盘扫描完-/-显示初始化-/P0口初始化void initpindata(bit i) if(i=

21、1) pindata=0xff; else pindata=0X00;/寄存器选择信号void setRS(bit i) if(i=1) pinRS=1; else pinRS=0;/读写操作控制void setRW(bit i) if(i=1) pinRW=1; else pinRW=0;/使能信号void setE(bit i) if(i=1) pinE=1; else pinE=0;/读BF以及AC的值uint read_BF_AC() uint temp; initpindata(1); setRS(0); setRW(1); setE(1); shortdelay(1); temp=

22、pindata; shortdelay(10); setE(0); return(temp); /判忙bit statuscheck() return(bit)(read_BF_AC()&0x80);/写指令函数void writeinstruc(uint instruc) while(statuscheck(); initpindata(0); setRS(0); setRW(0); setE(0); pindata=instruc; /short delay(1); setE(1); shortdelay(10); setE(0);/写数据到RAMvoid writedata(ui

23、nt data1) initpindata(0); setRS(1); setRW(0); setE(0); pindata=data1; setE(1); shortdelay(10); setE(0);/从RAM中读数据函数uint readdata(void) uint temp; initpindata(1); setRS(1); setRW(1); setE(1); shortdelay(1); temp=pindata; shortdelay(10); setE(0); return(temp);/显示程序 X为行号,Y为列号,date为要显示的数据void dispcharact

24、er(int x,uint y,uint data1) uint temp; while(statuscheck(); temp=y&0x0f; x&=0x01; if(x) temp|=0x40; setDDRAM_Add(temp); writedata(data1);/ writedata(data1);/LCD复位函数void LCDreset() clearscreen(); cursorreturn();/LCD初始化void initLCD() LCDreset(); inputmode(0x06);/增量方式,不移位 dispcontrol(0x0c);/显示开

25、,光标关,闪烁关 functionset(0x38);/8位,2行,5*7/-准备工作完成-/-计算器-/ compute(char key1,i) signed char m,n,c,act; long int num1,num2,result; signed char str44='7','8','9','/', '4','5','6','*', '1','2','3','-', 'c'

26、;,'0','=','+' signed char str111,string12; m=(key1&0xf0); m=m/16; m=m-1; n=key1&0x0f; n=n-1; c=strmn; sprintf(string1,"%c",c); strcat(str1,string1); if(c='+')|(c='-')|(c='*')|(c='/') act=c; num1=atoi(str1); memset(str1,0,11);

27、memset(string1,0,2); if(c='=') num2=atoi(str1); switch(act) case'+':result=num1+num2;break; case'-':result=num1-num2;break; case'*':result=num1*num2;break; case'/':result=num1/num2;break; if(c='c')act=0;num1=str10;num1=str18;memset(str1,0,11);memset(st

28、ring1,0,2);num1=str10;num1=str18; longdelay(350); switch(key1) case 0x11: dispcharacter(0,i,'7');i+;break; case 0x12: dispcharacter(0,i,'8');i+; break; case 0x13: dispcharacter(0,i,'9');i+; break; case 0x14: dispcharacter(0,i,'/');i+;break; case 0x21: dispcharacter(0,i,'4');i+;break; case 0x22: dispcharacter(0,i,'5');i+;break; case 0x23: dispcharacter(0,i,'6');i+;break; case 0x24: dispcharacter(0,i,'*');i+;break; case 0x31: dispcharacter(0,i,'1');i+;break; case 0x32: dispcharacter(0,i,'2');i+;break; case 0x33: d

温馨提示

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

评论

0/150

提交评论