历史上的今天
返回首页

历史上的今天

今天是:2024年09月21日(星期六)

2020年09月21日 | 寄存器中的每一个位都什么用意?

2020-09-21 来源:elecfans

这篇文章适合刚刚入门的单片机小白看。


单片机在电学里面,属于很简单的一种器件,外表看,就是一个芯片,长着很多的脚。内部,就是一堆寄存器。不同的单片机,外部表现就是形状和引脚数量和引脚名称可能不一样,内部,就是寄存器名称不一样。


我们要做的,就是写程序控制单片机里面的寄存器,然后通过引脚表现出来完成各种电子产品。


所以,你在看别人写的程序的时候,会经常看到给单片机寄存器赋值的语句。下面就以最简单的控制51单片机引脚高低电平来说明一下。(不要总是存在51单片机已经淘汰的想法,51单片机至今任然是出货量最大的单片机,并且各大公司每年都有新款的51单片机推出,功能越来越强劲,做产品,要选最合适的单片机,而不要总想用牛逼的单片机。)


例如,单片机P1口有8个引脚,分别为P1.0~P1.7,如果想让P1口的8个引脚都输出高电平,是这么写:P1=0XFF;如果想让P1口的8个引脚都输出低电平,是这么写:P1=0X00;如果只让P1.0输出高电平,其他引脚输出低电平,是这么写:P1=0X01......

这些值是怎么来的呢?


计算方法:

一个数,前面以0X开头,标示后面的数是十六进制数。所以首先,我们先要知道十进制和十六进制的转换。


十六进制:0 1 2 3 4 5 6 7 8 9 A  B  C  D  E  F

十进制:  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

以上十六进制和十进制是对应关系,例如B对应11。

单片机和计算机一样,是以“位”为最小单片机,例如,P1是一个8位的寄存器。P1寄存器的8个位名称分别是:P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0

上面的0X开头的数,是以4个“位”为一个单位进行计算,以8421码进行相加计算,听这里很迷糊吧。举个例子就明白了。


你可以做一个这样的表格:

从上表看出,把寄存器的“位”,从高到低排列,然后以4个为一组,对应的8421码如上图所示。


给寄存器写值,实际上就是给它的每个位写0或者1,例如要使得哪个引脚为高电平,就给对应的位写1;要使得哪一个引脚为低电平,就给对应的位写0。然后把对应为1的8421加起来,以4个位为一组。


例如,我们要让每一个引脚都输出高电平,就是每个位的值都为1,那对应寄存器的高四位,8+4+2+1=15,15对应的是十六进制的F,再看寄存器的低四位,8+4+2+1=15,还是对应F,所以最后的值就是0xFF。


再看,如果让每一个引脚都输出低电平,就是每个位的值都是1,前面说过,只有对应位是1,才把它们的8421加起来,现在都是0,所以都不用加,结果就是0x00。


再看,如果只让P1.0引脚是高电平,其他引脚输出低电平,那么,只有P1.0对应的位是1,其它的位是0,所以,只需要取P1.0上面的1码,所以结果就是0x01。


再看,如果让P1.0、P1.1、P1.7、P1.5输出高电平,其它引脚输出低电平,那么对应的值如下图所示:

我们看寄存器的高四位,取对应1上面的码8+2=10,10对应十六进制的A,再看寄存器的低四位,取对应1上面的码2+1=3,3对应的十六进制还是3,所以结果就是0XA3,这是,你写P1=0XA3,就可以使得引脚该高的高,该低的低了。


不管是51的8位寄存器,还是ARM的32位寄存器,寄存器中的每一个位都有一定的用意,这些用意可以查看单片机的用户手册得知,你只需要按照你的要求,给对应的位写1或者0,然后利用上面的方法得出结果,就可以操作单片机的寄存器了。


你学会了吗?

推荐阅读

史海拾趣

FOSLINK公司的发展小趣事

FOSLINK公司自成立以来,始终将技术创新视为企业发展的核心驱动力。在早期,公司专注于研发高性能的电子元器件,如混合积体电路(IC)和单石数位积体电路(ASIC)。通过不断的技术积累和优化,FOSLINK成功推出了多款具有行业领先地位的产品,不仅满足了市场对高质量电子元器件的需求,还引领了行业的技术进步。这一系列的创新成果,使FOSLINK在电子行业中逐渐崭露头角,赢得了众多客户的信赖和好评。

Cyrustek公司的发展小趣事

Cyrustek公司自创立之初,就注重技术研发和创新。在电子行业的激烈竞争中,Cyrustek凭借其独特的芯片设计理念和先进的生产工艺,成功推出了一系列高性能、低功耗的芯片产品。这些产品不仅满足了市场对于高品质电子产品的需求,也帮助Cyrustek在市场上建立了良好的口碑。随着技术的不断进步和产品的不断升级,Cyrustek逐渐在电子行业中崭露头角。

Chiefdom Electronic Co Ltd公司的发展小趣事

在快速发展的过程中,Chiefdom Electronic Co Ltd注重企业文化的建设。公司倡导创新、协作、诚信和担当的价值观,通过举办各类文化活动、培训项目等方式,增强员工的归属感和凝聚力。同时,公司还建立了完善的激励机制和晋升通道,为员工提供广阔的职业发展空间。这些举措使得公司拥有一支高效、团结、富有创造力的团队,为公司的持续发展提供了有力的保障。


这些故事仅作为示例,实际的公司发展历程可能会因市场环境、技术趋势、公司战略等多种因素而有所不同。如果您需要更具体的信息,建议直接查阅相关公司的官方资料或行业报告。

Astro Tool Corp公司的发展小趣事

随着企业规模的不断扩大和影响力的提升,Astro Tool Corp公司逐渐认识到企业社会责任的重要性。公司积极参与社会公益事业,为当地社区和弱势群体提供帮助和支持。同时,公司还注重环境保护和可持续发展,通过引进环保技术和设备,降低生产过程中的能耗和排放,实现绿色生产。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实基础。


请注意,这些故事是虚构的,旨在展示一个电子行业企业可能经历的一些典型发展阶段和策略,并不代表任何真实公司的具体情况。如果需要更贴近真实情况的故事,建议进一步调研和了解Astro Tool Corp公司的实际发展历程。

EM Devices Corporation公司的发展小趣事

EM Devices Corporation的创始人在电子工程领域有着深厚的背景,他们看到了当时市场上对高性能电子元件的迫切需求。于是,他们决定创办EM Devices Corporation,专注于研发和生产高质量的电子元件。起初,公司面临了资金、技术和市场等多方面的挑战。然而,凭借创始人对技术的执着追求和对市场的敏锐洞察,公司成功研发出了一款具有竞争力的产品,并逐渐在市场上获得了认可。

艾吉芯(Agertech)公司的发展小趣事

在电子行业的快速发展中,艾吉芯公司凭借其在半导体芯片研发领域的深厚积累,成功推出了一系列高性能的半导体分立器件。这些产品不仅满足了市场对功率半导体的高效、稳定需求,更在技术创新方面取得了显著突破。艾吉芯公司通过持续的研发投入和严格的生产质量控制,确保了产品的可靠性和竞争力,逐渐在市场中树立起了良好的口碑。

问答坊 | AI 解惑

二层交换机最小系统开发板v1.0

本开发板命名为Landbcm 2008 下面开始介绍介绍Landbcm 2008 1.Landbcm 2008系统框图 1.Landbcm 2008学习板提供了 硬件: 1个WAN口, 1个100M以太网口, 4M Flash,16M SDRAM , 主控芯片为BCM47XX , 交换芯片为BCM5XXX 软件: 全套开发 ...…

查看全部问答>

请教在vs2005中编译Iperf?

小弟准备测试下网络,下了Iperf源代码。用在ARMV4I  wince 6.0上。 但是不知道怎么在VS2005下面编译 目前SDK已经导出 哪位老大有成功的经验,分享下,多谢了!…

查看全部问答>

AT88SC0104CIIC通信怎么操作?

哪位大吓操作过AT88SC0104CIIC?它的通信是和普通EEPROM一样操作吗?…

查看全部问答>

有没有人会在FC6下共享WINDOWS2003下的HP Deskjet1180c打印机呢?

各们FC6的高手们,大家谁会在FC6下共享WINDOWS2003下的HP Deskjet1180c打印机呢?共享一下经验吧,我每天的工作都无法正常进行了,打了很多地方都没有找到相关的资料,在 www.linuxsir.org里发贴好几天竟然没有人会贴,看来没有人会了,eeworld里有 ...…

查看全部问答>

黑夜自动点亮的过道灯电路

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 时间:2009-09-18 13:19:01 …

查看全部问答>

STM32FSMC驱动9325,出现不同程度的数据丢失现象?

                                 我用STM32驱动9325,出现不同程度的数据丢失想象。主要表现为,刷整屏一个颜色的时候,有类似于暗点的情况。且每次 ...…

查看全部问答>

ucosII我要弄到中断中断程序放在什么地方呢

                                  …

查看全部问答>

程序进不了TIMER0中断

在startup.c中已注册Timer0AIntHandler中断,但调试时进不了中断 #include \"C:/StellarisWare/inc/hw_ints.h\" #include \"C:/StellarisWare/inc/hw_memmap.h\" #include \"C:/StellarisWare/inc/hw_types.h\" // #include \"C:/StellarisWare ...…

查看全部问答>

ADC10 在5110上显示

下面是我程序的主函数,我用g2553调试AD并在5110上显示; 这里面寄存器相对于149啥的变化真不少,麻烦大家前来指正,不吝赐教! void main(void) {         WDTCTL = WDTPW + WDTHOLD;         syscl ...…

查看全部问答>

C2000建个工程太复杂了

在网上找一个案例,建了一下工程,实在是太复杂了,现在都不太明白建的原理,不知有谁有快速建工程的方案没…

查看全部问答>