fs_man2023 发表于 2025-10-18 09:57:19

STC32G8K64,浮点计算,两个不同单片机计算结果不一样,那个好心STC大神来指导以下


程序段1

unsigned int A1;
unsigned char B2;
float y=0;
unsigned int AABB;


       
A1=1000;
B2=32;       

y=(float)A1*B2;
y=y/180;
AABB=10*y;


1、芯片出厂序列号 : F854CA3703AEF1可以计算浮点,AABB计算输出0x06F1;
2、芯片出厂序列号 : F854CA0A04DEF6   不可以计算浮点,,AABB计算输出0x07F1;



开始怀疑是板问题,我把STC对换,不能计算浮点的,依然不能,当A1=3000时候,两个单片机计算结果才一样,
求大神指导,




程序例子,是STC试验箱的串口例子,增加上面的程序段




/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- BBS: www.STCAIMCU.com-----------------------------------------*/
/* --- QQ:800003751 -------------------------------------------------*/
/* Èç¹ûÒªÔÚ³ÌÐòÖÐʹÓô˴úÂë,ÇëÔÚ³ÌÐòÖÐ×¢Ã÷ʹÓÃÁËSTCµÄ×ÊÁϼ°³ÌÐò            */
/*---------------------------------------------------------------------*/


/*************¹¦ÄÜ˵Ã÷    **************


±¾Àý³Ì»ùÓÚSTC32GΪÖ÷¿ØÐ¾Æ¬µÄʵÑéÏä½øÐбàд²âÊÔ¡£


ʹÓÃKeil C251±àÒëÆ÷£¬Memory ModelÍÆ¼öÉèÖÃXSmallģʽ£¬Ä¬È϶¨Òå±äÁ¿ÔÚedata£¬µ¥Ê±ÖÓ´æÈ¡·ÃÎÊËٶȿ졣


edata½¨Òé±£Áô1K¸ø¶ÑջʹÓ㬿ռ䲻¹»Ê±¿É½«´óÊý×é¡¢²»³£ÓñäÁ¿¼Óxdata¹Ø¼ü×Ö¶¨Òåµ½xdata¿Õ¼ä¡£


´®¿Ú1ȫ˫¹¤ÖжϷ½Ê½ÊÕ·¢Í¨Ñ¶³ÌÐò¡£


ͨ¹ýPCÏòMCU·¢ËÍÊý¾Ý, MCUÊÕµ½ºóͨ¹ý´®¿Ú1°ÑÊÕµ½µÄÊý¾ÝÔ­Ñù·µ»Ø.


Óö¨Ê±Æ÷×ö²¨ÌØÂÊ·¢ÉúÆ÷£¬½¨ÒéʹÓÃ1Tģʽ(³ý·ÇµÍ²¨ÌØÂÊÓÃ12T)£¬²¢Ñ¡Ôñ¿É±»²¨ÌØÂÊÕû³ýµÄʱÖÓÆµÂÊ£¬ÒÔÌá¸ß¾«¶È¡£


ÏÂÔØÊ±, Ñ¡ÔñʱÖÓ 22.1184MHz (Óû§¿É×ÔÐÐÐÞ¸ÄÆµÂÊ).


******************************************/


#include "STC32G.h"


#include "stdio.h"
#include "intrins.h"


typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;


#define MAIN_Fosc      22118400L   //¶¨ÒåÖ÷ʱÖÓ£¨¾«È·¼ÆËã115200²¨ÌØÂÊ£©
//==========================================================================


#define Baudrate1   (65536 - MAIN_Fosc / 115200 / 4)


#define UART1_BUF_LENGTH    128


//==========================================================================


/*************±¾µØ³£Á¿ÉùÃ÷    **************/




/*************IO¿Ú¶¨Òå    **************/


/*************±¾µØ±äÁ¿ÉùÃ÷    **************/


u8TX1_Cnt;    //·¢ËͼÆÊý
u8RX1_Cnt;    //½ÓÊÕ¼ÆÊý
bit B_TX1_Busy; //·¢ËÍæ±êÖ¾


u8RX1_Buffer; //½ÓÊÕ»º³å


/*************±¾µØº¯ÊýÉùÃ÷    **************/


void UART1_config(u8 brt);   // Ñ¡Ôñ²¨ÌØÂÊ, 2: ʹÓÃTimer2×ö²¨ÌØÂÊ, ÆäËüÖµ: ʹÓÃTimer1×ö²¨ÌØÂÊ.
void PrintString1(u8 *puts);


/****************Íⲿº¯ÊýÉùÃ÷ºÍÍⲿ±äÁ¿ÉùÃ÷ *****************/


void Delay10ms(void)        //@11.0592MHz
{
        unsigned char data i, j;


        i = 108;
        j = 145;
        do
        {
                while (--j);
        } while (--i);
}


/******************** Ö÷º¯Êý **************************/
void main(void)
{
unsigned int A1;
        unsigned char B2;
float y=0;
        unsigned int AABB;
       
        A1=1000;
        B2=32;       


y=(float)A1*B2;
        y=y/180;
AABB=10*y;
       
       
          WTST = 0;//ÉèÖóÌÐòÖ¸ÁîÑÓʱ²ÎÊý£¬¸³ÖµÎª0¿É½«CPUÖ´ÐÐÖ¸ÁîµÄËÙ¶ÈÉèÖÃΪ×î¿ì
    EAXFR = 1; //À©Õ¹¼Ä´æÆ÷(XFR)·ÃÎÊʹÄÜ
    CKCON = 0; //Ìá¸ß·ÃÎÊXRAMËÙ¶È


/*P0M1 = 0x30;   P0M0 = 0x30;   //ÉèÖÃP0.4¡¢P0.5Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P1M1 = 0x30;   P1M0 = 0x30;   //ÉèÖÃP1.4¡¢P1.5Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P2M1 = 0x3c;   P2M0 = 0x3c;   //ÉèÖÃP2.2~P2.5Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P3M1 = 0x50;   P3M0 = 0x50;   //ÉèÖÃP3.4¡¢P3.6Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P4M1 = 0x3c;   P4M0 = 0x3c;   //ÉèÖÃP4.2~P4.5Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P5M1 = 0x0c;   P5M0 = 0x0c;   //ÉèÖÃP5.2¡¢P5.3Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P6M1 = 0xff;   P6M0 = 0xff;   //ÉèÖÃΪ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P7M1 = 0x00;   P7M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
        */


    UART1_config(2);    // Ñ¡Ôñ²¨ÌØÂÊ, 2: ʹÓÃTimer2×ö²¨ÌØÂÊ, ÆäËüÖµ: ʹÓÃTimer1×ö²¨ÌØÂÊ.
    EA = 1;             //ÔÊÐíÈ«¾ÖÖжÏ


//PrintString1("STC32G UART1 Test Programme!\r\n");//UART1·¢ËÍÒ»¸ö×Ö·û´®
   SBUF=AABB/0x100;
       Delay10ms();
       SBUF=AABB%0x100;
    while (1)
    {
      if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy))   //ÊÕµ½Êý¾Ý, ·¢ËÍ¿ÕÏÐ
      {
            SBUF = RX1_Buffer;
            B_TX1_Busy = 1;
            if(++TX1_Cnt >= UART1_BUF_LENGTH)   TX1_Cnt = 0;
      }
    }
}


//========================================================================
// º¯Êý: void PrintString1(u8 *puts)
// ÃèÊö: ´®¿Ú1·¢ËÍ×Ö·û´®º¯Êý¡£
// ²ÎÊý: puts:×Ö·û´®Ö¸Õë.
// ·µ»Ø: none.
// °æ±¾: VER1.0
// ÈÕÆÚ: 2014-11-28
// ±¸×¢:
//========================================================================
void PrintString1(u8 *puts)
{
    for (; *puts != 0;puts++)   //Óöµ½Í£Ö¹·û0½áÊø
    {
      SBUF = *puts;
      B_TX1_Busy = 1;
      while(B_TX1_Busy);
    }
}


//========================================================================
// º¯Êý: SetTimer2Baudraye(u32 dat)
// ÃèÊö: ÉèÖÃTimer2×ö²¨ÌØÂÊ·¢ÉúÆ÷¡£
// ²ÎÊý: dat: Timer2µÄ֨װֵ.
// ·µ»Ø: none.
// °æ±¾: VER1.0
// ÈÕÆÚ: 2014-11-28
// ±¸×¢:
//========================================================================
void SetTimer2Baudraye(u32 dat)
{
    T2R = 0;                //Timer stop
    T2_CT = 0;        //Timer2 set As Timer
    T2x12 = 1;        //Timer2 set as 1T mode
    T2H = (u8)(dat / 256);
    T2L = (u8)(dat % 256);
    ET2 = 0;    //½ûÖ¹ÖжÏ
    T2R = 1;                //Timer run enable
}


//========================================================================
// º¯Êý: void UART1_config(u8 brt)
// ÃèÊö: UART1³õʼ»¯º¯Êý¡£
// ²ÎÊý: brt: Ñ¡Ôñ²¨ÌØÂÊ, 2: ʹÓÃTimer2×ö²¨ÌØÂÊ, ÆäËüÖµ: ʹÓÃTimer1×ö²¨ÌØÂÊ.
// ·µ»Ø: none.
// °æ±¾: VER1.0
// ÈÕÆÚ: 2014-11-28
// ±¸×¢:
//========================================================================
void UART1_config(u8 brt)
{
    /*********** ²¨ÌØÂÊʹÓö¨Ê±Æ÷2 *****************/
    if(brt == 2)
    {
      S1BRT = 1;        //S1 BRT Use Timer2;
      SetTimer2Baudraye(Baudrate1);
    }


    /*********** ²¨ÌØÂÊʹÓö¨Ê±Æ÷1 *****************/
    else
    {
      TR1 = 0;
      S1BRT = 0;                //S1 BRT Use Timer1;
      T1_CT = 0;                //Timer1 set As Timer
      T1x12 = 1;                //Timer1 set as 1T mode
      TMOD &= ~0x30;//Timer1_16bitAutoReload;
      TH1 = (u8)(Baudrate1 / 256);
      TL1 = (u8)(Baudrate1 % 256);
      ET1 = 0;    //½ûÖ¹ÖжÏ
      TR1 = 1;
    }
    /*************************************************/


    SCON = (SCON & 0x3f) | 0x40;    //UART1ģʽ, 0x00: ͬ²½ÒÆÎ»Êä³ö, 0x40: 8λÊý¾Ý,¿É±ä²¨ÌØÂÊ, 0x80: 9λÊý¾Ý,¹Ì¶¨²¨ÌØÂÊ, 0xc0: 9λÊý¾Ý,¿É±ä²¨ÌØÂÊ
//PS= 1;    //¸ßÓÅÏȼ¶ÖжÏ
    ES= 1;    //ÔÊÐíÖжÏ
    REN = 1;    //ÔÊÐí½ÓÊÕ
    P_SW1 &= 0x3f;
//P_SW1 |= 0x00;      //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7, 0xC0: P4.3 P4.4


    B_TX1_Busy = 0;
    TX1_Cnt = 0;
    RX1_Cnt = 0;
}




//========================================================================
// º¯Êý: void UART1_int (void) interrupt UART1_VECTOR
// ÃèÊö: UART1ÖжϺ¯Êý¡£
// ²ÎÊý: nine.
// ·µ»Ø: none.
// °æ±¾: VER1.0
// ÈÕÆÚ: 2014-11-28
// ±¸×¢:
//========================================================================
void UART1_int (void) interrupt 4
{
    if(RI)
    {
      RI = 0;
      RX1_Buffer = SBUF;
      if(++RX1_Cnt >= UART1_BUF_LENGTH)   RX1_Cnt = 0;
    }


    if(TI)
    {
      TI = 0;
      B_TX1_Busy = 0;
    }
}














社区闲人 发表于 2025-10-19 13:47:14

增加:#include "math.h"

fs_man2023 发表于 2025-10-20 10:11:44

社区闲人 发表于 2025-10-19 13:47
增加:#include "math.h"

增加:#include "math.h",也是一样又问题

fs_man2023 发表于 2025-10-20 10:27:08

尝试过,修改变量名称,依然不能解决,


unsigned int QAA1;
unsigned char QBB2;
void main(void)
{
    float Qyyy;          
    unsigned int AABB;       
       
   WTST = 0;
    EAXFR = 1;
    CKCON = 0;
          P0M1 = 0x00;   P0M0 = 0x00;   
    P1M1 = 0x00;   P1M0 =0x00;   
    P2M1 = 0x00;   P2M0 = 0x00;   
    P3M1 = 0x00;   P3M0 = 0x00;   
    P4M1 = 0x00;   P4M0 = 0x00;   
    P5M1 = 0x00;   P5M0 = 0x00;   
    P6M1 = 0x00;   P6M0 = 0x00;   
    P7M1 = 0x00;   P7M0 = 0x00;   
   UART1_config(2);   
    EA = 1;       
       
       Qyyy=0.00000f; // 注意这里,注释掉,QAA1=1000就计算正常
       
       QAA1=1000;//当QAA1=3000计算正确,QAA1=1000计算错误,   QAA1>3000值计算正确,QAA1<1000值计算错误,
       QBB2=32;   

       Qyyy=(float)QAA1*QBB2/180;       
       Qyyy=10*Qyyy;
       AABB=Qyyy;               

       ////正确结果是0x06F1,错误结果是0x07F1
       SBUF=AABB/0x100;//高位
       Delay10ms();
       SBUF=AABB%0x100;//低位
       
    while (1)
    {
      if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy))   //收到数据, 发送空闲
      {
            SBUF = RX1_Buffer;
            B_TX1_Busy = 1;
            if(++TX1_Cnt >= UART1_BUF_LENGTH)   TX1_Cnt = 0;
      }
    }
}


我把STC32G8K64浮点计算错误,源程序贴上来,那个STC大神能指点一下,或者用你们的编译一下,发hex上来,我测试一下
页: [1]
查看完整版本: STC32G8K64,浮点计算,两个不同单片机计算结果不一样,那个好心STC大神来指导以下