历史上的今天
今天是:2025年06月04日(星期三)
2020年06月04日 | 如何计算给单片机寄存器赋值
2020-06-04 来源: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,然后利用上面的方法得出结果,就可以操作单片机的寄存器了。
上一篇:探析单片机最小系统振荡电路图原理
史海拾趣
|
许多人参加工作以后,总是感到怀才不遇,不被人重视,觉得有劲无处使,憋闷得慌。其实,关键还在自身,在于自己怎么做,做得怎样。因为你的努力决定了你的价值。 I994年初进微软的唐骏,他本想去市场部,结果却成了微软软件开发部的程序员。那 ...… 查看全部问答> |
|
我写了不用操作系统的程序。把图像信息考到缓冲区后,只能显示一般的图像不知道为什么? 我的屏幕是320*240的 U8 ScreenBitmap[] = { 0X00,0X10,0X40,0X01,0XF0,0X00,0X01,0X1B,…………………………}; #define IMAGE_FRAMEBUFFER_DMA_BASE&nbs ...… 查看全部问答> |
|
MSP430单片机中, 当只用AD4一个端口的时候, 为什么跳不到中断中去? 每次中断标志都是显示 #include static unsigned int ADCResult; //功能函数 void Coulometry() { P6SEL |= BIT4 ; // Only Enable A/D channel A4 ADC12CTL0 &= ~ENC ; & ...… 查看全部问答> |
|
由于公司购买的部分红外设备仅支持原始红外,所以请问 多普大公司的PPC手机现在是否还支持 原始红外 这种通讯方式 多普大客服回复说 仅支持标准红外(就是IrComm) 怕他们说得不对,所以向大家征询一下 是否多普大的PPC手机还 ...… 查看全部问答> |
|
向大家请教 有关判断串口接收数据 以及使用AT COMMAND 控制手机收发短信的问题。 几个问题。 1:我从另外一端利用串口收到2个感应器的开关信息,分别是DOOROPEN & DOORCLOSE, DOORFREE & DOORBLOCK,问题是这些信息都是储存在一个data(从另一端接收到的)里面的,如果我让这个data显示在textbox,就会出现overwrite得问题。所以我 ...… 查看全部问答> |
|
各位大侠好: 我是一个刚参加工作的学生,得到的任务是将一个VC6.0写好的库移植到EVC上面。我使用的方法是将VC的代码粘贴到EVC中,再Bulid找错误,不知道是不是对。 在找错误期间,首先遇到了 error C2664: \'localtime ...… 查看全部问答> |
|
电路如图所示,市电经C5、R7、R8降压、VD7~VDl0整流和VD11稳压后为,电路提供工作电压。当电熨斗水平放置时,水银开关S向下倾斜15o 左右,处于断开状态。这时,IC1-a输出低电平,C1通过R2充电,ICl-c输出低电平,ICl-d也输出低电平,VD3、VD4、IC1 ...… 查看全部问答> |




