您现在所在的是:

单片机论坛

回帖:8个,阅读:926 [上一页] [1] [下一页]
* 帖子主题:

ad转换

948
dshplc
文章数:66
年度积分:50
历史总积分:948
注册时间:2010/5/24
发站内信
发表于:2011/5/22 22:11:23
#0楼
附件


这几条语句看不懂  请高手指点翻译一下
就在&这块看不懂  他俩与完了是一个什么条件执行sda=0或1
3641
yueliang150
文章数:389
年度积分:50
历史总积分:3641
注册时间:2003/4/24
发站内信
发表于:2011/5/23 10:13:41
#1楼
&0X80:D6-D0屏蔽,取D7;
如果 D7=1;SDA=1;
否则 D7=0;SDA=0;

单片机、ARM产品开发设计;
小设备、夹具、治具控制器设计开发;数码管、点阵LED电子看板开发;
948
dshplc
文章数:66
年度积分:50
历史总积分:948
注册时间:2010/5/24
发站内信
发表于:2011/5/23 18:48:10
#2楼
哦 原来如此,谢谢啦
948
dshplc
文章数:66
年度积分:50
历史总积分:948
注册时间:2010/5/24
发站内信
发表于:2011/5/23 21:36:20
#3楼
对了(c《bitcnt)也解释一下吧   我怕我理解错了,呵呵麻烦了
还有&&应用的格式我了解
这个&应用的格式我就不了解了,能不能也给我讲一下,非常感谢
948
dshplc
文章数:66
年度积分:50
历史总积分:948
注册时间:2010/5/24
发站内信
发表于:2011/5/23 21:50:30
#4楼
bitcnt循环8次的时候将8传送给c,c在跟0x80&,当c中的date与0x80比较一致也就是0x80定义的d7为1时就执行sda=1   是不是这样啊
3641
yueliang150
文章数:389
年度积分:50
历史总积分:3641
注册时间:2003/4/24
发站内信
发表于:2011/5/25 10:34:26
#5楼
&:运算符号:参与的数据会改变
&&:逻辑符号:只判断,不改变数据;
<<为左移动;
你可在编译软件理软仿真看看数据;
单片机、ARM产品开发设计;
小设备、夹具、治具控制器设计开发;数码管、点阵LED电子看板开发;
948
dshplc
文章数:66
年度积分:50
历史总积分:948
注册时间:2010/5/24
发站内信
发表于:2011/5/25 18:16:00
#6楼
哦  只明白一点
758
hDragon
文章数:19
年度积分:50
历史总积分:758
注册时间:2011/3/30
发站内信
发表于:2011/6/14 19:34:03
#7楼
你的问题答案
&和&&在C语言中都是双目运算符,即在使用它们时,在运算符的两侧都各要有一个操作数,如:a&b或c&&d。
但&是二进制运算符,它在执行时,将左右两侧的操作数按二进制数逐位地进行运算,比如:    a=0x57; b=0xac; c=a&b;
a:   0 1 0 1   0 1 1 1
b:   1 0 1 0   1 1 0 0
  &
----------------------------------
c:   0 0 0 0   0 1 0 0
所以执行后,c的值为0x04。
&&是逻辑运算符,它在执行时,将左右两侧的操作数都当作逻辑值,即真或假对待,然后按照逻辑与(两者同时为真,结果才为真)的规则,得出运算结果,结果也是逻辑值。这里有个事实要记住,C语言在判断一个量是真还是假时的依据是:只有0是假,一切非0值都是真;而C语言在表示一个值的真假时,用1(即0x01)表示真,用0(即0x00)表示假。
还以上例为例,a=0x57; b=0xac; c=a&b;
a:   0 1 0 1   0 1 1 1      C语言翻译为----->     0000 0001 (由非零为真翻译来的)
b:   1 0 1 0   1 1 0 0      C语言翻译为----->     0000 0001 (由非零为真翻译来的)
 &&                                                       &&
----------------------------------                             -------------------------
c:   0 0 0 0   0 1 0 0                                      0000 0001 (C语言给出的结果,真)
上例按&&运算后,c的值为0x01,表示真。

void SendByte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++)
 {
  if((c<<BitCnt)&0x80)  SDA=1;
  else SDA=0;
 }
}
这个函数的功能是:将调用时的单字节实参值,通过SDA线发送出去,发送时,高位(左侧的位)先发送。以如下调用为例:SendByte(0xa5); 函数执行时的过程如下:
1、刚进入SendByte()函数时,BitCnt取值为0,即对c不进行左移操作,用c的原值与0x80进行与操作,因为0xa5和0x80的最高位都是1,与的结果最高位也是1,为非0,为真,执行SDA=1;将数字1发送到SDA线上,此值正好与0xa5的最高位相同,符合实际。
2、当第一轮发送完1后,由于头一轮循环的最后执行了BitCnt++,BitCnt取值为1,再次执行c<<BitCnt,将c的值整体左移一位,即将次高位移到最高位,最高位移入单片机的进位位Cy,右侧移空的位填上0,移位的结果为0x4a,将这个结果再与0x80相与,因为0x80只有最高位为1,所以只有0x4a中的最高位可以保持原值,而0x4a中的其余位因为与0x80中的0相与,结果一定为0,所以(c<<BitCnt)&0x80结果是真是假,完全由0x4a的最高位决定,而0x4a的最高位是原数0xa5的次高位,实际执行的是SDA=0;将0(原数次高位)发送出去,
按照2的执行过程,直到将0xa5的最后一位发送出去。
948
dshplc
文章数:66
年度积分:50
历史总积分:948
注册时间:2010/5/24
发站内信
发表于:2011/6/28 20:27:21
#8楼
那第一次循环一位第二次循环两位第三次循环三位。。。。。
那这样的话不用八次就循环完了
还是我没看懂啊  呵呵

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

62.4004