網上抄來例程 16位有符號數據 快速排序 成功,而16位無符號和32位長整型數據排序不能通過。
請各位指教,哪里沒有弄好,應該怎么辦? 謝謝
單片機源程序如下:
- #include "STC32G.h"
- #include "stdio.h"
- #include "intrins.h"
- typedef unsigned char u8;
- typedef unsigned int u16;
- typedef unsigned long int u32;
- #define SYSCLK 132710400UL/6 //13....M/6=22.1184M
- #define BRT (65536 - SYSCLK/4/19200) //
- bit busy;
- u8 i;
- int aaa[6]={8,2,3,1,7,0};
- int bbb[6];
- //int AQ[5] = {123,1,521,400,619};
- //int arry[12] = {123,1,501,8,2,400,3,1,7,0,400,319};
- int arry[12] = {123,1,31501,8,2,400,3,1,7,0,21400,319};
- //u8 arry[12] = {123,1,201,8,2,200,3,1,7,0,100,219};
- //u32 arry[12] = {123,1,95201,8,10000,200,3,1,7,0,100,109219};
- //u16 arry[12] = {123,1,25201,8,10000,200,3,1,7,0,100,9219};
- /*=======延時函數 大約1mS===========*/
- void delay_ms(u16 ms)
- { u16 i;
- do
- {i = SYSCLK / 6000;
- while(--i) ;
- }while(--ms);
- }
- /*****Uart1Init********************************/
- void Uart1Init(void) //19200bps@22.1184MHz
- { SCON = 0x50; //8位數據,可變波特率
- AUXR |= 0x01; //串口1選擇定時器2為波特率發生器
- AUXR |= 0x04; //定時器時鐘1T模式
- T2L = 0xE0; //設置定時初始值
- T2H = 0xFE; //設置定時初始值
- AUXR |= 0x10; //定時器2開始計時
- ES=1;
- EA=1;
- }
- /*=======發字節 =========== */
- void Uart1Send(u8 dat)
- { while (busy);
- busy = 1;
- SBUF = dat;
- }
- /******************/
- #pragma FUNCTIONS (reentrant) //F1幫助里: C251 generates reentrant CODE
- //void quiksort(u16 a[],u16 low,u16 high)//reentrant
- //void quiksort(u8 a[],int low,int high)//reentrant
- //void quiksort(u32 a[],u32 low,u32 high)//reentrant
- void quiksort(int a[],int low,int high)//reentrant
- { int i = low;
- int j = high;
- int temp = a[i];
- //u32 i = low;
- //u32 j = high;
- //u32 temp = a[i];
- //u16 i = low;
- //u16 j = high;
- //u16 temp = a[i];
- if( low < high)
- {while(i < j)
- {while((a[j] >= temp) && (i < j))
- {j--;
- }
- a[i] = a[j];
- while((a[i] <= temp) && (i < j))
- {i++; //Uart1Send(0x1A);
- }
- a[j]= a[i];
- }
- a[i] = temp;
- quiksort(a,low,i-1);
- quiksort(a,j+1,high);
- }
- }
- void main()
- { WTST = 0x00;
- P_SW2 = 0x80;
- EAXFR = 1; //擴展寄存器(XFR)訪問使能
- CKCON = 0; //提高訪問XRAM速度
- P0M0 = 0x00; P1M0 = 0x00; P2M0 = 0x00; P3M0 = 0x00;
- P0M1 = 0x00; P1M1 = 0x00; P2M1 = 0x00; P3M1 = 0x00;
- P4M0 = 0x01; P5M0 = 0x00; P6M0 = 0x00; P7M0 = 0x00;
- P4M1 = 0x00; P5M1 = 0x00; P6M1 = 0x00; P7M1 = 0x00;
- Uart1Init();
- Uart1Send(0x1A);Uart1Send(0x2A);Uart1Send(0x3A);Uart1Send(0x4A);
- while (1)
- { delay_ms(550);
- Uart1Send(0xAA);Uart1Send(0xAA);
- for(i=0;i<12;i++)
- //{Uart1Send((u8)((int)(arry[i])>>8)); //
- // Uart1Send((u8)((int)(arry[i]) ));
- {Uart1Send((u8)((u16)(arry[i])>>8)); //
- Uart1Send((u8)((u16)(arry[i]) ));
- //{Uart1Send((u8)((u16)(arry[i])>>8)); //
- //{ Uart1Send((arry[i]) );
- // {Uart1Send((u8)((arry[i])>>16)); //
- // Uart1Send((u8)((arry[i])>>8 ));
- // Uart1Send((u8)((arry[i]) ));
- }
- Uart1Send(0xCC);Uart1Send(0xCC);//quiksort(arry,0,4);
- //----???----------------
- quiksort(arry,0,11);
- //----???----------------
- delay_ms(550);
- Uart1Send(0xBB);Uart1Send(0xBB);
- for(i=0;i<12;i++)
- //{Uart1Send((u8)((int)(arry[i])>>8)); //
- //Uart1Send((u8)((int)(arry[i]) ));
- {Uart1Send((u8)((u16)(arry[i])>>8)); //
- Uart1Send((u8)((u16)(arry[i]) ));
- //{Uart1Send((u8)(u32)(arry[i])>>16)); //
- // Uart1Send((u8)(u32)(arry[i])>>8 ));
- // Uart1Send((u8)(u32)(arry[i]) ));
- }
- }
- }
- /******************************************* */
- void Uart1Isr() interrupt 4
- { if (TI)
- { TI = 0;
- busy = 0;
- }
- if (RI)
- {RI = 0;
- }
- }
復制代碼
|