毕业设计基于c51单片机简易计算器的课程设计论文.docx

上传人:b****2 文档编号:3199208 上传时间:2023-05-05 格式:DOCX 页数:26 大小:160.45KB
下载 相关 举报
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第1页
第1页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第2页
第2页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第3页
第3页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第4页
第4页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第5页
第5页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第6页
第6页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第7页
第7页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第8页
第8页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第9页
第9页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第10页
第10页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第11页
第11页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第12页
第12页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第13页
第13页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第14页
第14页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第15页
第15页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第16页
第16页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第17页
第17页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第18页
第18页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第19页
第19页 / 共26页
毕业设计基于c51单片机简易计算器的课程设计论文.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

毕业设计基于c51单片机简易计算器的课程设计论文.docx

《毕业设计基于c51单片机简易计算器的课程设计论文.docx》由会员分享,可在线阅读,更多相关《毕业设计基于c51单片机简易计算器的课程设计论文.docx(26页珍藏版)》请在冰点文库上搜索。

毕业设计基于c51单片机简易计算器的课程设计论文.docx

毕业设计基于c51单片机简易计算器的课程设计论文

 

赣南师范学院

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

 

目录

1.绪论3

2.系统软件设计方案4

2.1设计目标和实现方法4

2.2整体方案论证4

3.系统硬件的设计与介绍5

3.1复位电路的设计与运用5

3.2时钟振荡器电路的设计与运用6

3.3输入电路的设计6

3.4输出电路的设计8

4.系统程序的设计与介绍11

4.1LED显示程序流程图设计11

4.2读键输入程序流程图设计13

4.3主程序流程图设计14

4.4仿真与调试15

5.结论

17

元件清单18

附录1简易计算器源程序19

 

1.绪论

中国古代最早采用的一种计算工具叫筹策,又被叫做算筹。

这种算筹多是用竹子制成,也有用木头,兽骨充当材料的。

大约二百七十枚一束,放在布袋里可以随身携带。

  

直到今天仍在使用的珠算盘,是中国古代计算工具领域中的另一项发明,明代时期的珠算盘已经与现代的珠算盘几乎没有差别。

  

17世纪初,西方国家的计算工具已经有了较大的发展,英国数学家纳皮尔发明的"纳皮尔算筹",英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方运算,甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带动了计算器的快速发展,也为实现现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具。

  

1642年,年仅19岁的法国伟大科学家帕斯卡引用算盘的原理,发明了世界上第一部机械式计算器,在他的计算器中有一些互相联锁的齿轮,一个转过十位的齿轮会使另一个齿轮转过一位,人们可以像拨电话号码盘那样,把数字拨进去,计算结果就会出现在另外一个窗口中,但是只能做加减计算。

1694年,莱布尼兹在德国将其改进成可以进行乘除的计算。

此后,一直要到20世纪50年代末才有了电子计算器的出现。

 

2.软件设计方案

2.1设计目标和实现方法

为了满足简易计算器的基本要求,可以进行基本的运算(加减乘除),数据归零和出错警告提示,我们采用基于51单片机设计计算器,并用七段共阴级LED数码管显示数据,4*4的矩阵键盘实现数据的输入。

2.2整体方案论述

根据简单计算器的功能和本方案中的设计指标要求,本系统选用了MCS51单片机为主控机。

通过扩展必要的外围接口电路,实现对简单计算器的设计。

具体设计考虑如下:

①由于要设计的是简单的计算器,可以进行基本的四则运算,对数字的大小范围要求不高,故我们采用可以进行四位数字的运算,选用8个LED数码管显示数据和运算结果。

②另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16个按键即可。

系统模块图:

图2-1系统模块图

3.系统硬件的设计

3.1复位电路的设计

上电复位的原理:

VCC上电时,C充电,在10K电阻上出现了电压,使单片机复位;几个毫秒后,C充满,10K电阻上电流降为0,电压也为0,使得单片机进入工作状态。

手动复位的原理:

工作期间,按下S,C放电。

S松手,C又充电,在10K电阻上出现电压,使得单片机复位。

几个毫秒后,单片机进入工作状态。

如SW复位键按下时:

RST经1k电阻接VCC,获得10k电阻上所分得电压,形成高电平,进入“复位状态”。

当SW复位键断开时:

RST经10k电阻接地,电流降为0,电阻上的电压也将为0,RST降为低电平,开始正常工作。

对于成熟产品,从降低成本角度,可以使用上电复位。

另外,作为产品,最好使用上电复位。

因为使用者通常没有专业知识,就知道断电通电,对他们来说,按键复位成了摆设。

按键复位比较适合样品制作或者实验室调试场合,上电复位电路成本也低一些。

综上所述我们在本方案中选用了上电自动复位电路。

上位自动复位电路图和手动复位电路图如下图

 

两种复位方式如图3—1:

 

3.2时钟振荡电路的设计

能够产生振荡电流的电路叫做振荡电路。

一般由电阻、电感、电容等元件和电子器件所组成。

由电感线圈l和电容器c相连而成的lc电路是最简单的一种振荡电路,其固有频率为f=[sx(]1[]2πlc。

§一种不用外加激励就能自行产生交流信号输出的电路。

它在电子科学技术领域中得到广泛地应用,如通信系统中发射机的载波振荡器、接收机中的本机振荡器、医疗仪器以及测量仪器中的信号源等。

XTAL1:

反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:

来自反向振荡器的输出。

XTAL1和XTAL2分别为反向放大器的输入和输出。

该反向放大器可以配置为片内振荡器。

石晶振荡和陶瓷振荡均可采用此振动器。

如采用外部时钟源驱动器件,XTAL2应不接。

有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。

使用片内振荡器,可以节省IO引脚,减少成本,但是内部振荡器使用阻容震荡,导致它的精度不高,如果使用了串口、或者PWM等对时钟比较敏感的功能,最好还是使用外部晶体振荡。

在本方案中我们选择了内部时钟方式,如下图:

两种时钟方式如图3—2:

3.3输入电路的设计

每一个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。

矩阵的行线和列线分别通过两并行接口和CPU通信。

键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。

键盘处理程序的任务是:

确定有无键按下,判断哪一个键按下,键的功能是什么?

还要消除按键在闭合或断开时的抖动。

两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。

当无按键闭合时,P10~P13与P14~P17之间开路;当有键闭合时,与闭合键相连的两条I/O口线之间短路。

判断有无按键按下的方法是:

第一步,置列线P14~P17为输入状态,从行线P10~P13输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。

第二步,行线轮流输出低电平,从列线P14~P17读入数据,若有某一列为低电平,则对应行线上表示有键按下。

综合一二两步的结果,可以确定按键编号。

但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。

键盘是单片机系统中常用的人机对话输入设备,用户通过键盘向单片机输入数据或者指令。

键盘控制程序需要完成的任务有:

监测是否有键按下,有键按下时,在无硬件去抖的动电路时,应用软件延时方法消除按键抖动影响;当有多个键同时按下时,只处理一个按键,不管一次按键持续多长时间,仅执行一次按键功能程序。

矩阵按键扫描程序是一种节省IO口的方法,按键数目越多节省IO口就越可观,思路:

先判断某一列(行)是否有按键按下,再判断该行(列)是那一只键按下。

但是,在程序的写法上,采用了最简单的方法,使得程序的效率最高。

本程序中,如果检测到了某个键按下了,就不再检测其它的按键,这完全能满足绝大多数需要,又能节省大量的CPU时间。

本键盘扫描程序的优点在于:

不使用专门的按键延时程序,提高了CPU效率,也不用中断来扫描键盘,节省了硬件资源。

另外,本键盘扫描程序,每次扫描占用CPU时最短,不论有键按下或者无键按下都可以在很短的时间完成一次扫描。

本键盘扫描子程序名叫key,每次要扫描时用lcallkey调用即可。

键盘可分为两类:

编码键盘和非编码键盘。

编码键盘是较多按键(20个以上)和专用驱动芯片的组合,当按下某个键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。

通用PC机使用的标准键盘就是编码键盘。

在智能仪器中,使用并行接口芯片8279或串行接口芯片HD7279均可以组成编码键盘,同时还可以兼顾数码管的显示驱动,其相关的接口电路和接口软件均可以在相关资料中得到。

当系统功能比较复杂,案件数量很多时,采用编码键盘可以简化软件设计。

但大多数智能仪器和电子产品的按键数目都不很多(20个以内),为了降低成本和简化电路通常采用非编码键盘。

非编码键盘的电路由设计者根据需要自己决定,按键信息通过接口软件来获取。

本课题需要16个按键,故选择非编码键盘,为了减少所占用的端口,由P1口采用4*4矩阵式键盘。

图3-3键盘样式

3.4输出电路设计

数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。

共阳级数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。

共阳级数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。

当某一字段的阴极为高电平时,对应的字段就不亮。

共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。

共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。

当某一字段的阳极为低电平时,对应的字段就不亮。

LED显示器由七段发光二极管组成,排列成8字形状,因此也成为七段LED显示器,器排列形状如下图所示:

图3-4LED段码

为了显示数字或符号,要为LED显示器提供代码,即字形代码。

七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。

简易计算器用到的数字0~9的共阴极字形代码如下表3-1所示:

 

显示字型

g

f

e

d

c

B

a

段码

0

0

1

1

1

1

1

1

3fh

1

0

0

0

0

1

1

0

06h

2

1

0

1

1

0

1

1

5bh

3

1

0

0

1

1

1

1

4fh

4

1

1

0

0

1

1

0

66h

5

1

1

0

1

1

0

1

6dh

6

1

1

1

1

1

0

1

7dh

7

0

0

0

0

1

1

1

07h

8

1

1

1

1

1

1

1

7fh

9

1

1

0

1

1

1

1

6fh

表3-50~9七段数码管共阴级字形代码

 

由于数值单元存放的是二进制数,而我们大家熟悉的是十进制数,所以应将数值单元中的二进制数字转换为十进制数字,即BCD码。

要通过数码管显示出当前的数值,还必须将BCD码进一步转换为七段码,转换的最终结果数据存放于显示缓冲区30H-33H单元中,其中30H单元存放数值的个位七段码,31H单元存放数值的十位七段码,32H单元存放数值的百位七段码,33H单元存放数值的千位七段码。

本方案设计中由P1口输出字形码,P0口输出字位码。

先将存放于30H单元的数值个位七段码由P1口输出,同时P0口输出使数值个位显示数码管点亮的字位码。

由于采用的是共阴数码管,所以只有该位数码管对应的P0.0为1,其他位P0.1-P0.3位0,点亮延时10MS。

然后P1口输出数值十位七段码,P0.1位1,数值十位数码管点亮,延时10MS。

接着P1口输出数值百位七段码,P0.2为1,数值百位数码管点亮,延时10MS。

最后P1口输出数值千位七段码,P0.3为1,数值千位数码管点亮,延时10MS。

发光二极管LED是单片机应用系统中的一种简单而最常用的输出设备,其在系统中的主要作用是显示单片机的输出数据、状态等。

因而作为典型的外围器件,LED显示单元是反映系统输出和操作输入的有效元器件。

LED具备数字接口可以方便的和单片机引脚连接;它的优点是价格低,寿命长,对电压电流的要求低以及容易实现多路等,因而在单片机应用系统中获得了广泛的应用,所以在此设计中我首先选用了LED作为显示器件。

如图3-10所示:

图3-6数码显示管

4.程序设计

本方案中的程序设计采用了模块化设计,各部分程序都分别进行独立的设计,最后主程序通过调用各模块程序来运行,编程中所使用的语言全部都是C语言,可以利用keil软件进行灵活的编译,编译完成后也可生成HEX文件,利用ISP编程软件通过串口写到单片机中。

本方案程序设计中部分包括主程序模块、液晶显示模块、功能按键和控制输出等部分。

下面仅仅叙述了各部分程序设计的基本思想和流程图,详细程序请参阅附录。

 

4.1读键输入程序流程图

为了实现键盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此每个键都对应一个码——键码。

为了得到被按键的键码,现使用行扫描法识别按键。

列扫描信号进行读入行的信号判断该列是否有列的输出——是则进行按照行列计算键盘的值,查表取得键码并返回——若否则进行再次扫描。

程序框图如下4—1图:

键盘输入流程图4—1

 

4.2LED显示程序流程图设计

LED数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们需要的数位,因此根据LED数码管的驱动方式的不同,可以分为静态式和动态式两类。

  

A、静态显示驱动:

  

静态驱动也称直流驱动。

静态驱动是指每个数码管的每一个段码都由一个单片机的I/O埠进行驱动,或者使用如BCD码二-十进位*器*进行驱动。

静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O埠多,如驱动5个数码管静态显示则需要5×8=40根I/O埠来驱动,要知道一个89S51单片机可用的I/O埠才32个呢。

故实际应用时必须增加*驱动器进行驱动,增加了硬体电路的复杂性。

  

B、动态显示驱动:

  

数码管动态显示介面是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位元选通控制电路,位元选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位元选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位元就会显示出字形,没有选通的数码管就不会亮。

  透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。

在轮流显示过程中,每位元数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O埠,而且功耗更低。

综上所述我们在本设计方案中选用了动态显示。

 

6位LED显示的程序框图如图4-2所示:

图4-2LED显示流程图

4.3主程序设计

主程序进行程序中用到的一些存储单元的初始化,数值显示和4*4键盘扫描。

首先,进行存储单元初始化,给数码管显示单元30H-33H赋予“0000”字形数据,将数值计数单元,存储单元,23H-25H,34H-37H,38H,39H,3AH,3BH,3CH,赋予初值零。

之后,调用键盘扫描子程序,和数码管显示数据转换程序,数码管动态显示子程序。

主程序不断进行键盘扫描,数码管显示数据转换子程序和动态显示子程序。

首先初始化参数,送LED低位显示“0”,功能键(“+”、“-”、“*”、“/”、“+”)位不显示。

然后扫描键盘看是否有键输入,若有,读取键码。

判断键码是数字键、清零键还是“+”、“—”、“*”“/”,是数值键则送LED显示并保存数值,是清零键则做清零处理,是功能键则又判断是“=”还是运算键,若是“=”则计算最后结果并送LED显示,若是运算键则保存相对运算程序的首地址。

运算主程序框图如4-3所示:

图4-3运算主程序框图

 

4.4仿真与调试

在程序设计方法上,模块化程序设计是单片机应用中最常用的程序设计方法。

设计的中心思想是把一个复杂应用程序按整体功能划分成若干相对独立的程序模块,各模块可以进行单独的设计、编程和调试,然后组合起来。

这种方法便于设计和调试,容易实现多个程序共存,但各个模块之间的连接有一定的难度。

根据需要我们可以采取自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各从属程序和子程序,层层细化逐步完成,最终完成一个复杂程序的设计。

这种方法比较符合人们的日常思维,缺点是一级的程序错误会对整个程序产生影响。

功能和操作:

加减乘除运算和显示。

A:

上电后,屏幕初始化,按下“ON/C”键。

B:

计算。

按下数字键,屏幕显示要运算的第一个数字,再按下符号键,然后再按下

数字键,屏幕显示要运算的第二个数字,最后按下“﹦”号键,屏幕上显示出计算结果。

C:

如果要再次计算,可以按下“ON/C”键清零,或者按下单片机的复位键,重新初始化。

硬件联系图如下图:

硬件连线图4.4

5结论

课程设计是培养学生运用所学的专业知识,发现,提出,分析和解决实际问题,锻炼实际动手能力的重要环节,是对学生实际工作能力的具体训练和考察,随着科学技术日新月异的发展,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说遍布我们生活之中。

这次设计进一步端正了我的学习态度,学会了实事求是,严谨的作风,对自己要严格要求。

急于求成是不好的,通过此次毕业设计我深有体会。

如果省略了那些必要的步骤,急于求成,不仅会浪费时间,还会适得其反。

我觉得动手之前,应该有清楚的步骤,这一步是很重要的。

就目前来说,我的动手能力虽然还有差距,但我知道,通过我的不懈努力,在动手方面,我会得到提高。

这一点,我坚信。

在此次的课程设计中我最大的体会就是进一步认识到了理论联系实践的重要性。

一份耕耘,一份收获。

通过这段时间的设计,让我明白科学的思维方法和学习方法是多么重要,只有这样才能够有很高的效率,才能够让自己的工作更完美。

总而言之,此次毕业设计让我学到了好多平时在课堂上学不到的东西,增加了我的知识运用能力,增强我的实际操作能力。

谢谢老师给我们提供这么好的机会,为我们之后走向社会奠定了一个好的基础。

在我做课程设计的整个过程中,无论是在设计的选题、构思和资料的收集方面,还是在设计的研究方法以及成文定稿方面,或是在论文的写作过程中,都得到了许多同学的宝贵建议,在此一并致以诚挚的谢意。

感谢所有关心、支持、帮助过我的同学。

 

6元件清单

元件

数量

单价(元)

12M晶振

1

1

STC89C52芯片

1

4

轻触按键

20

0.1

排阻

1

0.5

四位一体公阴数码管

2

1.5

电阻

若干

0.5

杜邦线

40

0.1

排针

40

0.1

电容

若干

0.5

总计

19.5

 

附录1简易计算器源程序

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineduanP0//数码管显示段选定义

#defineweiP2//数码管显示位选定义

#definekeyP3//键盘接口定义

sbitOFF=P1^0;//关机键定义

unsignedlongintshu1,shu2;//进行运算的两个变量数

ucharnum;////键盘扫描返回值

charflag1,flag_shu,flag_fuhao,fuhao,newkey;

//flag1开机标志newkey新按键标志,fuhao运算符

charkey_shu;//按键值

unsignedcharcodeWela[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

//六位数码管的位选

unsignedcharcodeDuan[]={0x3f,0x06,0x5b,

//012

0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};

//3456789无显示共阴极数码管

ucharkeyscan();//键盘扫描函数

voiddisplay(unsignedlongint);//数码管显示函数

voiddelay(uinti)//延时函数

{

while(i--);

}

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

主函数

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

voidmain()

{

flag1=0;//标志关机

while

(1)

{

if(keyscan()==15)//开机检测

{

flag1=1;//标志开机

shu1=shu2=fuhao=flag_shu=newkey=0;//初始化变量

while(flag1)

{

if(!

flag_fuhao)display(shu1);

elsedisplay(shu2);

key_shu=keyscan();

if(newkey==1)//有新键值

{

if(key_shu==15)//按下ON/C键,清零

{flag_fuhao=0;

shu1=shu2=fuhao=flag_shu=newkey=0;

}

elseif(key_shu==14&&flag_shu==1&&fuhao)//按下"="

{

switch(fuhao)

{

case10:

shu1=shu2+shu1;break;

case11:

shu1=shu2-shu1;break;

case12:

shu1=shu2*shu1;break;

case13:

shu1=shu2/shu1;break;

}

fuhao=0;flag_fuhao=0;

}

elseif((key_shu>=0)&&(key_shu<=9))//按下数字键

{flag_fuhao=0;

if(shu1<100000)

{shu1=key_shu+shu1*10;flag_shu=1;}

}

elseif((key_shu>=10)&&(key_shu<=13))//按下运算符

{

flag_fuhao=1;

if(flag_shu==1)

{

if(fuhao==0)

{

shu2=shu1;shu1=0;

fuhao=key_shu;flag_shu=2;

}

else

{

switch(fuhao)

{

cas

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

当前位置:首页 > 解决方案 > 学习计划

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

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