PIC单片机实现冒泡排序算法

发布者:innovator8最新更新时间:2019-05-11 来源: eefocus关键字:PIC单片机  冒泡排序  算法 手机看文章 扫描二维码
随时随地手机看文章

编写子程序paixu,实现1Byte数的顺序排列。待排序的10个二进制数(自定义数据大小)存放在内存空间内。

编写宏定义实现大小比较和换位,入口参数为待比较的两个数据地址。

注意排序过程中需要使用间接寻址方式,即利用FSR和INDF两个特殊功能寄存器实现寻址操作。

编写子程序,调用宏定义,使用冒泡排序算法实现排序。

1、冒泡排序算法

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。


冒泡排序算法的运作如下:


比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

2、编写宏定义实现大小比较与换位



;*****************宏定义*********************************************************

compare_swap  macro  DATAI,DATAJ,TEMP   

BCF      STATUS,C                ; 标志位清零

MOVF     DATAJ,W

SUBWF    DATAI,W                 ; 比较大小

BTFSC    STATUS,C                ; TEMP1>TEMP2? 

GOTO     NEXT1

GOTO     NEXT2     

NEXT1              

swap     DATAI,DATAJ,TEMP        ; 是,则交换两者的值

NEXT2

nop                              ; 否则,不做操作

endm

 

swap   macro   DATAI,DATAJ,TEMP    

MOVF     DATAI,W

MOVWF    TEMP

MOVF     DATAJ,W

MOVWF    DATAI

MOVF     TEMP,W

MOVWF    DATAJ

endm

进行宏指令嵌套时,要十分注意宏指令调用与子程序调用的区别,否则很容易产生错误。例如下面这段代码:


BTFSC    STATUS,C                ; TEMP1>TEMP2? 

GOTO     NEXT1

GOTO     NEXT2     

NEXT1              

swap     DATAI,DATAJ,TEMP        ; 是,则交换两者的值

NEXT2

nop    

如不慎写作:


BTFSC    STATUS,C                ; TEMP1>TEMP2?               

swap     DATAI,DATAJ,TEMP        ; 是,则交换两者的值

nop                              ; 否则,不做操作

就会发生错误。


3、编写子程序,调用宏定义实现排序



;*************************子程序************************** ********************

    ORG    0x0100

paixu

LOOP1

    MOVLW  0x20

    MOVWF  FSR                   ; FSR=0x20,起始位置

    CLRF   COUNT2

LOOP2   

    MOVF   INDF,W

    MOVWF  DATAI

    INCF   FSR,F

    MOVF   INDF,W

    MOVWF  DATAJ

    compare_swap   DATAI,DATAJ,TEMP 

    MOVF   DATAJ,W               ; 数据还原

    MOVWF  INDF

    DECF   FSR,F

    MOVF   DATAI,W

    MOVWF  INDF

    INCF   FSR,F

    INCF   COUNT2,F              ; COUNT2++,COUNT2<9-COUNT1?

    MOVF   COUNT1,W

    SUBWF  SIZE,W 

    BSF    STATUS,C

    SUBWF  COUNT2,W

    BTFSS  STATUS,C   

    GOTO   LOOP2

    INCF   COUNT1,F              ; COUNT1++,COUNT1<9?               

    BSF    STATUS,C

    MOVF   SIZE,W

    SUBWF  COUNT1,W

    BTFSS  STATUS,C

    GOTO   LOOP1

    NOP

    RETURN

;*****************************************************************************

完整程序:


list        p=16f877A            ;标明所用的处理器类型

#include           ;调用头文件 

__CONFIG    _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

 

;*****************宏定义*********************************************************

 

compare_swap  macro  DATAI,DATAJ,TEMP   

BCF      STATUS,C                ; 标志位清零

MOVF     DATAJ,W

SUBWF    DATAI,W                 ; 比较大小

BTFSC    STATUS,C                ; TEMP1>TEMP2? 

GOTO     NEXT1

GOTO     NEXT2     

NEXT1              

swap     DATAI,DATAJ,TEMP        ; 是,则交换两者的值

NEXT2

nop                              ; 否则,不做操作

endm

 

swap   macro   DATAI,DATAJ,TEMP    

MOVF     DATAI,W

MOVWF    TEMP

MOVF     DATAJ,W

MOVWF    DATAI

MOVF     TEMP,W

MOVWF    DATAJ

endm

 

;*****************变量定义*******************************************************

 

DATA1    EQU    0x20             ; 待排序的数据

DATA2    EQU    0x21             

DATA3    EQU    0x22          

DATA4    EQU    0x23             

DATA5    EQU    0x24             

DATA6    EQU    0x25 

DATA7    EQU    0x26

DATA8    EQU    0x27

DATA9    EQU    0x28

DATA10   EQU    0x29 

 

SIZE     EQU    0x30             ; 待排序数据个数-1

 

COUNT1   EQU    0x31             ; 循环变量

COUNT2   EQU    0x32 

 

TEMP     EQU    0x33             ; 临时变量 

DATAI    EQU    0x34

DATAJ    EQU    0x35                               

 

;*******************************************************************************

    ORG         0x0000           ; 复位入口地址

    nop                          ; 兼容ICD调试工具,必须加nop

    goto        Main             ; 跳转至Main函数

;*************************Main 函数的代码***************************************

Main                                               

    MOVLW  0x34                  ; 数据初始化

    MOVWF  DATA1                

    MOVLW  0x53                 

    MOVWF  DATA2

    MOVLW  0xb5                  

    MOVWF  DATA3

    MOVLW  0x33

    MOVWF  DATA4

    MOVLW  0xA1

    MOVWF  DATA5

    MOVLW  0x42

    MOVWF  DATA6

    MOVLW  0x11

    MOVWF  DATA7

    MOVLW  0x86

    MOVWF  DATA8

    MOVLW  0x65

    MOVWF  DATA9

    MOVLW  0x76

    MOVWF  DATA10

 

    MOVLW  .9

    MOVWF  SIZE 

                          

    CLRF   COUNT1                ; 初始化循环变量

    CLRF   COUNT2   

 

    CLRF   TEMP                  ; 初始化临时变量

    CLRF   DATAI

    CLRF   DATAJ

    

    CALL   paixu                 ; 调用子程序排序

    nop

    goto   $                     ; 停机

;*************************子程序************************** ********************

    ORG    0x0100

paixu

LOOP1

    MOVLW  0x20

    MOVWF  FSR                   ; FSR=0x20,起始位置

    CLRF   COUNT2

LOOP2   

    MOVF   INDF,W

    MOVWF  DATAI

    INCF   FSR,F

    MOVF   INDF,W

    MOVWF  DATAJ

    compare_swap   DATAI,DATAJ,TEMP 

    MOVF   DATAJ,W               ; 数据还原

    MOVWF  INDF

    DECF   FSR,F

    MOVF   DATAI,W

    MOVWF  INDF

    INCF   FSR,F

    INCF   COUNT2,F              ; COUNT2++,COUNT2<9-COUNT1?

    MOVF   COUNT1,W

    SUBWF  SIZE,W 

    BSF    STATUS,C

    SUBWF  COUNT2,W

    BTFSS  STATUS,C   

    GOTO   LOOP2

[1] [2]
关键字:PIC单片机  冒泡排序  算法 引用地址:PIC单片机实现冒泡排序算法

上一篇:PIC单片机-七段数码管的使用
下一篇:PIC单片机花式点亮LED

推荐阅读最新更新时间:2024-11-05 14:00

单片机模糊PID自整定控制算法的实现及仿真
0 引言 由于液压伺服系统的固有特性(如死区、泄漏、阻尼系数的时变性以及负载干扰的存在),系统往往会呈现典型的不确定性和非线性特性。这类系统一般很难精确描述控制对象的传递函数或状态方程,而常规的PID控制又难以取得良好的控制效果。另外,单一的模糊控制虽不需要精确的数学模型,但是却极易在平衡点附近产生小振幅振荡,从而使整个控制系统不能拥有良好的动态品质。 本文针对这两种控制的优缺点并结合模糊控制技术,探讨了液压伺服系统的模糊自整定PID控制方法,同时利用MATLAB软件提供的Simulink和Fuzzy工具箱对液压伺服调节系统的模糊自整定PID控制系统进行仿真,并与常规PID控制进行了比较。此外,本文还尝试将控制系统通过单片机的
[应用]
基于Transformer的目标检测算法难点
说到纯视觉的自动驾驶方案,大家第一个想到的就是Tesla吧。的确,早在2021年,Tesla就已经实现了纯视觉的BEV检测方案,而且效果非常好。 细心的同学可能发现了,这套BEV方案中将相机空间的图像转换到BEV空间的核心组件就是Transformer。 Transformer来源于自然语言处理领域,首先被应用于机器翻译。后来,大家发现它在计算机视觉领域效果也很不错,而且在各大排行榜上碾压CNN网络。 目标检测领域中,视觉Transformer不仅可以实现2D检测、3D检测,还可以实现多模态检测,BEV视角下的检测,性能也非常出色。 因此,掌握Transformer相关知识和工程基础成为了企业招聘算法工程师的一个技能要求点
[嵌入式]
基于Transformer的目标检测<font color='red'>算法</font>难点
PIC单片机读写时钟芯片DS1302汇编程序
#INCLUDE CBLOCK 20H SEC ;秒 MIN ;分 HOU ;小时 DATE ;日期 MON ;月 DAY ;日 YERR ;年 DDD ;写使能位 TIME_TX ;1302发送寄存器 TIME_RX ;1302接收寄存器 COUNT1 ; COUNT2 ; DELAY1 DELAY2 ENDC ******************************* ; ; 1302子程序说明 ; ;****************************** ; DS1302INI ;1302初始化,先禁止RST,设定充电方式 ; SET_TIME ;一次发送7个数据设定时间,包含写使能寄存器,8个数据 ; GET_T
[单片机]
PIC单片机4X4矩阵键盘检测原理及实现C语言程序
#include pic.h #define uchar unsigned char #define uint unsigned int __CONFIG(0x3B31); const uchar table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar key_num; void delay(uint x); void init(); void scan(); void didi(uchar num); void disp(); void mai
[单片机]
基于PIC单片机的电波数码显示时钟的设计
电波钟表是一种新兴的计时产品,是把原子振动的频率引出作为计时基准。目的是使世界时间同步统一。主要是为了解决目前石英钟表的精确度问题。石英钟表较机械钟表已准确很多,但日差仍有一秒半秒的误差。这种误差对于人们的日常生活没有多大的影响和更正的必要,但对于军事和科学实验,就是要解决的大问题。在一些重要场合,误差在0.01秒之间,结果也会失之千里。   电波钟的原理,是它有一个原子发射台,定期发射信号,频率每三千年只差一秒,非常准确。电波钟是以原子的精度来制造的计时产品。发射台发出的信号不是一直不断地往外发,而是间隔性的发射。所以电波钟或电波表实际是接收器,接收原子发射台的信号 。   无论电波钟,还是电波表,实际上都是一个接收器,
[单片机]
基于<font color='red'>PIC单片机</font>的电波数码显示时钟的设计
PIC单片机CCS之C语言(#BYTE的用法)
#BYTE 语法: #byte id=x id是一个有效的C标识符; x是一个常数或是一个C变量; 目的:如果id是一个已知C的变量,那么它将定位在地址x处,在这种情况下,变量类型的最初定义不会被改变.若id不是已知的C变量,则利用#byte id=x就可创建一个新的C变量,且放在地址x处,类型为整型(8位). 主意:在两个不同的存储区里,x不是唯一对应这个变量(id)的地址.其它变量可能和它拥有相同的地址.实际上,当x是一个变量时,那么id和x就共享有相同的地址存储单元. 例子: #byte status=3 //定义status的地址为3 #byte b_port=6 //定义b_port的地址为6 str
[单片机]
算法—>回溯法
设问:某人要从a路口经过4个路口(含起始路口和目的路口)到达b路口,已知该地区的道路有一个特点:除起点和终点外,每个路口都有三条叉路。请找出一条可行的路线。 首先,我们应该分析出我们所能找到的有关信息: 1、从起始地到目的地一共有4个路口; 2、除起点和终点外,每个路口都有三条叉路; 要解决这一问题,首先我们应该将地形图转换为较规范的路径图,其中路径图中的结点对应地图的路口,路径图中的连线对应地图的路;然后尝试着找出某种规则进行路的探求。当在某个路口走不通时就回头另找一条新的路,当发现了目标地址就可以停止寻找。 从问题的某一种可能情况出发, 搜索所有能达到的可能情况,然后再以其中的一种可能情况为新的出发点,继续向下探求,这样就走出了
[单片机]
32个算法介绍
A* 搜索算法 图形搜索算法,从给定起点到给定终点计算出路径。其中使用了一种启发式的估算,为每个节点估算通过该节点的最佳路径,并以之为各个地点排定次序。算法以得到的次序访问这些节点。因此,A*搜索算法是最佳优先搜索的范例。 集束搜索(又名定向搜索,Beam Search) 最佳优先搜索算法的优化。使用启发式函数评估它检查的每个节点的能力。不过,集束搜索只能在每个深度中发现最前面的m个最符合条件的节点,m是固定数字 集束的宽度。 二分查找(Binary Search) 在线性数组中找特定值的算法,每个步骤去掉一半不符合要求的数据。 分支界定算法(Branch and Bound) 在多种最优化问题中寻找特定最优化解决方案的算
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved