请教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是怎么回事儿? 那个Hz是long型的。 波特率和晶振没得问题吧 SendData怎么写的? /*----------------------------
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:59
可能是程序结构有问题,我又重新用以前好用的程序改了一个,好了。谢谢各位回复。 ...
据说keil用大端模式模拟16/32位数据。。所以直接赋值赋的是前面两个字节 本帖最后由 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这种复杂计算,结果怎么和用计算器算出来的结果不一样? 哪位老师能给指点一下,复杂计算
SIN_TAB=-0.978147601;
Hz = (unsigned long)((0.5*(300/60)*8*200)*SIN_TAB); 有符号强制转成无符号,数据自然就不对了 Tliang 发表于 2018-1-16 09:29
有符号强制转成无符号,数据自然就不对了
那应该把最高位与‘0‘,去掉符号位? SIN_TAB=-0.978147601;
Hz = (unsigned long)((0.5*(300/60)*8*200)*SIN_TAB+4000);
这样就没有符号问题了,肯定是正数 M1_timer = Hz
这里其实就溢出了吧?对不齐的 我把
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里面的数值就不对了? uint16M1_timer[]; 可能是没有定义数组长度。改成uint16M1_timer;试下 查查接收程序 感谢各位,我发现问题了,其实数组里面的计算结果是正确的,电脑计算用的Excel算的,有些数用INT()取整了,后来才发现,我把Excel里的INT()去了,计算结果就和单片机串口发回来的数值对上了,再次感谢各位,谢谢!
unsigned long Hz;
unsigned int M1_timer[];
Hz = 0.5*(Speed/60)*Subdivide*200*SIN_TAB;
M1_timer= Hz;
页:
[1]