基于单片机的冒泡排序动态显示系统设计论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
0. 前言 (1)
1. 基于单片机的冒泡排序动态显示系统基本理论 (1)
2. 方案设计 (2)
3. 硬件电路的工作原理 (2)
3.1单片机AT89C51工作原理 (2)
3.2键盘输入模块 (4)
3.3动态显示模块 (5)
3.4时钟模块 (6)
3.5复位模块 (6)
3.6发光提示和按键中断模块 (7)
4. 软件编程 (7)
4.1主程序功能 (7)
4.2键盘程序功能 (8)
4.3冒泡排序法程序功能 (9)
5. 系统调试和结果分析 (10)
6. 结论及进一步设想 (12)
参考文献 (12)
课设体会 (13)
附录1 元件清单 (14)
附录2 总体电路图 (15)
基于单片机的冒泡排序动态显示系统设计
金远华沈阳航空航天大学自动化学院
摘要:本文设计的是基于单片机的冒泡排序动态显示系统,它的主要功能是利用键盘输入数据和八位LED数码管动态地显示排序过程。
采用AT89C51作为电路核心部件,利用按键开关做成4×4键盘代表数字0~F,并且通过LED数码管作为显示电路,当确认排序后系统还可以在数码管中动态的显示排序过程。
通过硬件和软件的结合可以看到实验结果与设计要求基本吻合,实现了数据输入和动态排序显示。
关键词:单片机;键盘;冒泡排序;动态LED显示
0. 前言
单片机具有显著的优点,它已成为科技领域的有力工具,人类生活的得力助手。
它的应用遍及各个领域.
可以说,二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。
不过,这种电脑,通常是指个人计算机,简称PC机。
它由主机、键盘、显示器等组成。
还有一类计算机,大多数人却不怎么熟悉。
这种计算机就是把智能赋予各种机械的单片机(亦称微控制器)。
顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。
因为它体积小,通常都藏在被控机械的“肚子”里。
它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。
现在,这种单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。
各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。
现在有些工厂的技术人员或其它业余电子开发者搞出来的某些产品,不是电路太复杂,就是功能太简单且极易被仿制。
究其原因,可能就卡在产品未使用单片机或其它可编程逻辑器件上。
综合所述,单片机已成为计算机发展和应用的一个重要方面。
另一方面,单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。
从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。
这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。
本文论述了单片机控制键盘和LED数码管显示电路,实现将单片机采集到的数据排序显示的功能。
由于单片机具有4个I/O口,故利用单片机本身即可以实现本次任务要求。
1. 基于单片机的冒泡排序动态显示系统基本理论
把一批数据想象成纵向排列,自下而上比较相邻的两个数据元素,如果这两个数据元
素的大小顺序符合要求,则保持原样,否则交换它们的位置。
这样比较一轮后,最小的数据元素就象气泡一样浮到最顶上,故称冒泡算法。
实际编程设计时,每一轮操作都从数据区的首地址开始,向末端推进。
N个数据元素一般要进行N-1次轮次比较、交换排序,但如果操作过程中没有出现位置交换,则说明数据已经有序,可以提前结束排序。
然后再连接LED显示器,实现动态显示排序。
2. 方案设计
基于单片机的冒泡排序动态显示系统的基本组成如图1所示。
图1 基于单片机的冒泡排序动态显示系统的原理框图
根据设计任务要求,现采用如下方案实现。
硬件部分包括键盘输入电路、数码管显示电路、提示和外部中断按键电路,这些硬件电路不仅能产生按键信号送入单片机而且能通过数码管显示出来;软件部分能准确地识别键值和正确显示数据,还需要让采集到的数据实现从小到大的排序过程,同时通过数码管动态的显示出其过程。
单片机可以利用4个I/O口实现对外设的控制,通过软件编程方法可以达到设计要求。
3. 硬件电路的工作原理
3.1单片机AT89C51工作原理
AT89C51的管脚结构图见图2。
图2 A T89C51的管脚结构图
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
P1口:P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
P2口:P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
RST:复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
PSEN:外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
AT89C51是一个低功耗高性能CMOS 8位单片机,32k Bytes Flash只读程序存储器(ROM),512 Bytes 内部数据存储器(RAM),该微处理器采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,引脚兼容80C51和80C52芯片,片内的Flash存储器可以象常规程序存储器一样进行烧写,AT89C51RC片内总共有512字节的用户数据区,而256字节的内部扩展数据区需通过清SFR(8EH)的位1并用MOVX指令访问,片内置通用8位中央处理器和Flash存储单元,另一个256BytesRAM区与ATMEL 之AT89系列8052兼容的单片机是一致的,AT89C51RC结合通用的8位微处理器和Flash 存储技术构成功能强大单片微处理器,可提供许多高性能低价位的系统控制应用场合。
AT89C51具有如下主要特点:40个引脚,32kBytes的程序存储器,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,内置时钟振荡器,其Flash存储器,可反复擦写1000次的Flash存储器可有效地降低开发成本。
软件设置电源省电模式,睡眠其间,定时/计数器,串行口和中断口均停止工作,RAM中的数据被“冻结”,直到下次被中断激活或硬件复位方可恢复工作。
3.2键盘输入模块
键盘在单片机应用系统中能实现向单片机输入数据、传送命令等功能,是人工干预单片机的主要手段。
由于在按键数目较多的场合,行列式键盘要节省很多的I/O口,故本系统采用4×4的行、列结构构成的16个按键的矩阵式键盘,见图3。
按键设置在行、列线的交点上,行、列线分别连结到按键开关的两端。
通过软件编程扫描键盘的行线,当无键按下时,行线为低电平、列线为高电平,当有键按下时,按键所在的行线变为高电平,执行一段延时10ms的子程序后,确认该行线是否仍为高电平,如果仍为高电平,则认为该行确实有键按下。
然后扫描列线,使行线输出为高电平,列线输出为低电平,当有键按下时,按键所在列为高电平,而其余列为低电平,确认有键按下,然后等待键释放,当键释放以后求出按键的键值。
图3 4×4矩阵键盘
3.3动态显示模块
基本的LED数码管是由七个条状发光二极管芯片按图4排列而成的,可实现0~F 的显示。
图4 LED数码管原理图
LED(Light Emitting Diode),发光二极管,是一种固态的半导体器件,它可以直接把电转化为光。
LED的心脏是一个半导体的晶片.
LED是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成。
LED数码管常用段数一般为7段,有的另加一个小数点,还有一种是类似于3位“1+”型。
LED数码管根据接法不同分为共阴和共阳两类。
LED数码管广泛应用于仪表,时钟,车站,家电等场合。
如图5,8位共阴级LED显示器采用动态显示接法。
在AT89C51的内部RAM中设置8个缓冲单元30H~37H,分别存放显示器要显示的8位数据,单片机AT89C51的P0口用于输出段码,P2口用于输出位选码。
图5 8位LED数码管显示电路图
工作时,利用软件译码的方法求出被按下键对应的段码送至P0口,同时将位选码送至P2口,于是选中的显示器点亮,其余显示器处于熄灭状态。
若将各位从左至右依次进
行显示,每位数码管显示10ms,显示完最后一位后,再重复上述过程,则可得到连续显示的效果。
当有第二个键被按下时,将最右面的LED中的数据左移一位,同时把按下键对应的段码送至P0口,位选码送P2口,在最右面的LED中显示出来。
形成了移位的显示方式。
虽然这些字符是在不同时刻出现的,而在同一时刻,只有一位显示,但由于LED显示器的余辉和人眼的“视觉暂留”作用,只要每位显示间隔足够短,则可以造成“多位同时亮的假象”。
3.4时钟模块
AT89C51单片机各功能部件的运行是以时钟控制信号为基准的,有条不紊地一拍一拍地工作。
常用的时钟电路设计有两种方式,一种是内部时钟方式,另一种是外部时钟方式。
内部时钟方式的电路图如图6。
图6 单片机时钟电路图
3.5复位模块
复位是单片机的初始化操作,起功能主要是使单片机内逻辑电路回到起始点。
AT89C51的复位方式可以是自动复位,也可以是手动复位,见下图7。
此外,RESET/V pd 还是一复用脚,V cc掉电其间,此脚可接上备用电源,以保证单片机内部RAM的数据不丢失。
图7 单片机复位电路图
3.6发光提示和按键中断模块
由于使用的是8位LED数码管,当输入数据超过8位时,系统会清零当前显示,故利用发光二极管的特性设置了提示电路。
当输入第8位数据时,单片机P3.0口输出低电平,发光二极管导通点亮,进行提示。
当再次输入数据后,发光二极管熄灭,提示结束。
为了使单片机工作效率更高,在单片机的外部中断口设置1个按键式开关,作为开始排序按键,当按下开始排序按键后,单片机P3.2口变为低电平,执行中断程序,系统开始排序。
电路图见图8。
图8 发光提示和按键中断电路图
4. 软件编程
4.1主程序功能
基于单片机的冒泡排序动态显示系统主要应用了单片机强大的多功能I/O口,可以实现数据采集和数码管显示而无须添加其他芯片。
主程序将所有分支程序包括其中。
主程序流程图见图9。
图9 主程序流程图
由图可以看出,主程序实现了数据的键盘输入、数码管显示和冒泡动态排序所有要求。
4.2键盘程序功能
键盘程序部分主要完成键盘输入和显示的功能。
当没有键按下时主程序一直执行键扫描工作,当有键按下时,先执行延迟消抖程序,然后在确认是否有键按下。
若确实有键按下,计算出键值后显示执行显示程序。
键盘扫描的流程图见图10。
图10 键盘扫描流程图
4.3冒泡排序法程序功能
数据排序就是将一批数由小到大排列,或由大到小排列。
本部分采用的数据排序算法是冒泡法。
冒泡法是相邻数互换的排序方法,排序时从前向后进行相邻两个数的比较,如果数据的大小次序与要求的顺序不相符时,就将两个数互换,否则,顺序符合要求不互换。
为了实现升序排列,通过这种相邻数互换的方法,使小数向前移,大数向后移。
如此从前向后进行一次次相邻数呼唤,就会把这一批数据的最大排到最后,最小数排到最前,从而实现了数据从小到大的排列。
每次排序后调用一次显示子程序,将排序后的数据通过数码管输出,即可实现动态显示。
冒泡排序流程图见图11。
图11 冒泡法程序流程图
5. 系统调试和结果分析
根据方案设计要求,进行了硬件电路和软件电路的实际联接。
打开程序调试软件Keil uVision4,将已编写好的源程序保存成.ASM形式,通过编译后,生成.HEX和.BIN文件。
在编译提示框中可以看到错误和警告提示信息。
如缺少‘;’,指令错误、跳转范围不正确等,经过查看程序逐步改正过来,直到提示无错误和警告信息为止。
然后在仿真软件PROTEUS中搭建硬件电路图以便进行仿真试验,电路连好后在仿真电路图的AT89C51中添加Keil uVision4中生成的.HEX文件。
接下来就可以进行硬件仿真了。
硬件仿真亦存在很多的错误,在我仿真过程中最初做的按键按下后,数码管无显示,
结合程序和电路对比之后发现电路连接存在问题,依照程序改正后数码管依然无法正常显示,检查数码管后才知道是错误的选用了共阳极的数码管。
通过仿真可以观察到与设计要求相同的结果。
当按下键盘中的键值时能准确无误的通过数码管显示,如下图图12所示。
图12 键盘输入和数码管显示仿真结果图
当按键次数达到8次时,可以看到发光LED数码管点亮进行提示。
结果如图13所示。
图13 发光二极管提示仿真结果图
输入数据:2、A、3、5、B、0、1后,按下开始排序按键,可以观察到数码管中的数据进行排序过程,排序结果见图14。
图14 动态排序显示仿真结果图
6. 结论及进一步设想
本次设计的冒泡排序动态显示系统,能够进行数据排序的动态显示,并可用LED动态显示数据排序过程,同时可以用键盘选择数据的输入。
通过单片机AT89C51的I/O口控制外设键盘和数码显示电路,完成了本次设计要求。
根据实验结果可以知道基本完成了设计任务要求。
参考文献
[1] 李华.MCS-51单片机实用接口技术.北京:北京航空航天出版社大学,1999
[2] 方彦军,孙建.智能仪器技术及其应用.北京:化学工业出版社,2003
[3] 孙传友.测控系统原理与设计.北京:北京航空航天大学出版社,2002
[4] 刘守义等.单片机应用技术.西安:西安电子科技大学出版社,2002
[5] 何立民.单片机高级教程.北京:北京航空航天大学出版社,2000
[6]张毅刚. MCS—51单片机Y原理及应用. 哈尔滨:哈尔滨工业大学出版社,2004
[7]赵茂泰. 智能仪器原理及应用. 北京:电子工业出版社,2004.7
[8]公茂法.MCS—51/52单片机原理与应用. 北京:北京航空航天大学出版社,2009.3
[9]凌玉华. 单片机原理及应用系统设计.北京:电子工业出版社,2006.4
[10]周润景. 基于PROTEUS的电路及单片机系统设计与仿真. 北京:北京航空航天大学出
版社,2006.5
课设体会
在此次的基于单片机的冒泡排序动态显示系统设计过程中,让我更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和其具体的使用方法。
每次课程设计都是一次难得的锻炼机会,让我们能够充分利用所学过的理论知识还有己的想象的能力,另外还让我们学习查找资料的方法,以及自己处理分析电路,编写程序的能力。
这次课程设计让我受益匪浅,无论从知识上还是其他的各个方面。
上课的时候的学习从来没有见过真正的单片机,只是从理论的角度去理解枯燥乏味。
但在课设中见过甚至使用了单片机及其系统,能够理论联系实际的学习,开阔了眼界,提高了单片机知识的理解和水平。
在这次课程设计中又让我体会到了合作与团结的力量,当遇到不会或是设计不出来的地方,我们就会在QQ群里讨论或者是同学之间相互帮助。
团结就是力量,无论在现在的学习中还是在以后的工作中,团结都是至关重要的,有了团结会有更多的理念、更多的思维、更多的情感。
其实,我在开始做设计时,难度很大,很迷茫。
不积跬步何以至千里,通过求助于许老师、理清了思路。
同时,在图书馆里、网上查阅资料,攻克了设计中的道道难题。
最后经过指导老师胡老师的耐心指点和连续的奋战才算基本合格。
本次设计中我用自己学到的知识完成代码,对单片机设计也有了新的认识,又学到了在设计过程中的许多流程和该注意的事项,增强了电子产品开发的意识。
促进我以后更好的学习,锻炼了自身的能力。
单片机是很重要的一门课程,老师和一些工作的朋友都曾说过,如果学好一门单片机,就凭这个技术这门手艺找一个好工作也不成问题。
尽管我们在课堂学到的内容很有限,但在以后的学习中单片机还需要好好的深入研究和学习,学好了单片机也就多了一项生存的本钱。
最后感谢我的课设指导老师胡老师对我的精心指导和帮助。
附录1 元件清单
附录2 总体电路图
附录3 源程序
;**************************************
;以下8个存储单元分别存放8位数码管的段码
LED_BIT_1 EQU 30H
LED_BIT_2 EQU 31H
LED_BIT_3 EQU 32H
LED_BIT_4 EQU 33H
LED_BIT_5 EQU 34H
LED_BIT_6 EQU 35H
LED_BIT_7 EQU 36H
LED_BIT_8 EQU 37H
T_COUNT EQU 38H
KEY_CNT EQU 39H
LINE EQU 3AH
ROW EQU 3BH
;**************************************
ORG 0000H
LJMP START
ORG 0003H
LJMP SORT
ORG 0013H
LJMP INT_1
START: SETB EA
SETB EX0
CLR IT0
MOV T_COUNT,#00H ;初始化
MOV KEY_CNT,#00H
MOV LINE,#00H
MOV ROW,#00H
MOV LED_BIT_1,#00H
MOV LED_BIT_2,#00H
MOV LED_BIT_3,#00H
MOV LED_BIT_4,#00H
MOV LED_BIT_5,#00H
MOV LED_BIT_6,#00H
MOV LED_BIT_7,#00H
MOV LED_BIT_8,#3FH;最右位LED显示0,其余熄灭
MOV 40H,#00H
MOV 41H,#00H
MOV 42H,#00H
MOV 43H,#00H
MOV 44H,#00H
MOV 45H,#00H
MOV 46H,#00H
MOV 47H,#00H
MOV DPTR,#TABLE
A0: LCALL DISP
;**************************************
;按键扫描
LSCAN: MOV P1,#0F0H;行码扫描
L1: JNB P1.0,L2
LCALL DELAY
JNB P1.0,L2
MOV LINE,#00H
LJMP RSCAN
L2: JNB P1.1,L3
LCALL DELAY
JNB P1.1,L3
MOV LINE,#04H
LJMP RSCAN
L3: JNB P1.2,L4
LCALL DELAY
JNB P1.2,L4
MOV LINE,#08H
LJMP RSCAN
L4: JNB P1.3,A0
LCALL DELAY
JNB P1.3,A0
MOV LINE,#0CH
RSCAN: MOV P1,#0FH ;列码扫描
C1: JNB P1.4,C2
MOV ROW,#00H
LJMP CALCU
C2: JNB P1.5,C3
MOV ROW,#01H
LJMP CALCU
C3: JNB P1.6,C4
MOV ROW,#02H
LJMP CALCU
C4: JNB P1.7,C1
MOV ROW,#03H
;***********************************************
CALCU: INC KEY_CNT ;统计按键次数
MOV A,KEY_CNT
CJNE A,#8,CLEAR;如果按键8次,发光LED提示
CLR P3.0
CLEAR: CJNE A,#9,KEY1
SETB P3.0
W10: MOV A,P1;等待按键抬起
CJNE A,#0FH,W11
MOV P0,#00H
LJMP START
W11: MOV A,P1
CJNE A,#0F0H,W10
MOV P0,#00H
LJMP START
;************************************************** ;第1次按键,清除已显示的0,显示按下的数字
KEY1: CJNE A,#1,KEY2
MOV A,LINE
ADD A,ROW
MOV 47H,A
MOVC A,@A+DPTR;查断码表
MOV LED_BIT_8,A
DISP1: LCALL DISP
W20: MOV A,P1;等待按键抬起
CJNE A,#0FH,W21
LJMP A0;键已抬起
W21: MOV A,P1
CJNE A,#0F0H,W22
LJMP A0
W22: LJMP DISP1
RET
;*************************************************** ;第2到8次按键,移位显示按下的数字
KEY2: MOV A,LINE
ADD A,ROW
MOV 50H,A
MOVC A,@A+DPTR
LCALL SHIFT;调用段码移位DISP2: LCALL DISP;调用显示子程序
W30: MOV A,P1;等待按键抬起
CJNE A,#0FH,W31
LJMP A0
W31: MOV A,P1
CJNE A,#0F0H,W32
LJMP A0
W32: LJMP DISP2
;***********************************************
;LED段码移位子程序
SHIFT: MOV 30H,31H
MOV 31H,32H
MOV 32H,33H
MOV 33H,34H
MOV 34H,35H
MOV 35H,36H
MOV 36H,37H
MOV 37H,A
MOV 40H,41H
MOV 41H,42H
MOV 42H,43H
MOV 43H,44H
MOV 44H,45H
MOV 45H,46H
MOV 46H,47H
MOV 47H,50H
RET
;****************************************
;显示控制子程序
DISP: CLR P2.7
MOV P0,LED_BIT_8
LCALL DELAY
SETB P2.7
CLR P2.6
MOV P0,LED_BIT_7
LCALL DELAY
SETB P2.6
CLR P2.5
MOV P0,LED_BIT_6
LCALL DELAY
SETB P2.5
CLR P2.4
MOV P0,LED_BIT_5
LCALL DELAY
SETB P2.4
CLR P2.3
MOV P0,LED_BIT_4
LCALL DELAY
SETB P2.3
CLR P2.2
MOV P0,LED_BIT_3
LCALL DELAY
SETB P2.2
CLR P2.1
MOV P0,LED_BIT_2
LCALL DELAY
SETB P2.1
CLR P2.0
MOV P0,LED_BIT_1
LCALL DELAY
SETB P2.0
RET
;*********************************************** ;冒泡排序子程序
SORT: CLR IE0
MOV R0,#40H
MOV R1,#30H
MOV R2,#08
CLR F0
DEC R2
MOV A,@R0 LOOP: MOV R3,A
INC R0
INC R1
CLR C
MOV A,@R0
SUBB A,R3
JNC LOOP1
SETB F0
MOV A,R3
XCH A,@R0
DEC R0
XCH A,@R0
INC R0
MOV A,@R1
DEC R1
XCH A,@R1
INC R1
MOV R1,A
LOOP1: LCALL DISP
MOV A,@R0
DJNZ R2,LOOP
JB F0,SORT
RETI
INT_1: CLR IE1
LJMP START
RETI
DELAY: MOV R6,#10
MOV R7,#250
D1: DJNZ R7,$
DJNZ R6,D1
RET
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H;段码表DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
END。