目录
引言1
第一章设计原理及要求2 1.1 设计方案的确定2 1.2 系统的设计方案2 1.3 系统的设计要求2 第二章硬件模块设计3 2.1 单片机ATC514 2.1.1 ATC51芯片的特点4 2.1.2 管脚说明5 2.1.3 振荡器特性7 2.1.4 芯片擦除7 2.2 键盘控制模块7
2.2.1 矩阵键盘的工作原理7 2.2.2 键盘电路主要器件介绍8 2.3 LCD显示模块10 2.3.1 显示电路11
2.3.2 LCD1602主要技术参数11 2.3.3 引脚功能说明11 2.4 运算模块(单片机控制)13 第三章软件设计13 3.1 功能介绍13 3.2系统流程图13 3.3 程序15 第四章系统调试15 4.1软件介绍15
4.1.1 Keil uVision2仿真软件简介15 4.1.2 protues简介16
. -可修遍-
- .
4.2 软件调试17
4.2.1 软件分析及常见故障17 4.2.2 仿真结果演示18 4.3 硬件调试19 结束语20 参考文献21 附录22 致32
. -可修遍-
- .
引言
计算工具最早诞生于中国,中国古代最早采用的一种计算工具叫筹策,也被叫做算筹。这种算筹多用竹子制成,也有用木头,兽骨充当材料的,约二百七十枚一束,放在布袋里可随身携带。另外直到今天仍在使用的珠算盘,是中国古代计算工具领域中的另一项发明,明代时的珠算盘已经与现代的珠算盘几乎相同。
17世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的“纳皮尔算筹”,英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加、减、乘、除、乘方和开方运算,甚至可以计算三角函数、指数函数和对数函数。这些计算工具不仅带动了计算器的发展,也为现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具。12年,年仅19岁的法国伟大科学家帕斯卡引用算盘的原理,发明了第一部机械式计算器,在他的计算器中有一些互相联锁的齿轮,一个转过十位的齿轮会使另一个齿轮转过一位,人们可以像拨盘那样,把数字拨进去,计算结果就会出现在另一个窗口中,但是它只能做加减运算。1694年,莱布尼兹在德国将其改进成可以进行乘除的计算。此后,一直到20世纪50年代末才有电子计算器的出现。
. -可修遍-
- .
第一章 设计原理及要求
1.1 设计方案的确定
本设计是以单片机ATC51为核心的简易计算器设计,要通过芯片ATC51实现计算器程序运行来完成加、减、乘和除的简单计算功能。
本设计运算模块由ATC51实现,数据输入模块由4*4矩阵键盘电路实现,输出数据模块由LCD显示电路实现,再外加一个时钟电路和一个复位电路完成整个简易计算器的设计。
1.2 系统的设计方案
本设计由以下几部分组成:ATC51单片机系统(运算模块)、键盘电路、显示电路、时钟电路和复位电路构成,计算器系统框图如图1-1所示。
图1-1 计算器系统框图
1.3 系统的设计要求
为了更好地实现系统的功能,硬件电路的设计应该遵循以下原则: 1、优化硬件电路
. -可修遍-
- .
采用软件设计与硬件设计相结合的方法。尽管采用软件来实现硬件系统的功能时,也许响应的时间会比单纯使用硬件时长,而且还要占用微处理器(MCU)的时间;但是,用软件实现硬件的功能可以简化硬件结构,提高电路的可靠性。所以,在设计本系统的时候,在满足可靠性和实时性的前提下,尽可能地通过软件来实现硬件功能。
2、可靠性及抗干扰设计
根据可靠性设计理论,系统所用芯片数量越少,系统的平均无故障时间越长。而且,所用芯片数量越少,地址和数据总线在电路板上受干扰的可能性也就越小。因此,系统的设计思想是在满足功能的情况下争取较少数量的芯片。
3、灵活的功能扩展
功能扩展是否灵活是衡量一个系统优劣的重要指标之一。一次设计往往不能完全考虑到系统的各个方面,系统需要不断完善以及进行功能升级。进行功能扩展时,应该在原有设计的基础上,通过修改软件程序和少量硬件完成。对于本系统而言,就是要求在系统硬件不变的情况下,能够通过修改软件程序,完成功能的升级和扩展。
根据提出的系统设计方案,结合以上三条原则,确定了系统硬件的设计。计算器主要由以下一些功能模块组成:非编码键盘模块、运算模块(单片机部)和LCD液晶显示模块等。
该系统的硬件设计采用了模块化的设计方法。ATC51单片机、LCD液晶显示屏显示电路和键盘电路是整个电路的核心,它们能实现系统的功能要求。
简易计算器主要包括:键盘电路、运算电路和输出显示电路。
第二章 硬件模块设计
在本设计中主要用到的硬件:单片机ATC51、液晶显示屏LCD1602 、4*4矩阵键盘。
单片机ATC51的硬件资源分配:
(1)P3口:作为输入口,与键盘连接,实现数据的输入;
(2)P0、P2口:作为输出口(P2口为高位,P0口为低位),控制LCD液晶显示屏显示数据的结果;
(3)P1口和部分P3口:作为液晶显示屏LCD1602显示输出。
. -可修遍-
- .
2.1 单片机ATC51
本设计所用单片机采用ATC51单片机,它兼容于MCS-51系列单片机,而且具有1000次可擦写的FLASHMEMORY,方便于系统的开发以及参数的修改。尽管它是8位机,但它的处理精度完全满足系统的设计要求。该种单片机的最高频率可达到24MHz。在12MHz时,其处理速度完全达到设计要求,ATC51的实物图及引脚图如图2-1所示。
图2-1 单片机ATC51实物图及引脚图
2.1.1 ATC51芯片的特点
ATC51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机,他的特点如下:
1、与MCS-51 兼容 2、1000写/擦循环
3、4K字节可编程闪烁存储器 4、数据保留时间:10年 5、全静态工作:0Hz-24Hz 6、三级程序存储器锁定
. -可修遍-
- .
7、128*8位部RAM 8、32可编程I/O线 9、两个16位定时器/计数器 10、5个中断源 11、可编程串行通道 12、低功耗的闲置和掉电模式 13、片振荡器和时钟电路
2.1.2 管脚说明
VCC:供电电压。 GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写“1”时,被定义为高阻输入。P0口能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FLASH编程时,P0 口作为原码输入口,当FLASH进行校验时,P0口输出原码,此时P0口外部必须被拉高。
P1口:P1口是一个部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入“1”后,被部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
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”后,它们被部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL),这是由于上拉的缘故。
P3口也可作为ATC51的一些特殊功能口。
. -可修遍-
- .
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(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时,ALE只有在执行MOVX时ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取值期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:当/EA保持低电平时,则在此期间只管外部程序存储器(0000H-FFFFH),不管是否有部程序存储器,注意加密方式1时,/EA将部锁定为RESET;当/EA端保持高电平时,此时只管部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。
. -可修遍-
- .
2.1.3 振荡器特性
XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片振荡器。晶体振荡和瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。输入至部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
2.1.4 芯片擦除
整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。
此外,ATC51设有稳态逻辑,可以在低到零频率的条件下表示静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM、定时器、计数器、串口和中断系统仍在工作。在掉电模式下,保存RAM的容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
2.2 键盘控制模块
计算器输入数字和其他功能按键要用到很多按键,如果采用按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。
2.2.1 矩阵键盘的工作原理
键盘可分为两类:编码键盘和非编码键盘。编码键盘是较多按键(20个以上)和专用驱动芯片的组合;当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。
通用计算机使用的键盘就是编码键盘。在智能仪器中,使用并行接口芯片8279
. -可修遍-
- .
或串行接口HD7279均可以组成编码键盘,同时还可以兼顾数码管的显示驱动,其相关的接口电路和接口软件均可在芯片资料中得到。当系统功能比较复杂,按键数量很多时,采用编码键盘可以简化软件设计。
而非编码键盘成本低廉。从简易和成本角度出发,本设计选用的是非编码键盘。如图2-2所示。一般由16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。其矩阵图所对应的仿真图如图2-3所示。
图2-2 矩阵键盘部电路图 图2-3矩阵键盘布局图
2.2.2 键盘电路主要器件介绍
为了进一步节省单片机I/O口资源,我们在设计中使用了MM74C922芯片。MM74C922是一款4*4键盘扫描IC,它可检测到与之相连的4*4键盘的按键输入,并通过数据输出口将按键相应的编码输出。其引脚图如图2-4所示。
. -可修遍-
- .
图2-4 MM74C922芯片引脚图
MM74C922引脚说明:
(1) Y1-Y4(脚1-脚4):4*4键盘第一列至第四列。 (2) X1-X4(脚11、10、8、7):4*4键盘第一行至第四行。
(3) DOA- DOD(Dataout A-D,脚14-17):按键之BCD码输出,其中DOA为LSB,DOD为MSB。
(4) VCC(脚18):电源脚,+3V至+15V (5) GND(脚9):接地管脚
(6) OSC(Oscillator,脚5):键盘扫描电路之频率所需外加电容的引脚。 (7) KBM(Keyboard Mask,脚6):部消除开关弹跳电路所外加电容的引脚。 (8) OE(Output Enable,脚13):芯片使能脚,接低电位可使芯片使能。 (9) DA(Data Available,脚12):数据有效输出脚。任一按键按下时,此脚位会输出高电位,按键释放后此脚又会恢复为低电位。
如图2-5所示,在本设计中,计算器输入键盘的4条行线、4条列线分别连接到MM74C922的X1-X4、Y1-Y4引脚,MM74C922的数据输出口与单片机的P2口相连,MM74C922的DA引脚经过一个非门连接到单片机的/INT0脚,当MM74C922检测到键盘输入时,DA产生高电平,与之相连的/INT0检测到低电平,给单片机一个中断,单片机从P2口的低四位读入键盘上按下的按键值。
. -可修遍-
- .
图2-5 键盘接口电路图
2.3 LCD显示模块
本设计采用LCD液晶显示器来显示输入输出数据。通过D0-D7引脚向LCD写指令字或写数据以使LCD实现不同的功能或显示相应数据。LCD引脚图如图2-6所示。
图2-6 LCD1602 引脚图
LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,在实际使用中是否带背光并无多大差别,两者尺寸差别如图2-7所示。
图2-7 LCD背光和不带背光的尺寸对比图
. -可修遍-
- .
2.3.1 显示电路
当系统需要显示少量数据时,采用LCD液晶显示屏进行显示是一种经济实用的方法。P1口作为液晶显示的数据端口,P3.4-P3.6口作为其控制端口,控制LCD液晶显示屏显示输出数据。
显示电路图如图2-8所示。
图2-8 LCD液晶显示电路
2.3.2 LCD1602主要技术参数
显示容量:16×2个字符 芯片工作电压:4.5—5.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V 字符尺寸:2.95×4.35(W×H)mm
2.3.3 引脚功能说明
LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表2-1所示。
. -可修遍-
- .
表2-1 引脚接口说明表
编号 1 2 3 4 5 6 7 8 符号 VSS VDD VL RS R/W E D0 D1 引脚说明 电源地 电源正极 液晶显示偏压 数据/命令选择 读/写选择 使能信号 数据 数据 编号 9 10 11 12 13 14 15 16 符号 D2 D3 D4 D5 D6 D7 BLA BLK 引脚说明 数据 数据 数据 数据 数据 数据 背光源正极 背光源负极 第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端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。
. -可修遍-
- .
2.4 运算模块(单片机控制)
ATC51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是一些特殊的功能,通过使用单片机编写的程序可以实现高智能、高效率以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以很快地实现运算功能。
另外系统还包括时钟电路和复位电路。
第三章 软件设计
3.1 功能介绍
实际运用中人们熟悉的计算器,其功能主要如下: 1、键盘输入; 2、显示数值;
3、加、减、乘、除四则运算; 4、对错误输入和输出的控制及提示。
3.2系统流程图
在软件设计中程序分别要完成键盘输入检测、LCD初始化及显示、算术运算和错误处理及输出等功能。对主程序进行初始化,其他的程序选择模块式的方式。首先对每个模块进行调试,当模块调试成功后,逐一地加入主程序中,最后完成整个软件部分的设计。系统流程图如图3-1所示。
. -可修遍-
- .
开始 初始化参数 初始化LCD显示 有键输入? 读取键码 Y N 数字键 清零键 功能键 输入数值 状态清零 根据上次功能键和输入的数据计算结果 本次功能键 结果送显示缓冲 数值送显示缓冲 LCD显示
图3-1 系统流程图
. -可修遍-
- .
3.3 程序
本设计程序采用C语言编程,程序分为多个模块,由主程序、键值转换和LCD系列程序等模块组成。具体程序见附录。
第四章 系统调试
4.1软件介绍
4.1.1 Keil uVision2仿真软件简介
Keil uVision2是德国Keil公司开发的基于Windows平台的单片机集成开发环境,它包含一个高效的编译器、一个项目管理器和一个MAKE工具。其中Keil C51是一种专门为单片机设计的高效率C语言编译器,符合ANSI标准,生成的程序代码运行速度极高,所需要的存储器空间极小,完全可以与汇编语言媲美。Keil uVision2的界面如图4-1所示,Keil uVision2允许同时打开、浏览多个源文件。
. -可修遍-
- .
图4-1 Keil uVision2的界面
4.1.2 protues简介
protues软件是英国Labcenter electronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。它是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年已经增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器,界面图如图4-2所示。
图4-2 protues界面图
. -可修遍-
- .
4.2 软件调试
4.2.1 软件分析及常见故障
在此次设计中使用Keil uVision2和Proteus软件仿真,其中使用Keil uVision2软件汇编源程序,使用Proteus软件对硬件电路进行模拟。正确连接电路图,使其能按照题目要求及设计初衷正常工作。
从库里正确拾取元器件,认真合理地连线,做到不缺件,不缺线,选取合适的元件参考值,使其能正常工作。通过编译,连接程序。使其生成.hex文件,并连入连好的Proteus图中。测试该计算器是否能正常工作。若不能,首先要检查有没有漏掉元器件,元器件是否都连接好。其次,要看元件各引脚是否都连接正确,有无接反的。最后要看元件的参考值是否选择合理,电源电压是否能带动元器件正常工作。 常见故障:
1、逻辑错误:它是由设计错误或加工过程中的工艺性错误所造成的。这类错误包括错线、开路、短路等。
2、元器件失效:有两方面的原因:一是器件本身已损坏或性能不符合要求;二是组装错误造成元件失效,如电解电容、集成电路安装方向错误等。
3、可靠性差:因其可靠性差的原因很多,如金属化孔、接插件接触不良会造成系统时好时坏,经不起振动;走线和布局不合理也会引起系统可靠性差。
4、电源故障:若样机有电源故障,则加电后很容易造成器件损坏。电源故障包括电压值不符合设计要求,电源引线和插座不对,功率不足,负载能力差等。
调试方法:包括多级调试和联机调试。在调试过程中要针对可能出现的故障认真分析,直至检查出原因并排除。
本次硬件调试过程中,对所出现的问题进行了认真的分析和改正,最后能够很好的达到设计要求的效果。
系统仿真图如图4-3所示。
. -可修遍-
- .
图4-3 系统仿真图
4.2.2 仿真结果演示
下面以加、减、乘和除分别做仿真演示:
(1)加法:以258和825作为加数和被加数运算,结果为1083。加法仿真结果图如图4-4所示。
图4-4 加法仿真结果图
(2)减法:以76321和1234567作为被减数和减数运算,结果为197。减法仿真结果图如图4-5所示。
图4-5 减法仿真结果图
. -可修遍-
- .
(3)乘法:以694和123作为乘数和被乘数运算,结果为85362。乘法结果仿真图如图4-6所示。
图4-6 乘法结果仿真图
(4)除法:以1250和5作为被除数和除数运算,结果为250。除法结果仿真图如图4-7所示。
图4-7 除法结果仿真图
由以上四种运算结果可知软件仿真均正确,没有显示错误。
4.3 硬件调试
在protues里面把硬件图画好,把所有元器件的参数都设置好,程序在keil里面生成.hex文件,然后在 protues里单片机芯片中导入此文件,运行一切正常后开始准备焊接硬件。在焊接硬件过程中首先得准备好所有必备的东西,比如所需元器件和焊接所用工具等。在焊接前应先在面包板上把硬件插好调试,接通电源看能否显示出结果,如果元器件都是好的并且结果可以显示出,就可以焊接了。如果显示不出来再检查各个器件是否有损坏,并用万用表挨个检查,直至一切显示正常再焊接。
在焊接时要注意相邻焊点不能粘在一起,连接线不能太长,并且注意焊点的虚焊、假焊。在使用电烙铁时温度不能太高也不能太低,一般在350度左右,温度太低容易形成冷焊点,太高则会烧坏电路板。
电路板焊接好以后首先测试一下各个元器件是否正常,焊点有无虚焊、连焊、假焊等现象,检查没有问题以后接通电源查看LCD显示是否正常,如果一切显示没有问题把硬件妥善保管,防止不小心损坏。硬件电路实物图如图4-8所示。
. -可修遍-
- .
图4-8 硬件电路实物图
结束语
通过这次简易计算器的设计,很大程度的提高了我的理解力和动手能力,也拓宽了知识面。在图书馆和网上查阅资料使我了解了更多的资料,也方便了我们以后的使用。在查询的资料中让我对单片机有了更深入的了解,能把学到的知识用活,而不只局限于理论方面。
在硬件制作过程中,当我把硬件都焊好以后接通电源LCD怎么都不显示数字并且在很短的时间就会发热,我查了焊接点和仿真图都没有问题,接着仔细查找了LCD显示器各个管脚,发现两个电压管脚接反了,但在仿真时没出现问题,而在实物中出现了问题,是由于仿真元件都是理想化的,各个问题在实物中根据实际情况就会出现。
编程时,充分使用了结构化的思想。这样一来,因为语句较少,程序调试也比较方便,功能模块可以逐一地调试,充分体现了结构化编程的优势。当每个模块都完成时,将其功能互相整合就完成了整体的设计。经历了从最初的不了解设计容到
. -可修遍-
- .
最后做出仿真结果的过程使我从根本上提高了对专业的认识及兴趣,对于我们工科学生来说,学习了这些对我们以后工作有重大的影响。很感学校和老师给我们提供了这样的平台,能使我们的动手能力增强。感老师对我们提供的帮助。
参考文献
[1] 裴岩、利民单片机系统综合设计与实践[J].大学出版.2003.1 [2] 国林.
C语言程序设计[J].大学.2001.9
[3] 郭天祥. 新概念51单片机C语言程序[J].电子工业.2009.1
[4] LED与LCD显示器的区别. wenku.baidu./view/57ea20eb172ded630b1cb62b.html [5]基于单片机简易计算器的设计.wenku.baidu./view/06c710ff910ef12d2af9e742.html [6] 基于单片机的简易计算器设计..doc88./p-.html [7] 计算器模拟系统设计. .doc88./p-.html [8] 计算器设计报告..doc88./p-.html [9] 基于单片机的计算器..doc88./p-.html [10] ATC51单片机简介.hbfydz./xxyd/103.htm
[11] Keil uVision2仿真软件的使用说明μVision2集成开发环境wenku.baidu./view/75ad363e5727a5e9856a61e7.html
. -可修遍-
- .
[12] 4×4矩阵键盘计算器设计wenku.baidu./view/b1ac2d92daef5ef7ba0d3c65.html [13]Henderson D. Calibration of fast sampling o scilloscopes. Meas SciTechnol.1990.1 [14] Barry Ross. Hands-On Guide to Oscilloscopes, McGraw-Hill.1994,6
[15] [13] V. A. Krukov, R. V. Udovichenko.Debugging DVM Programs[J]. Programming and puting Software,May.2001
#include #define uchar unsigned char #define uint unsigned int char translate(int keycode); void arithmetic(); void init_LCM(); void write_data(char ddata); void write_(char mand); void check_BF(); void clearLCD(); void display(long a); void dealerror(); void dataoverflow(); long x=0,y=0,num=0; int operators,input,iny=0; char key; . -可修遍- 附录 - . char error[5]=\"error\"; char overflow[8]=\"overflow\"; sbit EN=P3^4; sbit R_W=P3^5; sbit RS=P3^6; main() { EA=1; EX0=1; IT0=1; P2=0xff; display(0); init_LCM(); write_data(0x30); while(1) { } } /**********键值转化为键盘上按键值函数*************/ char translate(int keycode) { switch(keycode) { case 0: return '7'; break; case 1: return '4'; break; case 2: return '1'; . -可修遍- - . break; case 3: return 'c'; break; case 4: return '8'; break; case 5: return '5'; break; case 6: return '2'; break; case 7: return '0'; break; case 8: return '9'; break; case 9: return '6'; break; case 10: return '3'; break; case 11: return '='; break; case 12: return '/'; break; . -可修遍- - . } case 13: return '*'; break; case 14: return '-'; break; case 15: return '+'; break; } /***********外部中断0处理函数*************/ void INT_0(void) interrupt 0 using 0 { 围 { } else display(num); key=translate(P2&0x0f); if(key<='9'&&key>='0') //判断按下的键是否为数值 { num=num*10+(key-'0'); if (operators>0) { } else x=num; y=num; iny=1; if(num<1000000000&&num>-1000000000) //当前数值是否超出限定 . -可修遍- - . dataoverflow(); } else { switch(key) { case 'c': x=0; y=0; num=0; iny=0; operators=0; display(num); break; case '=': arithmetic(); iny=0; operators=0; num=0; break; case '+': if (operators) arithmetic(); operators=1; num=0; break; case '-': if (operators) arithmetic(); operators=2; . -可修遍- - . num=0; break; case '*': if (operators) arithmetic(); operators=3; num=0; break; case '/': if (operators) arithmetic(); operators=4; num=0; break; } } } /**********算术运算函数*********/ void arithmetic() { if (iny) { switch(operators) { case 1: x=x+y; num=x; if(num<100000000&&num>-100000000) { display(num); . -可修遍- - . } else dataoverflow(); break; case 2: x=x-y; num=x; if(num<100000000&&num>-100000000) { display(num); } else dataoverflow(); break; case 3: x=x*y; num=x; if(num<100000000&&num>-100000000) { display(num); } else dataoverflow(); break; case 4: if (y==0) dealerror(); else { x=x/y; num=x; . -可修遍- - . if(num<100000000&&num>-100000000) { display(num); } else dataoverflow(); } break; } y=0; } } /**************LCD初始化函数*************/ void init_LCM() { write_(0x30); write_(0x30); write_(0x30); write_(0x38); write_(0x08); write_(0x01); write_(0x06); write_(0x0e); } /***********LCD写数据函数*************/ void write_data(char ddata) { RS=1;/*写指令*/ R_W=0; EN=1;/*使能信号开*/ . -可修遍- - . } P1=ddata;/*将数据送入p1口*/ EN=0;/*使能信号关*/ check_BF(); /***********LCD写指令函数*************/ void write_(char mand) { RS=0;/*写指令*/ R_W=0; EN=1;/*使能信号开*/ P1=mand;/*将数据送入p1口*/ EN=0;/*使能信号关*/ check_BF(); } /************LCD检查忙碌函数***********/ void check_BF() { char i,x=0x80; P1=0xff; while(x&0x80) { RS=0; R_W=1; EN=1; x=P1; EN=0; for (i=0;i<10;i++); } EN=0;/*关闭使能信号*/ } . -可修遍- - . /**********LCD清屏函数**********/ void clearLCD() { write_(0x01); } /**********LCD显示函数**********/ void display(long a) { long temp,b,c=-1; int lenth=1,i,j; clearLCD(); if(a<0) { a=a*c; write_data('-'); } temp=a; while((temp=temp/10)!=0) { lenth++; } for(i=lenth;i>0;i--) { b=1; for(j=0;j . -可修遍- - . } /**********除数为0处理函数**********/ void dealerror() { int i=0; clearLCD(); for(i=0;i<5;i++) write_data(error[i]); } /*********数值溢出处理函数**********/ void dataoverflow() { int i=0; clearLCD(); for(i=0;i<8;i++) write_data(overflow[i]); } 致 本次毕业设计得到指导老师乌仁格日乐老师的热心指导,在这里对老师表示最衷心的感。老师平易近人,对学生的设计进度和学习很关心。在毕业设计的前期,首先给我们分析了一下课题的基本含义,也介绍了不少有用的资料和书籍;在硬件设计等方面给予悉心地指导;在调试的过程中,老师给每个出现的问题也给予了及时的指导。在写毕业设计论文的阶段,老师先跟我们讲了一下大体的结构思路、容字体、格式上的及一些其他问题。待人平和、工作认真、治学严谨的她给我留下了很深刻的印象。更重要的是,她善于与学生沟通,不仅在毕业设计上给了我及时的指导,更为我大学最后阶段的学习提出了许多宝贵的意见。这一切都在潜移默化地影响着我,为我以后进入工作岗位树立了良好的榜样。 最后向所有帮助和关心过我的人表示衷心感! . -可修遍- - . . -可修遍- 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igbc.cn 版权所有 湘ICP备2023023988号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务