51单片机的寄存器设置
51单片机位操作指令
51单片机位操作指令摘要:1.51 单片机简介2.位操作指令概述3.常见位操作指令a.位清零指令b.位置位指令c.位取反指令d.位测试指令4.位操作指令应用实例a.简单按键控制b.计数器应用c.矩阵键盘扫描5.位操作指令在51 单片机中的重要性正文:51 单片机是一种广泛应用的8 位微控制器,其功能强大且成本低廉,被广泛应用于嵌入式系统和自动控制领域。
在51 单片机的指令系统中,位操作指令占据着重要地位,它们可以实现对单片机内部寄存器和外设状态的快速操作。
位操作指令主要针对单个二进制位进行操作,包括位清零指令、位置位指令、位取反指令和位测试指令等。
这些指令可以实现对二进制数据的设置、检测和修改等功能,为实际应用提供了极大的便利。
位清零指令(如CLR)用于将指定寄存器的某一位设置为0。
例如,我们可以使用CLR P1.0 来将P1 寄存器的第0 位清零。
位置位指令(如SETB)则用于将指定寄存器的某一位设置为1。
例如,我们可以使用SETB P1.0 来将P1 寄存器的第0 位设置为1。
位取反指令(如CPL)用于将指定寄存器的某一位取反,即0 变1,1 变0。
例如,我们可以使用CPL P1.0 来将P1 寄存器的第0 位取反。
位测试指令(如JC、JNC、JB、JNB 等)用于根据指定寄存器的某一位的值来决定程序的执行流程。
例如,我们可以使用JC P1.0 来检查P1 寄存器的第0 位是否为1,若为1 则跳转到指定地址执行程序。
位操作指令在实际应用中有着广泛的应用。
例如,我们可以使用位清零指令和位置位指令来实现简单按键的控制,根据按键的状态来控制LED 灯的点亮和熄灭。
又如,我们可以使用位操作指令来实现计数器功能,通过位清零指令和位测试指令来计数和判断计数器是否达到预定值。
此外,位操作指令还可以应用于矩阵键盘扫描,通过位操作指令来检测并识别按键的按下。
总之,位操作指令在51 单片机中具有举足轻重的地位,掌握这些指令的使用方法对于进行51 单片机编程至关重要。
51单片机寄存器详解
51单片机寄存器详解符号地址功能介绍B F0H B寄存器ACC E0H 累加器PSW D0H 程序状态字IP B8H 中断优先级控制寄存器P3 B0H P3口锁存器IE A8H 中断允许控制寄存器P2 A0H P2口锁存器SBUF 99H 串行口锁存器SCON 98H 串行口控制寄存器P1 90H P1口锁存器TH1 8DH 定时器/计数器1(高8位)TH0 8CH 定时器/计数器1(低8位)TL1 8BH 定时器/计数器0(高8位)TL0 8AH 定时器/计数器0(低8位)TMOD 89H 定时器/计数器方式控制寄存器TCON 88H 定时器/计数器控制寄存器DPH 83H 数据地址指针(高8位)DPL 82H 数据地址指针(低8位)SP 81H 堆栈指针P0 80H P0口锁存器PCON 87H 电源控制寄存器PSW_7PSW_6PSW_5PSW_4PSW_3PSW_2PSW_1PSW_0 CY AC F0 RS1 RS0 OV USR P 状态寄存器:PSWCY 进位标志位AC 辅助进位标志位F0 通用标志位RS1 寄存器组选择位高位RS0 寄存器组选择位低位OV 溢出标志位USR 用户定义标志位P 奇偶标志位PCON_7PCON_6PCON_5PCON_4PCON_3PCON_2PCON_1PCON_0 SMOD - - - GF1 GF0 PDWN IDLE 电源控制寄存器:PCONSMOD 串行口通信波特率控制位置位使波特率翻倍- 保留- 保留- 保留GF1 通用标志位GF0 通用标志位PDWN 低功耗标志位置位进入低功耗模式IDLE 空闲标志位置位进入空闲模式IP_7IP_6IP_5IP_4IP_3IP_2IP_1IP_0- - PT2 PS PT1 PX1 PT0PX0中断优先级寄存器:IP- 保留- 保留PT2 定时器2 中断优先级PS 串行通信中断优先级PT1 定时器1 中断优先级PX1 外部中断1 优先级PT0 定时器0 中断优先级PX0 外部中断0 优先级处理器的状态保存在状态寄存器PSW 中,状态字中包括进位位,用于BCD 码处理的辅助进位位,奇偶标志位,溢出标志位,还有前面提到的用于寄存器组选择的RS0 和RS1。
51单片机寄存器(个人整理)
51单片机寄存器功能一览表fe51单片机的CPU中,有21个特殊功能寄存器(52系列是26个)不连续地分布在128个字节的SF存储空间中,地址空间为80H-FFH,在这片SF空间中,包含有128个位地址空间,地址也是80H-FFH,但只有83个有效位地址,可对11个特殊功能寄存器的某些位作位寻址操作(这里介绍一个技巧:其地址能被8整除的都可以位寻址)。
在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有OM,用来存放程序,有AM,用来存放中间结果,此外还有定时/计数器,串行I/O 口,中断系统,以及一个内部的时钟电路。
在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SF)。
这样的特殊功能寄存器51单片机共有21个并且都是可寻址的列表如下(其中带*号的为52系列所增加的特殊功能寄存器):MCS-51单片机的特殊功能寄存器符号地址功能介绍BF0HB寄存器ACCE0H累加器PSWD0H程序状态字TH2*CDH定时器/计数器2(高8位)TL2*CCH定时器/计数器2(低8位)CAP2H*CBH外部输入(P1.1)计数器/自动再装入模式时初值寄存器高八位CAP2L*CAH外部输入(P1.1)计数器/自动再装入模式时初值寄存器低八位T2CON*C8HT2定时器/计数器控制寄存器IPB8H中断优先级控制寄存器P3B0HP3口锁存器IEA8H中断允许控制寄存器P2A0HP2口锁存器SBUF99H串行口锁存器SCON98H串行口控制寄存器P190HP1口锁存器TH18DH定时器/计数器1(高8位)TH08CH定时器/计数器1(低8位)TL18BH定时器/计数器0(高8位)TL08AH定时器/计数器0(低8位)TMOD89HT0、T1定时器/计数器方式控制寄存器TCON88HT0、T1定时器/计数器控制寄存器DPH83H数据地址指针(高8位)DPL82H数据地址指针(低8位)SP81H堆栈指针P080HP0口锁存器PCON87H电源控制寄存器分别说明如下:1、ACC---是累加器,通常用A表示这是个什么东西,可不能从名字上理解,它是一个寄存器,而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中的缘故吧。
51单片机中的PCON寄存器
51单片机中的PCON寄存器(电源控制及波特率选择寄存器)
PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器,单元地址是87H,其结构格式如下:
PCON???D7??D6 D5 D4 D3???D2??D1 D0
位符号SMOD -??-??-??GF1 GF0 PD IDL
在CHMOS型单片机中,除SMOD位外,其他位均为虚设的,SMOD是串行口波特率倍增位,当SMOD=1时,串行口波特率加倍。
系统复位默认为SMOD=0。
各位的定义:
SMOD:该位与串口通信有关。
SMOD=0; 串口方式1,2,3时,波特率正常。
SMOD=1; 串口方式1,2,3时,波特率加倍。
GF1,GF0:两个通用工作标志位,用户可以自由使用。
PD:掉电模式设定位。
PD=0 单片机处于正常工作状态。
PD=1 单片机进入掉电(Power Down)模式,可由外部中断或硬件复位模式唤醒,进入掉电模式后,外部晶振停振,CPU、定时器、串行口全部停止工作,只有外部中断工作。
IDL:空闲模式设定位。
IDL=0 单片机处于正常工作状态。
IDL=1 单片机进入空闲(Idle)模式,除CPU不工作外,其余仍继续工作,在空闲模式下可由任一个中断或硬件复位唤醒。
51单片机 特殊功能寄存器 SBUF使用方法
51单片机特殊功能寄存器(SFR)SBUF使用方法Posted on 2011-03-22 10:40 香格里拉\(^o^)/阅读(109) 评论(0)编辑收藏串行口中有两个缓冲寄存器SBUF,一个是发送寄存器,一个是接收寄存器,在物理结构上是完全独立的。
它们都是字节寻址的寄存器,字节地址均为99H。
这个重叠的地址靠读/写指令区分:串行发送时,CPU向SBUF写入数据,此时99H表示发送SBUF;串行接收时,CPU从SBUF读出数据,此时99H表示接收SBUF。
单片机串口#include <reg52.h>#include <absacc.h>#define unit unsigned int#define uchar unsigned charuchar date;uchar recFlag;//接收数据标识,0 未接收数据1 接收数据void init_serial();void send();void receive();main(){init_serial();IE=0; //屏蔽中断while(1){ receive(); send();}}void init_serial() //初始化串口{ TMOD=0x20; //定时器T1使用工作方式2TH1=250; //设置初值TH0=250;TR1=1; //开始计时PCON=0x80; //SMOD=1;SCON=0x50; //工作方式1,波特率9600bit/s,允许接收TI=1;}void send(){ if(TI==1) //检测输出是否READY{ if(recFlag==1) //是否接收过数据{ SBUF=date; //发送数据recFlag=0;TI=0;}}}void receive(){ if(RI==1) //检测是否有数据接收{ date=SBUF; //接收数据recFlag=1; //设置接收标识符RI=0;}}。
51单片机push指令用法
51单片机push指令用法在51单片机的编程中,push指令是一个非常常用且重要的指令。
它用于将数据压入栈中,栈是一种后入先出(Last In First Out,LIFO)的数据结构。
通过使用push指令,我们可以在程序中实现一些关键的功能,如保存寄存器的值、传递参数等。
使用push指令的语法如下:push <寄存器>其中,寄存器可以是A、B、DPL、DPH等。
当我们执行push指令时,指定的寄存器中的数据将被压入栈中。
栈在内存中的位置由栈指针(SP)寄存器来控制。
需要注意的是,栈的大小是有限的,通常在51单片机中为256个字节。
因此,在编程时需要谨慎使用push指令,以避免栈溢出的情况发生。
为了更好地理解push指令的使用,下面举一个简单的例子:```ORG 0H ; 程序从地址0开始执行MOV A, #10 ; 将寄存器A的值设置为10PUSH A ; 将A的值压入栈中MOV A, #20 ; 将寄存器A的值设置为20PUSH A ; 将A的新值压入栈中.........POP A ; 弹出栈顶的值,并存入寄存器A.........END ; 程序结束```在上述示例中,我们首先将寄存器A的值设为10,并使用push指令将其压入栈中。
接着,将寄存器A的值更改为20,并再次使用push指令将其压入栈中。
后续的程序可以继续执行其他操作。
当我们想要访问栈中的数据时,可以使用pop指令将栈顶的值弹出并存入寄存器A中。
通过这个简单的例子,我们可以看到push指令的用法及其在51单片机编程中的重要性。
它使我们能够在程序中保存和传递数据,为程序设计提供了更大的灵活性和可扩展性。
总结起来,push指令是51单片机编程中一种重要的指令,用于将数据压入栈中。
通过合理地使用push指令,我们可以更好地进行寄存器值的保存和参数传递,提高程序的效率和功能。
在编程过程中,我们需要注意栈的大小限制,避免栈溢出的情况。
MCS-51单片机的特殊功能寄存器
MCS-51单片机的特殊功能寄存器从图中我们可以看出,在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。
在一个51单片机的内部包含了这么多的东西。
对图进行进一步的分析,我们已知,对并行I/O口的读写只要将数据送入到相应I/O 口的锁存器就可以了,那么对于定时/计数器,串行I/O口等怎么用呢?在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SFR)。
事实上,我们已接触过P1这个特殊功能寄存器了,还有哪些呢?看下表下面,我们介绍一下几个常用的SFR。
1、ACC---是累加器,通常用A表示。
这是个什么东西,可不能从名字上理解,它是一个寄存器,而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中的缘故吧。
它的名字特殊,身份也特殊,稍后在中篇中我们将学到指令,可以发现,所有的运算类指令都离不开它。
自身带有全零标志Z,若A=0则Z=1;若A≠0则z=0。
该标志常用作程序分枝转移的判断条件。
2、B--一个寄存器。
在做乘、除法时放乘数或除数,不做乘除法时,随你怎么用。
3指针寄存器(1)程序计数器PC指明即将执行的下一条指令的地址,16位,寻址64KB范围,复位时PC = 0000H(2)堆栈指针SP指明栈顶元素的地址,8位,可软件设置初值,复位时SP = 07H(3)数据指针DPTR@R0、@R1、@DPTR;指明访问的数据存储器的单元地址,16位,寻址范围64KB。
DPTR = DPH + DPL。
可以用它来访问外部数据存储器中的任一单元,如果不用,也可以作为通用寄存器来用,由我们自已决定如何使用。
分成DPL(低8位)和DPH(高8位)两个寄存器。
用来存放16位地址值,以便用间接寻址或变址寻址的方式对片外数据RAM或程序存储器作64K字节范围内的数据操作4、PSW-----程序状态字。
51单片机djnz指令用法
51单片机djnz指令用法1. 介绍在51单片机中,djnz(Decrement and Jump if Not Zero)指令用于将一个寄存器的值减1,并检查结果是否为零。
如果结果不为零,则跳转到指定的目标地址执行程序。
2. 指令格式djnz 操作数,目标地址3. 操作数操作数可以是任意一个寄存器或者内部RAM的一个字节。
4. 目标地址目标地址是一个16位的绝对地址,用于指定程序执行的下一条指令的位置。
5. 使用方法首先,我们需要将需要进行减1操作的寄存器(或内部RAM字节)初始化为一个非零值。
然后,在使用djnz指令之前,我们需要确定跳转目标地址。
通常情况下,跳转目标地址是有条件地执行某段程序代码。
当djnz指令被执行时,它会将操作数所对应的值减1,并检查结果是否为零。
如果结果不为零,则会跳转到目标地址处执行下一条指令;如果结果为零,则不会跳转,而是继续顺序执行下一条指令。
需要注意的是,在使用djnz指令之前,我们必须确保操作数所对应的值大于等于1。
否则,当操作数为零时,djnz指令会导致一个无限循环。
6. 示例下面是一个简单的示例程序,演示了如何使用djnz指令:ORG 0000h ; 设置程序起始地址MOV R0, #10h ; 将R0寄存器初始化为16LOOP:DJNZ R0, LOOP ; R0减1,并检查是否为零,如果不为零则跳转到LOOP处执行下一条指令END ; 程序结束在上述示例中,我们首先将R0寄存器初始化为16(10h),然后进入一个循环。
在循环中,我们使用djnz指令将R0的值减1,并检查是否为零。
如果R0不为零,则跳转到LOOP处执行下一条指令;如果R0为零,则继续顺序执行下一条指令。
这样就实现了一个简单的倒计时功能。
7. 注意事项•在使用djnz指令时,需要确保操作数所对应的值大于等于1,否则可能会导致无限循环。
•跳转目标地址必须是16位的绝对地址。
•使用djnz指令时需要小心控制程序流程,避免出现逻辑错误。
51单片机特殊功能寄存器
51单片机特殊功能寄存器一、中断控制寄存器IE功能解释:1、EA:中断总开关,如果它等于0,则所有中断不允许。
2、X:无效位;3、ET2:定时器2中断允许;4、ES:串行口中断允许;5、ET1:定时器1中断允许;6、EX1:外部中断1中断允许;7、ET0:定时器0中断允许;8、EX0:外部中断0中断允许;二、中断标志及外部中断方式选择寄存器TCON功能解释1、TF1:定时器/计数器1(T1)的溢出中断标志。
当T1从初值开始加1计数到计数满,产生溢出时,由硬件使TF1置“1”,直到CPU响应中断时有硬件复位;2、TR1:T1的运行控制位,该位置1或清0用来实现启东计数或停止计数;3、TF0:定时器/计数器0(T0)的溢出标志位,其作用同TF1;4、TR0:T0的运行控制位,该位置1或清0用来实现启东计数或停止计数;5、IE1:外部中断1中断请求标志位,如果IT1 = 1,则外部中断1引脚P3.1上的电平有1变0时,IE1由硬件置位,外部中断1请求中断。
在CPU响应该中断时由硬件清0;6、IT1:外部中断源1触发方式控制位,边沿/电平触发模式。
7、IE0:外部中断0中断请求标志位,功能同IE1;8、IT0:外部中断源0触发方式控制位,边沿/电平触发模式。
三、定时器方式控制寄存器TMOD高4位(D7-D4)用于定时器1,低四位(D3-D0)用于定时器0;1、Gate:定时器/计数器运行控制位,用来确定外部中断请求引脚(INT0,INT1)是否参与T0或T1的操作控制。
当Gate=0时,只要定时器控制寄存器TCON中的TR0(或TR1)被置1时,T0(或T1)被允许开始计数;当Gate=1时,不仅要TCON中的TR0或TR1置位,还需要P3口的P3.2或P3.3引脚为高电平,才允许计数;2、C/T:定时器方式或计数器方式选择位。
C/T = 1时,为计数器方式;C/T = 0时为定时器模式。
3、M1,M0:定时器四种工作方式选择位:4、四、UART控制寄存器SCON功能解释:1、SMO,SM1:串行口操作方式选择位,两个选择位对应四种状态。
MCS-51单片机的(SFR)特殊功能寄存器
MCS-51单片机的特殊功能寄存器从图中我们可以看出,在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。
在一个51单片机的内部包含了这么多的东西。
对图进行进一步的分析,我们已知,对并行I/O口的读写只要将数据送入到相应I/O 口的锁存器就可以了,那么对于定时/计数器,串行I/O口等怎么用呢?在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SFR)。
事实上,我们已接触过P1这个特殊功能寄存器了,还有哪些呢?看下表下面,我们介绍一下几个常用的SFR。
1、ACC---是累加器,通常用A表示。
这是个什么东西,可不能从名字上理解,它是一个寄存器,而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中的缘故吧。
它的名字特殊,身份也特殊,稍后在中篇中我们将学到指令,可以发现,所有的运算类指令都离不开它。
自身带有全零标志Z,若A=0则Z=1;若A≠0则z=0。
该标志常用作程序分枝转移的判断条件。
2、B--一个寄存器。
在做乘、除法时放乘数或除数,不做乘除法时,随你怎么用。
3指针寄存器(1)程序计数器PC指明即将执行的下一条指令的地址,16位,寻址64KB范围,复位时PC = 0000H(2)堆栈指针SP指明栈顶元素的地址,8位,可软件设置初值,复位时SP = 07H(3)数据指针DPTR@R0、@R1、@DPTR;指明访问的数据存储器的单元地址,16位,寻址范围64KB。
DPTR = DPH + DPL。
可以用它来访问外部数据存储器中的任一单元,如果不用,也可以作为通用寄存器来用,由我们自已决定如何使用。
分成DPL(低8位)和DPH(高8位)两个寄存器。
用来存放16位地址值,以便用间接寻址或变址寻址的方式对片外数据RAM或程序存储器作64K字节范围内的数据操作4、PSW-----程序状态字。
mcs-51单片机中断优先级寄存器IP
mcs-51单片机中断优先级寄存器IP
在MCS-中断优先级中由中断优先级寄存器IP来高置的,IP中某位设为1,相应的中断就是高优先级,否则就是低优先级。
-
-
-
PS
PT1
PX1
PT0
PX0
IP优先级别寄存器各位介绍如下:
PS:串行口中断优先级控制位。
PS=1设定串行口为高优先级中断;PS=0为低优先级中断。
PT1:T1中断优先级控制位。
PT1=1设定定时器T1为高优先级中断;PT1=0 为低优先级中断。
PX1:外部中断1优先级控制位。
PX1=1设定定时器外部中断1为高优先级中断;PX1=0为低优先级中断。
PT0:T0中断优先级控制位。
PT0=1设定定时器T0为高优先级中断;PT0=0 为低优先级中断。
PX0:外部中断0优先级控制位。
PX0=1设定定时器外部中断0为高优先级中断;PX0=0为低优先级中断。
例:设有如下要求,将T0、外中断1设为高优先级,其它为低优先级,求
IP的值。
51单片机中的21个寄存器
51单片机中的21个寄存器ACC 累加器B 用于辅助累加器做某些运算的寄存器PSW 程序状态字其中最高位是进/借位标志C;PSW.6 是辅助进位标志AC,用于标识加减运算中低四位向高四位的进位;PSW.4 和PSW.3 是寄存器组选择位RS1 和RS0,用于从00H--1FH 的32 个存储器单元(4 组)中选出当前准备使用的一组工作寄存器的映射地址;PSW.2 是溢出标志OV;PSW.0 是ACC 的偶校验位P;PSW 的其余位不用IP 中断优先级控制寄存器在51 中IP.0--IP.4 依次控制INT0、T0、INT1、T1、UART 中断的优先级,高三位不用IE 中断使能控制器IE.7 是所有中断的总开关EA,IE.0--IE.4 依次控制INT0、T0、INT1、T1、UART 中断功能的开放或关断P0、P1、P2、P3 这四个寄存器用于读写51 单片机的四个I/O 端口SBUF 串行数据缓冲器将数据写入SBUF,单片机就自动将数据从UART 口发送出去SCON 串行口功能控制器最高两位SM0、SM1 控制串行口工作模式;第5 位SM2 通常用于多机通信中区分地址帧和数据帧;第4 位REN 是控制串口接收数据的使能位;第3 位TB8 和第2 位RB8 分别是在串口的相关工作模式下要发送的和接收到的第9 位数据;次低位TI 和最低位RI 分别标识一个发送或接收过程已结束,这两个标志位都会触发串口中断TH0、TL0 定时器T0 的计数单元的高8 位和低8 位TH1、TL1 定时器T1 的计数单元的高8 位和低8 位TMOD 定时/计数器工作模式控制器低4 位和高4 位的内容对应相同,分别控制T0 和T1 的工作模式,次低位和最低位控制对应定时/计数器的工作模式;最高位控制定时/计数器的计数是否由外中断口线参与控制;次高位控制对应的定时器/计数器工作在定时方式还是对相应口线的脉冲进行计数的方式TCON 定时/计数器控制字TCON.0 和TCON.2 分别是外中断INT0 和INT1 的触发方式选择位IT0 和IT1;TCON.1 和TCON.3 分别是外中断INT0 和INT1 的中断触发标志位IE0 和IE1;TCON.4 和TCON.6 分别是T0 和T1 的计数开关TR0 和TR1;TCON.5 和TCON.7 分别是T0 和T1 的中断触发标志位TF0 和TF1PCON 电源模式控制器最高位SMOD 用于串行口通信的波特率加倍,低4 位用于选择不同的低功耗模式,比如空闲模式、掉电模式、时钟停止模式等,但具体每一位的用法没有找到相关资料DPH、DPL 数据指针DPTR 的高、低字节DPTR 可以用于指向程序存储器、片内RAM、片外RAM 来读取数据SP 堆栈指针堆栈都是分配在片内RAMtips:感谢大家的阅读,本文由我司收集整编。
51单片机串口通信相关寄存器及设置指引
51单片机串口通信相关寄存器及设置指引关键字SBUF:串口数据缓存寄存器SCON:串口通信状态控制寄存器Fosc:晶振的震荡频率PSW:程序状态字寄存器1、SBUF数据缓存寄存器SBUF可直接寻址专用寄存器,是个8位寄存器,不可进行位操作。
字节地址99H。
物理上它是两个寄存器,一个发送寄存器,一个接收寄存器。
写数据到SBUF中时(SBUF = 0x52;),单片机自己会判断是写到发送寄存器。
读取SBUF中数据时(rReg = SBUF;),单片机自己会判断是读取接收寄存器。
接收寄存器是双缓冲的,以避免在接收下一帧数据之前,单片机还来不及响应接收中断,没有把上一帧的数据读取走,而产生两次帧数据重叠问题。
发送寄存器,没有缓冲,发送时单片机直接主动发出数据,不会产生重叠问题。
(扩展知识:为了保持最大的传输速率,一般不需要发送寄存器建立双缓冲功能。
双缓冲功能有别于发送数据队列缓存区。
)2、SCON串口通讯状态控制寄存器SCON可直接寻址专用寄存器,是个8位寄存器,可以进行位操作。
SCON用于控制串行通信的模式选择、接收和发送,标识串口的状态。
SCON即可以字节寻址也可以位寻址,字节地址98H,地址位为98H~9FH。
系统复位时,SCON的所有位都被清除。
SCON串口通讯状态控制寄存器的格式及各位的功能定义如下:●SM0、SM1SM0和SM1是串口模式选择位。
SM0和SM1编码对应串口4种模式,如下表:●SM2SM2在模式2和模式3中是多机通信的使能位。
在模式0中,SM2必须为0。
在模式1中,若SM2=1且没有接收到有效的停止位,则接收中断标志位RI不会被激活。
在模式2和模式3中若SM2=1且接收到的第9位数据(RB8)为0,则接收中断标志RB8不会被激活,若接收到的第9位数据(RB8)为1,则RI置位。
此功能可用于多处理机通信。
●RENREN为允许串行接收位,由软件置位或清除。
置位时允许串行接收,清除时禁止串行接收。
51单片机寄存器集(包括所有的寄存器位的详细介绍)
(1)SM0、SM1:串行口工作方式控制位。
SM0,SM1 工作方式00 方式0-波特率由振荡器频率所定:振荡器频率/1201 方式1-波特率由定时器T1或T2的溢出率和SMOD所定:2SMOD ×(T1溢出率)/3210 方式2-波特率由振荡器频率和SMOD所定:2SMOD ×振荡器频率/6411 方式3-波特率由定时器T1或T2的溢出率和SMOD所定:2SMOD ×(T1溢出率)/32(2)SM2:多机通信控制位。
< br> 多机通信是工作于方式2和方式3,SM2位主要用于方式2和方式3。
接收状态,当串行口工作于方式2或3,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断申请,否则会将接受到的数据放弃。
当SM2=0时,就不管第位数据是0还是1,都难得数据送入SBUF,并发出中断申请。
工作于方式0时,SM2必须为0。
(3)REN:允许接收位。
< br> REN用于控制数据接收的允许和禁止,REN=1时,允许接收,REN=0时,禁止接收。
(4)TB8:发送接收数据位8。
< br> 在方式2和方式3中,TB8是要发送的——即第9位数据位。
在多机通信中同样亦要传输这一位,并且它代表传输的地址还是数据,TB8=0为数据,TB8=1时为地址。
(5)RB8:接收数据位8。
在方式2和方式3中,RB8存放接收到的第9位数据,用以识别接收到的数据特征。
(6)TI:发送中断标志位。
可寻址标志位。
方式0时,发送完第8位数据后,由硬件置位,其它方式下,在发送或停止位之前由硬件置位,因此,TI=1表示帧发送结束,TI可由软件清“0”。
(7)RI:接收中断标志位。
可寻址标志位。
接收完第8位数据后,该位由硬件置位,在其他工作方式下,该位由硬件置位,RI=1表示帧接收完成。
11、PCON-----电源管理寄存器PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器,单元地址是87H,其结构格式如下:。
51单片机buf用法
51单片机buf用法51单片机的BUF指令是一种数据传输指令,用于将一个数据或一个数据段传送到8位的SFR寄存器中。
该指令可以用于将数据从一个寄存器复制到另一个寄存器,也可以用于将数据加载到SFR寄存器中。
BUF指令的语法格式如下:BUF dst,src其中,dst表示目的寄存器,src表示源寄存器。
BUF指令有不同的寻址方式,可以按照直接寻址、寄存器间接寻址和立即寻址进行操作。
1. 直接寻址:BUF A,R1这个指令的作用是将R1寄存器中的值传送到累加器A中。
通过这种方式,可以实现寄存器之间的数据传输。
2. 寄存器间接寻址:BUF @R0,@R1这个指令的作用是将R1中的值作为地址,找到对应的内部RAM中的数据,并将其传送到R0寄存器中。
通过这种方式,可以实现RAM和RAM之间的数据传输。
3. 立即寻址:BUF A,#20H这个指令的作用是将立即数20H加载到累加器A中。
通过这种方式,可以将立即数加载到SFR寄存器中。
BUF指令的应用场景非常广泛。
下面以一些实例来说明BUF指令的具体使用。
例1:将一个8位的温度数据传送到串行通信寄存器LDR A,P1 ;从引脚P1读取温度数据到累加器ABUF SBUF,A ;将累加器A中的数据传送到串行通信寄存器SBUF中通过BUF指令,将引脚P1上的温度数据传送到串行通信寄存器中,实现了数据的传输。
例2:将RAM中的一段数据复制到另一个RAM区域MOV R0,#20H ;设置源地址MOV R1,#30H ;设置目的地址BUF @R1,@R0 ;将源地址为20H的RAM中的数据传送到目的地址为30H的RAM中通过BUF指令,将RAM中的一段数据从一个地址复制到另一个地址,实现了数据的拷贝。
例3:将立即数加载到特殊功能寄存器中MOV A,#40H ;将立即数40H加载到累加器A中BUF P0,A ;将累加器A中的数据传送到特殊功能寄存器P0中通过BUF指令,将立即数加载到特殊功能寄存器中,实现了对特殊功能寄存器的设置。
51单片机寄存器 详解
一、TMOD工作方式寄存器工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。
其格式如下:GATE:门控位。
GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;:定时/计数模式选择位。
=0为定时模式;=1为计数模式。
M1M0:工作方式设置位。
定时/计数器有四种工作方式,由M1M0进行设置。
二、TCON定时/计数器控制寄存器TCON的低4位用于控制外部中断。
TCON的高4位用于控制定时/计数器的启动和中断申请。
其格式如下:▪TF1(TCON.7):T1溢出中断请求标志位。
T1计数溢出时由硬件自动置TF1为1。
CPU 响应中断后TF1由硬件自动清0。
T1工作时,CPU可随时查询TF1的状态。
所以,TF1可用作查询测试的标志。
TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。
▪TR1(TCON.6):T1运行控制位。
TR1置1时,T1开始工作;TR1置0时,T1停止工作。
TR1由软件置1或清0。
所以,用软件可控制定时/计数器的启动与停止。
▪TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。
▪TR0(TCON.4):T0运行控制位,其功能与TR1类同。
三、IE中断允许寄存器CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
▪ET0(IE.1),定时/计数器T0中断允许位;▪EX1(IE.2),外部中断0允许位;▪ET1(IE.3),定时/计数器T1中断允许位;▪ES(IE.4),串行口中断允许位;▪EA (IE.7),CPU中断允许(总允许)位。
▪EX0(IE.0),外部中断0允许位;四、51单片机共5个中断源0. INT0:外部中断0,由P3.2端口引入,低电平或下降沿引起。
1. T0:定时器0(计数器0)中断,由T0计数器计满引起。
2. INT1:外部中断1,由P3.3端口引入,低电平或下降沿引起。
51单片机寄存器详解
定时器/计数器的方式寄存器TMODTMOD是一个8位的特殊功能寄存器,对应的地址是89H,不可位寻址。
TMOD:工作方式控制寄存器寄存器地址89H,不可位寻址。
位序 B7 B6 B5 B4 B3 B2 B1 B0位符号GATE C/T M1 M0 GATE C/T M1 M0GATE——门控位当=0时,以运行TR0(或TR1)启动或禁止定时器、计数器当=1时,以TR0*/INT0(或TR1*/INT1)启动或禁止定时器、计数器GATE=0 以TR0(TR1)启动定时器GATE=1 以INT0(INT1)启动定时器C/T=0 定时/计数工作方式选择位M1M0——工作方式选择位T2MOD:工作方式控制寄存器寄存器地址0C9H,不可位寻址------T2OE DCENT2OE:定时器2输出允许位,当=1时,P1.0/T2引脚输出连续脉冲信号DCEN:当=1时,T2配置成向上向下计数器A 主要完成三个功能:*确T0计数溢出标志位当计数器计数溢出时,该位置“1”。
使用查询方式时,此位作为状态位供cpu查询,但应注意在查询该位有效后应以软件方法及时将该位清“0”。
使用中断方式时,此位作为中断申请标志位,进入中定选择定时器还是计数器;*选择何种工作方式;*是否借用外中断控制定时器和计数器的启停;B TMOD的低4位是控制T0的字段(T0--P3.4 定时器/计数器0外部事件脉冲输入端)TMOD的高4位是控制T1的字段(T1--P3.5定时器/计数器1外部事件脉冲输入端)C 控制字的格式和含义a、 GATE(TMOD.7)分为两种情况:GATE=0,定时器的启停和INT1无关,只取决于TR0;GATE=1,定时器的启停不仅要由TR0来控制,而且要INT1引脚的控制,只有二者都为高电平时定时器才开始工作; b、 C/T(TMOD.6) 分为两种情况:C/T=0,用作定时器;C/T=1,用作计数器; d、 M1(TMOD.5),M0(TMOD.4)用M1,M0来控制定时器/计数器的4种工作方式:*方式0:M1=0,M0=0.13位定时/计数方式*方式1:M1=0,M0=1.16位定时/计数器*方式2,M1=1,M0=0.8位初值自动重新装入的8位定时/计数器*方式3,M1=1,M0=1.仅适用于T0,分为两个8位计数器,T1停止计数定时器/计数器控制寄存器TCONTCON是一个8位的特殊功能寄存器,对应的地址为88H,可为寻址。
51单片机对控制寄存器的赋值方法
51单片机对控制寄存器的赋值方法51单片机是一种广泛应用于嵌入式系统中的微控制器。
在进行控制操作时,我们需要对其内部的控制寄存器进行赋值,以实现相应的功能。
本文将介绍51单片机对控制寄存器的赋值方法,帮助读者更好地理解并应用于实际开发中。
一、概述控制寄存器是51单片机内部的一种特殊寄存器,用于控制单片机的工作模式、功能和特性。
通过对控制寄存器的赋值,我们可以设置单片机的时钟源、中断使能、IO口状态、定时器模式等各种功能。
掌握对控制寄存器的赋值方法,对于实现所需的功能至关重要。
二、寄存器的赋值方法1. 寄存器的地址在对控制寄存器进行赋值之前,首先需要知道寄存器的地址。
51单片机的控制寄存器地址范围为0x80~0xFF,不同的寄存器对应不同的功能。
可以通过查阅相关资料或者单片机的数据手册来获取寄存器的地址。
2. 寄存器位的定义控制寄存器中的每一位都代表着不同的功能或状态。
在对寄存器进行赋值时,需要清楚每个位的含义。
可以通过查阅单片机的数据手册或者相关资料来获取寄存器位的定义。
3. 赋值方法控制寄存器的赋值方法主要通过对寄存器的位进行赋值。
可以使用位操作指令来实现对寄存器位的操作。
常用的位操作指令有与(AND)、或(OR)、非(NOT)等。
通过这些指令,我们可以将特定的位设置为1或者清零,以实现相应的功能。
三、示例以控制P0口为例,介绍51单片机对控制寄存器的赋值方法。
1. 获取控制寄存器的地址P0口的控制寄存器地址为0x80。
2. 定义寄存器位的含义P0口的控制寄存器P0CON中,各位的含义如下:- P0.0:P0口第0位- P0.1:P0口第1位- P0.2:P0口第2位- P0.3:P0口第3位- P0.4:P0口第4位- P0.5:P0口第5位- P0.6:P0口第6位- P0.7:P0口第7位3. 赋值方法对P0口的控制寄存器进行赋值时,可以通过位操作指令来设置或清零相应的位。
例如,我们需要将P0口的第0位设置为1,可以使用以下代码:```cP0CON |= 0x01;```表示将P0CON寄存器的第0位设置为1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void INT_0(void) interrupt 0{if(inf_mode_en == 1) //如果红外线接收总控制开,那么才可以判断下面的所有{if(inf_shunxu == 0){TH1 = 0x1F; //定时器高位TL1 = 0xFF; //定时器低位TR1 = 1; //定时器1开始计数,由于晶振是24Minf_shunxu++; //顺序加一ET1 = 1; //开定时器1的溢出中断使能}else if(inf_shunxu == 1){ inf_gonggong(); //红外线接收公共程序if(inf_zanshi>kaishizhi_l){inf_dizhi_buf=0;inf_dizhichou_buf=0;inf_shuju_buf=0;inf_shujuf_buf=0;}else inf_gongcuowu(); //公共错误处理错误位置1,接收顺序清0}else{switch(inf_shunxu){case 2: inf_gonggong(); //红外线接收公共程序if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_dizhi_buf&=0xFE;} //清除最低位else if(inf_zanshi<inf_yizhi_h){inf_dizhi_buf|=0x01;} //置最低位else{inf_gongcuowu();} //公共错误处理break;case 3: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_dizhi_buf&=0xFD;}else if(inf_zanshi<inf_yizhi_h){inf_dizhi_buf|=0x02;}else{inf_gongcuowu();} //公共错误处理break;case 4: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_dizhi_buf&=0xFB;}else if(inf_zanshi<inf_yizhi_h){inf_dizhi_buf|=0x04;}else{inf_gongcuowu();} //公共错误处理break;case 5: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_dizhi_buf&=0xF7;}else if(inf_zanshi<inf_yizhi_h){inf_dizhi_buf|=0x08;}else{inf_gongcuowu();} //公共错误处理break;case 6: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_dizhi_buf&=0xEF;}else if(inf_zanshi<inf_yizhi_h){inf_dizhi_buf|=0x10;}else{inf_gongcuowu();} //公共错误处理break;case 7: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_dizhi_buf&=0xDF;}else if(inf_zanshi<inf_yizhi_h){inf_dizhi_buf|=0x20;}else{inf_gongcuowu();} //公共错误处理break;case 8: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_dizhi_buf&=0xBF;}else if(inf_zanshi<inf_yizhi_h){inf_dizhi_buf|=0x40;}else{inf_gongcuowu();} //公共错误处理break;case 9: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_dizhi_buf&=0x7F;}else if(inf_zanshi<inf_yizhi_h){inf_dizhi_buf|=0x80;}else{inf_gongcuowu();} //公共错误处理break;case 10: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_dizhichou_buf&=0xFE;}else if(inf_zanshi<inf_yizhi_h){inf_dizhichou_buf|=0x01;}else{inf_gongcuowu();} //公共错误处理break;case 11: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_dizhichou_buf&=0xFD;}else if(inf_zanshi<inf_yizhi_h){inf_dizhichou_buf|=0x02;}else{inf_gongcuowu();} //公共错误处理break;case 12: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_dizhichou_buf&=0xFB;}else if(inf_zanshi<inf_yizhi_h){inf_dizhichou_buf|=0x04;}else{inf_gongcuowu();} //公共错误处理break;case 13: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_dizhichou_buf&=0xF7;}else if(inf_zanshi<inf_yizhi_h){inf_dizhichou_buf|=0x08;}else{inf_gongcuowu();} //公共错误处理break;case 14: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_dizhichou_buf&=0xEF;}else if(inf_zanshi<inf_yizhi_h){inf_dizhichou_buf|=0x10;}else{inf_gongcuowu();} //公共错误处理break;case 15: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_dizhichou_buf&=0xDF;}else if(inf_zanshi<inf_yizhi_h){inf_dizhichou_buf|=0x20;}else{inf_gongcuowu();} //公共错误处理break;case 16: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_dizhichou_buf&=0xBF;}else if(inf_zanshi<inf_yizhi_h){inf_dizhichou_buf|=0x40;}else{inf_gongcuowu();} //公共错误处理break;case 17: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_dizhichou_buf&=0x7F;}else if(inf_zanshi<inf_yizhi_h){inf_dizhichou_buf|=0x80;}else{inf_gongcuowu();} //公共错误处理break;case 18: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_shuju_buf&=0xFE; }else if(inf_zanshi<inf_yizhi_h){inf_shuju_buf|=0x01;}else{inf_gongcuowu();} //公共错误处理break;case 19: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_shuju_buf&=0xFD;}else if(inf_zanshi<inf_yizhi_h){inf_shuju_buf|=0x02;}else{inf_gongcuowu();} //公共错误处理break;case 20: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_shuju_buf&=0xFB;}else if(inf_zanshi<inf_yizhi_h){inf_shuju_buf|=0x04;}else{inf_gongcuowu();} //公共错误处理break;case 21: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_shuju_buf&=0xF7;}else if(inf_zanshi<inf_yizhi_h){inf_shuju_buf|=0x08;}else{inf_gongcuowu();} //公共错误处理break;case 22: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_shuju_buf&=0xEF;}else if(inf_zanshi<inf_yizhi_h){inf_shuju_buf|=0x10;}else{inf_gongcuowu();} //公共错误处理break;if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_shuju_buf&=0xDF;}else if(inf_zanshi<inf_yizhi_h){inf_shuju_buf|=0x20;}else{inf_gongcuowu();} //公共错误处理break;case 24: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_shuju_buf&=0xBF;}else if(inf_zanshi<inf_yizhi_h){inf_shuju_buf|=0x40;}else{inf_gongcuowu();} //公共错误处理break;case 25: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_shuju_buf&=0x7F;}else if(inf_zanshi<inf_yizhi_h){inf_shuju_buf|=0x80;}else{inf_gongcuowu();} //公共错误处理break;case 26: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_shujuf_buf&=0xFE;}else if(inf_zanshi<inf_yizhi_h){inf_shujuf_buf|=0x01;}else{inf_gongcuowu();} //公共错误处理break;case 27: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_shujuf_buf&=0xFD;}else if(inf_zanshi<inf_yizhi_h){inf_shujuf_buf|=0x02;}else{inf_gongcuowu();} //公共错误处理break;case 28: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_shujuf_buf&=0xFB;}else if(inf_zanshi<inf_yizhi_h){inf_shujuf_buf|=0x04; }else{inf_gongcuowu();} //公共错误处理break;if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_shujuf_buf&=0xF7;}else if(inf_zanshi<inf_yizhi_h){inf_shujuf_buf|=0x08;}else{inf_gongcuowu();} //公共错误处理break;case 30: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_shujuf_buf&=0xEF;}else if(inf_zanshi<inf_yizhi_h){inf_shujuf_buf|=0x10;}else{inf_gongcuowu();} //公共错误处理break;case 31: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_shujuf_buf&=0xDF;}else if(inf_zanshi<inf_yizhi_h){inf_shujuf_buf|=0x20;}else{inf_gongcuowu();} //公共错误处理break;case 32: inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_shujuf_buf&=0xBF;}else if(inf_zanshi<inf_yizhi_h){inf_shujuf_buf|=0x40;}else{inf_gongcuowu();} //公共错误处理break;case 33:inf_gonggong();if(inf_zanshi<inf_lingzhi_h) //如小于0码最大值则说明是0{inf_shujuf_buf&=0x7F;inf_wancheng();}else if(inf_zanshi<inf_yizhi_h){inf_shujuf_buf|=0x80;inf_wancheng();}else{inf_gongcuowu();} //公共错误处理break;default:inf_shunxu = 0;break;}}}}。