搜索
bottom↓
回复: 28

sbit引出的困惑

[复制链接]

出0入0汤圆

发表于 2012-8-25 22:01:12 | 显示全部楼层 |阅读模式

给位大侠,我估计我连个菜鸟都算不上,请问这两幅图中的程序运行结果为什么不同啊?
另外sbit的作用和typedefine 有什么区别,8051单片机读取引脚的值可以像a=P0^0的方法来获得吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-8-25 22:11:04 | 显示全部楼层
好像51单片机必须要用sbit定义某一个IO口后才能操作该一个口,不能直接用,要么用整个8个口

出0入0汤圆

发表于 2012-8-25 22:13:47 来自手机 | 显示全部楼层
楼上正解

出0入0汤圆

 楼主| 发表于 2012-8-25 22:16:30 | 显示全部楼层
yjk282 发表于 2012-8-25 22:11
好像51单片机必须要用sbit定义某一个IO口后才能操作该一个口,不能直接用,要么用整个8个口 ...

谢谢您的回答,应该是这个原因

出0入0汤圆

 楼主| 发表于 2012-8-25 22:17:27 | 显示全部楼层
yjk282 发表于 2012-8-25 22:11
好像51单片机必须要用sbit定义某一个IO口后才能操作该一个口,不能直接用,要么用整个8个口 ...

我想再问一个问题,这方面的问题应该看那些书啊

出0入0汤圆

发表于 2012-8-25 22:20:03 | 显示全部楼层
基本上是本教材都会讲到吧。。。

出0入0汤圆

发表于 2012-8-25 22:21:42 | 显示全部楼层
我想问一下,第二个编译不会报错吗?

出0入0汤圆

 楼主| 发表于 2012-8-25 22:24:02 | 显示全部楼层
y574924080 发表于 2012-8-25 22:21
我想问一下,第二个编译不会报错吗?

不报错啊!

出0入0汤圆

发表于 2012-8-25 22:27:39 | 显示全部楼层
diaoxinfeixiang 发表于 2012-8-25 22:24
不报错啊!

我试了一下,直接报错

可以发你的C文件来看看吗?

想不通啊

出0入0汤圆

发表于 2012-8-25 22:38:44 | 显示全部楼层
文件不报错,,有这么神奇

出0入0汤圆

发表于 2012-8-25 23:00:21 | 显示全部楼层
gi 不报错才怪呢,while语句直接挂。。。。。。

出0入0汤圆

 楼主| 发表于 2012-8-25 23:37:58 来自手机 | 显示全部楼层
y574924080 发表于 2012-8-25 22:27:39

我试了一下,直接报错

可以发你的C文件来看看吗?

想不通啊

不好意思啊,明天给你,回宿舍了

出0入0汤圆

 楼主| 发表于 2012-8-25 23:39:08 来自手机 | 显示全部楼层
stevenli 发表于 2012-8-25 22:38:44
文件不报错,,有这么神奇

明天给你源文件看一下,我这没报错反正

出0入4汤圆

发表于 2012-8-25 23:52:12 | 显示全部楼层
不明白右边代码
P0^7后面为什么加个;"分号"
然后再==号
不应该直接写while(P0^7==1);吗?

出0入0汤圆

发表于 2012-8-26 00:14:27 | 显示全部楼层
laujc 发表于 2012-8-25 23:52
不明白右边代码
P0^7后面为什么加个;"分号"
然后再==号

这个的意思我才猜表示P0与0x07异或,然后判断是否为零~~~

出0入4汤圆

发表于 2012-8-26 00:22:44 | 显示全部楼层
y574924080 发表于 2012-8-26 00:14
这个的意思我才猜表示P0与0x07异或,然后判断是否为零~~~

不对,P0^7
是指P0的第7个IO口,是有定义好的.在头文件里.
不是你想当然的异或.
有的头文件里面写成P0.7的.

出0入0汤圆

发表于 2012-8-26 01:06:32 | 显示全部楼层
本帖最后由 y574924080 于 2012-8-26 01:16 编辑
laujc 发表于 2012-8-26 00:22
不对,P0^7
是指P0的第7个IO口,是有定义好的.在头文件里.
不是你想当然的异或.


P0^7 不是只能在sbit定义的时候才可以用的吗?

而且头文件定义的是P0_7(或者是P0.7,这个我不大清楚),而不是P0^7

口说无凭,上一段代码看看,很明显,数据先从P1读到A,然后与0x01异或,然后判断结果是否为零
  1.      3: void main()
  2.      4: {
  3.      5:     
  4.      6:     do{
  5.      7:  
  6.      8:     }while(P1^1 == 1);  
  7.      9:  
  8. C:0x000F    E590     MOV      A,P1(0x90)
  9. C:0x0011    6401     XRL      A,#0x01
  10. C:0x0013    70FA     JNZ      main(C:000F)
  11.     10:     while(1);
  12. C:0x0015    80FE     SJMP     C:0015
复制代码
/**************************/

修改了红字

**************

另外楼主的代码多了一个;应该会报错的~~~~~

出0入0汤圆

发表于 2012-8-26 02:52:29 | 显示全部楼层
P0^7 不是只能在sbit定义的时候才可以用的吗?


why don't you read the f@#$king compiler manual?

specifically, the section titled "bit-addressable objects".

always read the f!@#%$king manual or you will forever be a retard.

出0入0汤圆

发表于 2012-8-26 06:30:29 | 显示全部楼层
millwood0 发表于 2012-8-26 02:52
why don't you read the f@#$king compiler manual?

specifically, the section titled "bit-addressabl ...

又见大师 跪烂

出0入0汤圆

发表于 2012-8-26 08:49:57 | 显示全部楼层
millwood0 发表于 2012-8-26 02:52
why don't you read the f@#$king compiler manual?

specifically, the section titled "bit-addressabl ...

谢谢大师指出,我去看了用户手册,我更正我的说法:

       在声明中,用sbit 声明新的变量可以访问 可位寻址目标 的位,即(可位寻址目标)^常数 表示指定位的位置

出0入0汤圆

 楼主| 发表于 2012-8-26 08:52:44 | 显示全部楼层
millwood0 发表于 2012-8-26 02:52
why don't you read the f@#$king compiler manual?

specifically, the section titled "bit-addressabl ...

thank you so much

出0入0汤圆

发表于 2012-8-26 10:44:13 | 显示全部楼层
帮你顶顶!

出0入0汤圆

发表于 2012-8-26 10:45:16 | 显示全部楼层
yjk282 发表于 2012-8-25 22:20
基本上是本教材都会讲到吧。。。

没有在教材上看到过。。。。。

出0入4汤圆

发表于 2012-8-26 11:56:28 | 显示全部楼层
本帖最后由 laujc 于 2012-8-26 12:49 编辑
y574924080 发表于 2012-8-26 01:06
P0^7 不是只能在sbit定义的时候才可以用的吗?

而且头文件定义的是P0_7(或者是P0.7,这个我不大清楚), ...


我重新测试了一下代码,可能原来我理解的也有问题。
下午上代码。

程序中如果有P1^1 ,编译器应该是理解成异或的。
但可以预先定义,如sbit PORT = P3^1;这样程序中直接使用PORT,编译器会识别出是判断IO电平的。
如果程序中使用P1^1 编译器仍然把它当作异或运算。

看来理解是对的,如下图,左右是有声明sbit PORT = P3^1;
右边没有声明.
注意:== 的优先级大于^的优先级.程序先做的 3== 1 不为真,所以汇编时,直接当判断P1 ^ 0了.


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-8-26 12:34:40 | 显示全部楼层
laujc 发表于 2012-8-26 11:56
我重新测试了一下代码,可能原来我理解的也有问题。
下午上代码。

嗯嗯,看了cx51手册,用在声明,^应该表示指定位

在程序中,只可能是异或

出0入0汤圆

 楼主| 发表于 2012-8-26 13:34:42 | 显示全部楼层
laujc 发表于 2012-8-26 11:56
我重新测试了一下代码,可能原来我理解的也有问题。
下午上代码。

恩,谢谢,学习了

出0入0汤圆

发表于 2012-8-26 16:18:39 | 显示全部楼层
laujc 发表于 2012-8-26 11:56
我重新测试了一下代码,可能原来我理解的也有问题。
下午上代码。

我还真的忽略了优先级的问题

现在才看懂你表达的意思

学习了~~

出0入4汤圆

发表于 2012-8-27 17:02:52 | 显示全部楼层
y574924080 发表于 2012-8-26 16:18
我还真的忽略了优先级的问题

现在才看懂你表达的意思

呵呵,共同进步!

出0入0汤圆

发表于 2012-8-27 17:26:57 | 显示全部楼层
怎么没看到main()函数,While括号里面的";"是什么意思
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 00:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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