基于AT89C52单片机的计算器设计.doc_第1页
基于AT89C52单片机的计算器设计.doc_第2页
基于AT89C52单片机的计算器设计.doc_第3页
基于AT89C52单片机的计算器设计.doc_第4页
基于AT89C52单片机的计算器设计.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

电子设计大赛训练设计报告基于AT89C52 单片机的计算器设计 指导老师: 曾祥志.管立新.许粮 作者:黄红平 学校:赣南师范学院 物理与电子信息工程 完成时间 2011年8月20日摘 要计算器是微型电子计算机的一种特殊类型。它与一般通用计算机的主要区别在于程序输入方式的不同。计算器的程序一般都已经固定,只需按键输入数据和运算符号就会得出结果,很容易就能掌握。而一般计算机的程序可以根据需要随时改动,或重新输入新的程序。简易计算器主要用于加减乘除;科学计算器,又增添了初等函数运算。随着微电子技术的不断发展,微处理芯片的集成程度越来越高,单片机已可以在一片芯片上同时集成cpu,存储器,定时器,计数器,并行和串行接口,看门狗,前置放大器,A|D 转换器,D|A 转换器等多种电路。关键词:计算器、at89s52、液晶显示16021.简易计算器的设计方案1.1 硬件部分设计方案1. 单片机以AT89S52 来作为核心元器件2按键部分采用4*4 行列式键盘,分别设定数字键和功能键。3. 显示部分方案一:使用8 位LED 数码管来做显示。LED 显示器是由发光二极管显示字段组成的显示器件,在单片机应用系统中通常使用的是七段LED,这种显示器有共阴极和共阳极两种,它具有成本低廉、配置灵活和单片机接口方便等特点。方案二:使用液晶显示器来显示。液晶是介于固态和液态间的有机化合物,将其加热会变成透明液态,冷却后变成结晶的混作固态。在点击的作用下,产生冷热变化,从而影响它的透光性,来达到显示的目的。LED 还具有以下几个优点:低压、微功耗、显示信息量大、长寿命、无辐射、无污染。后选择的显示是液晶显示。大致原理图如下。(后改用AT89S52 代替AT89C51 )总的电路设计方案以单片机 AT89S52 来作为核心元器件,外围采用4*4 行列式键盘作为输入,采用led1602 液晶显示来做输出。这里重点介绍液晶输出地管脚,因为一开始本打算用数码管来做显示,后改为液晶,不是很熟悉。它是一个双行显示的液晶显示器。其采用标准的16 脚接口。1. vss 为地电源2. vdd 接5v 正电源3. vo 为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对江西师范大学理电学院电子系07 级电子综合实践文稿29比度最高,对比度过高会产生影子,使用时可以通过一个10k 的电位器调整对比度4. rs 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器5. rw 为读写信号线,高电平时选择读操作,低电平时选择写操作。当rs和rw 共同为低电平时可以写入指令或者显示地址,当rs 为低电平rw 为高电平时可以读忙信号,当rs 为高点平rw 为低电平时可以写入数据。6. e 端为使能端,当e 端由高电平跳变成低电平时,液晶模块执行命令7. 714 d0d7 为8 位双向数据线8. 1516 分别为背光灯正负极,A 接正极,K 接负极1.2 软件部分1.采用汇编语言编写计算器程序2.采用c 语言编写计算器程序最终选择了 c 语言编写计算器程序,主程序见附录2.调试与仿真下面用 KEIL uVision 与porteus 仿真软件实现简易计算器的仿真与调试。keil 软件的介绍单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU 可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51 单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil 软件是目前最流行开发MCS-51 系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil 即可看出。Keil 提供了包括C 编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。运行Keil 软件需要Pentium 或以上的CPU,16MB 或更多RAM、20M 以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP 等操作系统。掌握这一软件的使用对于使用51 系列单片机的爱好者来说是十分必要的,如果你使用C 语言编程,那么Keil 几乎就是你的不二之选(目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不使用C 语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。1. 系统概述Keil C51 是美国Keil Software 公司出品的51 系列兼容单片机C 语言软件开发系统,与汇编相比,C 语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C 来开发,体会更加深刻。KeilC51 软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows 界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51 生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。下面详细介绍Keil C51 开发系统各部分功能和使用。2. Keil C51 单片机软件开发系统的整体结构C51 工具包的整体结构中,其中uVision 与Ishell 分别是C51 for Windows和for Dos 的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE 本身或其它编辑器编辑C 或汇编源文件。然后分别由C51 及A51 编译器编译生成目标文件(.OBJ)。目标文件可由LIB51 创建生成库文件,也可以与库文件一起经L51 连接定位生成绝对目标文件(.ABS)。ABS文件由OH51 转换成标准的Hex 文件,以供调试器dScope51 或tScope51 使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM 中。3. 采用KEIL 开发的89c51 单片机应用程序一般需要以下步骤:(1) 在 uVision 集成开发环境中创建新项目(Project),扩展文件名为.UV2,并为该项目选定合适的单片机CPU 器件(本设计采用ATMEL 公司下的AT89C51)(2)用uVision 的文本编辑器编写源文件,可以是汇编文件(.ASM),也可以使C语言文件(扩展名.C),并将该文件添加到项目中去。一个项目文件可以包含多个文件,除了源程序文件外,还可以是库文件、头文件或文本说明文件。(3)通过uVision 2 的相关选择项,配置编译环境、连接定位器以及Debug 调试器的功能。(4)对项目中的源文件进行编译连接,生成绝对目标代码和可选的HEX 文件,如果出现编译连接错误则返回到第2 步,修改源文件中的错误后重构整个项目。(5)对没有语法错误的程序进行仿真调试,调试成功后将HEX 文件写入到单片机应用系统的ROM 中。另利用 isis 仿真软件进行全面的仿真测试,截图如下3.结果分析基于以上制作出来的计算器能进行基本的四则运算,仿真软件中的功能实现成功。实际效果图如下图所示,包括正反面以及运算界面。5.收获与体会通过这次电子综合实践的学习,着重培养了我独立思考、综合运用所学有关知识的能力,能更好的巩固单片机、c 语言、模拟电路、数字电路学习的内容6.参考文献1 胡汉才. 单片机原理及接口技术M. 清华大学出版社2 华成英. 模拟电子技术基础M. 高等教育出版社3 阎石. 数字电子技术基础. 高等教育出版社软件程序:/p1口接矩阵键盘#include #include #include #include #include #define uchar unsigned char#define uint unsigned intsbit pinRS= P26; /复位端 sbit pinRW= P25; /写数据端sbit pinE= P27;/使能端/#include LCD1602.hvoid shortdelay(uchar i)/短延时for(;i0;i-);/长延时void longdelay(uint i)uint j;for(;i0;i-)for(j=100;j0;j-);/延时程序void delay(int i)int j;for(;i0;i-)for(j=0;j100;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(P1&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;elseP1=0xfd;delay(1);if(P1&0xfd)!=0xfd)switch(P1)case 0xed: key=0x21;flag=1;break;case 0xdd: key=0x22;flag=1;break;case 0xbd: key=0x23;flag=1;break;case 0x7d: key=0x24;flag=1;break;if(flag)goto exit;elseP1=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(flag)goto exit;elseP1=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)/uchar pindata,pinRS,pinRW,pinE;if(i=1) P0=0xff;else P0=0X00;/数据命令选择设置void setRS(bit i)if(i=1) pinRS=1; /RS高电平选择数据寄存器else pinRS=0;/RS低电平选择指令寄存器/读写操作控制void setRW(bit i)if(i=1) pinRW=1; /RW高电平选择读else pinRW=0; /RW低电平选择写/使能信号void setE(bit i)if(i=1) pinE=1;else pinE=0; /下降沿执行/读BF 以及AC 的值uint read_BF_AC()/忙标志位和地址计数器AC命令 BF为1表示忙uint temp;initpindata(1); /初始化setRS(0); /数据命令选择设置setRW(1); /读写操作控制设置setE(1); /以上是忙标志设置shortdelay(1);temp=P0;shortdelay(10);setE(0);/E下降沿开始执行return(temp);/判忙bit statuscheck()return(bit)(read_BF_AC()&0x80); /判最高位是否为1 /写指令函数void writeinstruc(uint instruc)while(statuscheck();initpindata(0);setRS(0);setRW(0); /00写指令setE(0);P0=instruc;/short delay(1);setE(1);shortdelay(10);setE(0); /下降沿开始执行/写数据到RAMvoid writedata(uint data1)initpindata(0);setRS(1);setRW(0); /10写数据setE(0);P0=data1;setE(1);shortdelay(10);setE(0);/下降沿开始执行/从RAM 中读数据函数uint readdata(void)uint temp;initpindata(1);setRS(1);setRW(1); /数据寄存器读出setE(1);shortdelay(1);temp=P0;shortdelay(10);setE(0); /下降沿开始执行return(temp);/显示程序 X 为行号,Y 为列号,date 为要显示的数据void dispcharacter(int x,uint y,uint data1)uint temp;while(statuscheck(); /判忙temp=y&0x0f;/不忙此语句执行 高四位被置0x&=0x01; /高七位被置0if(x) temp|=0x40;writedata( data1);/setDDRAM_Add(temp);/LCD 初始化void initLCD()writeinstruc(0x01);/LCD 复位函数writeinstruc(0x06);/增量方式,不移位writeinstruc(0x0c);/显示开,光标关,闪烁关writeinstruc(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,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);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(string1,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: dispcharacter(0,i,3);i+;break;case 0x34: dispcharacter(0,i,-);i+;break;case 0x41: writeinstruc(0x01); break;case 0x42: dispcharacter(0,i,0);i+;break;case 0x44: dispcharacter(0,i,+);i+;break;case 0x43: dispcharacter(0,i,=);i+;/上面为各个运算符号所对的按键m=result/10000; /

温馨提示

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

评论

0/150

提交评论