找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1065|回复: 3
收起左侧

16位有符号数据排序成功 16位无符号和32位长整型数据排序不行?

[复制链接]
ID:91150 发表于 2024-9-17 11:31 | 显示全部楼层 |阅读模式
   网上抄来例程  16位有符号数据 快速排序 成功,而16位无符号和32位长整型数据排序不能通过。
请各位指教,哪里没有弄好,应该怎么办?  谢谢

单片机源程序如下:
  1. #include "STC32G.h"
  2. #include "stdio.h"
  3. #include "intrins.h"

  4. typedef     unsigned char      u8;
  5. typedef     unsigned int       u16;
  6. typedef     unsigned long int  u32;

  7. #define  SYSCLK    132710400UL/6  //13....M/6=22.1184M
  8. #define  BRT      (65536 - SYSCLK/4/19200)    //  


  9. bit busy;
  10. u8  i;
  11. int aaa[6]={8,2,3,1,7,0};
  12. int bbb[6];
  13. //int AQ[5] = {123,1,521,400,619};
  14. //int arry[12] = {123,1,501,8,2,400,3,1,7,0,400,319};
  15. int arry[12] = {123,1,31501,8,2,400,3,1,7,0,21400,319};
  16. //u8 arry[12] = {123,1,201,8,2,200,3,1,7,0,100,219};
  17. //u32 arry[12] = {123,1,95201,8,10000,200,3,1,7,0,100,109219};
  18. //u16 arry[12] = {123,1,25201,8,10000,200,3,1,7,0,100,9219};

  19. /*=======延时函数  大约1mS===========*/
  20. void  delay_ms(u16 ms)
  21. { u16 i;
  22.         do
  23.          {i = SYSCLK / 6000;   
  24.                 while(--i)        ;
  25.    }while(--ms);
  26. }



  27. /*****Uart1Init********************************/
  28. void Uart1Init(void)                //19200bps@22.1184MHz
  29. { SCON = 0x50;                //8位数据,可变波特率
  30.         AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
  31.         AUXR |= 0x04;                //定时器时钟1T模式
  32.         T2L = 0xE0;                        //设置定时初始值
  33.         T2H = 0xFE;                        //设置定时初始值
  34.         AUXR |= 0x10;                //定时器2开始计时
  35.         ES=1;
  36.         EA=1;
  37. }
  38. /*=======发字节 ===========        */
  39. void Uart1Send(u8 dat)
  40. {   while (busy);
  41.     busy = 1;
  42.     SBUF = dat;
  43. }
  44. /******************/
  45. #pragma FUNCTIONS (reentrant) //F1帮助里: C251 generates reentrant CODE
  46. //void quiksort(u16 a[],u16 low,u16 high)//reentrant
  47. //void quiksort(u8 a[],int low,int high)//reentrant
  48. //void quiksort(u32 a[],u32 low,u32 high)//reentrant
  49. void quiksort(int a[],int low,int high)//reentrant
  50. {   int i = low;
  51.     int j = high;  
  52.     int temp = a[i];
  53.     //u32 i = low;
  54.     //u32 j = high;  
  55.     //u32 temp = a[i];   
  56.     //u16 i = low;
  57.     //u16 j = high;  
  58.     //u16 temp = a[i];   
  59.           if( low < high)
  60.      {while(i < j)
  61.        {while((a[j] >= temp) && (i < j))
  62.          {j--;
  63.          }
  64.         a[i] = a[j];
  65.         while((a[i] <= temp) && (i < j))
  66.          {i++;    //Uart1Send(0x1A);
  67.          }  
  68.         a[j]= a[i];
  69.        }
  70.      a[i] = temp;
  71.      quiksort(a,low,i-1);
  72.      quiksort(a,j+1,high);
  73.     }
  74. }


  75. void main()
  76. {   WTST = 0x00;
  77.     P_SW2 = 0x80;
  78.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  79.     CKCON = 0; //提高访问XRAM速度
  80.     P0M0 = 0x00; P1M0 = 0x00; P2M0 = 0x00; P3M0 = 0x00;
  81.           P0M1 = 0x00; P1M1 = 0x00; P2M1 = 0x00; P3M1 = 0x00;
  82.           P4M0 = 0x01; P5M0 = 0x00; P6M0 = 0x00; P7M0 = 0x00;
  83.           P4M1 = 0x00; P5M1 = 0x00; P6M1 = 0x00; P7M1 = 0x00;
  84.         Uart1Init();  
  85.   Uart1Send(0x1A);Uart1Send(0x2A);Uart1Send(0x3A);Uart1Send(0x4A);
  86.   while (1)
  87.    {         delay_ms(550);
  88.                          Uart1Send(0xAA);Uart1Send(0xAA);
  89.     for(i=0;i<12;i++)
  90.     //{Uart1Send((u8)((int)(arry[i])>>8)); //
  91.                 // Uart1Send((u8)((int)(arry[i])   ));
  92.      {Uart1Send((u8)((u16)(arry[i])>>8)); //
  93.                   Uart1Send((u8)((u16)(arry[i])   ));
  94.    //{Uart1Send((u8)((u16)(arry[i])>>8)); //
  95.                 //{        Uart1Send((arry[i])   );
  96.     // {Uart1Send((u8)((arry[i])>>16)); //
  97.                 //  Uart1Send((u8)((arry[i])>>8 ));
  98.                 //  Uart1Send((u8)((arry[i])    ));
  99.      }
  100.                          Uart1Send(0xCC);Uart1Send(0xCC);//quiksort(arry,0,4);
  101.                 //----???----------------
  102.                 quiksort(arry,0,11);
  103.                 //----???----------------
  104.                          delay_ms(550);
  105.                          Uart1Send(0xBB);Uart1Send(0xBB);
  106.     for(i=0;i<12;i++)
  107.      //{Uart1Send((u8)((int)(arry[i])>>8)); //
  108.                         //Uart1Send((u8)((int)(arry[i])   ));
  109.                  {Uart1Send((u8)((u16)(arry[i])>>8)); //
  110.                         Uart1Send((u8)((u16)(arry[i])   ));
  111.      //{Uart1Send((u8)(u32)(arry[i])>>16)); //
  112.                  // Uart1Send((u8)(u32)(arry[i])>>8 ));
  113.                  // Uart1Send((u8)(u32)(arry[i])    ));
  114.                  }         
  115.   }
  116. }
  117. /******************************************* */
  118. void Uart1Isr() interrupt 4
  119. {  if (TI)               
  120.     {   TI = 0;         
  121.         busy = 0;
  122.     }
  123.    if (RI)
  124.     {RI = 0;

  125.     }
  126. }
复制代码



pai_xu0求教.rar

1.57 KB, 下载次数: 0

回复

使用道具 举报

ID:844772 发表于 2024-9-17 20:01 来自触屏版 | 显示全部楼层
我在用手机看,32位排序每次都不能成功吗?这是八位机,你这种超过八位的运算不要开中断
回复

使用道具 举报

ID:744809 发表于 2024-9-18 09:09 | 显示全部楼层
你quiksort函数的入参都是int类型的,51里面int类型是16位有符号数,范围是-32768到32767;而16位无符号数是0-65535,32位无符号数就更大了,所以你排序肯定是失败的。如果想排序16位无符号数可以把入参类型改为unsigned int,排序32位无符号数可以把入参类型改为u32
回复

使用道具 举报

ID:91150 发表于 2024-9-18 15:29 | 显示全部楼层
谢谢先生们指教。
在keil 5 C251下试验  对应变量数据类型在子函数里相同都是u16或
u32,排序不成功。程序文本写了不同类型 屏蔽和去除屏蔽很方便
请设置到u16或u32,试一下,看能否找到不成功的原因。
8位机应该能处理16、32位数据,int类型(-32768~ +32767)就是16位
它就可以排序。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表