久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 908|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线视频免费观看 | 欧美日韩在线观看一区二区三区 | 91亚洲精品在线观看 | 精品欧美一区二区三区久久久 | 亚洲综合热 | 国产精品麻 | 一级毛片在线视频 | 亚洲国产免费 | 日韩欧美在线一区 | 成人3d动漫一区二区三区91 | 狠狠久久| 91久久爽久久爽爽久久片 | 狠狠爱综合网 | 密室大逃脱第六季大神版在线观看 | 日韩在线播放一区 | 国产在线一区二区三区 | 日韩精品中文字幕在线 | 久久久久国产精品 | 黄色成人免费在线观看 | 日本午夜一区二区三区 | 国产一区免费视频 | 自拍偷拍亚洲视频 | 色视频在线播放 | 国产成人精品一区 | 亚洲一区av | 精品久久久久久 | 久久久久久久综合色一本 | 午夜小电影| 成人一区av偷拍 | 欧美在线观看一区 | 网站黄色在线免费观看 | 亚洲成人久久久 | 久草视频观看 | 欧美成人精品 | 欧美日韩不卡在线 | 九九热最新地址 | 精品欧美一区二区三区久久久 | 国产 日韩 欧美 在线 | 欧美一区二区三区四区五区无卡码 | 国产欧美精品一区二区三区 | 黄色免费看 |