数码之家

 找回密码
 立即注册
搜索
查看: 2366|回复: 20

[C51] 问个单片机新手问题

[复制链接]
发表于 2019-5-14 21:42:39 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

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

x
最近改车尾灯,真是杀猪用牛刀,就是为了个呼吸灯,没系统学编程,感觉单片机价格低外围电路也简单,程序几乎都可以下载到,看够了可以再换程序,说多了
想问下大家 比如现在是我用到的stc15w401as 20个引脚的,端口可以用p1.1 p1.2 P1.3 表示,然后还有一种方式是用0xfe ,0x80 或者0x多少 也可以代表端口  我就想问下  这个0x这个是什么意思 ?查询手册没找到,比如我现在p1.5这个端口,怎么知道是0x多少 ,另外stm单片机也是同理吗 谢谢大家指点迷津
发表于 2019-5-14 22:09:43 | 显示全部楼层
本帖最后由 aqxgm 于 2019-5-14 22:10 编辑

0x开头的是16进制哦,0xfe转为2进制就是11111110,也就是只有PX.0是低电平其余为高电平;同理0x80转二进制1000 0000,只有最高位是高电平。楼主可以试试电脑上的计算器

打赏

参与人数 1家元 +6 收起 理由
benli + 6 認真發帖

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-5-14 22:10:47 | 显示全部楼层
在C语言中,0x开头代表后面是十六进制数据,例如0xFF就是十六进制数据FF
回复 支持 反对

使用道具 举报

发表于 2019-5-14 22:12:09 | 显示全部楼层
完全不懂路过
回复 支持 反对

使用道具 举报

发表于 2019-5-14 22:12:44 | 显示全部楼层
Decimal:0d00,0d01,0d02...,0d09,0d10;
Octal:0o00,0001,...,0o07,0o10;
Hex:0x00,0x01,...,0x09,0x0A,...,0x0F,0x10;
Binary:0b00,0b01,0b10.
回复 支持 反对

使用道具 举报

发表于 2019-5-14 22:16:49 | 显示全部楼层
0X是16进制,0B是二进制,0D是十进制,基本用的到就是这三种吧,
回复 支持 反对

使用道具 举报

发表于 2019-5-14 22:21:49 | 显示全部楼层
此外,P1.5属于P1端口,P1寄存器位于SFR区内,该区使用直接寻址访问,地址为0x90可以被8整除所以可以被位寻址指令访问。
位寻址指令使用位地址访问,位地址是将特定的字节地址的每一位映射到八个连续的位地址上。比如对于0xC8是P5的寄存器,第0位位地址是0x90,第一位是0x91,第二位是0x92,依此类推到第7位,这就解释了为什么只有被8整除的寄存器允许位寻址,因为处于8倍数之间的位地址已经被用掉了,其它不能被8整除地址的寄存器就没有相应的位地址可编了!
回复 支持 反对

使用道具 举报

发表于 2019-5-14 22:31:12 | 显示全部楼层
一楼正解,用电脑计算器设置成程序员模式,调到二进制输入八位二进制数,要控制的位置是高电平就输入1,是低电平就输入0,八位全部输入完后调到十六进制就会得出对应的十六进制数。
回复 支持 反对

使用道具 举报

发表于 2019-5-14 22:31:45 | 显示全部楼层
因此,如果使用字操作批量修改某个地址的8位数据,则使用MOV   0x90,#0xFF指令完成,该指令将P0寄存器,也就是0x90地址全部置位。
在ASM中,可以使用P0  EQU  0x90,使得你可以直接写MOV   P0,#0xFF,在C中可以使用sfr P0=0x90,使得你可以写P0=0xFF。
如果使用位操作修改某个位的数据,则可以使用MOV  0x92,C或者MOV  0x90.2,C完成,该指令将P0寄存器的第2位,也就是0x92位地址置为C的状态。
在ASM中,可以使用P0  EQU  0x90,使得你可以直接写MOV  P0.2,C或者,在C中可以使用sbit P02=0x90 ^2,使得你可以写P02=1。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-14 22:37:28 | 显示全部楼层
aqxgm 发表于 2019-5-14 22:09
0x开头的是16进制哦,0xfe转为2进制就是11111110,也就是只有PX.0是低电平其余为高电平;同理0x80转二进制1 ...

也就是说0xfe 代表的是端口的电位 而不是端口的代号是吗  我以为 比如1号引脚是P1.1 0x也是p1.1的意思了
回复 支持 反对

使用道具 举报

发表于 2019-5-14 22:40:30 | 显示全部楼层
首先MCU的端口如P0/P1/P2都是有专门对应的RAM地址的,
例如传统51机P0=0x80H   P1=0x90H  P2=0xA0H  P3=0xB0H,当然还有其它如中断控制器/定时计数器/AD/DA等都有对应的RAM地址。
这个查MCU的资料上有。

上面说到的0x80H就是P0口在RAM上的地址,当用程序对0x80H地址写入255即16进制0xFF时候,
那么P0.1-P0.7的电压就变成分别是低/高/高/高/高/高/高。
因为计算机类都是用高电平表示1,低电平表示0,至于16进制/2进制/10进制怎么转换问度娘吧
回复 支持 反对

使用道具 举报

发表于 2019-5-14 22:41:33 | 显示全部楼层
aqxgm 发表于 2019-5-14 22:09
0x开头的是16进制哦,0xfe转为2进制就是11111110,也就是只有PX.0是低电平其余为高电平;同理0x80转二进制1 ...

错了,0xFF才是11111110
回复 支持 1 反对 0

使用道具 举报

发表于 2019-5-15 08:59:18 | 显示全部楼层
本帖最后由 aqxgm 于 2019-5-15 09:00 编辑
jounge 发表于 2019-5-14 22:37
也就是说0xfe 代表的是端口的电位 而不是端口的代号是吗  我以为 比如1号引脚是P1.1 0x也是p1.1的意思了 ...

可以写为P0=0xFF,把P0口8个引脚全部设为高电平
              P1=0x00,P1口8个引脚全部拉低
回复 支持 反对

使用道具 举报

发表于 2019-5-16 02:11:05 | 显示全部楼层


1个byte是8位二进制,刚好是一端口的8位,所以,通常使用0x00~0xff 十六进制去写端口的状态。
回复 支持 反对

使用道具 举报

发表于 2019-5-19 21:57:33 来自手机浏览器 | 显示全部楼层
一组8个脚分成2个8421,正好一位,全高0xff,8421加起来就是F,谁高就相对那个数就有效,无论读取还置位,比如0x37,00110111,对于引脚就是Px^5,4,2,1,0,几个为高,右往左读
回复 支持 反对

使用道具 举报

发表于 2019-5-19 22:08:34 来自手机浏览器 | 显示全部楼层
jounge 发表于 2019-5-14 22:37
也就是说0xfe 代表的是端口的电位 而不是端口的代号是吗  我以为 比如1号引脚是P1.1 0x也是p1.1的意思了 ...

这个引脚寄存器地址可以去头文件看到,随便写个程序包含头,比如reg52.h什么的,编译后列表就会出现这列表,能打开的,sfr px=0xxx之类的,PX只是给他命名
回复 支持 反对

使用道具 举报

发表于 2019-5-19 23:32:28 来自手机浏览器 | 显示全部楼层
兄弟,玩单片机也得稍微了解一下c语言吧
0x什么什么的,这样写是直接操作寄存器。
sbit L1=P1^0;
L1=0;      是位操作
回复 支持 反对

使用道具 举报

发表于 2019-5-20 10:05:57 | 显示全部楼层
玩单片机的新手的第一天都会有类似问题,慢慢的就好了,11楼的解答真的相当全面了。
回复 支持 反对

使用道具 举报

发表于 2019-5-20 12:41:20 | 显示全部楼层
遇到这种问题,以我的智商是没法回答的。
回复 支持 反对

使用道具 举报

发表于 2019-5-21 13:20:17 | 显示全部楼层
如果没有电子方面的基本知识基础,一般是很难理解的,死记也难记懂
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-20 04:17 , Processed in 0.343201 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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