本帖最后由 耕在此行 于 2009-12-17 13:29 编辑
12. 17 13:26 修改
如果楼主是炫耀你的指针功底或C功底,完全没有必要。
有人说用了指针就牛,其实我认为不是这样子的。我认为用C,只需要符合“最容易理解”+“最快速算法”就OK了。
没有必要去死抠那些个汇编,我用直接">>8"又怎么 ...
wgj_king 发表于 2009-12-17 12:48
有些编译器就是转不过来的.如KEIL C51
=========================================================
自己产品的程序,难道忽悠我自己? 呵呵.
其实还是做法问题 一个是整体移8位 操作移8*4次 一个是移字节 移2次.
整体移8位 程序看起来简单,
字节移8位,单片机工作起来简单.
能明白蓝色部分的指针应该及格了吧!
这个程序并不高深,但我相信很多人不会这么做,觉得麻烦,直接来一句:
UI_tmp >>= 8;就完事了,
但这么写可能编译成机器码的时候就多了好多字节了.按移位来做,机器周期也会多很多.
/*----------------------------------------------
计算出电压电流有效值
在电压=220V 电流等于5A时 ATT7022B读出值大小约等于330*2^13
330*2^13 约等于 2200*1024
约等于 5000*512
-------------------------------------------------*/
bin16 cal_UI( bin08 EMad_UI, bin08 n)
{
bin32 UI_tmp;
UI_tmp = 0;
EM_Cread( EMad_UI, (bin08*)&UI_tmp+1 );
*((bin08*)&UI_tmp+3) = *((bin08*)&UI_tmp+2);
*((bin08*)&UI_tmp+2) = *((bin08*)&UI_tmp+1);
*((bin08*)&UI_tmp+1) = 0;
UI_tmp >>= n; /* 读出电压值移10位 除1024 n = 2(前已移8位)
读出电流值移9位 除512 n = 1(前已移8位)
因从ATT7022B读出数据放在UI_tmp的高3个字节,
所以需另外多移8位 */
return (bin16)UI_tmp;
} |