智能仪器简易计算器设计报告.docx

上传人:b****2 文档编号:2002287 上传时间:2023-05-02 格式:DOCX 页数:37 大小:112.32KB
下载 相关 举报
智能仪器简易计算器设计报告.docx_第1页
第1页 / 共37页
智能仪器简易计算器设计报告.docx_第2页
第2页 / 共37页
智能仪器简易计算器设计报告.docx_第3页
第3页 / 共37页
智能仪器简易计算器设计报告.docx_第4页
第4页 / 共37页
智能仪器简易计算器设计报告.docx_第5页
第5页 / 共37页
智能仪器简易计算器设计报告.docx_第6页
第6页 / 共37页
智能仪器简易计算器设计报告.docx_第7页
第7页 / 共37页
智能仪器简易计算器设计报告.docx_第8页
第8页 / 共37页
智能仪器简易计算器设计报告.docx_第9页
第9页 / 共37页
智能仪器简易计算器设计报告.docx_第10页
第10页 / 共37页
智能仪器简易计算器设计报告.docx_第11页
第11页 / 共37页
智能仪器简易计算器设计报告.docx_第12页
第12页 / 共37页
智能仪器简易计算器设计报告.docx_第13页
第13页 / 共37页
智能仪器简易计算器设计报告.docx_第14页
第14页 / 共37页
智能仪器简易计算器设计报告.docx_第15页
第15页 / 共37页
智能仪器简易计算器设计报告.docx_第16页
第16页 / 共37页
智能仪器简易计算器设计报告.docx_第17页
第17页 / 共37页
智能仪器简易计算器设计报告.docx_第18页
第18页 / 共37页
智能仪器简易计算器设计报告.docx_第19页
第19页 / 共37页
智能仪器简易计算器设计报告.docx_第20页
第20页 / 共37页
亲,该文档总共37页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

智能仪器简易计算器设计报告.docx

《智能仪器简易计算器设计报告.docx》由会员分享,可在线阅读,更多相关《智能仪器简易计算器设计报告.docx(37页珍藏版)》请在冰点文库上搜索。

智能仪器简易计算器设计报告.docx

智能仪器简易计算器设计报告

《智能仪器》

课程设计报告

 

题目∶

简易计算器设计

院系∶

机械与电子工程学院

专业班级∶

姓名∶

学号∶

指导老师

 

2015年1月13日

概  要

随着时代的进步和发展,单片机技术已经普及到我们生活、工作、科研等各个领域,已经成为一种比较成熟的技术,本文将介绍一种用单片机设计的简单计算器。

这个计算器除了会加减乘除的运算功能以外,还具有连续运算的功能。

本文首先简单描述了硬件系统的工作原理,且附以硬件系统的设计框图,论述了本次课程设计所应用的硬件接口技术和各个接口模块的功能及工作过程,并具体描述了外接电路接口的软、硬件调试。

其次阐述了程序的流程和实现过程。

本次课程设计就是以C51来进行软件设计,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了。

使硬件在软件的控制下协调运作。

本文撰写的主导思想是软、硬件相结合,以硬件为基础,来进行各功能模块的编写。

关键词:

计算器,单片机,AT89C51,汇编语言,模块化

概要-----------------------------------------------------------------1

第一章课程设计选题及设计要求-------------------------------------------3

1.1课程设计选题--------------------------------------------------------3

1.2课题设计要求---------------------------------------------------------3

第二章方案选择----------------------------------------------------------4

4.3源程序--------------------------------------------------------------15

第五章调试程序-----------------------------------------------------------------27

5.1调试结果分析-------------------------------------------------------27

5.2存在的问题及解决方法------------------------------------------------28

参考文献-----------------------------------------------------------------31

第一章课程设计选题与功能要求

 

1.1 课程设计选题:

此次课程设计包含九个课题,存在几个比较难得课题但大部分还是算比较简单的,像简易数字示波器就比较有难度,因为涉及的模块比较多,像AD采集转换、LCD12864,而且自己对LCD12864不是很熟悉,在一个礼拜的课程设计的时间里很难熟练地掌握和应用,故没有选择;课题中相对来说也存在几个简单的课题,像灯光控制器,交通灯,因为自己先前做过类似的实验,所以没有选择。

在考虑课题难度及时间的情况下,再综合自己的实践能力,我就选择难度不是很大的“简易计算器设计”这一个课题。

一是因为自己对这个课题感兴趣,而且经常在学习中使用;二是自己对这个课题有一定的理论基础和完成这个课题的构思,所以就定下了这课题。

 

1.2课题设计要求

1.能进行多字节的整数的单独运算,结果用十进制的数字显示;

2.尝试编写连加、连减的运算程序并进行演示;

3.尝试编写混合的运算程序并进行演示;

4.尝试编写实数的连加、连减运算程序。

 

第二章方案选择

2.1单片机芯片的选择:

方案一:

采用89C51芯片作为硬件核心,采用FlashROM,内部具有4KBROM存储空间,能于3V的超低压工作。

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能、CMOS、8位单片机。

该器件采用ATMEL高密度非易失存储器制造技术制造,而且与MCS-51系列单片机完全兼容。

2.2显示模块的选择:

方案一:

采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以不用此种作为显示.

方案二:

采用LED数码管动态扫描,虽然LED数码管价格适中,但要显示多个数字所需要的个数偏多,功耗较大,所以也不用此种作为显示。

方案三:

采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,与普通数码管相比功耗较小,硬件连接简单。

所以显示部分采用1602液晶。

2.3电路设计最终方案:

综上各方案所述,对本次设计的方案选定为:

1.采用AT89C51作为主控制系统;

2.4X4矩阵键盘和独立键盘作为输入模块;

3.1602液晶作为显示模块。

 

第三章硬件电路设计

 

3.1总体框图设计

1.本设计里用到的单片机芯片是AT89C51芯片,除此之外还包括:

晶振电路和复位电路构成单片机最小应用系统;

2.4x4矩阵键盘;

3.LCD显示电路。

 

 总体设计框图

3.2主要单元电路

3.2.1TC89C52RC单片机介绍

STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。

主要特性如下:

1.增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051.

2.工作电压:

5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)

3.工作频率范围:

0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz

4.用户应用程序空间为8K字节

5.片上集成512字节RAM

6.通用I/O口(32个)复位后为:

,P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。

7.ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片

8.具有EEPROM功能

9.具有看门狗功能

10.共3个16位定时器/计数器。

即定时器T0、T1、T2

11.外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触发中断方式唤醒

12.通用异步串行口(UART),还可用定时器软件实现多个UART

13.工作温度范围:

-40~+85℃(工业级)/0~75℃(商业级)

14.PDIP封装

STC89C52RC单片机的工作模式

掉电模式:

典型功耗<0.1μA,可由外部中断唤醒,中断返回后,继续执行原程序

空闲模式:

典型功耗2mA典型功耗

正常工作模式:

典型功耗4Ma~7mA典型功耗

掉电模式可由外部中断唤醒,适用于水表、气表等电池供电系统及便携设备

STC89C52RC引脚功能说明

VCC(40引脚):

电源电压

VSS(20引脚):

接地

P0端口(P0.0~P0.7P0.7,39~32引脚):

P0口是一个漏极开路的8位双向I/O口。

作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入每个引脚能驱动写入“1”时,可以作为高阻抗输入。

在访问外部程序和数据存储器时在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线位数据的复用总线。

此时,P0口内部上拉电阻有效。

在FlashROM编在程时,P0端口接收指令字节端口接收指令字节;而在校验程序时,则输出指令字节则输出指令字节。

验证时,要求外接上拉电阻。

P1端口(P1.0~P1.7,1~8引脚):

P1口是一个带内部上拉电阻的8位双向I/O口。

P1的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。

对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。

P1口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流()。

此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),具体参见下表:

在对FlashROM编程和程序校验时,P1接收低8位地址。

表XXP1.0和P1.1引脚复用功能

P2端口(P2.0~P2.7,21~28引脚):

P2口是一个带内部上拉电阻的8位双向I/O端口。

P2的输出缓冲器可以驱动(吸收或输出电流方式)4个TTL输入。

对端口写入1时,通过内部的上拉电阻把端口拉到高电平,这时可用作输入口。

P2作为输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流(I)。

在访问外部程序存储器和16位地址的外部数据存储器(如执行“MOVX@DPTR”指令)时,P2送出高8位地址。

在访问8位地址的外部数据存储器(如执行“MOVX@R1”指令)时,P2口引脚上的内容(就是专用寄存器(SFR)区中的P2寄存器的内容),在整个访问期间不会改变。

在对FlashROM编程和程序校验期间,P2也接收高位地址和一些控制信号。

P3端口(P3.0~P3.7,10~17引脚):

P3是一个带内部上拉电阻的8位双向I/O端口。

P3的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。

对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。

P3做输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输入一个电流()。

在对FlashROM编程或程序校验时,P3还接收一些控制信号。

P3口除作为一般I/O口外,还有其他一些复用功能,如下表所示:

表XXP3口引脚复用功能复用功能

RST(9引脚):

复位输入。

当输入连续两个机器周期以上高电平时为有效,用来完成单片机单片机的复位初始化操作。

看门狗计时完成后,RST引脚输出96个晶振周期的高电平。

特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。

DISRTO默认状态下,复位高电平有效。

ALE/ROG(30引脚)地址锁存控制信号:

(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。

在Flash编程时,此引脚(ROG)也用作编程输入脉冲。

在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。

然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。

如果需要,通过将地址位8EH的SFR的第0位置“1”,ALE操作将无效。

这一位置“1”,ALE仅在执行MOVX或MOV指令时有效。

否则,ALE将被微弱拉高。

这个ALE使能标志位(地址位8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。

外部程序存储器选通信号(SEN)是外部程序存储器选SEN(29引脚)

通信号。

当AT89C51RC从外部程序存储器执行外部代码时,SEN在每个机器周期被激活两次,而访问外部数据存储器时,SEN将不被激活。

A/VPP(31引脚)访问外部程序存储器控制信号。

为使能从0000H到FFFFH的外部程序存储器读取指令,A必须接GND。

注意加密方式1时,A将内部锁定位RESET。

为了执行内部程序指令,A应该接VCC。

在Flash编程期间,A也接收12伏VPP电压。

XTAL1(19引脚):

振荡器反相放大器和内部时钟发生电路的输入端。

XTAL2(18引脚):

振荡器反相放大器的输入端。

 

3.2.24X4键盘控制电路

矩阵式键盘的结构与工作原理:

在键盘中的按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图2.5所示。

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样,只需要单片机的一个端口(如P1口)就可以构成4*4=16个按键,比直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。

由此可见,在需要的键数比较多时,采用矩阵法来做键盘比较是合理的。

由于本系统按键较多,在这里采用矩阵式4*4键盘,这样可以合理应用硬件资源,用一个8位I/O口控制,如图2.5所示:

图2.5按键电路

矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,图2.5中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。

这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。

一旦有键按下,则输入线就会被拉低,行线输出是低电平。

这样,通过读入输入线的状态就可得知是否有键按下了。

具体的识别及编程方法如2.3.2所述。

矩阵式键盘的工作方法:

为了确定矩阵式键盘上何键被按下,我们采用一种“扫描法”。

扫描法:

扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。

以图2.5所示键盘电路为例,介绍过程如下:

1.判断键盘中有无键按下将全部行线X0-X3置低电平,然后检测列线的状态。

只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。

若所有列线均为高电平,则键盘中无键按下。

2.判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。

其方法是:

依次将行线置为低电平,即在置某根行线为低电平时,其它行线为高电平。

在确定某根行线为低电平后,再逐行检测各列线的电平状态。

若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

如图2.5所示。

AT89C51单片机的P1口用作键盘I/O口,键盘的列线接到P1口的高4位,键盘的行线接到P1口的低4位。

列线P14-P17分别接有4个上拉电阻到正电源+5V,并把行线P10-P13设置为输出线,列线P14-P17设置为输入线。

4根行线和4根列线形成16个相交点。

1.检测当前是否有键被按下。

检测的方法是P10-P13输出全“0”,读取P14-P17的状态,若P14-P17为全“1”,则无键闭合,否则有键闭合。

2.去除键抖动。

当检测到有键按下后,延时一段时间再做下一步的检测判断。

3.若有键被按下,应识别出是哪一个键闭合。

方法是对键盘的行线进行扫描。

P10-P13按下述4种组合依次输出:

P131110

P121101

P111011

P100111

在每组行输出时读取P14-P17,若全为“1”,则表示为“0”这一行没有键闭合,否则有键闭合。

由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值。

4.为了保证键每闭合一次CPU仅作一次处理,必须消除键释放时的抖动。

 

3.2.3LCD显示电路

1.1602介绍

字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。

下面以长沙太阳人电子有限公司的1602字符型液晶显示器为例,介绍其用法。

一般1602字符型液晶显示器实物如图:

图-41602字符型液晶显示器实物图

2.1602LCD的基本参数及引脚功能

1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图所示:

性能参数:

显示容量:

16×2个字符芯片工作电压:

4.5—5.5V工作电流:

2.0mA(5.0V)

模块最佳工作电压:

5.0V字符尺寸:

2.95×4.35(W×H)mm

引脚功能说明:

编号符号引脚说明编号符号引脚说明

1VSS电源地9D2数据

2VDD电源正极10D3数据

3VL液晶显示偏压11D4数据

4RS数据/命令选择12D5数据

5R/W读/写选择13D6数据

6E使能信号14D7数据

7D0数据15BLA背光源正极

8D1数据16BLK背光源负极

第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脚:

背光源负极。

3.1602LCD的指令说明及时序

1602液晶模块内部的控制器共有11条控制指令,如表-4所示:

序号指令RSR/WD7D6D5D4D3D2D1D0

1清显示0000000001

2光标返回000000001*

3置输入模式00000001I/DS

4显示开/关控制0000001DCB

5光标或字符移位000001S/CR/L**

6置功能00001DLNF**

7置字符发生存贮器地址0001字符发生存贮器地址

8置数据存贮器地址001显示数据存贮器地址

9读忙标志或地址01BF计数器地址

10写数到CGRAM或DDRAM)10要写的数据内容

11从CGRAM或DDRAM读数11读出的数据内容

表-4:

控制命令表

1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。

(说明:

1为高电平、0为低电平)

指令1:

清显示,指令码01H,光标复位到地址00H位置。

指令2:

光标复位,光标返回到地址00H。

指令3:

光标和显示模式设置I/D:

光标移动方向,高电平右移,低电平左移屏幕上所有文字是否左

移或者右移。

高电平表示有效,低电平则无效。

指令4:

显示开关控制。

D:

控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:

制光标的开与关,高电平表示有光标,低电平表示无光标B:

控制光标是否闪烁,高电平闪烁,

低电平不闪烁。

指令5:

光标或显示移位S/C:

高电平时移动显示的文字,低电平时移动光标。

指令6:

功能设置命令DL:

高电平时为4位总线,低电平时为8位总线N:

低电平时为单行显示,高

电平时双行显示F:

低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。

指令7:

字符发生器RAM地址设置。

指令8:

DDRAM地址设置。

指令9:

读忙信号和光标地址BF:

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

果为低电平表示不忙。

指令10:

写数据。

指令11:

读数据。

第四章软件编程设计

4.1流程图

 

4.2设计思路分析

总的来说,我的设计思路主要由以下几个模块来构成的:

1.实时键盘扫描模块(4*4矩阵键盘和多个独立按键):

键盘作为输入设备,提供给使用者使用。

因为要做到使用者一按键,系统就能响应,因此此模块需实时进行扫描输入,故此模块使用了一个定时器(T0)进行间隔10ms的扫描。

2.实时显示模块(LCD1602):

1602液晶显示屏用作按键所对应的键值的显示和数据运算结果的输出。

因为要实时显示按键所对应的值,故此模块也需通过定时器(T1)进行实时的显示输出。

3.数据处理模块:

此模块又可细分为四个小模块来进行更好的理解;第一个是‘取值存储’模块,第二个是‘运算处理’模块,第三个是‘符号判断’模块,第四个是‘结果输出’模块。

此模块的四个小模块为顺序执行。

 

当一个键盘按下的时候,经过按键程序判断按键所代表的字符,转向显示子程序来显示,并在相应的数组中进行存储,然后等待下一个按键按下,直到所按下的键代表“=”时,程序转向数据处理模块,经过上述所讲的四个小模块就能得到运算的结果并进行结果的输出显示。

 

资源分配(包含端口):

P1口用做4*4矩形键盘的输出响应端口;

P0口用作LCD1602液晶显示模块的输入控制端口;

P3.2、P3.3端口用作独立键盘的输出响应端口;

定时器T0用作定时(30ms)扫描4*4矩阵键盘;

定时器T1用作定时(10ms)扫描显示输出;

 

端口和变量的定义:

因在下述程序中可以看到本程序所有使用的变量,故可参考下述

详细程序的变量定义。

 

4.3源程序

4.3.1主程序

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharcodetab[]={'1','7','8','9','/','4','5','6','*','1','2','3','-','0','.','=','+'};

ucharflag=0,flag1=0,fuhao=0;

uintkeyvalue,result4,sign=0,p=0;//全局变量注:

int为2个字节

inti,datagroup[15],signgroup[15];

sbitreset=P3^2;

sbitdelete=P3^3;

voidtimer0_init();

voidtimer1_init();

voidjianpan_scanning();

voiddelay10ms(uintz);

voiddisplay();

voidcatch_keyvalue(/*uintkeyvalue1*/);//取数并存于数组函数

//voidoutputview1(uintresult1);//输出显示函数

voidoutputview2(uintresult2);

uint

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2