大学毕设论文--基于c51单片机简易计算器的课程设计论文.doc

上传人:可**** 文档编号:93224956 上传时间:2023-07-01 格式:DOC 页数:25 大小:266KB
返回 下载 相关 举报
大学毕设论文--基于c51单片机简易计算器的课程设计论文.doc_第1页
第1页 / 共25页
大学毕设论文--基于c51单片机简易计算器的课程设计论文.doc_第2页
第2页 / 共25页
点击查看更多>>
资源描述

《大学毕设论文--基于c51单片机简易计算器的课程设计论文.doc》由会员分享,可在线阅读,更多相关《大学毕设论文--基于c51单片机简易计算器的课程设计论文.doc(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、赣南师范学院基于C51单片机的简易计算器 目录1. 绪论32. 系统软件设计方案4 2.1设计目标和实现方法4 2.2整体方案论证43. 系统硬件的设计与介绍5 3.1复位电路的设计与运用5 3.2时钟振荡器电路的设计与运用6 3.3输入电路的设计6 3.4输出电路的设计84. 系统程序的设计与介绍11 4.1 LED显示程序流程图设计11 4.2读键输入程序流程图设计13 4.3主程序流程图设计14 4.4仿真与调试155. 结论17元件清单18附录1简易计算器源程序191.绪论 中国古代最早采用的一种计算工具叫筹策,又被叫做算筹。这种算筹多是用竹子制成,也有用木头,兽骨充当材料的。大约二百

2、七十枚一束,放在布袋里可以随身携带。 直到今天仍在使用的珠算盘,是中国古代计算工具领域中的另一项发明,明代时期的珠算盘已经与现代的珠算盘几乎没有差别。 17世纪初,西方国家的计算工具已经有了较大的发展,英国数学家纳皮尔发明的纳皮尔算筹,英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方运算,甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带动了计算器的快速发展,也为实现现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具。 1642年,年仅19岁的法国伟大科学家帕斯卡引用算盘的原理,发明了世界上第一部机械式计算器,在他的计算器中有一些互相联锁的齿轮

3、,一个转过十位的齿轮会使另一个齿轮转过一位,人们可以像拨电话号码盘那样,把数字拨进去,计算结果就会出现在另外一个窗口中,但是只能做加减计算。1694年,莱布尼兹在德国将其改进成可以进行乘除的计算。此后,一直要到20世纪50年代末才有了电子计算器的出现。2. 软件设计方案2.1 设计目标和实现方法为了满足简易计算器的基本要求,可以进行基本的运算(加减乘除),数据归零和出错警告提示,我们采用基于51单片机设计计算器,并用七段共阴级LED 数码管显示数据,4*4的矩阵键盘实现数据的输入。2.2 整体方案论述 根据简单计算器的功能和本方案中的设计指标要求,本系统选用了MCS 51 单片机为主控机。通过

4、扩展必要的外围接口电路,实现对简单计算器的设计。具体设计考虑如下:由于要设计的是简单的计算器,可以进行基本的四则运算,对数字的大小范围要求不高,故我们采用可以进行四位数字的运算,选用8 个LED 数码管显示数据和运算结果。另外键盘包括数字键(09)、符号键(+、-、)、清除键和等号键,故只需要16 个按键即可。系统模块图: 图2-1 系统模块图 3. 系统硬件的设计3.1 复位电路的设计 上电复位的原理:VCC上电时,C充电,在10K电阻上出现了电压,使单片机复位;几个毫秒后,C充满,10K电阻上电流降为0,电压也为0,使得单片机进入工作状态。 手动复位的原理:工作期间,按下S,C放电。S松手

5、,C又充电,在10K电阻上出现电压,使得单片机复位。几个毫秒后,单片机进入工作状态。 如SW复位键按下时:RST经1k电阻接VCC,获得10k电阻上所分得电压,形成高电平,进入“复位状态”。 当SW复位键断开时:RST经10k电阻接地,电流降为0,电阻上的电压也将为0,RST降为低电平,开始正常工作 。对于成熟产品,从降低成本角度,可以使用上电复位。另外,作为产品,最好使用上电复位。因为使用者通常没有专业知识,就知道断电通电,对他们来说,按键复位成了摆设。按键复位比较适合样品制作或者实验室调试场合,上电复位电路成本也低一些。 综上所述我们在本方案中选用了上电自动复位电路。上位自动复位电路图和手

6、动复位电路图如下图 两种复位方式 如图31:3.2 时钟振荡电路的设计 能够产生振荡电流的电路叫做振荡电路。一般由电阻、电感、电容等元件和电子器件所组成。由电感线圈l和电容器c相连而成的lc电路是最简单的一种振荡电路,其固有频率为f=sx(12lc。 一种不用外加激励就能自行产生交流信号输出的电路。它在电子科学技术领域中得到广泛地应用,如通信系统中发射机的载波振荡器、接收机中的本机振荡器、医疗仪器以及测量仪器中的信号源等。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振

7、荡器。石晶振荡和陶瓷振荡均可采用此振动器。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。使用片内振荡器,可以节省IO引脚,减少成本,但是内部振荡器使用阻容震荡,导致它的精度不高,如果使用了串口、或者PWM等对时钟比较敏感的功能,最好还是使用外部晶体振荡。在本方案中我们选择了内部时钟方式,如下图: 两种时钟方式 如图32:3.3 输入电路的设计每一个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。键盘的一端(列线)通过

8、电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。当无按键闭合时,P10P13 与P14P17 之间开路;当有键闭合时,与闭合键相连的两条I/O 口线之间短路。判断有无按键按下的方法是:第一步,置列线P14P17 为输入状态,从行线P10P13 输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。第二步,行线轮流输出低电平,

9、从列线P14P17 读入数据,若有某一列为低电平,则对应行线上表示有键按下。综合一二两步的结果,可以确定按键编号。但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。键盘是单片机系统中常用的人机对话输入设备,用户通过键盘向单片机输入数据或者指令。键盘控制程序需要完成的任务有:监测是否有键按下,有键按下时,在无硬件去抖的动电路时,应用软件延时方法消除按键抖动影响;当有多个键同时按下时,只处理一个按键,不管一次按键持续多长时间,仅执行一次按键功能程序。矩阵按键扫描程序是一种节省IO口的方法,按键数目越多节省IO口就越可观,思

10、路:先判断某一列(行)是否有按键按下,再判断该行(列)是那一只键按下。但是,在程序的写法上,采用了最简单的方法,使得程序的效率最高。本程序中,如果检测到了某个键按下了,就不再检测其它的按键,这完全能满足绝大多数需要,又能节省大量的CPU时间。本键盘扫描程序的优点在于:不使用专门的按键延时程序,提高了CPU效率,也不用中断来扫描键盘,节省了硬件资源。另外,本键盘扫描程序,每次扫描占用CPU时最短,不论有键按下或者无键按下都可以在很短的时间完成一次扫描。本键盘扫描子程序名叫key,每次要扫描时用lcall key调用即可。键盘可分为两类:编码键盘和非编码键盘。编码键盘是较多按键(20个以上)和专用

11、驱动芯片的组合,当按下某个键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。通用PC机使用的标准键盘就是编码键盘。在智能仪器中,使用并行接口芯片8279或串行接口芯片HD7279均可以组成编码键盘,同时还可以兼顾数码管的显示驱动,其相关的接口电路和接口软件均可以在相关资料中得到。当系统功能比较复杂,案件数量很多时,采用编码键盘可以简化软件设计。但大多数智能仪器和电子产品的按键数目都不很多(20个以内),为了降低成本和简化电路通常采用非编码键盘。非编码键盘的电路由设计者根据需要自己决定,按键信息通过接口软件来获取。本课题需要16个按键,故选择非编码键盘,为了减少所占用的

12、端口,由P1口采用4*4矩阵式键盘。 图3-3 键盘样式 3.4 输出电路设计 数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳级数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳级数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,对应的字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴

13、数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,对应的字段就不亮。LED显示器由七段发光二极管组成,排列成8字形状,因此也成为七段LED显示器,器排列形状如下图所示: 图3-4 LED段码为了显示数字或符号,要为LED显示器提供代码,即字形代码。七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。简易计算器用到的数字09的共阴极字形代码如下表3-1所示:显示字型gfedcBa段码001111113fh1000011006h210110115bh310011114fh4110011

14、066h511011016dh611111017dh7000011107h811111117fh911011116fh表3-5 09七段数码管共阴级字形代码由于数值单元存放的是二进制数,而我们大家熟悉的是十进制数,所以应将数值单元中的二进制数字转换为十进制数字,即BCD码。要通过数码管显示出当前的数值,还必须将BCD码进一步转换为七段码,转换的最终结果数据存放于显示缓冲区30H-33H单元中,其中30H单元存放数值的个位七段码,31H单元存放数值的十位七段码,32H单元存放数值的百位七段码,33H单元存放数值的千位七段码。本方案设计中由P1口输出字形码,P0口输出字位码。先将存放于30H单元的

15、数值个位七段码由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 显示单元是反映系统输出和操作输

16、入的有效元器件。LED 具备数字接口可以方便的和单片机引脚连接;它的优点是价格低,寿命长,对电压电流的要求低以及容易实现多路等,因而在单片机应用系统中获得了广泛的应用,所以在此设计中我首先选用了LED作为显示器件。如图3-10所示:图3-6 数码显示管4. 程序设计本方案中的程序设计采用了模块化设计,各部分程序都分别进行独立的设计,最后主程序通过调用各模块程序来运行,编程中所使用的语言全部都是C语言,可以利用keil软件进行灵活的编译,编译完成后也可生成HEX文件,利用ISP编程软件通过串口写到单片机中。本方案程序设计中部分包括主程序模块、液晶显示模块、功能按键和控制输出等部分。下面仅仅叙述了

17、各部分程序设计的基本思想和流程图,详细程序请参阅附录。4.1 读键输入程序流程图为了实现键盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此每个键都对应一个码键码。为了得到被按键的键码,现使用行扫描法识别按键。列扫描信号进行读入行的信号判断该列是否有列的输出是则进行按照行列计算键盘的值,查表取得键码并返回若否则进行再次扫描。程序框图如下41图:开始初始化地址读入行扫描信号输出列扫描信号等待按键释放该列有信号?四列扫描完?返回根据行列计算键值返回列扫描信号位移查表得键码是否是否 键盘输入流程图41 4.2 LED显示程序流程图设计LED数码管要正常显示,就要用驱动电路来驱动数码管的各个

18、段码,从而显示出我们需要的数位,因此根据LED数码管的驱动方式的不同,可以分为静态式和动态式两类。 A、 静态显示驱动: 静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O埠进行驱动,或者使用如BCD码二-十进位*器*进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O埠多,如驱动5个数码管静态显示则需要58=40根I/O埠来驱动,要知道一个89S51单片机可用的I/O埠才32个呢。故实际应用时必须增加*驱动器进行驱动,增加了硬体电路的复杂性。 B、 动态显示驱动: 数码管动态显示介面是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个

19、显示笔划a,b,c,d,e,f,g,dp 的同名端连在一起,另外为每个数码管的公共极COM增加位元选通控制电路,位元选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位元选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位元就会显示出字形,没有选通的数码管就不会亮。 透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位元数码管的点亮时间为12ms,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的

20、速度足够快,给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O埠,而且功耗更低。综上所述我们在本设计方案中选用了动态显示。 6位LED显示的程序框图如图4-2所示: 图4-2 LED显示流程图4.3主程序设计主程序进行程序中用到的一些存储单元的初始化,数值显示和4*4键盘扫描。首先,进行存储单元初始化,给数码管显示单元30H-33H赋予“0000”字形数据,将数值计数单元,存储单元,23H-25H,34H-37H,38H,39H,3AH,3BH,3CH,赋予初值零。之后,调用键盘扫描子程序,和数码管显示数据转换程序,数码管动态显示子程序。主程

21、序不断进行键盘扫描,数码管显示数据转换子程序和动态显示子程序。 首先初始化参数,送LED低位显示“0”,功能键(“+” 、“-” 、“*” 、“/” 、 “+” )位不显示。然后扫描键盘看是否有键输入,若有,读取键码。判断键码是数字键、清零键还是“+” 、“” 、“*” “/” ,是数值键则送LED显示并保存数值,是清零键则做清零处理,是功能键则又判断是“=”还是运算键,若是“=”则计算最后结果并送LED显示,若是运算键则保存相对运算程序的首地址。运算主程序框图如4-3所示:图4-3 运算主程序框图4.4仿真与调试在程序设计方法上,模块化程序设计是单片机应用中最常用的程序设计方法。设计的中心思

22、想是把一个复杂应用程序按整体功能划分成若干相对独立的程序模块,各模块可以进行单独的设计、编程和调试,然后组合起来。这种方法便于设计和调试,容易实现多个程序共存,但各个模块之间的连接有一定的难度。根据需要我们可以采取自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各从属程序和子程序,层层细化逐步完成,最终完成一个复杂程序的设计。这种方法比较符合人们的日常思维,缺点是一级的程序错误会对整个程序产生影响。功能和操作:加减乘除运算和显示。A:上电后,屏幕初始化,按下“ON/C”键。B: 计算。按下数字键,屏幕显示要运算的第一个数字,再按下符号键,然后再按下数字键,屏幕显示要运算的第二个数字

23、,最后按下“”号键,屏幕上显示出计算结果。C:如果要再次计算,可以按下“ON/C”键清零,或者按下单片机的复位键,重新初始化。硬件联系图如下图: 硬件连线图4.45 结论课程设计是培养学生运用所学的专业知识,发现,提出,分析和解决实际问题,锻炼实际动手能力的重要环节,是对学生实际工作能力的具体训练和考察,随着科学技术日新月异的发展,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说遍布我们生活之中。这次设计进一步端正了我的学习态度,学会了实事求是,严谨的作风,对自己要严格要求。急于求成是不好的,通过此次毕业设计我深有体会。如果省略了那些必要的步骤,急于求成,不仅会浪费时间,还会适得其

24、反。我觉得动手之前,应该有清楚的步骤,这一步是很重要的。就目前来说,我的动手能力虽然还有差距,但我知道,通过我的不懈努力,在动手方面,我会得到提高。这一点,我坚信。在此次的课程设计中我最大的体会就是进一步认识到了理论联系实践的重要性。一份耕耘,一份收获。通过这段时间的设计,让我明白科学的思维方法和学习方法是多么重要,只有这样才能够有很高的效率,才能够让自己的工作更完美。总而言之,此次毕业设计让我学到了好多平时在课堂上学不到的东西,增加了我的知识运用能力,增强我的实际操作能力。谢谢老师给我们提供这么好的机会,为我们之后走向社会奠定了一个好的基础。在我做课程设计的整个过程中,无论是在设计的选题、构

25、思和资料的收集方面,还是在设计的研究方法以及成文定稿方面,或是在论文的写作过程中,都得到了许多同学的宝贵建议,在此一并致以诚挚的谢意。感谢所有关心、支持、帮助过我的同学。6 元件清单元件数量单价(元)12M晶振 11STC89C52芯片14轻触按键200.1排阻10.5四位一体公阴数码管21.5电阻若干0.5杜邦线400.1排针400.1电容若干0.5总计19.5 附录1 简易计算器源程序#include #define uchar unsigned char#define uint unsigned int#define duan P0/数码管显示段选定义#define wei P2/数码管

26、显示位选定义#define key P3/键盘接口定义sbit OFF = P10;/关机键定义unsigned long int shu1,shu2;/进行运算的两个变量数uchar num;/键盘扫描返回值char flag1,flag_shu,flag_fuhao,fuhao,newkey;/flag1开机标志newkey新按键标志,fuhao运算符char key_shu;/按键值unsigned char code Wela=0xdf,0xef,0xf7,0xfb,0xfd,0xfe;/六位数码管的位选unsigned char code Duan=0x3f,0x06,0x5b,/

27、0 1 20x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00; /3 4 5 6 7 8 9 无显示共阴极数码管uchar keyscan();/键盘扫描函数void display(unsigned long int );/数码管显示函数void delay(uint i)/延时函数while(i-);/* 主函数*/void main()flag1=0;/标志关机while(1)if(keyscan()=15)/开机检测flag1=1;/标志开机shu1=shu2=fuhao=flag_shu=newkey=0;/初始化变量while(flag1)if(!fla

28、g_fuhao)display(shu1);else display(shu2);key_shu=keyscan();if(newkey=1)/有新键值if(key_shu=15)/按下ON/C键,清零flag_fuhao=0;shu1=shu2=fuhao=flag_shu=newkey=0;else if(key_shu=14&flag_shu=1&fuhao)/按下=switch(fuhao)case 10:shu1=shu2+shu1;break;case 11:shu1=shu2-shu1;break;case 12:shu1=shu2*shu1;break;case 13:shu1

29、=shu2/shu1;break;fuhao=0;flag_fuhao=0; else if(key_shu=0)&(key_shu=9)/按下数字键flag_fuhao=0;if(shu1=10)&(key_shu=0&num=0&num=0&num=0&num99999) dis_flag=6;else if(dis_shu9999) dis_flag=5;else if(dis_shu999) dis_flag=4;else if(dis_shu99) dis_flag=3;else if(dis_shu9) dis_flag=2;else dis_flag=1;for(dis_aa=0;dis_aadis_flag;dis_aa+) dis_datadis_aa=dis_shu%10;dis_shu=dis_shu/10;/数码管段选for(dis_aa=0;dis_aadis_flag;dis_aa+) duan=Duandis_datadis_aa;wei=Weladis_aa;delay(100);wei=0xff;/数码管位选 25

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁