单片机课程设计计算器设计资料Word文档下载推荐.docx

上传人:b****7 文档编号:22853012 上传时间:2023-02-05 格式:DOCX 页数:26 大小:324.32KB
下载 相关 举报
单片机课程设计计算器设计资料Word文档下载推荐.docx_第1页
第1页 / 共26页
单片机课程设计计算器设计资料Word文档下载推荐.docx_第2页
第2页 / 共26页
单片机课程设计计算器设计资料Word文档下载推荐.docx_第3页
第3页 / 共26页
单片机课程设计计算器设计资料Word文档下载推荐.docx_第4页
第4页 / 共26页
单片机课程设计计算器设计资料Word文档下载推荐.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

单片机课程设计计算器设计资料Word文档下载推荐.docx

《单片机课程设计计算器设计资料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机课程设计计算器设计资料Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。

单片机课程设计计算器设计资料Word文档下载推荐.docx

要求设计一个单片机应用系统,利用keil和proteus软件完成系统软硬件的设计及模拟调试。

实现五位数(可为带小数点)的加减乘除运算,通过按键输入十进制数据。

利用六位数码管显示运算结果。

并实现复位操作。

由于要设计的是简单的计算器,可以进行四则运算,为了得到教好的显示效果,采用LCD显示数据和结果。

、另外键盘包括数字键(0-9)、符号键(+、-、*、/)、清除键和等号键,故只需要16个按键即可,设计中采用集成的计算机键盘来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果,执行程序:

开机显示零,等待键入数值,当键入数字,通过LCD显示出

二、设计方案

2.1硬件电路设计方案

2.1.1基本结构

计算器一般由运算器、控制器、键盘、显示器、电源和一些可选外围设备及电子配件通过人工或机器设备组成。

键盘是计算器的输入部件,一般采用接触式或传感式。

显示器是计算器的输出部件,有发光二极管显示器或液晶显示器等。

除显示计算结果外,还常有溢出指示、错误指示等。

计算器电源采用交流转换器或电池。

计算器都采用CMOS工艺制作的大规模集成电路。

本次课程设计中我是采用了以MCS—51系列的单片机AT89C51单片机为核心构成的简易计算器。

该系统通过单片机控制,实现对4*4键盘进行实时扫描的按键检测,并把检测数据存储下来。

整个计算器系统的工作过程为:

首先存储单元初始化,显示初始值和键盘扫描,判断按键位置,查表得出按键值,单片机则对数据进行储存与相应处理转换,之后送入数码管动态显示。

整个系统可分为三个主要功能模块:

功能模块一,实时键盘扫描;

功能模块二,数据转换成显示器显示;

功能模块三,计算控制模块。

功能模块四:

显示模块。

2.1.2系统框架图

图2.1系统总体框架图

2.1.3工作流程图

No

Yes

图2.2系统工作流程图

2.1.4单片机主控制模块

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

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

主要特性:

与MCS-51兼容;

4K字节可编程闪烁存储器;

1000写/擦循;

数据保留时间:

10年;

全静态工作:

0Hz-24Hz;

三级程序存储器锁定;

128*8位内部RAM;

32可编程I/O线;

两个16位定时器/计数器;

5个中断源;

可编程串行通道;

低功耗的闲置和掉电模式;

片内振荡器和时钟电路

74LS245是我们常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。

74LS245还具有双向三态功能,既可以输出,也可以输入数据。

当8051单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。

当片选端/CE低电平有效时,DIR=“0”,信号由B向A传输;

(接收)

DIR=“1”,信号由A向B传输;

(发送)当CE为高电平时,A、B均为高阻态。

由于P2口始终输出地址的高8位,接口时74LS245的三态控制端1G和2G接地,P2口与驱动器输入线对应相连。

P0口与74LS245输入端相连,E端接地,保证数据线畅通。

8051的/RD和/PSEN相与后接DIR,使得RD且PSEN有效时,74LS245输入(P0.1←D1),其它时间处于输出(P0.1→D1)。

图274LS245引脚图

2.2系统功能描述

本程序有LCD动态显示,键盘输入显示功能,程序启动时默认为计算器状态。

(1)计算器状态下:

按“0”~“9”,显示相应数字;

按“复位”,恢复初始化模式;

按“加减乘除”可实现加减乘除的运算功能

三、各模块功能介绍

3.1键盘输入模块

3.1.1键盘分布图

图3.1计算器键盘图

3.1.2工作原理

本设计采用P3口作为矩阵键盘输入口,开始工作后,单片机先对矩阵键盘的行进行扫描。

若无键按下,先使P3为11110000,然后检测外来输入,若有输入,则可使四位的0其中一位置1,即完成了按行号的输入。

列扫描远离同行扫描相同,不过P3初始为00001111.检测完行号与列号后,产生一个8位二进制码,即可对键盘值进行输入。

3.2运算控制模块

图3.2计算器运算控制模块

控制模块控制着数字录入,数字录入是进行计算的前提,它是将从矩阵键盘上输入的数值、运算符等录入单片机处理器进行处理,从而得出运算结果。

计算模块作为计算器的核心模块共有加、减、乘、除四个部分。

其设计原理是先将键盘输入的BCD码数字转换为十进制数字,然后再对其进行运算。

由于最后需要进行输出显示,所以我们的最终结果以十进制的形式显示在六位的数码显示管上。

3.3显示模块

图3.3数码管显示屏

本设计采用了六位数码管,可以显示0~999999之间的任意整数,由于LED数码管有6个,若采用静态显示,则最少需要48根数据线与6根地址线,这对只有40个引脚的单片机来说是不可能实现的。

所以我采用了动态扫描的显示方法。

其原理是不同时刻对不同位上的数码管进行选通,同时对其进行数码输出。

当扫描频率很高时,将不会看到数码管的闪烁。

本设计应用了定时器中断来实现间时显示。

3.4振荡电路模块

图3,.4振荡电路

振荡电路如图所示。

图中晶振的两端分别接单片机的19和18脚。

时钟有内部电路产生,定时器件为石英晶体和电容组成的并联谐振回路。

3.5起保护作用模块

图3.5限流电阻

这一排限流电阻,它们的作用是起保护作用,防止数码管的段位被烧坏。

四、仿真电路

图4.1系统电路仿真图

仿真运行结果

例如:

运行23*2时,一次在键盘上输入数据和功能键,功能键不会再数码管上显示出来,只会显示出输入的数据和运行结果。

图4.2输入数据23时

图4.3输入数据2

图4.4计算23*2的运行结果

五、调试过程总结

开始在做这个单片机课设的时候,感觉无从下手,一点头绪都没有。

后来上网查了好多资料,向学长请教。

终于功夫不负有心人,做出了这个单片机的课设。

调试过程中也遇到了一些问题,先是数码管显示数据不完整,经过仔细检查发现是线路连接的错误;

后来又遇到计算时会出现运算错误,经过查找发现原来是编程的问题。

在利用keil软件编程的过程中,会出现各种各样的问题,有的是由于粗心而引起的,有的是因为概念模糊而导致的。

再用proteus进行仿真时,会出现的问题主要是线路连接问题,可能会不小心把线连错,其他的我觉得只要元器件选择好,各引脚的功能清楚的话一般不会有太大的问题。

在这次做课程设计的过程中我深深体会到了要独立完成一个作品的设计是多么不容易。

虽然我做的只是最基础的,但是从这个最小的系统中却是利用了单片机的最基础的功能。

在这个过程中,我们不仅仅是编程仿真那么简单,还需要有极大的耐心与毅力。

设计的过程中会遇到各种各样的问题,我们应该静下心来好好研究,这对于我们以后的工作也是非常重要的。

总的来说,这次课程设计,一个礼拜的紧张忙碌终于完成了。

感觉自己的收获还是很多的,无论是对专业知识的了解还是对硬件的设计,都是需要我们下很大的功夫去研究的。

通过这次课程设计,最大的一点体会是单片机学的不够扎实,不会的很多啊,当然这次的课程设计做计算器程序用的是汇编语言,尽管大家都知道汇编编这个程序很困难,但还是互相学习,到处找资料看,问同学,所以我的软件主程序才能编译成功,系统才能调试出结果。

很感谢那些热心教导我的同学和指导我的老师。

【1】姜志海、刘连鑫等,单片机微型计算机原理及应用[M]。

北京:

电子工业出版社,2011

【2】周润景,张丽娜。

基于PROTEUS的电路及单片机系统设计与仿真[M]。

北京:

北京航空航天大学出版社,2006

源程序代码

YJEQU50H;

结果存放

YJ1EQU51H;

中间结果存放

GONGEQU52H;

功能键存放

ORG00H;

程序存放的首地址

START:

MOVR3,#0;

初始化显示为空

MOVGONG,#0;

功能键清零

MOV32H,#00H;

(32H)=00H,存放输入的数据

MOV33H,#00H;

(33H)=00H

MOV34H,#00H;

(34H)=00H

MLOOP:

CALLDISP;

调显示子程序,call通过入口地址跳转有返回,返回地址压入堆栈。

WAIT:

CALLTESTKEY

NEXT1:

CJNEA,#1,NEXT2

LJMPE1

NEXT2:

CJNEA,#2,NEXT3

NEXT3:

CJNEA,#3,NEXT4

NEXT4:

CJNEA,#4,NEXT5

NEXT5:

CJNEA,#5,NEXT6

NEXT6:

CJNEA,#6,NEXT7

NEXT7:

CJNEA,#7,NEXT8

NEXT8:

CJNEA,#8,NEXT9

NEXT9:

CJNEA,#9,NEXT10

NEXT10:

CJNEA,#10,NEXT11;

判断是否功能键

LJMPE2;

转功能键处理

NEXT11:

CJNEA,#11,NEXT12

LJMPE2

NEXT12:

CJNEA,#12,NEXT13

LJMPE2

NEXT13:

CJNEA,#13,NEXT14

NEXT14:

CJNEA,#14,NEXT15

NEXT15:

LJMPE3;

判断是否清除键

E1:

CJNER3,#1,N1;

判断第几次按键,若(R3)不等于

(1),则跳转到N1处执行

LJMPE11;

为第一个数字

N1:

CJNER3,#2,N2

LJMPE12;

为第二个数字

N2:

CJNER3,#3,N3

LJMPE13;

为第三个数字

N3:

LJMPE3;

第四个数字转溢出

E11:

MOVR4,A;

输入值暂存R4

MOV34H,A;

输入值送显示缓存

MOV33H,#00H

MOV32H,#00H

LJMPMLOOP;

等待再次输入

E12:

MOVR7,A;

个位数暂存R7

MOVB,#10

MOVA,R4

MULAB;

十位数,输入的值乘10,即为十位数

ADDA,R7

MOVR4,A;

输入值存R4

MOV33H,34H

MOV34H,R7

LJMPMLOOP

E13:

MOVR7,A

MULAB

JBOV,E3;

输入溢出

JBCY,E3;

MOVR4,A

MOV32H,33H;

E3:

MOVR3,#0;

按键次数清零

MOVR4,#0;

输入值清零

MOVYJ,#0;

计算结果清零

MOVGONG,#0;

功能键设为零

显示清空

MOV34H,#00H

E2:

MOVR0,GONG;

与上次功能键交换

MOVGONG,A

MOVA,R0

CJNEA,#10,N21;

判断功能键

LJMPJIA;

"

+"

N21:

CJNEA,#11,N22

LJMPJIAN;

-"

N22:

CJNEA,#12,N23

LJMPCHENG;

*"

N23:

CJNEA,#13,N24

LJMPCHU;

/"

N24:

CJNEA,#0,N25

LJMPFIRST;

首次按功能键

N25:

LJMPDEN;

="

N4:

LJMPE3

FIRST:

MOVYJ,R4;

输入值送结果

LJMPDISP1;

结果处理

//加法//

JIA:

MOVA,YJ;

上次结果送累加器

ADDA,R4;

上次结果加输入值

JBCY,N4;

溢出

MOVYJ,A;

存本次结果

MOVR3,#0;

LJMPDISP1

//减法//

JIAN:

MOVA,YJ

SUBBA,R4;

上次结果减输入值

负数溢出,JB位变量条件转移指令,若直接寻址位的值为1,则执行转移

MOVYJ,A

MOVR3,#0

//乘法//

CHENG:

MOVB,A

MULAB;

上次结果乘输入值

JBOV,N4;

MOVYJ,A

//除法//

CHU:

MOVA,R4

MOVA,YJ

DIVAB;

上次结果除输入值

//等于//

DEN:

MOVR3,#0

DISP1:

MOVB,#10

MOVA,YJ

MOVA,YJ1

DIVAB

MOVYJ1,A

MOVA,B

MOV33H,A;

十位送显示缓存

JZDISP11;

结果是否为二位数

MOV32H,A;

百位数送显示缓存

DISP11:

LJMPMLOOP;

长跳转指令

DISP:

MOVR0,#34H

DIR1:

MOVDPTR,#SEGTAB;

基寄存器DPTR存入输入的数据值

MOVA,@R0;

寄存器间接寻址

MOVCA,@A+DPTR;

基寄存器加变址寄存器间接寻址

MOVP0,A

CJNER0,#34H,DIR2

SETBP2.0

DIR2:

CJNER0,#33H,DIR3

SETBP2.1

CALLD1MS

CLRP2.1;

P2.1端口清零

DECR0;

减1指令

SJMPDIR1

DIR3:

SETBP2.2

CLRP2.2

RET

D1MS:

MOVR7,#02H

DMS:

MOVR6,#0F0H

DJNZR6,$;

减1不为0跳转指令

DJNZR7,DMS

RET

SEGTAB:

DB0C0H,0F9H,0A4H,0B0H;

0123定义字节

DB99H,92H,82H,0F8H;

4567

DB80H,90H,88H,83H;

89AB

DB0C6H,0A1H,86H,8EH;

CDEF

TESTKEY:

ACALLDISP

MOVP1,#0FH;

读入键状态

MOVA,P1

CPLA;

将累加器A的内容逐位求反,不影响标志

ANLA,#0FH;

高四位不用,与操作,屏蔽高四位

KEYTABLE:

DB0D7H,0EBH,0DBH,0BBH;

键码定义

DB0EDH,0DDH,0BDH,0EEH

DB0DEH,0BEH,077H,07BH

DB07DH,07EH,0B7H,0E7H

;

DB07EH,07DH,07BH,0E7H;

DB0D7H,0B7H,0DEH,0BDH

DB0EBH,0DBH,0BBH,0DDH

DB077H,0EEH,0BEH,0EDH

GETKEY:

MOVR6,#10;

读键子程序

ACALLDELAY

MOVP1,#0FH

MOVA,P1

CJNEA,#0FH,K12

LJMPMLOOP

K12:

MOVP1,#0EFH

CJNEA,#0EFH,K13

MOVP1,#0DFH

CJNEA,#0DFH,K13

MOVP1,#0BFH

CJNEA,#0BFH,K13

MOVP1,#07FH

CJNEA,#07FH,K13

K13:

ANLA,#0F0H

ORLA,B;

或操作,用于数据拼装

MOVR1,#16

MOVR2,#0

MOVDPTR,#KEYTABLE

K14:

MOVA,R2

MOVCA,@A+DPTR

CJNEA,B,K16

K15:

MOVA,P1

CJNEA,#0FH,K15

MOVR6,#10

MOVA,R2

K16:

INCR2

DJNZR1,K14

AJMPMLOOP

DELAY:

MOVR7,#10

TS1:

MOVR6,#0FFH

TS2:

NOP;

空操作指令

NOP

DJNZR6,TS2

DJNZR7,TS1

END

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

当前位置:首页 > 党团工作 > 思想汇报心得体会

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1