基于AT89C51单片机的简易计算器的设计

时间:2020-07-01 14:40:20 浏览量:

 

  毕 业 设 计

 题目

 简易计算器的制作

  专

 业

  通信工程

 目

 录

 摘 要 1

 Abstract 2

 第一章 绪论 3

 1.1

 开发背景 3

 1.2

 设计目的 4

 第二章 方案论证与设计 5

 2.1 设计指标 5

 2.2 方案论证与设计 5

 第三章 硬件模块介绍 8

 3.1 主控及运算模块 8

 3.2 显示模块 13

 3.3 输入模块 16

 第四章 软件设计 18

 4.1 主程序的设计 18

 4.2 键盘扫描的程序设计 19

 4.3 显示模块程序设计 21

 4.4 运算模块程序设计 23

 第五章 仿真及调试 24

 结束语 25

 致

 谢 26

 参考文献 27

 附录一:硬件实物图 28

 附录二:系统程序 29

 附录三:任务书 40

 附录四:开题报告 42

 附录五:外文原文与外文译文 47

 基于AT89C51单片机的简易计算器的设计

 摘 要

 计算器在人们的日常生活中是较为常见的电子产品之一。初期的计算器仅仅能实现简单的加减乘除运算,而现在人们所广泛使用的科学计算器功能已不再停留于此,除了加减乘除运算外,它还能进行乘方,开方,指数,对数,三角函数,反三角函数等的存储和运算。而且计算器的种类和模式也在逐渐多样化,如使用太阳能电池的计算器,使用ASIC制作的计算器,使用纯软件设计的计算器和被集成到手机、平板电脑等电子产品中的计算器。可以说计算器还正在发展之中而且还将有很大的发展空间,未来必将出现功能更加强大的计算器。基于这样的理念,本设计以AT89C51单片机为核心,以软硬件结合的方式设计了一个简易计算器。该计算器以4*4矩阵键盘为输入方式,可以进行4位带符号数的加减乘除运算,并在LCD1602液晶显示器上显示操作过程。该论文详细介绍了整个系统的硬件组成结构、工作原理和软件设计思想与流程。

  关键词:

 计算器

 AT89C51

 LCD1602

 矩阵键盘

 Simple calculator designed based on AT89C51

 Abstract

 The calculator in People's Daily life is one of the most common electronic products. Early computing calculator can only implement simple addition, subtraction, multiplication, and division, but now the scientific calculator which widely used by people’s functions are no longer stay, operation besides addition, subtraction, multiplication, and division, it can also power, prescribe, index, logarithmic, trigonometric function, inverse trigonometric function such as storage and computation. And the types of the calculator and pattern has also been gradually diversified, such as using solar calculator, using ASIC production calculator, using pure software design of the calculator and be integrated into mobile phones, tablets, and other electronic products in the calculator. We can say that calculators are under development and will also have very big development space, the future will appear more powerful calculators. Based on this idea, I design a simple calculator which use AT89C51 single-chip microcomputer as the core, and use the way that combine the hardware and software. The calculator use 4 * 4 matrix keyboard as input mode, it can carry out four signed several operations of addition,subtraction, multiplication, and division, and it display operation process on the LCD1602 . The paper introduces in detail the system structure, working principle of the hardware and the software design idea and process.

 key words:

  calculator

 AT89C51

 LCD1602

 matrix keyboard

 第一章 绪论

 1.1

 开发背景

 计算器是日常生活中比较常见的电子产品之一,它已在数十年间遍布千家万户。计算器(calculator ;counter)一般是指“电子计算器”,该名词由日文传入中国。它是能进行数学运算的手持机器,拥有集成电路芯片,但结构简单,比现代电脑结构简单得多,可以说是第一代的电子计算机(电脑),且功能也较弱,但较为方便与廉价,可广泛运用于商业交易中,是必备的办公用品之一。除显示计算结果外,还常有溢出指示、错误指示等。对于计算器的百年历史,1946年2月15日,在美国宾夕法尼亚大学,世界上第一台电子计算器ENIAC正式投入了运行。在隆重的揭幕仪式上,ENIAC表演了它的“绝招”:在1秒钟内进行5000次加法运算;在1秒钟内进行500次乘法运算。这比当时最快的电器计算器的运算速度要快1000多倍。全场起立欢呼,欢呼科学技术进入了一个新的历史发展时期。 

 电子计算器不仅是一种工具,它与其它的工具都不相同:电子计算器是人脑的一个侧面的延伸。因为电子计算器不仅具有非凡的计算能力,速度之快令人望尘莫及,而且还能够仿真人的某些思维功能,按照一定的规则进行逻辑判和逻辑推理,代替人的部分脑力劳动。1976年,数学家凭借电子计算器去证明四色定理,“依靠机器完成了人没有能够完成的事情”,轰动了整个国际数学界。 

 随着社会的发展和科学技术的进步,电子产品变得越来越先进,功能变得越来越强大,集成化程度也变得越来越高,其更新速度令人吃惊。对于计算器人们也在不断地对它进行改进,然而技术的进步是无止境的,如何让计算器技术更加的成熟,充分利用现有的软件和硬件条件,制作出更加好用的计算器,让我们更方便的使用它,让它更好的为我们的生活服务,始终是当今电子领域的重要研究课题。而另一方面,近年来,单片机以其体积小、价格廉、面向控制等诸多优点,在各种工业控制、仪器仪表、产品、设备的自动化、智能化方面获得了极为广泛的应用。与此同时,单片机系统的可靠性成为人们越来越关注的重要课题。影响系统可靠性的因素是多方面的,如构成系统的各种元器件本身的可靠性、系统本身各部分之间的相互耦合因素等。其中抗干扰性能是系统可靠性的重要指标。

  本设计采用AT89C51芯片和LCD1602液晶显示器,实现了利用单片机来设计一个简易计算器的目的。该计算器允许对四位输入数据进行带符号加减乘除运算

 ,用C语言编写程序驱动整个系统的运行,便于移植和升级。如果所要设计的对象是更为复杂的计算器系统,其实际原理和实现方法与本设计基本相同。本设计关键在于必须非常熟悉单片机的原理与结构,并能熟练的运用51C语言来编写程序,同时还要对整个系统的设计流程有很好的把握,从而将单片机和其他模块完整的衔接。

  在现今的日常生活中,计算器毫无疑问是人们的最重要工具之一,它的身影遍布在社会的各个角落,例如商店,学校等等。所以设计一款简单但却极其实用的计算器具有很大的实际意义,而本文中利用单片机和LCD1602液晶结合设计的计算器充分利用了以上所讲的单片机的诸多优点,具有很好的实用价值。

  1.2

 设计目的

 本设计旨在进一步掌握单片机理论知识,理解嵌入式单片机系统的硬软件设计,加强对实际应用系统设计的能力。通过本设计的学习,使我掌握单片机程序设计和微机接口应用的基本方法,并能综合运用本科阶段所学软、硬件知识分析实际问题,提高解决毕业设计实际问题的能力,为单片机应用和开发打下良好的基础。

  第二章 方案论证与设计

 2.1 设计指标

 本次设计的简易计算器的基本性能如下:

  1、 能够进行4位整数的加减乘除运算(除法的结果中可以有小数)。

  2、 能够将计算结果输出到LCD1602液晶显示屏中以便于观察。

  3、 能够实现清除数据的功能。

  4、 能够进行错误提示(比如当输入数据除数为0时会在LCD1602上显示error)。

  2.2 方案论证与设计

 根据功能和以上对设计指标的描述,本系统采用AT89C51单片机为控制芯片,LCD1602为显示芯片,辅以其他电路所需基本器件,完成对简易计算器的设计。具体的设计考虑如下:

  1、 由于本次所要设计的是一个简易计算器, 要求能够进行4位整数的加减乘除运算,功能较为简单,所编写程序不会太长,故使用AT89C51单片机即可满足需求。

  2、 由于LCD1602液晶显示器相比于8段数码管而言,拥有更大的显示量,更好的显示效果,更全面的显示字符类型,因此这里选用LCD1602液晶显示器作为显示模块。

  3、 根据计算器的功能要求,键盘包括数字键(0-9)、符号键(+、—、*、÷)、清除键(CE)和等号键,故需要16个按键(4*4键盘)。

  系统模块图如图2.1所示:

  4*4矩阵键盘(输入模块)

 LCD1602液晶显示器(显示模块)

 AT89C51单片机

 运算模块(编程实现)

  图2.1

 系统模块图

 为了更好的实现系统的功能,硬件电路的设计应该遵循以下原则:

  1、优化硬件电路

 采用软件设计与硬件设计相结合的方法;尽管采用软件来实现硬件系统的功能时,也许响应时间会比单纯使用硬件时长,而且还要占用微处理器(MCU)的时间;但是,用软件实现硬件的功能可以简化硬件结构,提高电路的可靠性。所以,在设计本系统得时候,在满足可靠性和实时性的前提下,尽可能的通过软件来实现硬件功能。

  2、可靠性及抗干扰设计

 根据可靠性设计理论,系统所用芯片数量越少,系统的平均无故障时间越长。而且,所用芯片数量越少,地址和数据总线在电路板上受干扰的可能性也就越小。因此,系统的设计思想是在满足功能的情况下力争使用较少数量的芯片。

  3、灵活的功能扩展

 功能扩展是否灵活是衡量一个系统优劣的重要指标。一次设计往往不能完全考虑到系统的各个方面,系统需要不断完善以及进行功能升级。进行功能扩展时,应该在原有设计的基础上,通过修改软件程序和少量硬件完成。对于本系统而言,就是要求在系统硬件不变的情况下,能够通过修改软件程序,完成功能的升级和扩展。

  而在软件方面根据设计需要我们可以采用自上而下的程序设计方法,这种方法先从主程序开始设计,之后再编制各从属程序和子程序,层层细化逐步求精,最后完成一个复杂程序的设计。这种设计方法比较符合人们的日常思维,但是缺点是一级的程序错误将会对整个程序产生影响。计算器的程序流程图如图2.2所示:

  结束(断开电源)

 是

 否

 按下CE键

 输入数据

 LCD显示

 按下功能键

 计算结果

 LCD显示

 是否结束

 按下功能键

 LCD显示

 输入数据

 LCD显示初始值

 启动计算器

 (接通电源)

  图2.2

 程序流程图

 第三章 硬件模块介绍

 3

 3.1

  主控及运算模块

 AT89C51单片机是将微处理器(CPU),数据存储器(RAM)、程序存储器(4KB Flash ROM)、并行I/O 口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)这些一台计算机所需要的基本功能部件集成在了一块芯片上,它靠程序运行,并可以修改程序以通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过单片机及其程序可以实现高智能,高效率,以及高可靠性!所以设计采用单片机作为该计算器的主控及运算模块,可以很好的实现控制和运算功能。

  AT89C51单片机引脚图如图3.1,其实际外观图如图3.2:

  图3.1

 AT89C51单片机引脚图

 图3.2

  AT89C51单片机实际外观图

 其各引脚功能如下:

  一、 电源引脚

 1、 Vcc:

 正电源脚,接+5V电源。

  2、 GND:

 接地端。

  二、 外接晶体引脚

 外接晶体引脚图如图3.3所示:

  图3.3

 外接晶体管引脚

 1、 XTAL1:片内振荡器反相放大器和时钟发生器电路的输入端。使用片内振荡器时,该引脚连接外部石英晶体和微调电容。

  2、 XTAL2:

  片内振荡器反相放大器和时钟发生器电路的输出端,当使用片内振荡器时,该引脚连接外部石英晶体和微调电容。当采用外部时钟源时,引脚XTAL1接收外部时钟振荡器的信号,XTAL2悬空。

  内部方式时,时钟发生器对振荡脉冲二分频,比如晶振为12MHz,时钟频率就为6MHz。晶振的频率可以在1MHz-24MHz内选择,而电容则取30PF左右。

  型号同样是AT89C51的芯片,在其后面还会有频率编号,有12,16,20,24MHz可选,在购买和选用时需注意。比如AT89C51 24PC就是最高振荡频率24MHz,40P封装的普通商用芯片。

  三、 控制引脚

 1、 RST

 复位信号输入端,高电平有效。当单片机运行时,在此引脚加上持续时间大于2个机器周期(24个时钟振荡周期)的高电平时,就可以对单片机完成复位操作且只要这个脚保持高电平,51芯片便循环复位。在单片机复位后P0-P3口均置1,引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。当RST脚电平由高变低时,单片机开始从ROM的0000H处开始运行程序。

  在单片机正常工作时,此引脚应为<=0.5V的低电平。

  比较常用的复位电路如图3.4所示。

  图3.4 复位电路图

 复位操作并不会对内部RAM有影响。当AT89C51通电后,时钟电路开始工作,在RST引脚上出现24个时钟周期以上的高电平,系统便初始复位,也就是说单片机开始重新执行程序代码。AT89C51的复位方式可以是自动复位,也同样可以是手动复位,如图3.5所示。

  图3.5 复位方式

 2、 EA/Vpp

 EA为外部程序存储器访问控制端。

  当EA引脚为高电平时,单片机读片内程序存储器,但在PC值超过0FFFH时,将自动转向访问外部程序存储器中的程序。

  当EA引脚为低电平时,对程序存储器的读操作只限定在外部程序存储器,地址为0000H~FFFFH,片内的4KBFlash程序存储器不起作用。

  Vpp为该引脚的第二功能,为编程电压输入端。对于89C51,在片内Flash固化编程时,加在Vpp引脚的编程电压为+5V或+12V。在编程校验时,该引脚接Vcc。

  3、 ALE/PROG

 ALE为低8位地址锁存允许信号。在系统扩展时ALE的负跳沿将P0口发出的低8位地址锁存在外接的地址锁存器中,然后P0口再作为数据端口,以实现P0口的低8位地址和数据的分时传送。

  PROG为该引脚的第二功能,在对片内Flash存储器编程时,该引脚作为编程脉冲输入端。

  4、 PSEN

 片外程序存储器的读选通信号。在单片机读外部程序存储器时,此引脚输出脉冲的负跳沿作为读外部程序存储器的选通信号。此引脚接外部程序存储器的OE端;在访问外部RAM时,PSEN信号无效。

  四、 I/O引脚

 1) P0口:8位,漏极开路的双向I/O口。

  当89C51扩展外部存储器及I/O接口芯片时,P0口作为地址总线(低8位)及数据总线的分时复用端口。

  P0口也可作为通用的I/O口使用,但需加上拉电阻,这时为准双向口。当作为普通的I/O口输入时,应先向端口的输出锁存器写入1。P0口可驱动8个LS型的TTL负载。

  2) P1口:8位,准双向I/O口,具有内部上拉电阻。

  P1口是专为用户使用的准双向I/O口,当作为普通的I/O口输入时,应先向端口的输出锁存器写入1,P1口可驱动4个LS型TTL负载。

  3) P2口:8位,准双向I/O口,具有内部上拉电阻。

  当89C51扩展外部存储器及I/O口时,P2口可输出高8位地址。

  P2口也可作为普通的I/O口使用。当作为普通的I/O口输入时,应先向端口的输出锁存器写入1。P2口可驱动4个LS型TTL负载。

  4) P3口:8位,准双向I/O口,具有内部上拉电阻。

  P3口可作为通用I/O口使用,当作为通用的I/O口输入时应先向端口的输出锁存器写入1。P2口可驱动4个LS型TTL负载。

  P3口还可提供第二功能。其第二功能定义如下表:

  表3.1

 P3口第二功能定义

 端口引脚

 第二功能

 P3.0

 RXD(串行输入口)

 P3.1

 TXD(串行输出口)

 P3.2

 /INT0(外部中断0)

 P3.3

 /INT1(外部中断1)

 P3.4

 T0(记时器0外部输入)

 P3.5

 T1(记时器1外部输入)

 P3.6

 /WR(外部数据存储器写选通)

 P3.7

 /RD(外部数据存储器读选通)

 3.2 显示模块

 在本设计中使用LCD1602液晶显示器作为显示模块。其实际外观如图3.6所示:

  图3.6

  LCD1602实际外观图

 LCD1602模块内部自带字符发生存储器(CGROM),字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母

 “A”的代码是(41H),显示时模块把代码41H发给液晶模块,我们就能在液晶上看到字母“A”。

  1602液晶模块内部的控制器共有11条控制指令,丰富的指令可以完成液晶的时序控制、工作方式式设置和数据显示等。

  采用的LCD1602液晶模块是标准16针插座,接口电路如图3.7所示:

 图3.7

  LCD1602接口接口电路

 LCD1602的引脚功能和指令分别如表3.1和表3.2所示:

  表3.2

  LCD1602引脚功能

 第1脚

 VSS为地电源

 第2脚

 VDD接5V正电源

 第3脚

 V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。

  实际电路中采用2K电阻到地,比较理想。

  第4脚

 RS为寄存器选择,高电平选择数据寄存器、低电平选择指令寄存器。

  第5脚

 RW为读写信号线,高电平时进行读操作,低电平时进行写操作。

  当RS和RW共同为低电平时

 (00)可以写入指令或者显示地址;

 当RS为低电平RW为高电平时(01)可以读入忙信号;

 当RS为高电平RW为低电平时(10)可以写入数据。

  第6脚

 E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

  第7~14脚

 D0~D7为8位双向数据线。

  第15~16脚

 背光阳极和背光阴极。

  表3.3

  LCD1602 指令表

 指令1

 清显示

  指令码01H, 光标复位到地址00H位置;

 指令2

 光标复位

  指令码02H, 光标返回到地址00H位置 ;

 指令3

 光标和显示模式设置

  I/D位 → 光标移动方向,高电平右移,低电平左移;

 S

 位 → 屏幕上所有文字是否左移或者右移,高电平有效,低电平无效;

 指令4

 显示开关控制

  D

 位 → 控制整体显示的开与关,高电平表示开显示,低电平表示关显示;

 C

 位 → 控制光标的开与关,高电平表示有光标,低电平表示无光标;

  B

 位 → 控制光标是否闪烁,高电平闪烁,低电平不闪烁 ;

 指令5

 光标或显示移位

 S/C位 → 高电平时移动显示的文字,低电平时移动光标

 指令6

 功能命令设置

 DL位---高电平时为4位数据总线,低电平时为8位总线;

 N—位低电平时为单行显示,高电平时为双行显示;

 F—位低电平时显示5x7的点阵字符,高电平时为5x10的点阵字符;

 指令7

 字符发生器RAM地址设置

 指令8

 DDRAM地址设置

 指令9

 读忙信号和光标地址

 BF位 → 为忙标志位,高电平表示忙,此时模块不能接收命令或者数据

 指令10

 写数据

 指令11

 读数据

 LCD的特点:

  1、低压微功耗;

 2、平板型结构;

 3、被动显示型(无眩光,不刺激人眼,不会引起眼睛疲劳);

 4、显示信息量大(因为像素可以做得很小);

 5、易于彩色化(在色谱上可以非常准确的复现);

 6、无电磁辐射(对人体安全,利于信息保密);

 7、长寿命(这种器件几乎没有什么劣化问题,因此寿命极长,但是液晶背光寿命有限,不过背光部分可以更换)。

  3.3 输入模块

 计算器输入数字和其他功能按键要用到很多按键,假如采用独立按键的方式,这种情况下,编程会比较简单,但却会占用大量的I/O 口资源,所以在很多情况下都不采用这种方式。为此,我们引入矩阵键盘,即采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每一个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式的键盘结构能够有效地提高单片机系统中I/O 口的利用率。

  矩阵键盘的按键设在行列线交点上,键盘的行线或列线接上正电。

 假如键盘的行线接上正电,则无按键按下时,行线处于高电平状态;当有按键按下时,行线电平状态将由与此行线相连的列线决定。列线的电平如果为低,则行线电平为低;列线电平如果为高,则行线的电平也为高,这一点是识别行列式键盘按键是否按下的关键所在。由于行列式键盘中行列线为多键共用,各按键均影响该键所在行和列的电平,因此各按键彼此将相互发生影响,所以必须将行、列线信号配合起来并做适当的处理,才能确定闭合键的位置。

  本设计中所用到的键盘电路如图3.8所示:

  图3.8 键盘电路

 综合以上模块的设计介绍,可以确定系统硬件的设计。其设计图如图3.9所示:

  图3.9

 系统硬件原理图

 第四章 软件设计

 简易计算器的程序主要包括以下功能模块:

 1、 按键扫描模块。

 2、基于LCD液晶显示屏的显示模块。

  3、运算模块。

 5、 主模块。

 6、

 4

 4.1 主程序的设计

 主程序通过调用函数实现对整个程序的控制,包括对LCD1602液晶的初始化,对输入按键判断,进行加减乘除运算,输出计算结果等。

 其程序流程图如图4.1所示:

  图4.1

  主程序流程图

 4.2

  键盘扫描的程序设计

 按键的识别分为扫描法和线反转法两种。扫描法要逐列扫描查询,当被按下的键处于最后一列时,则要经过多次扫描才能最后获得此按键所处的行列值。而线反转法则很简练,无论被按键是处于第一列或最后一列,均只需经过两步便能获得此按键所在的行列值。由于线反转法更加简单实用,故本设计采用线反转法来完成键盘扫描程序的设计。线反转法的两个具体操作步骤如下:

  1. 让行线编程为输入线,列线编程为输出线,并使输出线输出为全低电平,则行线中电平由高变低的所在行为按键所在行。

  2. 再把行线编程为输出线,列线编程为输入线,并使输出线输出为全低电平,则行线中电平由高变低的所在列为按键所在列。

  在键盘扫描程序中当数字键按下则将相应的数字送入缓存区,当功能键按下则执行相应的程序。

  另外,键盘的工作方式有三种,分别是编程扫描,定时扫描和中断扫描。其中,编程扫描只有当单片机空闲时,才调用键盘扫描子程序,反复扫描键盘,等待用户从键盘上输入命令或数据,来响应键盘的输入请求。定时扫描即每隔一定的时间对键盘扫描一次。中断扫描只有在键盘有键按下时,才执行键盘扫描程序并执行该按键功能程序,如果无键按下,单片机将不理睬键盘,这种方式可进一步提高单片机扫描键盘的工作效率。

  由于本设计中单片机除了键盘扫描、计算和LCD显示控制外并无其它工作,所以用简单的编程扫描方式更为合适。

  其流程图如图4.2所示:

  开始

 赋按键接口初值

 有键按下吗?

 N

  Y

 反转按键接口初值

 判断闭合键盘键号

 计算键号

 返回键号

 结束

  图4.2

 按键扫描程序流程图

 键盘扫描程序的主体如下:

  short temp1,temp2,temp,a=0xff;

  P1=0xf0;

 /* 输入行值(或列值) */

  LCD_Delay_ms(20);

 /* 延时 */

  temp1=P1;

 /* 读列值(或行值) */

  P1=0xff;

  LCD_Delay_ms(20);

 /* 延时程序 */

  P1=0x0f;

 /* 输入列值(或行值) */

  LCD_Delay_ms(20);

 /* 延时 */

 temp2=P1;

 /* 读行值(或列值) */

  P1=0xff;

  temp=(temp1&0xf0)|(temp2&0xf); /* 将两次读入数据组合 */

 4.3 显示模块程序设计

 显示模块程序需要首先要对显示模块进行初始化,然后向LCD1602液晶写入指令,最后向LCD1602液晶写入数据。因此其需要三个函数来完成该程序的设计,三个函数分别如下:

  1、 LCD1602液晶初始化函数;

 2、 写入指令函数;

 3、 写入数据函数;

 4、 指定显示器坐标写入字符(字符串)函数。

  其中LCD1602液晶初始化函数包括设置显示类型、光标、清屏、开显示、显示位置的首地址和初始显示数据等等。其程序主体如下:

  wela=0;

 //写液晶

  lcden=0;

  //使能1602

  write_com(0x38);

  //8 位总线,双行显示,5X7 的点阵字符

  LCD_Delay_us(100);

  //延时100us

  write_com(0x0c);

  //开显示,无光标,光标不闪烁

  write_com(0x06);

  //光标右移动

  write_com(0x01);

  //清屏

  write_com(0x80);

  //DDRAM 地址归0

 显示模块程序流程图如图4.3所示:

  开始

 LCD1602液晶初始化

 判断数据在LCD1602上要显示的位置

 向LCD1602液晶写入指令

 向LCD1602液晶写入数据

 结束

  图4.3

 显示模块程序流程图

 4.4 运算模块程序设计

 运算模块的功能是利用单片机计算输入数据运算的结果,这个功能运用C语言中的加减乘除运算符即可实现。特别要注意的是在运算除法时除数不能为零,即除数为零时程序要报错(在LCD1602液晶显示器上显示error!)。

  其程序主体如下:

  switch(x)

 /*功能键选择*/

  {

  case 1:data_c=data_a+data_b;break;

  //加

 /* + S=1 */ /* 数值转换函数 */

  case 2:if(data_a>=data_b){data_c=data_a-data_b;} /* - S=2 *///减

  else{data_c=data_b-data_a;W_lcd(5,1,'-');} //负数符号

 break;

 case 3:data_c=(data_a*data_b);break;

 /* * S=3 *///乘

 case4:if(data_b==0){LCD_Write_String(0,1,"Error !");}else{data_c=(data_a*10000)/data_b;}break;

 /* / S=4 *///除//溢出时显示错误

 case 0:break;

  }

  第五章 仿真及调试

 在本设计中使用keil C软件对程序进行编译,然后再将其编译连接后所生成的执行文件放入已搭建好的proteus仿真图中的AT89C51单片机上进行仿真。其仿真图如图5.1所示:

  图5.1

 简易计算器仿真图

 首先输入第一个数据,然后再输入功能键(+,-,*,/)和另一个数据,最后按等号键就可以看到LCD显示屏的第二行显示出相应的结果。如上图中输入“222/5=”,就在第二行显示出结果“44.4000”,从这个结果可以看出,当计算结果为小数时,计算器能够显示小数,小数位为四位。另外,在计算除法时,如果输入除数为0,可以看到LCD的第二行显示出“Error 0.0000”的字样。

  结束语

 在硬件的制作过程中我走了好多的弯路,主要是在系统还没有设计很有把握就开始动手制作了。后来发现与设计的要求还有偏差,反复的改过了几次,浪费了大量的时间和体力。感受到设计人员要有耐心,要认真的从要求开始研究。软件的编写过程中费了很大的力气,因为软件的编写要求很高,要很细心,一不小心就会调用错误,很深刻的体会到作为软件编程人员是绝不能粗心大意的。一个程序的完成的速度和质量高低与细心与否有着很大联系。编程时,我充分使用了结构化的思想。这样因为语句较少,程序调试比较方便,功能模块可以逐一的调试,充分体现了结构化编程的优势。当每个模块都完成时,将其功能加到一起就完成了整体的设计。

  致

 谢

 本次毕业设计得到导师张帆老师的热心指导,在这里对张帆老师表示最衷心的感谢。张帆老师平易近人,对学生的设计进度和学习很关心。在毕业设计的前期,首先给我们介绍了不少有用的资料和书籍;在硬件设计等方面给予悉心的指导;在调试的过程中张帆老师给每个出现的问题给予及时的指导。在写毕业设计论文的阶段,张帆老师让我们提前给他评审,不论内容字体,还是格式上的问题都一一指出。待人平和、工作认真、治学严谨他的给我留下很深刻的印象。更重要的是,他善于与学生沟通,不仅在毕业设计上给我及时的指导,更为我大学最后阶段的学习提出了许多宝贵的意见。这一切都在潜移默化地影响着我,为我以后进入工作岗位树立了良好的榜样。

  最后向所有帮助和关心过我的人表示衷心感谢!

 参考文献

 [1] 张毅刚 彭喜元. 单片机原理与应用设计[M]. 北京:电子工业出版社

 [2] 张义和 王敏男 许宏昌等. 例说51单片机(第3版)[M]. 北京:人民邮电出版

  [3] 恰汗·合孜尔.

 C语言程序设计(第三版)[M]. 北京:中国铁道出版社,2010年第三版

 [4] 陈雷. C51单片机应用实训[M]. 北京:中国电力出版社,2011年第一版

 [5] 张欣 孙宏昌 尹霞. 单片机原理与C51程序设计基础教程[M]. 北京:清华大学出版社,2010年第一版

 [6] 王巧芝 郑锋 刘瑞国等. 51单片机开发应用从入门到精通[M]. 北京:中国铁道出版社

 [7] 张靖武 周灵杉.单片机系统的PROTEUS设计与仿真[M].北京:北京电子工业出版社

 [8] 靳达 求是科技.单片机应用系统开发实例导航[M].:人民邮电出版社,2006

 [9] 刘守义. 单片机应用技术[M].:西安电子科技大学出版社,2001

 [10] 林志琦.基于PROTEUS的单片机可视化软硬件仿真[M].北京:北京航空航天大学出版社,2006

 [11] 胡汉才.单片机原理及接口技术.清华大学出版社,1996

 [12] 徐江海.单片机实用教程[M].北京:机械工业出版社,2007.

 [13] 肖洪兵. 跟我学用单片机. 北京:北京航空航天大学出版社,2002.8

 [14] 夏继强. 单片机实验与实践教程. 北京:北京航空航天大学出版社, 2001

 [15] 谭浩强. C语言程序设计[M].北京:清华大学出版社,2000.

 [16] 刘福基. C语言程序设计与实训教程[M].北京:科学出版社,2004.

 [17] 张磊. C语言程序设计[M].北京:高等教育出版社,2005.

 [18] 严桂兰. C语言程序设计[M].厦门:厦门大学出版社,2006

 附录一:硬件实物图(图6.1和图6.2):

  图6.1

 正面图

  图6.2

 背面图

 附录二:系统程序

 #include<reg51.h>

 #define uint unsigned int

 #define uchar unsigned char

 sbit rs=P2^7;

 //指令or数据

 sbit wela=P2^6;

 //读or写

 sbit lcden=P2^5;

 //使能信号

 uchar code table[]= "

 ";

 long

 int data_a,data_b;

 //第一个数和第二个数

 long

 int data_c;

  //计算结果

 uchar dispaly[10];

  //显示缓冲

 //************************************************************************/

 // 延时t us函数

 //************************************************************************/

 void LCD_Delay_us(unsigned int t)

 {

  while(t--);

  //t=0,退出

 }

 //************************************************************************/

 // 延时t ms函数

 //************************************************************************/

 void LCD_Delay_ms(unsigned int t)

 {

  unsigned int i,j;

  for(i=0;i<t;i++)

  //执行t次循环

  for(j=0;j<113;j++)

  //执行113次循环

  ;

 }

 //************************************************************************/

 // 1602液晶写指令

 //************************************************************************/

 void write_com(uchar com)

  //1602液晶写指令

 {

  rs=0;

  //写指令

  lcden=0;

 //使能1602

 P0=com;

  //写入指令com

  LCD_Delay_ms(1);

 //延时1ms

  lcden=1;

 //使能1602

  LCD_Delay_ms(2);

 //延时2ms

  lcden=0;

  //使能1602

 }

 //************************************************************************/

 // 1602液晶写数据

  //************************************************************************/

 void write_date(uchar date) //1602液晶写数据

 {

  rs=1;

 //写数据

  lcden=0;

  //使能1602

 P0=date;

  //写入数据date

  LCD_Delay_ms(1);

  //延时1ms

  lcden=1;

  //使能1602

  LCD_Delay_ms(2);

  //延时2ms

  lcden=0;

 //使能1602

 }

 //************************************************************************/

 // 指定x,y写入字符函数

 //************************************************************************/

  void W_lcd(unsigned char x,unsigned char y,unsigned char Data)

 {

  if (y == 0){write_com(0x80 + x);}

  //第一行

 else{write_com(0xc0 + x);}

 //第二行

 write_date( Data);

 //写入数据

  }

  //指定x,y写入字符串函数

  void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)

 {

 if (y == 0){write_com(0x80 + x);}

  //第一行

  else{write_com(0xC0 + x);}

 //第二行

  while (*s)

 //

 {write_date( *s); s++;}

 //写入数据

  }

 //************************************************************************/

 // 初始化液晶,及画面初始化

  //************************************************************************/

 void init_lcd(void)

 //初始化液晶,及画面初始化

 {

  wela=0;

 //写液晶

  lcden=0;

  //使能1602

  write_com(0x38);

  //8 位总线,双行显示,5X7 的点阵字符

  LCD_Delay_us(100);

  //延时100us

  write_com(0x0c);

  //开显示,无光标,光标不闪烁

  write_com(0x06);

  //光标右移动

  write_com(0x01);

  //清屏

  write_com(0x80);

  //DDRAM 地址归0

 }

 //************************************************************************/

 //

 反转法键盘扫描

  //************************************************************************/

 short keycheckdown()

 /* 反转法键盘扫描 */

 {

  short temp1,temp2,temp,a=0xff;

  P1=0xf0;

 /* 输入行值(或列值) */

  LCD_Delay_ms(20);

 /* 延时 */

  temp1=P1;

 /* 读列值(或行值) */

  P1=0xff;

  LCD_Delay_ms(20);

 /* 延时 */

  P1=0x0f;

 /* 输入列值(或行值) */

 LCD_Delay_ms(20);

 /* 延时 */

 temp2=P1;

 /* 读行值(或列值) */

  P1=0xff;

  temp=(temp1&0xf0)|(temp2&0xf); /* 将两次读入数据组合 */

  switch(temp)

  /* 通过读入数据组合判断按键位置 */

  {

 case 0x77 :a=0x0d;break;//

 按键/

  case 0x7b :a=0x0e; break;// 按键=

  case 0x7d :a=0;

 break;// 按键0

 case 0x7e :a=0x0f; break;// 按键CE

 case 0xb7 :a=0x0c;break;//

 按键*

 case 0xbb :a=0x9;break; //

 按键9

 case 0xbd :a=0x8;break; //

 按键8

  case 0xbe :a=0x7;break; //

 按键7

 case 0xd7 :a=0x0b;break;//

 按键-

 case 0xdb :a=0x6;break; //

 按键6

 case 0xdd :a=0x5;break; //

 按键5

 case 0xde :a=0x4;break; //

 按键4

 case 0xe7 :a=0x0a; break;// 按键+

 case 0xeb :a=3;break; //

 按键3

 case 0xed :a=2;break; //

 按键2

 case 0xee :a=1;break; //

 按键1

 default :a=0xff;

 }

  return a;

 /* 返回按键值 */

 }

 void display_a() //显示数据a

 {

  dispaly[3]=data_a%10000/1000;

 //千

  dispaly[2]=data_a%1000/100;

 //百

  dispaly[1]=data_a%100/10;

 //十

  dispaly[0]=data_a%10;

 //个

 write_com(0x80+0);

  //显示数据a

  if(data_a>999){ write_date('0'+dispaly[3]);}

 //显示千位

  if(data_a>99){ write_date('0'+dispaly[2]);}

  //显示百位

  if(data_a>9){ write_date('0'+dispaly[1]);}

  //显示十位

 write_date('0'+dispaly[0]);

 //显示个位

 }

 void display_b() //显示数据b

 {

  write_com(0x80+7); //第一行

  dispaly[3]=data_b%10000/1000;

 //千

  dispaly[2]=data_b%1000/100;

 //百

  dispaly[1]=data_b%100/10;

 //十

  dispaly[0]=data_b%10;

 //个

  if(data_b>999){ write_date('0'+dispaly[3]); }

  //显示千位

  if(data_b>99) { write_date('0'+dispaly[2]); }

 //显示百位

 if(data_b>9)

 { write_date('0'+dispaly[1]); }

  //显示十位

  write_date('0'+dispaly[0]);

 //显示个位

 }

 //计算结果

 void display_c(x)

 {

  if(data_c<100000000&&data_c>-1)//溢出时显示错误

  {

  dispaly[8]=data_c%1000000000/100000000;

  //万万

 dispaly[7]=data_c%100000000/10000000;

  //千万

 dispaly[6]=data_c%10000000/1000000;

 //百万

 dispaly[5]=data_c%1000000/100000;

 //十万

 dispaly[4]=data_c%100000/10000;

  //万

 dispaly[3]=data_c%10000/1000;

  //千

 dispaly[2]=data_c%1000/100;

  //百

 dispaly[1]=data_c%100/10;

  //十

 dispaly[0]=data_c%10;

  //个

  write_com(0x80+6+0x40); //第一行

 if(x==4)

 {

 if(data_c>99999999) { write_date('0'+dispaly[8]);}

 //显示万万

 if(data_c>9999999) { write_date('0'+dispaly[7]);}

  //千万

 if(data_c>999999) { write_date('0'+dispaly[6]);}

 //百万

 if(data_c>99999) { write_date('0'+dispaly[5]);}

 //十万

 write_date('0'+dispaly[4]);

 //万

 write_date('.');

 write_date('0'+dispaly[3]);

 //千

 write_date('0'+dispaly[2]);

 //百

 write_date('0'+dispaly[1]);

 //十

 write_date('0'+dispaly[0]);

 //个

  }

  else{

 if(data_c>99999999) { write_date('0'+dispaly[8]);}

 //显示万万

 if(data_c>9999999) { write_date('0'+dispaly[7]);}

 //千万

 if(data_c>999999) { write_date('0'+dispaly[6]);}

 //百万

 if(data_c>99999) { write_date('0'+dispaly[5]);}

 //十万

 if(data_c>9999)

 { write_date('0'+dispaly[4]);}

 //万

 if(data_c>999)

 { write_date('0'+dispaly[3]);}

 //千

 if(data_c>99)

 { write_date('0'+dispaly[2]);}

 //百

 if(data_c>9)

 { write_date('0'+dispaly[1]);}

 //十

 write_date('0'+dispaly[0]);

 //个

  }

  }

  else

 //溢出时显示错误

  {

 write_com(0x80+11+0x40); //第一行

 write_date('E');

  //显示 E

  write_date('r');

  //显示R

 write_date('r');

  //显示R

 write_date('o');

  //显示O

 write_date('r');

  //显示E

  }

 }

 void eql(uchar x)//加减乘除运算

 {

  switch(x)

 /*功能键选择*/

  {

  case 1:data_c=data_a+data_b;break;

  //加

 /* + S=1 */ /* 数值转换函数 */

  case 2:if(data_a>=data_b){data_c=data_a-data_b;} /* - S=2 *///减

  else{data_c=data_b-data_a;W_lcd(5,1,'-');} //负数符号

 break;

 case 3:data_c=(data_a*data_b);break;

 /* * S=3 *///乘

 case4:if(data_b==0){LCD_Write_String(0,1,"Error !");}else{data_c=(data_a*10000)/data_b;}break;

 /* / S=4 *///除//溢出时显示错误

 case 0:break;

  }

  }

 void main()

 {

  uchar

  key=0xff;

  //键值初始化

  uchar

  n=0;

 //第1个数可以按1-4次

  uchar

  m=5;

 //第2个数可以按1-4次

  uchar

  x=0;

 data_a=0;

  //前一个数

  data_b=0;

  //后一个数

 data_c=0;

  //结果

  init_lcd();

  //1602液晶初始化

  display_a();

 while(1)

  {

 key=keycheckdown();

  /*动态扫描键盘,返回按键对应值,赋给j

 key=0到f */

 if(0xff!=key)

 /*若返回值有效,进入内部处理程序*/

 {

  if(key<10)

 {

  if(n<4){data_a=data_a*10+key;m=5;display_a();}n++;

 //首先输入第一个数

 if(m<4){data_b=data_b*10+key;n=5;display_b();}m++;

 //必须按了+-*/才能输入第二个数

 }

 else

 { switch(key)

 /*功能键选择*/

  {

 case 0xa:n=5;m=0;x=1;W_lcd(5,0,'+');break; //加

 /* + S=1 */ /* 数值转换函数 */

  case 0xb:n=5;m=0;x=2;W_lcd(5,0,'-');break;

 /* - S=2 *///减

 case 0xc:n=5;m=0;x=3;W_lcd(5,0,'*');break;

 /* * S=3 *///乘

 case 0xd:n=5;m=0;x=4;W_lcd(5,0,'/');break;

 /* / S=4 *///除

 case 0xe:n=5;m=5;eql(x);W_lcd(12,0,'=');display_c(x);break;

 /* = */

  case 0xf:n=0;x=0;m=5;

  data_a=0;data_b=0;data_c=0;LCD_Write_String(0,0,table);LCD_Write_String(0,1,table);W_lcd(0,0,'0');break; /*

  C*/

  }

  }

  do{P1=0xf0;}while(P1!=0xf0);

 /*等待按键松开*/

 }

  }

 }

 附录三:任务书

 毕业设计(论文)任务书

 简易计算器的制作

 一、毕业设计(论文)目的

 1、让学生更深入的认识和理解89C51单片机的结构和工作原理,并让其掌握单片机的一些简单开发方法。为以后可能从事的单片机工作打下铺垫。

  2、让学生对LCD1602液晶显示器有一个初步的认识并对其工作原理和各引脚功能加以理解,达到用LCD1602这个显示模块来设计自己想做的东西的目的。

  3、对C语言有个更深入的理解,尤其是结合实际的理解,而不再单单是知道它的语法而已。这无论是对以后可能进行的软件开发还是硬件开发都有好处。

  4、让学生对实际进行一个设计的步骤和注意事项有个认识,从而促使他们学以致用。

  二、主要内容

 以AT89C51单片机为核心,LCD1602液晶显示器为显示模块,4*4矩阵键盘为输入模块来制作一个简易计算器。能实现基本的加减乘除运算,并能将运算结果显示在LCD1602液晶显示器上。

  三、重点研究问题

 1、如何用软件来实现按键的扫描。

  2、如何用软件来驱动LCD1602液晶显示器的数据显示。

  3、如何实现输入数据的加减乘除运算。

  4、如何识别输入错误并进行错误提示。

  四、 主要技术指标或主要参数

 1、能够进行4位整数的加减乘除运算(除法的结果中可以有小数)。

  2、能够将计算结果输出到LCD1602液晶显示屏中以便于观察。

  3、能够实现清除数据的功能。

  4、能够进行错误提示(比如当输入数据除数为0时会在LCD1602上显示error)。

  五、基本要求

 1、设计需制作出实物,而不是只停留在设计方案或者prote仿真图阶段。

  2、设计需由学生独立完成,不得抄袭他人成果(包括简易计算器的制作和其论文撰写。

  3、需对设计中出现的问题不断反思,直至完全弄清原因为止。

  4、对于不懂的地方要耐心查询相关资料,或者虚心请教他人。

  六、其它(包括选题来源)

 选题由指导老师提供。

  附录四:开题报告

 毕业设计(论文)开题报告

                       

 20XX年

 4 月

 1日

 学生姓名

 学号

 专业

  通信工程

 题目名称

 基于单片机的简易计算器设计

 课题来源

 自选

 主

 要

 内

 容

 一、 课题意义

 本次设计是以51单片机为核心应用《单片机应用基础》等所学相关知识及查阅资料,完成简易计算器的设计,以达到理论与实践更好的结合、进一步提高综合运用所学知识和设计的能力的目的。通过本次设计的训练,可以使我在基本思路和基本方法上对基于MCS-51单片机的系统设计有一个更加深入的认识,并具备一定程度的设计能力。

  二、 相关背景

 随着社会的不断发展,科技的不断创新。计算器已在数十年间遍布千家万户,数学家把聪明给了电子计算器,电子计算器将使数学家变得更加明。而且电子计算器不仅是一种工具,它与其它的工具都不相同:电子计算器是人脑的一个侧面的延伸。因为电子计算器不仅具有非凡的计算能力,速度之快令人望尘莫及,而且还能够仿真人的某些思维功能,按照一定的规则进行逻辑判和逻辑推理,代替人的部分脑力劳动。

 计算器的未来是小型化和轻便化,现在市面上出现的使用太阳能电池的计算器,使用ASIC设计的计算器,如使用纯软件实现的计算器等,未来的智能化计算器将是我们的发展方向,更希望成为应用广泛的计算工具。而这次我要做的是用51单片机设计一个简易计算器。这次设计的价值和核心就在于倡导自己把所学知识运用到现实生活,为现实生活服务,把自己的知识转化为实物哪怕是很简单的物件,很简单的功能,但真真切切的让自己感受到创造的快乐,为自己今后的工作做好铺垫,往后通过更多的学习,更多的尝试,把知识的作用真正发挥出来,改变大家的生活。

  三、 可行性分析

 51单片机可以进行加减乘除等运算,并且可以与键盘和LCD1602液晶显示器连接,以供输入数据以及将计算结果直观的显示到LCD1602液晶显示器上,这符合简易计算器的基本特性,因此用51单片机与键盘和LCD1602液晶显示器等配合来设计简易计算器是可行的。

  四、 目标任务分析

 本次设计的简易计算器的基本性能如下:

  1) 能够进行4位整数的加减乘除运算(除法的结果中可以有小数)。

  2) 能够将计算结果输出到LCD1602液晶显示屏中以便于观察。

  3) 能够实现清除数据的功能。

  4) 能够进行错误提示(比如当输入数据除数为0时会在LCD1602上显示error)。

  本设计需要利用Proteus软件实现电路的仿真,完成简易计算器的仿真实现,测试其是否能够完成各种功能然后用硬件电路做出实物。

  采取的主要技术路线或方法

 本简易计算器的设计主要有以下模块:

  1. 键盘扫描识别模块

 l 计算器输入数字以及其他功能按键要用到很多按键,假如采用独立按键的方式,编程当然会很简单,但是问题是键盘会占用大量的I/O 口资源,所以这里不采用这种方式,而采用矩阵键盘的方案。矩阵键盘使用四条I/O 线作为行线,四条I/O 线作为列线,在行线和列线的每一个交叉点上设置一个按键。这样键盘上按键的个数就为4×4共16个。

  计算器的键盘布局如图7.1所示:一般有16个键组成,在单片机中恰好可用一个P口实现16个按键功能。

  图7.1

 键盘布局图

 l 矩阵式键盘的按键识别方法有扫描法和线反转法两种,由于线反转法更加简单实用所以这里采用线反转法来识别按键。

  l 单片机在忙于各种工作任务时,如何兼顾键盘的输入,取决于键盘的工作方式。而键盘的工作方式有三种:编程扫描,定时扫描和中断扫描,由于在这个设计中使用编程扫描比较方便,所以这里采用编程扫描的方式。

  2. LCD1602液晶显示器模块:

  LCD1602显示器如图7.2所示:

  图7.2

 LCD1602液晶显示器

 对LCD1602的编程分为初始化部分和数据显示部分,具体编写时处理,这里不再叙述。

  3. 计算模块

 主要由编程实现,不牵扯硬件电路,这里不加叙述。

  原理图如图7.3所示:

  4*4矩阵键盘(输入模块)

 LCD1602液晶显示器(显示模块)

 AT89C51单片机

 运算模块(编程实现)

 图7.3

 简易计算器模块设计图

 时间安排

 3—5周:查找资料

 6—9周:方案的设计(主要是程序的编写)以及proteus仿真调试

 10周-11周 :购买元器件制作硬件电路并调试

  12周:根据自己前期的设计制作和调试撰写论文

 13周:准备毕业答辩

 指导教师意见

 签 名:

  年   月   日

 备注

 无

 附录五:外文原文与外文译文

 singlechip temperature system

 1.MCU

 A microcontroller (or MCU) is a computer-on-a-chip. It is a type of microprocessor emphasizing self-sufficiency and cost-effectiveness, in contrast to a general-purpose microprocessor (the kind used in a PC).

  The majority of computer systems in use today are embedded in other machinery, such as telephones, clocks, appliances, vehicles, and infrastructure. An embedded system usually has minimal requirements for memory and program length and may require simple but unusual input/output systems. For example, most embedded systems lack keyboards, screens, disks, printers, or other recognizable I/O devices of a personal computer. They may control electric motors, relays or voltages, and read switches, variable resistors or other electronic devices. Often, the only I/O device readable by a human is a single light-emitting diode, and severe cost or power constraints can even eliminate that.

  In contrast to general-purpose CPUs, microcontrollers do not have an address bus or a data bus, because they integrate all the RAM and non-volatile memory on the same chip as the CPU. Because they need fewer pins, the chip can be placed in a much smaller, cheaper package.

  Integrating the memory and other peripherals on a single chip and testing them as a unit increases the cost of that chip, but often results in decreased net cost of the embedded system as a whole. (Even if the cost of a CPU that has integrated peripherals is slightly more than the cost of a CPU + external peripherals, having fewer chips typically allows a smaller and cheaper circuit board, and reduces the labor required to assemble and test the circuit board). This trend leads to design.

  A microcontroller is a single integrated circuit, commonly with the following features:

  central processing unit - ranging from small and simple 4-bit processors to sophisticated 32- or 64-bit processors

  input/output interfaces such as serial ports (UARTs)

  other serial communications interfaces like I²C, Serial Peripheral Interface and Controller Area Network for system interconnect

 peripherals such as timers and watchdog

 RAM for data storage ROM, EPROM, EEPROM or Flash memory for program storage

 clock generator - often an oscillator for a quartz timing crystal, resonator or RC circuit many include analog-to-digital converters .

 This integration drastically reduces the number of chips and the amount of wiring and PCB space that would be needed to produce equivalent systems using separate chips and have proved to be highly popular in embedded systems since their introduction in the 1970s.

  Some microcontrollers can afford to use a Harvard architecture: separate memory buses for instructions and data, allowing accesses to take place concurrently.

  The decision of which peripheral to integrate is often difficult. The Microcontroller vendors often trade operating frequencies and system design flexibility against time-to-market requirements from their customers and overall lower system cost. Manufacturers have to balance the need to minimize the chip size against additional functionality.

  Microcontroller architectures are available from many different vendors in so many varieties that each instruction set architecture could rightly belong to a category of their own. Chief among these are the 8051, Z80 and ARM derivatives.[citation needed]

  A microcontroller (also MCU or µC) is a functional computer system-on-a-chip. It contains a processor core, memory, and programmable input/output peripherals.

 Microcontrollers include an integrated CPU, memory (a small amount of RAM, program memory, or both) and peripherals capable of input and output.

  It emphasizes high integration, in contrast to a microprocessor which only contains a CPU (the kind used in a PC). In addition to the usual arithmetic and logic elements of a general purpose microprocessor, the microcontroller integrates additional elements such as read-write memory for data storage, read-only memory for program storage, Flash memory for permanent data storage, peripherals, and input/output interfaces. At clock speeds of as little as 32KHz, microcontrollers often operate at very low speed compared to microprocessors, but this is adequate for typical applications. They consume relatively little power (milliwatts or even microwatts), and will generally have the ability to retain functionality while waiting

  for an event such as a button press or interrupt. Power consumption while sleeping (CPU clock and peripherals disabled) may be just nanowatts, making them ideal for low power and long lasting battery applications.

 Microcontrollers are used in automatically controlled products and devices, such as automobile engine control systems, remote controls, office machines, appliances, power tools, and toys. By reducing the size, cost, and power consumption compared to a design using a separate microprocessor, memory, and input/output devices, microcontrollers make it economical to electronically control many more processes.

 The majority of computer systems in use today are embedded in other machinery, such as automobiles, telephones, appliances, and peripherals for computer systems. These are called embedded systems. While some embedded systems are very sophisticated, many have minimal requirements for memory and program length, with no operating system, and low software complexity. Typical input and output devices include switches, relays, solenoids, LEDs, small or custom LCD displays, radio frequency devices, and sensors for data such as temperature, humidity, light level etc. Embedded systems usually have no keyboard, screen, disks, printers, or other recognizable I/O devices of a personal computer, and may lack human interaction devices of any kind.

 It is mandatory that microcontrollers provide real time response to events in the embedded system they are controlling. When certain events occur, an interrupt system can signal the processor to suspend processing the current instruction sequence and to begin an interrupt service routine (ISR). The ISR will perform any processing required based on the source of the interrupt before returning to the original instruction sequence. Possible interrupt sources are device dependent, and often include events such as an internal timer overflow, completing an analog to digital conversion, a logic level change on an input such as from a button being pressed, and data received on a communication link. Where power consumption is important as in battery operated devices, interrupts may also wake a microcontroller from a low power sleep state where the processor is halted until required to do something by a peripheral event.

 Microcontroller programs must fit in the available on-chip program memory, since it would be costly to provide a system with external, expandable, memory. Compilers and assembly language are used to turn high-level language programs into a compact machine code for storage in the microcontroller's memory. Depending on the device, the program memory may be permanent, read-only memory that can only be programmed at the factory, or program memory may be field-alterable flash or erasable read-only memory.

 Since embedded processors are usually used to control devices, they sometimes need to accept input from the device they are controlling. This is the purpose of the analog to digital converter. Since processors are built to interpret and process digital data, i.e. 1s and 0s, they won't be able to do anything with the analog signals that may be being sent to it by a device. So the analog to digital converter is used to convert the incoming data into a form that the processor can recognize. There is also a digital to analog converter that allows the processor to send data to the device it is controlling.

 In addition to the converters, many embedded microprocessors include a variety of timers as well. One of the most common types of timers is the Programmable Interval Timer, or PIT for short. A PIT just counts down from some value to zero. Once it reaches zero, it sends an interrupt to the processor indicating that it has finished counting. This is useful for devices such as thermostats, which periodically test the temperature around them to see if they need to turn the air conditioner on, the heater on, etc.

 Time Processing Unit or TPU for short. Is essentially just another timer, but more sophisticated. In addition to counting down, the TPU can detect input events, generate output events, and other useful operations.

 Dedicated Pulse Width Modulation (PWM) block makes it possible for the CPU to control power converters, resistive loads, motors, etc., without using lots of CPU resources in tight timer loops.

 Universal Asynchronous Receiver/Transmitter (UART) block makes it possible to receive and transmit data over a serial line with very little load on the CPU.

 For those wanting ethernet one can use an external chip like Crystal Semiconductor CS8900A, Realtek RTL8019, or Microchip ENC 28J60. All of them allow easy interfacing with low pin count.

 中文翻译:

  1.单片机

 单片机即单片微型计算机,是把中央处理器、存储器、定时/计数器、输入输出接口都集成在一块集成电路芯片上的微型计算机。与应用在个人电脑中的通用型微处理器相比,它更强调自供应(不用外接硬件)和节约成本。它的最大优点是体积小,可放在仪表内部,但存储量小,输入输出接口简单,功能较低。由于其发展非常迅速,旧的单片机的定义已不能满足,所以在很多应用场合被称为范围更广的微控制器,但是目前在中国大陆仍多沿用“单片机”的称呼。

 绝大多数现在的单片机都是基于冯·诺伊曼结构的,这种结构清楚地定义了嵌入式系统所必需的四个基本部分:一个中央处理器核心,程序存储器(只读存储器或者闪存)、数据存储器(随机存储器),一个或者更多的定时/计时器,还有用来与外围设备以及扩展资源进行通信的输入/输出端口——所有这些都被集成在单个集成电路芯片上。说单片机与通用型中央处理单元芯片不同是因为前者一般很容易配合最小型的外部支持芯片制成工作计算机。这样就可以很容易的把单片机系统植入装置内部来控制装置了。近年来为了在指令和数据上使用不同的字宽,并提高处理器流水线速度,哈佛结构在微控制器和DSP也逐渐得到了广泛的应用。

 传统的微处理器是不允许这么做的。它要完成单片机的工作,就必须连接一些其他芯片。比如说,片上没有数据存储器,就必须要添加一些RAM的存储芯片,虽然所添加存储器的容量很灵活,但是至少还是要添加,另外还需要添加很多连线来传递芯片之间的数据。

 比如,一个典型的微控制器只需要一个时钟发生器和很少的RAM和ROM(或者EPROM, E2PROM)就可以在软件和晶振下工作了。同时,微控制器具有丰富的输入输出设备,像是模拟数字转换(ADC),定时器,串口或者其他串行通讯接口(比如I2C,串行外围接口(SPI),控制器局域网)。通常,这些继承在内部的设备可以通过特殊的指令来操作。

 一些现代的微控制器支持一些内建的高级编程语言,比如BASIC语言。

  一个微控制器(也叫MCU)是一个微型计算芯片。它包含一个处理器、一个内存(有少量的RAM ,程序存储器,或两者兼而有之)和一个可编程输入/输出外设。

  它强调高度集成,而相比之下,一个微处理器只包含一个CPU (比如一台PC ) 。除了通常的算术和逻辑要素等一般用途的微处理器,微控制器还集成了更多的要素,如读写存储器的数据存储,只读存储器的存储程序,快闪记忆体的永久数据存储,外设,和输入/输出接口。在时钟频率只有32Mhz的情况下 ,微操作系统往往以非常低的速度相运行,但是这足够典型的应用。他们消耗较少的功率(毫瓦或什微) ,且具有保持功能,同时可以等待一个事件,如一个按钮的按下或中断。在睡眠状态时, CPU时钟和外设禁用,从而使它们适合用于低功耗和长期持久的电池应用。

 微控制器广泛应用于自动控制产品和设备,如汽车发动机控制系统,远程控制系统,办公室机器设备系统,家用电器,电动工具,和玩具等。通过降低尺寸,成本和能耗,设计使用单独的微处理器,内存和输入/输出设备,能够使微控制器控制更多的进程,更经济。

  目前,大多数的计算机系统被嵌入在其他设备中使用,如汽车,电话以及很多需要外设的计算机系统。这些嵌入其他设备的计算机系统被称为嵌入式系统。有些嵌入式系统是非常复杂的,很多能够达到人们的要求,但由于内存和程序长度的限制,软件的复杂性降低。典型的输入和输出设备包括交换机,继电器,螺线管,发光二极管,小形或定制的液晶显示器,数码显示器等。射频设备和传感器等嵌入式系统通常没有键盘,屏幕,硬盘,打印机或其他公认的I / O设备,并可能缺乏人机互动装置的任何一种。

  某些强制性的微控制器能够提供实时应对突发事件的嵌入式系统并控制它们。当某些事件发生时,中断系统能够让信号处理器暂停处理当前的指令序列,并开始了中断服务。当中断服务结束之后,再返回原来的指令序列,这就是我们通常所说的单片机的中断系统

 。中断源的设备依赖通常有很多种,如内部定时器溢、完成了模拟向数字转换、逻辑水平变化的一种投入、一个按钮被按下和收到了数据的通信联系等。凡是许多重要的中断源发出中断申请,都必须中断,如电池供电的设备停止运行后,微控制器在低功耗睡眠状态下的处理器必须停止,直到做一些外围的活动才重新开始返回当前指令序列。

  单片机程序必须符合现有的芯片程序存储器的要求,因为这将是代价高昂的系统提供了与外部设备之间可以扩展的存储器。编译器和汇编语言是用来打开高级语言程序到一个紧凑机器代码存储在微控制器的存储过程。根据不同的设备,程式记忆体可能是永久性的,而唯读存储器,只能进行编程。在工厂,可以生产可擦除式只读存储器。

  由于嵌入式处理器通常是用来控制设备的,他们有时需要接受输入设备的数据输入,但由于处理器内置处理数数据只有1和0 ,所以它们将无法直接处理任何模拟信号。因此,要先使需要处理的数据通过模拟向数字转换的过程,才能使传入的数据转化为处理器可以识别的形式。还有一种转换器叫做数模转换器,他能够使数字信号转换为模拟信号并将数据发送到需要CPU控制的设备上,以达到控制的目的。

  此外,许多嵌入式微处理器包括各种兼职的转换器。最常见的一种类型的转换器是可编程间隔定时转换器。工作过程为一个倒计时刚到达零,它就会对处理器发出一个中断的指令。这表明它已经完成转换,并需要对所控制的设备发出指令,使其作出某些动作。这是非常有用的设备,如恒温系统,需要定期测试他们周围的温度,看看他们是否需要打开空调或者加热器等等。

推荐访问:单片机 计算器 简易

《基于AT89C51单片机的简易计算器的设计.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:

文档为doc格式

一键复制全文 下载 投诉