bg4mna 发表于 2018-1-15 20:22:23

请教c51赋值问题,long赋值给int数组后的奇怪现象

      uint16M1_timer[];

        Hz = 0xf1f2abcd;
        M1_timer = Hz;

        for(l=0;l<168;l++)
        {
                j = M1_timer;
                k = M1_timer>>8;
                SendData(k);
                SendData(j);
        }
结果串口传出来的数据如下:
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F1 F2 AB CD 00 CD 00 0D 00 00 00 00 00 3C 03 D4 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 92 04 EC F5 28 00 AC 08 48 D3 8F 59 5D 85 20 1C 80 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F1 F2 AB CD 00 CD 00 8D 00 00 00 00 00 3C 03 D4 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

请教我问题如下:
1、Hz = 0xf1f2abcd; F1F2怎么会赋给数组了?
2、串口输出数据中F1 F2 AB CD 前面的那些0000000是怎么回事儿?

bg4mna 发表于 2018-1-15 20:32:17

那个Hz是long型的。

WM_CH 发表于 2018-1-15 20:40:42

波特率和晶振没得问题吧

javenreal 发表于 2018-1-15 20:40:43

SendData怎么写的?

bg4mna 发表于 2018-1-15 21:15:44

/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4 using 1
{
    if (RI)
    {
      RI = 0;               //清除RI位
      P0 = SBUF;            //P0显示串口数据
      P22 = RB8;            //P2.2显示校验位
    }
    if (TI)
    {
      TI = 0;               //清除TI位
      busy = 0;               //清忙标志
    }
}

/*----------------------------
发送串口数据
----------------------------*/
void SendData(uchar dat)
{

        SBUF=dat;
        while(TI==0);
        TI=0;

//    while (busy);               //等待前面的数据发送完成
//    ACC = dat;                  //获取校验位P (PSW.0)
//    if (P)                      //根据P来设置校验位
//    {
//#if (PARITYBIT == ODD_PARITY)
//      TB8 = 0;                //设置校验位为0
//#elif (PARITYBIT == EVEN_PARITY)
//      TB8 = 1;                //设置校验位为1
//#endif
//    }
//    else
//    {
//#if (PARITYBIT == ODD_PARITY)
//      TB8 = 1;                //设置校验位为1
//#elif (PARITYBIT == EVEN_PARITY)
//      TB8 = 0;                //设置校验位为0
//#endif
//    }
//    busy = 1;
//    SBUF = ACC;               //写数据到UART数据寄存器

}

/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{
    while (*s)                  //检测字符串结束标志
    {
      SendData(*s++);         //发送当前字符
    }
}

bg4mna 发表于 2018-1-15 21:16:32

波特率也没有问题,发送我没有用例程里面的,这个发送程序我以前用过很好的

bg4mna 发表于 2018-1-15 21:59:38

可能是程序结构有问题,我又重新用以前好用的程序改了一个,好了。谢谢各位回复。

wye11083 发表于 2018-1-15 22:21:32

bg4mna 发表于 2018-1-15 21:59
可能是程序结构有问题,我又重新用以前好用的程序改了一个,好了。谢谢各位回复。 ...

据说keil用大端模式模拟16/32位数据。。所以直接赋值赋的是前面两个字节

bg4mna 发表于 2018-1-15 22:57:24

本帖最后由 bg4mna 于 2018-1-15 23:00 编辑

多谢指点,本人半路出家的,很多东西没有搞明白,还有问题请教,
float code SIN_TAB={                //        282°开始的168个sin值                               
-0.978147601,-0.974370065,-0.970295726,-0.965925826,-0.961261696,-0.956304756,-0.951056516,-0.945518576,
-0.939692621,-0.933580426,-0.927183855,-0.920504853,-0.913545458,-0.906307787,-0.898794046,-0.891006524,
-0.882947593,-0.874619707,-0.866025404,
};


        Hz = (unsigned long)((0.5*(300/60)*8*200)*SIN_TAB);
        M1_timer = Hz;
        for(l=0;l<168;l++)
        {
                j = M1_timer;
                k = M1_timer>>8;
                SendData(k);
                SendData(j);
        }
像Hz这种复杂计算,结果怎么和用计算器算出来的结果不一样?

bg4mna 发表于 2018-1-16 08:12:22

哪位老师能给指点一下,复杂计算
SIN_TAB=-0.978147601;
Hz = (unsigned long)((0.5*(300/60)*8*200)*SIN_TAB);

Tliang 发表于 2018-1-16 09:29:09

有符号强制转成无符号,数据自然就不对了

bg4mna 发表于 2018-1-16 12:56:39

Tliang 发表于 2018-1-16 09:29
有符号强制转成无符号,数据自然就不对了

那应该把最高位与‘0‘,去掉符号位?

bg4mna 发表于 2018-1-16 12:59:01

SIN_TAB=-0.978147601;
Hz = (unsigned long)((0.5*(300/60)*8*200)*SIN_TAB+4000);
这样就没有符号问题了,肯定是正数

tear604922959 发表于 2018-1-16 21:40:22

M1_timer = Hz
这里其实就溢出了吧?对不齐的

bg4mna 发表于 2018-1-18 21:51:33

我把
SIN_TAB[]里面的数都搞成正值了,
float code SIN_TAB={                //        280°开始的168个sin值                               

0.015192,0.018373,0.021852,0.025630,0.029704,0.034074,0.038738,0.043695,
0.048943,0.054481,0.060307,0.066420,0.072816,0.079495,0.086455,0.093692,
0.101206,0.108993,0.117052,0.125380,0.133975,0.142833,0.151952,0.161329,
0.170962,0.180848,0.190983,0.201364,0.211989,0.222854,0.233956,0.245290,
0.256855,0.268646,0.280660,0.292893,0.305342,0.318002,0.330869,0.343941,
0.357212,};



        Hz = 0.5*(Speed/60)*Subdivide*200*SIN_TAB;
      M1_timer= Hz;
    M1_timer里面的数值是正确的,但是如果再复杂一点儿就不对了

如果是这样Hz = 2980750/(((Speed/60)*Subdivide*200*SIN_TAB)+0.5);
M1_timer里面的数值就不对了?

flash3g 发表于 2018-1-19 00:05:48

uint16M1_timer[]; 可能是没有定义数组长度。改成uint16M1_timer;试下

tangnyzl 发表于 2018-1-19 07:36:36

查查接收程序

bg4mna 发表于 2018-1-20 08:33:55

感谢各位,我发现问题了,其实数组里面的计算结果是正确的,电脑计算用的Excel算的,有些数用INT()取整了,后来才发现,我把Excel里的INT()去了,计算结果就和单片机串口发回来的数值对上了,再次感谢各位,谢谢!
unsigned long Hz;
unsigned int M1_timer[];

Hz = 0.5*(Speed/60)*Subdivide*200*SIN_TAB;
M1_timer= Hz;
页: [1]
查看完整版本: 请教c51赋值问题,long赋值给int数组后的奇怪现象