找回密码
 立即注册
查看: 100|回复: 3

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-10-20 10:11:44

6

主题

9

回帖

92

积分

注册会员

积分
92
发表于 2025-10-18 09:57:19 | 显示全部楼层 |阅读模式

程序段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¿Ú¶¨Òå    **************/


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


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


u8  RX1_Buffer[UART1_BUF_LENGTH]; //½ÓÊÕ»º³å


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


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[TX1_Cnt];
            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[RX1_Cnt] = SBUF;
        if(++RX1_Cnt >= UART1_BUF_LENGTH)   RX1_Cnt = 0;
    }


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














回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:679
  • 最近打卡:2025-10-30 06:18:29

24

主题

532

回帖

1334

积分

荣誉版主

积分
1334
发表于 2025-10-19 13:47:14 | 显示全部楼层
增加:#include "math.h"
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-10-20 10:11:44

6

主题

9

回帖

92

积分

注册会员

积分
92
发表于 2025-10-20 10:11:44 | 显示全部楼层
社区*** 发表于 2025-10-19 13:47
增加:#include "math.h"

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-10-20 10:11:44

6

主题

9

回帖

92

积分

注册会员

积分
92
发表于 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[TX1_Cnt];
            B_TX1_Busy = 1;
            if(++TX1_Cnt >= UART1_BUF_LENGTH)   TX1_Cnt = 0;
        }
    }
}


我把STC32G8K64浮点计算错误,源程序贴上来,那个STC大神能指点一下,或者用你们的编译一下,发hex上来,我测试一下

STC32G浮点计算错误.zip

48.45 KB, 下载次数: 1

回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-10-30 22:03 , Processed in 0.131702 second(s), 70 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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