专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
不懂就要问:为什么P1^0就代表P1口的0引脚?
2020-02-02 09:22
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
6937
13
13
前几天一学弟问我,怎么点亮一个LED灯
答曰:P1^0=0;
又问:P1^0为什么代表第0引脚?
答曰:@@#¥%…………&,最后勉强的回答:(1)'^'是异或的符号,但是在这里,它是表示位偏移的意思,P1^0就是P10的意思
哎,自己的基础不好,不知道误导学弟没?当初学习51的时候没有深究。各位有没有更好的解释?
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
jiaohaitao
2020-02-03 14:39
本帖最后由 jiaohaitao 于 2012-11-15 19:43 编辑
嗯,非常感谢以上大佬的精彩讲解,小辈收获不少。确实,如果一些基本的东西没有解决的话,到后面你会非常的痛苦。就像盖大楼,地基没打好,,,,,呵呵
下面我结合下各位的讲解和我的理解写出下面一些东东,给那些像我一样的疑惑者一些引导。
(1) lcofjp 和renpeng009说的对,在main之前操作寄存器是不合法的,我的理解是main函数之前是有一些堆栈什么指针类的硬件配置,为我们的用户函数main配置环境,不可以随便更改处理器中一些内部的寄存器,而renpeng009所说的赋值语句不能放在函数外面是欠妥的。你可以试验下,在main之前定义一个变量,然后再另写个语句赋值是可以的,如:itn i;i=0;。编译器并没有报错。所以说:在main函数之前我们是不能对单片机内部的一重要些寄存器随便操作的,而可以对一些无关紧要的内存区操作,不知这样说对不对?
(2)关于51单片机的位操作,确实你百度下‘sbit’这个c51扩展类型,你就会明白了。下面是百科上一句话:
sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbit xxx = REGE^6这样的定义,这个sbit量就确定地址了。sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。
也就是说:sbit是对可以位寻址的一些寄存器的操作。这个问题的本身P1^0为什么会代表P1.0这应该是编译器默认吧。我想编译器为了区分和异或的区别,所以,我们在位操作的时候就要用到sbit这个扩展类型了。可以说有位操作就会有sbit。不知这样理解行不行。。。
(3)问题扩展:sbit可不可以定义一些变量,从而使这些变量也具有位操作的能力?答案是肯定的,这里需要 bdata这个关键字
unsigned char bdata Data;
那么这个Data就会被映射到单片机内部20H-2FH,地址不会像其他的变量一样地址随机产生。这个Data就可以位寻址操作了,因为单片机内部20-2f这16个Bytes是可以位寻址的。所以我们只能最多定义16个可以操作的Bytes
上面是根据各位大侠的回复和自己的理解写的,对错?我也不敢确定,仅供参考。如果您有更好的见解,请在下面写出来,可以帮助更多的疑惑者
加载中...
查看其它13个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
嗯,非常感谢以上大佬的精彩讲解,小辈收获不少。确实,如果一些基本的东西没有解决的话,到后面你会非常的痛苦。就像盖大楼,地基没打好,,,,,呵呵
下面我结合下各位的讲解和我的理解写出下面一些东东,给那些像我一样的疑惑者一些引导。
(1) lcofjp 和renpeng009说的对,在main之前操作寄存器是不合法的,我的理解是main函数之前是有一些堆栈什么指针类的硬件配置,为我们的用户函数main配置环境,不可以随便更改处理器中一些内部的寄存器,而renpeng009所说的赋值语句不能放在函数外面是欠妥的。你可以试验下,在main之前定义一个变量,然后再另写个语句赋值是可以的,如:itn i;i=0;。编译器并没有报错。所以说:在main函数之前我们是不能对单片机内部的一重要些寄存器随便操作的,而可以对一些无关紧要的内存区操作,不知这样说对不对?
(2)关于51单片机的位操作,确实你百度下‘sbit’这个c51扩展类型,你就会明白了。下面是百科上一句话:
sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbit xxx = REGE^6这样的定义,这个sbit量就确定地址了。sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。
也就是说:sbit是对可以位寻址的一些寄存器的操作。这个问题的本身P1^0为什么会代表P1.0这应该是编译器默认吧。我想编译器为了区分和异或的区别,所以,我们在位操作的时候就要用到sbit这个扩展类型了。可以说有位操作就会有sbit。不知这样理解行不行。。。
(3)问题扩展:sbit可不可以定义一些变量,从而使这些变量也具有位操作的能力?答案是肯定的,这里需要 bdata这个关键字
unsigned char bdata Data;
那么这个Data就会被映射到单片机内部20H-2FH,地址不会像其他的变量一样地址随机产生。这个Data就可以位寻址操作了,因为单片机内部20-2f这16个Bytes是可以位寻址的。所以我们只能最多定义16个可以操作的Bytes
上面是根据各位大侠的回复和自己的理解写的,对错?我也不敢确定,仅供参考。如果您有更好的见解,请在下面写出来,可以帮助更多的疑惑者
一周热门 更多>