找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4729|回复: 8
收起左侧

51单片机C语言的赋值问题,sbit要用中间变量而整个io口又可以省掉?

[复制链接]
ID:793261 发表于 2020-6-29 22:08 | 显示全部楼层 |阅读模式
请教各位大佬,C语言赋值一般是从右边到左边,等号的右边是一个值,左边是变量,如 sbit a = P0^0 ;a = 1;第一句意思是把IO口P0的第一个口赋值给a,第二句是把  1再次赋值给a ,那按照C语言的理解 ,a 最终会是1(前面第一次赋值应该从内存中清掉了才对),那怎么会控制P0^0了呢?还有如 b = 0xff;P0 = b ;如果我直接写P0=0xff 这个好像也是可以的把,那问题就来了,用sbit给IO口赋值的的时候不能省掉中间变量,那为什么给整个IO口赋值的时候又省去中间变量呢?劳烦解惑!谢谢
回复

使用道具 举报

ID:784974 发表于 2020-6-30 08:28 | 显示全部楼层
sbit不是你理解的赋值吧,通俗的说是把a和P0^0等价起来,就是给P0^0另外起了个名字,a=1;语句才能算得上是赋值,也就是给P0^0赋值。
sbit和IO口后面这个问题,你可以看看reg51.h文件里面有没有包含了P0和P0^0。
希望有所帮助,如有错误也请指正,谢谢
回复

使用道具 举报

ID:332444 发表于 2020-6-30 08:33 | 显示全部楼层
我也想知道哈,位定义可以独立操作IO口其中一个,利于单独操作,比如对外设的通信操作,数据线和时钟线,整体操作则是操作8个,当需要单独操作时就用位定义,能整体操作时则不需要一一定位,我也只知道这样了。
回复

使用道具 举报

ID:65956 发表于 2020-6-30 08:40 | 显示全部楼层
一看这样的问题就知道是个初学者,我也学C才两年,我的理解是当你在程序前用这个sbit a = P0^0 ;定义时,这时只是定义P0寄存器的bit.0为一个IO口标志位,当你进行a = 1;操作时,即把P0.0寄存器的bit.0置1,也是只是把那个IO口置高电平,以此类推,后面的操作建议结合硬件去试验,这样能加快学习应用;
回复

使用道具 举报

ID:644427 发表于 2020-6-30 08:43 | 显示全部楼层
sbit是C51扩展的变量类型,是定义特殊功能寄存器的位变量。典型应用是:sbit P0_1=P0^1;//即定义P0_1为P0口的第2位,以便进行位操作。
在C语言里,如果直接写P1.1,C编译器并不能识别,而且P1.1也不是一个合法的C语言变量名,所以得给它另起一个名字,这里起的名为P1_1,可是P1_1是不是就是P1.1呢?你这么认为,C编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil C的关键字sbit来定义,sbit的用法有三种:
第一种方法:sbit 位变量名=地址值
第二种方法:sbit 位变量名=SFR名称^变量位地址值
第三种方法:sbit 位变量名=SFR地址值^变量位地址值
用sbit P1_1=P1^1;就是定义用符号P1_1来表示P1.1引脚,如果你愿意也可以起P11一类的名字,只要下面程序中也随之更改就行了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:466730 发表于 2020-6-30 09:08 | 显示全部楼层
sbit有点像宏定义一样,只是针对位而已,绑定了一个端口
回复

使用道具 举报

ID:213173 发表于 2020-6-30 09:28 | 显示全部楼层
C语言中没有sbit关键字,这是keil c51编译器里面的关键字。 sbit a = P0^0 ;是对端口位寄存器用户另命名的方式。这里的a不是变量,是P0.0寄存器的别名。
回复

使用道具 举报

ID:452950 发表于 2020-6-30 10:28 | 显示全部楼层
sbit a = P0^0 ;不是赋值的意思,是定义a与P0^0等价。
回复

使用道具 举报

ID:793261 发表于 2020-6-30 10:32 | 显示全部楼层
嘿黑潶嗨 发表于 2020-6-30 08:28
sbit不是你理解的赋值吧,通俗的说是把a和P0^0等价起来,就是给P0^0另外起了个名字,a=1;语句才能算得上是 ...

谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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