毕业设计(论文)任务书
(2016届)
所属系(部): 机电工程学院 所学专业: 通信技术 班 级: 13通信技术班 姓 名: xxx 学 号: xxx 指导教师: xxx
2015 年 7 月 7 日
ATC52单片机设计
通信技术 Xxx Xxx
摘 要
计算器是微型电子计算机的一种特殊类型。它与一般通用计算机的主要区别在于程序输入方式的不同。计算器的程序一般都已经固定,只需按键输入数据和运算符号就会得出结果,很容易就能掌握。而一般计算机的程序可以根据需要随时改动,或重新输入新的程序.简易计算器主要用于加减乘除;科学计算器,又增添了初等函数运算。随着微电子技术的不断发展,微处理芯片的集成程度越来越高,单片机已可以在一片芯片上同时集成cpu,存储器,定时器,计数器,并行和串行接口,看门狗,前置放大器,A|D 转换器,D|A 转换器等多种电路。完成一定区间和条件的简单四则运算过程.
关键词:计算器,ATC52,矩阵按键,LCD1602
2
目录
第一章 绪论 ...................................................................... 5 1.1 课题的提出及意义 ............................................................. 5 1.2 设计的任务及要求 ............................................................. 5 第二章 总体方案设计 .............................................................. 7 2。 1 芯片比较 ................................................................... 7 2。1.1 单片机选择 ................................................................ 7 2。1.2 显示器的选择 .............................................................. 7 2.1。3 按键部分的选择 ............................................................ 8 2.2总体设计及系统原理 ............................................................ 8 第三章 单片机硬件设计 ........................................................... 10 3。1 单片机部分 ................................................................. 10 3。1.1 单片机发展历史 ........................................................... 10 3。1。2 单片机发展趋势 .......................................................... 10 3.1。3 计算器系统现状 ........................................................... 11 3.1。4 ATC52系列单片机简介 .................................................... 12 3. 2 矩阵按键部分 ............................................................... 20 3。 3 液晶显示器部分 ............................................................ 22 第四章 单片机软件设计 ........................................................... 29 4.1主程序设计 ................................................................... 29 4.2 键扫程序设计 ................................................................ 29 4。3 算术运算程序设计 ........................................................... 30 4.4 显示程序设计 ................................................................ 31 第五章 单片机安装、调试 ......................................................... 33 5。1 软件仿真 ................................................................... 33 5。2 安装步骤 ................................................................... 34 5.2。1 检查元件的好坏 ........................................................... 34 5。2.2 放置、焊接各元件 ......................................................... 34 5.3 调试 ........................................................................ 38 5。3.1 硬件调试 ................................................................. 38
3
5。3.2 软件调试 ................................................................. 39 结束语 .......................................................................... 40 致谢 ............................................................................ 41 参考文献 ........................................................................ 42
4
第一章 绪论
1.1 课题的提出及意义
随着社会的发展,科学的进步,人们的生活水平在逐步地提高,尤其是微电子技术的发展犹如雨后春笋般的变化.计算器在人们的日常中是比较常见的电子产品之一,如何使计算器技术更加的成熟,充分利用已有的软件和硬件条件,设计出更出色的计算器,使其更好地为各个行业服务,成了如今电子领域重要的研究课题.现在人们的日常生活中已经离不开计算器了,社会的各个角落都有它。因此设计一款简单实用的计算器会有很大的实际意义.
本设计在进一步掌握单片机理论知识,理解嵌入式单片机系统的硬软件设计,加强对实际应用系统设计的能力。通过本设计的学习,使我掌握单片机程序设计和微机接口应用的基本方法,并能综合运用本科阶段所学软、硬件知识分析实际问题,提高解决毕业设计实际问题的能力,为单片机应用和开发打下良好的基础。
对字符液晶显示模块的工作原理,如初始化、清屏、显示、调用及外特性有较清楚的认识,并会使用LCD(液晶显示模块)实现计算结果的显示;掌握液晶显示模块的驱动和编程,设计LCD和单片机的接口电路,以及利用单片机对液晶显示模块的驱动和操作;
在充分分析内部逻辑的概念,进行软件和调试,学会使用,并能够以其为平台设计出具有四则运算能力简易计算器的硬件电路和软件程序。
1.2 设计的任务及要求
1目的:通过本次工程实践,运用《智能化测量控制仪表原理与设计》、《MCS-51系列○
单片微型计算机及其应用》所学知识及查阅相关资料,完成简易计算器的设计,达到理论知识与实践更好结合、提高综合运用所学知识和设计能力的目的。
通过本次设计训练,可以使我们在基本思路和基本方法上对基于MCS—51单片机的嵌入式系统设计有一个比较感性的认识,并具备一定程度的设计能力。
错误!要求:
使用硬件:MCS—51单片机,处理器,数据存储器(RAM),程序存储器(ROM)等。
5
使用软件:电子绘图软件Protel。
(1)通过网络及各种相关书籍查找相关信息,确定使用的元器件。
(2)以MCS—51单片机为核心,开发一个完整的系统,包括硬件设计和软件的编程. (3)使用Protel软件,绘制原理图、PCB,并进行元器件安装、焊接及调试检测达到预期的目的。矩阵按键输入、LCD1602液晶显示,构成一套可以运算两个数之间的加减乘除的设计。最大运算是:9999*9999,可以运算负数。
6
第二章 总体方案设计
2。 1 芯片比较
2。1。1 单片机选择
ATC52是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含8Kbytes的可反复擦写的只读程序存储器(PEROM)和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置通用8位处理器(CPU)和FLASH存储单元,功能强大ATC52单片机适用于许多较为复杂控制应用场合。ATC52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2 个读写口线,ATC52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的 Flash存储器可有效地降低开发成本。
ATC52有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。
2。1。2 显示器的选择
在单片机应用系统中,使用的显示器主要有LED(发光二极管显示器)、LCD液晶显示. 方案一:使用8位LED数码管来显示,LED显示器是由发光二极管显示字段组成的显示器件,在单片机应用系统中通常使用的是七段LED,这种显示器有共阴极和共阳极两种,它具有成本低廉、配置灵活和单片机接口方便等特点。
方案二:使用液晶显示器来显示.液晶是介于固态和液态间的有机化合物,将其加热会变成透明液态,冷却后变成结晶的浑浊固态.在电机的作用下,产生冷热变化,从而影响它的透光性,来达到显示的目的。LCD还具有以下优点:(1)低压、微功耗;(2)显示信息量大;(3)长寿命;(4)无辐射、无污染。选择液晶显示屏。
为了适应本课题的需要,本设计采用液晶显示屏LCD1602进行显示。
7
2.1.3 按键部分的选择
根据操作需要和毕业设计需要,按键部分采用4*4 行列式键盘,分别设定数字键和功能键。
2。2总体设计及系统原理
大致原理图如图2。2.1所示:
图2.2.1 原理图
总的电路设计方案以单片机 ATS52 来作为核心元器件,外围采用4*4 行列式键盘作为输入,采用lcd1602 液晶显示来做输出.这里重点介绍液晶输出,它是一个双行显示的液
8
晶显示器,其采用标准的16 脚接口。
1. vss 为地电源; 2. vdd 接5v 正电源;
3。 vo 为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高会产生影子,使用时可以通过一个10k 的电位器调整对比度;
4。 rs 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器; 5。 rw 为读写信号线,高电平时选择读操作,低电平时选择写操作.当rs和rw 共同为低电平时可以写入指令或者显示地址,当rs 为低电平rw 为高电平时可以读忙信号,当rs 为高点平rw 为低电平时可以写入数据。
6。 e 端为使能端,当e 端由高电平跳变成低电平时,液晶模块执行命令; 7. 7~14 d0~d7 为8 位双向数据线;
8。 15~16 分别为背光灯正负极,A 接正极,K 接负极。
9
第三章 单片机硬件设计
3。1 单片机部分
目前,52系列单片机在我国的各行各业得到了广泛应用,各大专业院校、职业培训学校,均开设了单片机原理与应用方面的课程,这是一门技术性和实践性很强的学科,必须通过一系列的软硬件实验、理论联系实际,才能学好、学懂,取得较好的学习效果.
3。1。1 单片机发展历史
单片机(Microcontrollers)诞生于1971年,经历了SCM、MCU、SoC三大阶段,早期的SCM单片机都是8位或4位的。其中最成功的是INTEL的8051,此后在8051上发展出了MCS51系列MCU系统。基于这一系统的单片机系统直到现在还在广泛使用。随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。90年代后随着消费电子产品大发展,单片机技术得到了巨大提高。随着INTEL i960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场.
而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍.高端的32位Soc单片机主频已经超过300MHz,性能直追90年代中期的专用处理器,而普通的型号出厂价格跌落至1美元,最高端的型号也只有10美元。
当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上。而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的Windows和Linux操作系统.
3.1。2 单片机发展趋势
单片机的发展趋势:低功耗CMOS化;微型单片化;主流与多品种共存;单片机从8位、16位到32位,数不胜数,应有尽有,有与主流C51系列兼容的,也有不兼容的,但它们各具特色,互成互补,为单片机的应用提供广阔的天地。
10
纵观单片机的发展历程,可以发现单片机的发展趋势大致有: 1、低功耗CMOS化
MCS-51系列的8051推出时的功耗达630mW,而现在的单片机普遍都在100mW左右,随着对单片机功耗的要求越来越低,现在的各个单片机制造商基本都采用了CMOS(互补金属氧化物半导体工艺)。像80C51就采用了HMOS(即高密度金属氧化物半导体工艺)和CHMOS(互补高密度金属氧化物半导体工艺).CMOS虽然功耗较低,但由于其物理特征决定了其工作速度不够高,而CHMOS则具备了高速和低功耗的特点,这些特征,更适合于在要求低功耗象电池供电的应用场合。所以这种工艺将是今后一段时期内单片机发展的主要途径.
2、微型单片化
现在常规的单片机普遍都是将处理器(CPU)、随机存取数据存储(RAM)、只读程序存储器(ROM)、并行和串行通信接口、中断系统、定时电路、时钟电路集成在一块单一的芯片上,增强型的单片机集成了如A/D转换器、PMW(脉宽调制电路)、WDT(看门狗),有些单片机将LCD(液晶)驱动电路都集成在单一的芯片上,这样单片机包含的单元电路就更多,功能就更强大。甚至单片机厂商还可以根据用户的要求量身定做,制造出具有自己特色的单片机芯片.
此外,现在的产品普遍要求体积小、重量轻,这就要求单片机除了功能强和功耗低外,还要求其体积要小。现在的许多单片机都具有多种封装形式,其中SMD(表面封装)越来越受欢迎,使得由单片机构成的系统正朝微型化方向发展。
3、主流与多品种共存
现在虽然单片机的品种繁多,各具特色,但仍是以80C51为核心的单片机占主流,兼容其结构和指令系统的有PHILIPS公司的产品,ATMEL公司的产品和中国的Winbond系列单片机。因此以80C51为核心的单片机占据了半壁江山.而Microchip公司的PIC精简指令集(RISC)也有着强劲的发展势头,中国的HOLTEK公司近年的单片机产量与日俱增,以其价低质优的优势,占据一定的市场份额.此外还有MOTOROLA公司的产品,日本几大公司的专用单片机.在一定的时期内,这种形势将得以延续,将不存在某个单片机一统天下的垄断局面,走的是依存互补,相辅相成、共同发展的道路。
3.1.3 计算器系统现状
11
计算器一般由运算器、控制器、存储器、键盘、显示器、电源和一些可选外围设备及电子配件通过人工或机器设备组成。低档计算器的运算器、控制器由数字逻辑电路实现简单的串行运算,其随机存储器只有一、二个单元,供累加存储用。高档计算器由微处理器和只读存储器实现各种复杂的运算程序,有较多的随机存储单元以存放输入程序和数据。键盘是计算器的输入部件,一般采用接触式或传感式。为减小计算器的尺寸,一键常常有多种功能。显示器是计算器的输出部件,有发光二极管显示器和液晶显示器等。除显示计算结果外,还常有溢出指示、错误指示等。计算器电源采用交流转换器或电池,电池可用交流转换器或太阳能转换器再充电。为节省电能,计算器都采用CMOS工艺制作的大规模集成电路(见互补金属—氧化物—半导体集成电路),并在内部装有定时不操作自动断电电路。计算器可选用的外围设备有微型打印机、盒式磁带机和磁卡机等。
本计算器是以MCS-51系列单片机ATC52为核心构成的简易计算器系统.该系统通过单片机控制,实现对4*4键盘扫描进行实时的按键检测,并把检测数据存储下来。整个计算器系统的工作过程为:首先存储单元初始化,显示初始值和键盘扫描,判断按键位置,查表得出按键值,单片机则对数据进行储存与相应处理转换,之后送入LED显示器动态显示。整个系统可分为两个主要功能模块:功能模块一,实时键盘扫描;功能模块二,数据1602显示。
3.1。4 ATC52系列单片机简介
错误!ATC52单片机的硬件结构
如图3—1所示,为ATC52的硬件结构图.ATC52单片机的内部结构与MCS-51系列单片机的构成基本相同。CPU是由运算器和控制器所构成的。运算器主要用来对操作数进行算术、逻辑运算和位操作的。控制器是单片机的指挥控制部件,主要任务的识别指令,并根据指令的性质控制单片机各功能部件,从而保证单片机各部分能自动而协调地工作.它的程序存储器为8K字节可重擦写Flash闪速存储器,闪烁存储器允许在线+5V电擦除、电写入或使用编程器对其重复编程。数据存储器比51系列的单片机相比大了许多为256字节RAM。ATC52单片机的指令系统和引脚功能与MCS-51的完全兼容。单片机ATC52
结构框图如图3。1.1所示。
12
图3。1。1 单片机ATC52结构框图
时钟 定时器 计数器 输入输出接口 CPU FLASH RAM 串行通讯口 2主要性能参数 ○
• 8K字节可重擦写Flash闪速存储器 • 1000次可擦写周期 • 全静态操作:0Hz—24MHz • 三级加密程序存储器 • 256×8字节内部RAM • 32个可编程I/O口线 • 3个16位定时/计数器 • 8个中断源
• 可编程串行UART通道 • 低功耗空闲和掉电模式
ATC52外部引脚图如图图3.1。2所示:
13
图3.1.2 ATC52外部引脚图
3ATC52管脚说明 ○VCC:电源 GND:接地
P0口:P0口是一个8位漏级开路的双向I/O口.作为输出口,每位能驱动8个TTL逻辑电平。对P0口端口写”1\"时,引脚作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。
在flash编程时,P0口也用来接受指令字节:在程序效验时,输出指令字节。程序效验时,需要外部上拉电阻。
P1口:P1口是一个具有内部上拉电阻的8位是双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑电平。对P1口写\"1”时,内部上拉电阻的原因,将输出电流ILL。
此外,与ATC51不同之处是,P1。0和P1.1还可分别作为定时/计数器2的外部计数输入(P1。0/T2)和输出(P1.1/T2EX),具体如表3。1。1所示。
表3.1.1 P1。0和P1.1的第二功能
引脚号 P1.0 P1。1 功能特性 T2(定时/计数器2外部计数脉冲输入),时钟输出 T2EX定时/计数2捕获/重装载触发和方向控制
在Flash编程和校验时,P1口接收低8位地址字节。
P2口:P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲级可驱动吸收
14
或输出电流4个TTL逻辑电平。对P2口写”1\"时,通过内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流ILL。
在访问外部好曾许存储器或用16位地址读取外部数据存储器时,P2口送出高8位地址。在这种应用中,P2口使用很强的内部上拉发送1。在使用8位地址访问外部数据存储器时,P2口输出P2锁存器的内容.在Flash编程和校验时,P2口接收低8位地址字节和一些控制信号。
P3口:P3口是一个具有内部上拉电阻的8位双向I/O口,P3输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑电平。对P3口写”1\"时,内部上拉电阻把端口拉高,此时可以作为输入端口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流ILL.P3口除了作为一般、的I/O口线外,更重要的是它的第二功能,如表3.1。2所示:
表 3.1.2 P3口引脚第二功能
引脚号 P3.0 P3。1 P3。2 P3.3 P3。4 P3。5 P3。6 P3.7 第二功能 RXD(串行输入) TXD(串行输出) INT0(外部中断0) INT1(外部中断1) T0(定时器0外部输入) T1(定时器1外部输入) WR(外部数据存储器写选通) RD(外部数据存储器读选通)
在Flash编程和校验时,P3口也接收一些控制信号。
RST:复位输入。晶振工作时,RST脚持续2个机器周期以高电平将使用单片机复位。 ALE/PROG:地址锁存器控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。在Flash编程时,此引脚(PROG)也使用作编程输入脉冲。
在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。
如果需要,通过将地址为8EH的SFR的第0位置”1”,ALE操作无效。这一位置”1”,ALE
15
仅在执行MOVX或MOVC指令时有效。否则,ALE将被微弱拉高.这个ALE使能标志位的设置对微控制器处于外部执行模式下无效.
PSEN:外部程序储存器选通信号(PSEN)是外部程序存储器选通信号。当ATC52
从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据储存器时,PSEN将不被激活。
EA/VPP:访问外部程序存储器控制信号.为使能从0000H—FFFFH的外部程序存储器
读取指令,EA端必须保持低电平(接地).为了执行内部程序指令,EA应该接VCC。
在flash编程期间,EA也接受12伏VPP电压。 XTA L1:振荡器反相放大器及内部时钟发生器的输入端. XTA L2:振荡器反相放大器的输出端. 错误!存储器结构
MCS—51器件有单独的程序存储器和数据存储器。外部程序存储器和数据存储器都可以K寻址。
1。 程序存储器
如果EA引脚接地,程序读取只从外部存储器开始。
对于C52,如果EA接VCC,程序先从内部存储器(地址为0000H~1FFFFH)开始,接着从外部寻址,寻址范围为:2000H~FFFFH。
2. 数据存储器
ATC52有256字节RAM.高128字节与特殊功能寄存器重叠。也就是说高128字节与特殊功能寄存器有相同的地址,而物理上是分开的。当一条指令访问高于7FH的地址时,寻址方式决定CPU访问高字节RAM还是特殊功能寄存器空间。直接寻址方式访问特殊功能寄存器(SFR)。
错误!定时器
1。 定时器0和定时器1
在ATC52中,定时器0和定时器1都是16位加法计数结构,分别由TH0(地址8CH)和TL0(地址8AH)及TH1(地址8DH)和TL1(地址8BH)两个8位计数器组成。这4个计数器均属于专用寄存器之列。每个定时器/计数器都有定时和计数两种功能。
2。 计数功能
所谓的计数功能是指对外部事件进行计数。外部事件的发生以输入脉冲表示,因此计数功能的实质就是对外脉冲进行计数.MCS—51系列的芯片有T0(P3。4)和T1(P3。5)
16
两个信号引脚,分别就是这两个计数器的计数输入端.外部输入的脉冲在负跳变时有效,进行计数器加1。
计数方式下,单片机在每个机器周期的S5P2拍节对外部计数脉冲进行采样。如果前一个机器周期采样为高电平,后一个机器周期采样为低电平,即为一个有效计数脉冲。在下一个机器周期的S3P1进行计数。可见采样计数脉冲是在2个机器周期进行的.鉴于此,计数脉冲的频率不能高于振荡脉冲的频率不能高于振荡脉冲频率的1/24。
3. 定时功能
定时器也是通过计数器的计数来实现的,不过此时的计数脉冲来自单片机的内部,即每个机器周期产生一个计数脉冲。也就是每个机器周期计数加1。由于一个机器周期等于12个振荡脉冲周期,因此计数频率为振荡频率的1/12.如果单片机采用12MHz晶体,则计数频率为1MHz。即每微秒计数器加1。这样不但可以根据计数值计算出定时时间,也可以反过来按定时时间的要求计算出计数器的预置值。
4。 定时器2
定时器2是一个16位定时器/计数器,它既可以作定时器,又可以做事件计数器。其工作方式由特殊寄存器T2CON中的C/T2位选择(如表2所示)。定时器2有三种工作模式:捕捉方式、自动重载(向上或向下计数)和波特率发生器。如表3。3所示,工作模式由T2CON中的相关为选择。定时器2有2个8位寄存器:TH2和TL2。在定时工作方式中,每个机器周期,TL2寄存器都会加1。由于一个机器周期由12个晶振周期构成,因此,计数频率就是晶振频率的1/12。定时器2工作模式如表3。1.3所示:
表3.1。3 定时器2工作模式
RCLK+TCLK 0 0 1 × CP/RL2 0 1 × × TR2 1 1 1 0 MODE 16位自动重载 16位捕捉 波特率发生器 不用
在计数工作方式下,寄存器在相关外部输入角T2发生1至0的下降沿时增加1。在这种方式下,每个机器周期的S5P2期间采样外部输入。一个周期采样到高电平,而下一个周期采样到低电平,计数器加1.在检测到跳变的这个周期的S3P1期间,新的计数值出现
17
在寄存器中。因为识别1—0的跳变需要2个机器周期(24个晶振周期),所以,最大的计数频率不高于晶振频率的1/24.为了确保给定的电平在采样前采样到一次,电平应该至少在一个完整的机器周期内保持不变。T2MOD-定时器2控制寄存器如表3。1.4所示:
表3.4 T2MOD-定时器2控制寄存器
T2MOD地址:0C9H 复位值:×××××00B — 7 符号 — T2OE DCEN - 6 功能 无定义,预留扩展 定时器2输出允许位 置1后,定时器2可配置向上或向下计数 — 5 - 4 - 3 — 2 T2OE 1 DCEN 0
错误!中断
ATC52有6个中断源:两个外部中断(INT0和INT1),三个定时中断定时器0、1、2和一个串行中断。每个中断源都可以通过置位或清除特殊寄存器IE中的相关中断允许控制位分别使得中断源有效或无效。IE还包括一个中断总控制位EA,它能禁止所有中断.
如表3.5所示,IE.6位是不可用的。对于ATS52,IE.5位也是不能用的。用户软件不应给这些位写1。它们为AT系列新产品预留。
定时器2可以被寄存器T2CON中的TF2和EXF2的或逻辑触发。程序进入中断服务后,这些标志位都可以由硬件清0。实际上,中断服务程序必须判定是否是TF2或EXF2激活中断。标志位也必须由软件清0.
定时器0和定时器1标志位TF0和TF1在计数溢出的那个周期的S5P2被置位.它们的值一直到下一个周期被电路捕捉下来。然而,定时器2的标志位TF2在计数溢出的那个周期被置位,在同一个周期被电路捕捉下来。中断允许控制位如表3.1.5所示:
18
表3.1.5 中断允许控制位
符号 EA 位地址 IE.7 功能 中断允许控制位,EA=0,中断总禁止;EA=1,各中断由各自的控制位设定 — ET2 ES ET1 EX1 ET0 EX0 IE.6 IE。5 IE.4 IE。3 IE。2 IE。1 IE.0 预留 定时器2中断允许控制位 串行口中断允许控制位 定时器1中断允许控制位 外部中断1允许控制位 定时器0中断允许控制位 外部中断0允许控制位
错误!晶振特性
ATC52单片机有一个用于构成内部振荡器的反相放大器,XTAL1和XTAL2分别是放大器的输入、输出端。石英晶体和陶瓷谐振器都可以用来一起构成自激振荡器。从外部时钟远驱动器件的话,XTAL2可以不接,而从XTAL1接入。由于外部时钟信号经过二分频触发后作为外部时钟电路输入的,所以对外部时钟信号的占空比没有其它要求,最长低电平持续时间和最少高电平持续时间等还是要符合要求的。
石英晶振 C1,C2=30PF+-10PF 陶瓷谐振器 C1,C2=40PF+-10PF 错误!空闲模式
在空闲工作模式下,CPU处于睡眠状态,而所有片上外部设备保持激活状态。这种状态可以通过软件产生.在这种状态下,片上RAM和特殊功能寄存器的内容保持不变。
空闲模式可以被任一个中断或硬件复位中止。由硬件复位终止空闲模式只需两个机器周期有效复位信号,在这种情况下,片上硬件禁止访问内部RAM,而可以访问端口引脚。空闲模式被硬件复位终止后,为了防止预想不到的写端口,激活空闲模式的那一条指令的下一条指令不应该是写端口或外部存储器。
错误!掉电模式
在掉电模式下,晶振停止工作,激活掉电模式的指令是最后一条执行指令.片上RAM和特殊功能寄存器保持原值,直到掉电模式终止。掉电模式可以通过硬件复位和外部中断退
19
出。复位重新定义例如SFR的值.在VCC未恢复到正常工作电压时,硬件复位不能无效.并且应保持足够长的时间以使晶振重新工作和初始化。空闲模式和掉电模式下的外部引脚状态如表3.1。6所示:
表3.1.6 空闲模式和掉电模式下的外部引脚状态
模式 空闲 空闲 掉电 掉电 程序存储器 内部 外部 内部 外部 ALE 1 1 0 0 PESN 1 1 0 0 PORT0 数据 浮空 数据 浮空 PORT1 数据 数据 数据 数据 PORT2 数据 地址 数据 数据 PORT3 数据 数据 数据 数据
3。 2 矩阵按键部分
键盘是单片机系统中最常用的人机对话输入设备,用户通过键盘向单片机输入数据或指令。键盘控制程序需完成的任务有:监测是否有键按下,有键按下时,若无硬件去抖动电路时,应用软件延时方法消除按键抖动影响;当有多个键同时按下时,只处理一个按键,不管一次按键持续多长时间,仅执行一次按键功能程序.
矩阵按键扫描程序是一种节省I/O口的方法,按键数目越多节省I/O口就越可观,思路:先判断某一列(行)是否有按键按下,再判断该行(列)是哪一只键按下。但是,在程序的写法上,采用了最简单的方法,使得程序效率最高。本程序中,如果检测到某键按下了,就不再检测其它的按键,这完全能满足绝大多数需要,又能节省大量的CPU时间。
采用4x4键盘与单片机的P1口相连,连接电路如图4所示.*设为复位键,按下时,清零,液晶显示为0.
按键说明图如图3。2.1所示: 按键电路流程图如图3。1.2所示:
20
图3.2。1 按键说明图
21
图3。1.2 按键电路流程图
3。 3 液晶显示器部分
11602字符型LCD简介 ○
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。下面以长沙太阳人电子有限公司的1602字符型液晶显示器为例,介绍其用法。一般1602字符型液晶显示器实物如图3。3.1所示:
图3。3。1 1602字符型液晶显示器实物图
错误!1602LCD的基本参数及引脚功能
1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如图3。3。2所示:
22
图3。3。2 1602LCD尺寸图
错误!1602 LCD主要技术参数: 显示容量:16×2个字符 芯片工作电压:4。5—5.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V 字符尺寸:2.95×4.35(W×H)mm 错误!引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表3.3.1所示:
表3.3。1 引脚接口说明表
编号 1 2 3 4 5 6 7 8
第1脚:VSS为地电源。 第2脚:VDD接5V正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生”鬼影\",使用时可以通过一个10K的电位器调整对比度.
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W
23
符号 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 引脚说明 数据 数据 数据 数据 数据 数据 背光源正极 背光源负极
共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据.
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。
○,5 1602LCD的指令说明及时序
1602液晶模块内部的控制器共有11条控制指令,如表3。3。2所示:
表3.3.2 控制命令表
序号 指令 1 2 3 4 5 6 7 8 9 10 清显示 光标返回 置输入模式 显示开/关控制 光标或字符移位 置功能 置字符发生存贮器地址 置数据存贮器地址 读忙标志或地址 写数到CGRAM或DDRAM) 从CGRAM或DDRAM读数 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 D 0 1 I/D C 1 * S B * * 1 S/C R/L * DL N F * 1 字符发生存贮器地址 1 显示数据存贮器地址 BF 计数器地址 要写的数据内容 11
1 1 读出的数据内容 1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)
指令1:清显示,指令码01H,光标复位到地址00H位置。 指令2:光标复位,光标返回到地址00H。
24
指令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:读数据.
与HD44780相兼容的芯片时序表如表3.3.3所示:
表3.3.3 基本操作时序表
读状态 写指令 输入 输入 RS=L,R/W=H,E=H 输出 D0-D7=状态字 无 RS=L,R/W=L,D0-D7=指令码,E=高脉输出 冲 读数据 输入 RS=H,R/W=H,E=H 输出 D0—D7=数据 无 写数据 输入 RS=H,R/W=L,D0—D7=数据,E=高脉冲 输出 读写操作时序如图3.3.3和3.3.4所示:
25
图3.3.3 读操作时序
图3。3。4 写操作时序图
错误!1602LCD的RAM地址映射及标准字库表
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效.要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,1602的内部显示地址图如图3.3.5所示:
26
图3.3。5 1602LCD内部显示地址
例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。
在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图10-58所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母”A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母\"A\",字符代码与图形对应图如图图3.3.6所示:
图3。3。6 字符代码与图形对应图
71602LCD的一般初始化(复位)过程 ○延时15mS
写指令38H(不检测忙信号) 延时5mS
写指令38H(不检测忙信号)
27
延时5mS
写指令38H(不检测忙信号)
以后每次写指令、读/写数据操作均需要检测忙信号 写指令38H:显示模式设置 写指令08H:显示关闭 写指令01H:显示清屏 写指令06H:显示光标移动设置 写指令0CH:显示开及光标设置 错误!硬件使用原理图
1602液晶显示模块可以和单片机ATC51直接接口,电路如图3。3.7所示:
图3。3.7 硬件使用原理图
28
第四章 单片机软件设计
本系统程序包括主程序、键盘扫描子程序、发送键码子程序、发送数据子程序、接收命令子程序等。主程序用于系统初始化,子程序调度等。键盘扫描子程序用于扫描键盘状态,将被按键的位置号存入缓冲器中。发送键码子程序用于将缓冲区键的接通码或断开码发送给单片机接口.发送数据子程序用于将数据发给单片机接口.接收命令子程序用于接收单片机接口发来的键盘命令.
4。1主程序设计
主程序通过键盘扫描子程序进行各行扫描是否有按键,消抖及重键处理:通过软件上延时程序来消除抖动;采用后按键优先处理,即多键同时按下时,只重复发送最后按下键的扫描码。主程序流程图如图4。1。1所示:
图4。1。1 主程序流程图
4.2 键扫程序设计
键扫程序的过程为:开始时,先判断是否有键闭合,无键闭合时,返回继续判断,有键闭合时,先去抖动,然后确定是否有键按下,若无键按下,则返回继续判断是否有键闭合,若有键按下,则判断键号,然后释放,若释放按键完毕,则返回,若没有释放按键,则返回
29
继续释放.其流程图如图4。2.1所示。
返回 图4。2.1 键扫程序流程图
释放 Y判断键号 Y确有键按下 N去抖动 Y有键闭合否? N返回 开始
4。3 算术运算程序设计
算术运算程序的过程为:先判断输入的运算符是+、—、*、/ 中的哪一个,若是+或-,则要判断运算结果是否溢出,溢出则显示错误信息,没溢出就显示运算结果,若是/,则要先判断除数是否为零,为零就显示错误信息,不为零则显示运算结果,若是-,则直接显示运算结果。其流程图如图4.3。1所示:
30
图4.3.1 算术运算程序设计流程图
数值送显示缓冲 运算结溢出? 错误送显示缓冲 NNYY除数为0? 加 乘 除 减 运算符? 开始 4.4 显示程序设计
显示程序的过程为:显示开始时,先进行LCD的初始化,然后依次判断显示位置。其流程图如图4。4。1所示:
31
图4。4。1 显示程序流程图
32
5.1 软件仿真
如图5.1.2图所示:
第五章 单片机安装、调试
利用Protel仿真软件进行全面的仿真测试,截图如图5。1。1所示,硬件连接PCB图
图5。1 软件仿真截图
33
图5。1。2 硬件连接PCB图
5。2 安装步骤
5。2。1 检查元件的好坏
按电路图买好元件后首先检查买回元件的好坏,按各元件的检测方法分别进行检测,一定要仔细认真。而且要认真核对原理图是否一致,在检查好后才可上件、焊件,防止出现错误焊件后不便改正。
5.2.2 放置、焊接各元件
按原理图的位置放置各元件,在放置过程中要先放置、焊接较低的元件,后焊较高的和要求较高的元件。特别是容易损坏的元件要后焊,在焊集成芯片时连续焊接时间不要超过10s,注意芯片的安装方向。现在列出电源自锁开关、供电方式和轻触按键的制作安装方式。其中,电源自锁开关的连接方式如图5.2.1所示:
34
错误!电源自锁开关制作安装
图5。2。1 电源开关软件及硬件图
图5。2。1中,P2是电池盒接口或者是USB输入的接口,图5。3中SW1为电源开关,用来接通电源和断开电源。
错误!供电方式制作安装
原理图如图5。2。2所示,实物图如图5。2。3所示:
图5.2。2 供电原理图
35
图5。2。3 供电实物图
错误!轻触开关制作安装
轻触开关的原理图如图5。2.4所示,实物图如图5.2。5所示:
36
图5。2。4 轻触开关原理图
图5。2.5 轻触开关按键接法
这种按键接法:
1。上下接两个脚(一个接地,一个接单片机IO口)
2。接斜对脚是绝对不会接错的(一个接地,一个接单片机IO口)
基于以上制作出来的计算器能进行基本的四则运算,仿真软件中的功能实现成功。实际效果图如下图所示,包括正反面以及运算界面,如图5。2.6所示:
37
图5.2。6 实物图
5.3 调试
5。3。1 硬件调试
常见故障:
1、逻辑错误:它是由设计错误或加工过程中的工艺性错误所造成的。这类错误包括错线、开路、短路等。
2、元器件失效:有两方面的原因:一是器件本身已损坏或性能不符合要求;二是组装错误造成元件失效,如电解电容、集成电路安装方向错误等。
3、可靠性差:因其可靠性差的原因很多,如金属化孔、接插件接触不良会造成系统时好时坏,经不起振动;走线和布局不合理也会引起系统可靠性差.
4、电源故障:若样机由电源故障,则加电后很容易造成器件损坏。电源故障包括电压值不符合设计要求,电源引线和插座不对,功率不足,负载能力差等。
调试方法:包括多级调试和联机调试。在调试过程中要针对可能出现的故障认真分析,直至检查出原因并排除。本次硬件调试过程中,对所出现的问题进行了认真的分析和改正,最后能够很好的达到设计要求的效果。
38
5.3.2 软件调试
软件调试一般分为以下四个阶段:1、 编写程序并查错;2、在C语言的编译系统中编译源程序3、对程序进行编译连接,并及时发现程序中存在的错误;4、改正错误。
在本次调试中出现的问题有: 1、在程序中有的函数名未定义;
2、在抄录程序时,少录入一些字符,如:”;”、\"{“、\"-\"等符号,而出现错误; 3、有一些函数名录入时少写一个字母或顺序颠倒; 4、没有注意函数名的调用及定义;
5、芯片引脚定义出错而导致没有实验现象。
在软件调试过程中,对出现的错误进行了认真的分析和修改,多次调试成功后,能够很好的达到既定的设计效果.
39
结束语
通过这次电子综合实践的学习,着重培养了我思考、综合运用所学有关知识的能力,能更好的巩固单片机、c 语言、模拟电路、数字电路学习的内容。
我的题目是基于ATC52的计算器设计,对于我来说,这是一次考验。怎样才能找到课堂所学与实际应用的最佳结合点?怎样让自己的业余更接近专业?怎样让自己的计划更具有序性,而不会忙无一用?这都是我们所要考虑和努力的。这次毕业设计我学到很多很多的东西,学会了怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。不仅巩固了以前所学过的知识,而且学到了很多在书本上没有学到过的知识,掌握了一种系统的研究方法,可以进行一些简单的编程。通过这次毕业设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和思考的能力。同时在设计的过程中发现了自己的不足之处,例如对以前所学过的知识理解得不够深刻,掌握得不够牢固,对编程语言掌握得不够好等.
40
致谢
首先,衷心感谢我的指导老师。本文是在何惠芳精心指导下完成的。何老师以其严谨求实的治学态度、高度的敬业精神、兢兢业业、孜孜以求的工作作风和大胆创新的进取精神对我产生了重要影响。对于我在写作论文过程中给予的指导,严谨求实的治学态度,使我受益匪浅。在此表示衷心的感谢.
衷心感谢所有给予我支持、帮助和关心的领导、老师、亲友和同学们!
另外,我还要特别感谢同学们对我实验以及论文写作的指导,他们为我完成这篇论文提供了巨大的帮助。
最后,再次对关心、帮助我的老师和同学表示衷心感谢。
41
参考文献
[1]杨文龙编。单片机原理及应用[M].西安:西安电子科技大学出版社,2005。 [2]杨将新,李华军编.单片机程序设计及应用[M]。北京:电子工业出版社,2006。 [3]陈有卿,张晓东编。报警集成电路和报警器制作实例[M].北京:北京人民邮电出版社2001。
[4]高文焕,刘润生编。电子线路基础[M]。北京:北京高等教育出版社,1997。 [5]王世昌编.电子线路辅导和题选[M]。上海:上海科学技术文献出版社,1999. [6]王远编.模拟电子技术基础学习指导书北[M].北京:清华大学出版社,1998. [7]邱关源主编.电路(上﹑下册)[M].第四版。北京:高等教育出版社,1999.
42
附录—程序源代码
/*
接盘按键说明:
—---—-——--——-—--——--—-————-—-———---—--———-——————-— |1|2|3|+|
— - — - — - — — — - — — — |4|5|6|—|
- — — - — - — — - — — - — |7|8|9|*|
— — - - - - - — — - - - — | C |0|=|/|
-----——--——--—--———--—--—————-—-—--——---—-—-----——*/ //操作简介
// 按第一个数,再按'+—*/’,再按’=’显示出结果,然后按C清屏 // 加最大9999+9999=19998 // 减最大9999-0 =9999 // 乘最大9999*9999=99980001 // 除 1/9=0。1111 保留小数点后4位 #include //——————-—LCD1602-----—---—--—--——-— 43 //-——-----KEY—-—---—--—-——--—------— //P1口 //——--—---KEY--———-----—-—————-—-—-- uchar code table[]= ““; longint data_a,data_b; //第一个数和第二个数 longint 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 ; } //************************************************************************/ // 描述: 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 45 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)//初始化液晶,及画面初始化 { 46 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)/* 通过读入数据组合判断按键位置 */ 47 { 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 { 48 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) { 49 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]);}//显示万万 50 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; 51 case 3:data_c=(data_a*data_b);break;/* * S=3 *///乘 case 4: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();/*动态扫描键盘,返回按键对应值,赋给jkey=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++;//必须按了+-*/才能输入第二个数 52 } 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);/*等待按键松开*/ }//(0xff!=key) }//while }//main 53
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- cepb.cn 版权所有 湘ICP备2022005869号-7
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务