找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3777|回复: 13
收起左侧

对单片机的一个IO口赋值1000 0000和0000 0001有区别吗?

  [复制链接]
ID:609281 发表于 2021-2-23 21:12 | 显示全部楼层 |阅读模式
        小弟我在学习51单片机的SDA数据发送时,经常遇到类似于这样的write子函数(从设备先发送高位数据,假设dat = 1001 0111):通过一个八次的
for循环,先把temp = dat>>7右移七位变为0000 0001,接着 P1^0 = temp, 然后dat<<1,循环八次,从而把dat的八位数据读给单片机的IO口,可这就相

当于P1^0 = 0000 0001,把一个十六进制的数0x01 赋给了一个IO口,这样行吗?   

       当write子函数(从设备先发送低位数据,假设dat = 1001 0111),通过一个八次的for循环,先把temp = dat<<7左移七位变为1000 0000,接着

P1^0 = temp, 然后dat>>1,循环八次,从而把dat的八位数据读给单片机的IO口,可这就相当于P1^0 = 1000 0000,那么P1^0 = 1000 0000和P1^0 =

0000 0001有区别吗?


回复

使用道具 举报

ID:390416 发表于 2021-2-23 21:42 | 显示全部楼层
建议你先去看看 单片机的基础部分 学习一下移位操作
回复

使用道具 举报

ID:451718 发表于 2021-2-23 22:32 | 显示全部楼层
你说的应该是两个概念的事情。
1,给IO口赋值,可以直接给端口 P1 = 0xf1,这个效果相当于  P1^7、P1^6、P1^5、P1^4、P1^1输出都为1,P1^3、P1^2、P1^1输出都为0 。 可以理解为并行赋值。这个时候的硬件对象是一个端口。也就是8个引脚。
2,把一个16进制的值,通过一个端点,串行的传输出去。 这就是你举例描述了半天的过程。 有时会是循环左移,有时会是循环右移。接收的时候再去解码编译。这个操作是按位把数据串行的传递出去。这个时候,硬件对象是一个端口的某一位,也就是单片机的某一个引脚。

评分

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

查看全部评分

回复

使用道具 举报

ID:473159 发表于 2021-2-24 08:08 | 显示全部楼层
去了解一下什么叫赋值,什么叫数据传输
回复

使用道具 举报

ID:592807 发表于 2021-2-24 08:24 | 显示全部楼层
C语言里面你对IO口赋值只有只有0和非0.懂吗?
回复

使用道具 举报

ID:844772 发表于 2021-2-24 08:40 | 显示全部楼层
没区别,只有0和非0的区别。 你举的例子是为了取每位的值,而不是你说的区别,如:移位后还要与如temp=(dat>>7)&&0x01左移就与0x80

评分

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

查看全部评分

回复

使用道具 举报

ID:752974 发表于 2021-2-24 08:51 | 显示全部楼层
在单片机中有端口和IO之分,端口是单片机上可以并行输入/输出的口,是八位二进制数据并行操作,一次可以读写八位二进制数,如51的P0,P1,P2,P3等。IO口是端口中的一个位,就是平常说的一根口线,只能位操作。 举例中P1^0 = temp;是不行的,这样是对的: P1^0 =(bit) temp;

评分

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

查看全部评分

回复

使用道具 举报

ID:648281 发表于 2021-2-24 09:04 | 显示全部楼层
10000000,00000001,如果没区别为什么两种写法;
比方,给你1000块钱和给你0001块钱,你说有区别吗
回复

使用道具 举报

ID:883031 发表于 2021-2-24 09:18 | 显示全部楼层
左移1位一个字节数据,相当于把最高位移入了CY,再把该字节付给1个IO,就是把CY的值付给了这个IO
回复

使用道具 举报

ID:213173 发表于 2021-2-24 10:04 | 显示全部楼层
单片机与外设串行通讯中发送/接收1个字节,是由高到低还是由低到高逐位传输不是随意的。它是由此外设的制造商确定的。用户只能根据所选用的外设规制编写程序才能完成单片机与此外设的正确通讯。不论是由高到低还是由低到高逐位传输,程序可以有多种写法,但功能是相同的。楼主举例中的P1.0只能赋值0或1,不可能赋值一个字节,一个字节的8位数据是分8次对P1.0赋值传输的。

评分

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

查看全部评分

回复

使用道具 举报

ID:419968 发表于 2021-2-24 19:19 | 显示全部楼层
P1^0 是位操作,只能是0 或 1
回复

使用道具 举报

ID:609281 发表于 2021-2-24 22:33 | 显示全部楼层
munuc_w 发表于 2021-2-24 08:51
在单片机中有端口和IO之分,端口是单片机上可以并行输入/输出的口,是八位二进制数据并行操作,一次可以读 ...

讲得十分精辟,谢谢您的答复!
回复

使用道具 举报

ID:517951 发表于 2021-2-25 08:39 | 显示全部楼层
对单片机的一个IO口赋值1000 0000和0000 0001有区别吗?以51单片机为例, 串行输出时候就是有很大不同, 前面一个是第一个clk对应数据为1,后面对应clk一直为零;  后面一个是前面的那些clk对应数据为零,直至最后一个clk对应数据为1.
回复

使用道具 举报

ID:824490 发表于 2021-2-27 10:50 | 显示全部楼层
有什么区别呢?
如果是并行输出,就是你要进男洗手间和女洗手间的问题;
如果是串行输出,就是你先刷牙后吃饭和先吃饭再刷牙的问题了。

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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