51单片机定时器TMOD与TCON、SCON

article/2025/10/24 21:41:55

51单片机中断级别

中断源                                默认中断级别    序号(C语言用)
INT0---外部中断0                   最高              0 
T0    ---定时器/计数器0中断    第2               1
INT1---外部中断1                    第3               2
T1   ----定时器/计数器1中断    第4               3
TX/RX---串行口中断                第5               4
T2   ---定时器/计数器2中断     最低              5
————————————————

定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。

 

D0~D3为T0定时/计数器的设置,D4~D7为T1定时/计数器的设置 。

GATE  :为门控位,GATE=0时,只要在编写程序时,使TCON中的TRO或TR1为1,就可以启动定时器/计数器工作。

                                 GATE=1时,不仅要在编写程序时,使TCON中的TRO或TR1为1,且需要外部引脚也为高电平,才能 工作。

C/T    :定时/计数模式切换,C/T=0时为定时模式,C/T=1时为计数模式。

M1,M0:用来选择定时计/计数器的工作方式,一般使用都是采用16位的计时计数器。

 TCON 定时器控制寄存器

定时器控制寄存器,作用是控制定时器的启、停,标志定时器溢出和中断情况。

TF1  :TF1=1表示T1有中断产生。(Timer Flag,定时器标志位)

TR1  :TR1=1表示T1开始运行。(单片机中T0引脚,需要高低电平的驱动)

TF0  :TF0=1表示T0有中断产生。

TR0  :TR0=1表示T0开始运行。(单片机中T1引脚,需要高低电平的驱动)

IE1   :IE1=1表示INT1有中断产生。

IT1   :IT1=1表示INT1为下降沿触发,IT1=0表示INT1为低电平触发。

IE0   :IE0=1表示INT0有中断产生。

IT0   :IT0=1表示INT0为下降沿(负跳变)触发,IT0=0表示INT0为低电平触发。

       外部中断:

           IE0/IE1:外部中断请求标志位

                   当INT0(INT1)引脚出现有效的请求信号,此位由单片机自动置1,

                   CPU开始响应,处理中断,而当入中断程序后由单片机自动置0.

           IT0/IT1:外部中断触发方式控制位          //选择有效信号

                   IT0/IT1=1:脉冲触发方式,下降沿有效。

                   IT0/IT1=0:电平触发方式,低电平有效。
————————————————

中断允许寄存器  IE (A8H)

EA    :整体中断允许位;EA=1允许中断。

ET2   :T2中断允许位;ET2=1允许中断(S52才有)。

ES    :串行中断允许位;ES=1允许中断。

ET1   :T1中断允许位;ET1=1允许中断。

EX1   :INT1中断允许位;EX1=1允许中断。

ET0   :T0中断允许位;ET0=1允许中断。

EX0   :INT0中断允许位;EX0=1允许中断。


在程序中,通过设订两个8位寄存器中TH与TL的值,来决定定时值和计数值。TH与TL的计算过程如下:

假设定时器的时间常数为X,定时器的位数为N
定时时间T=(2的N次方-X)12/单片机晶振频率   (例如11.0592MHZ的振荡器频率F=1/11.0592)
N为定时器的工作方式(关于定时/计数器的4中工作方式,以下会有具体介绍):

 方式0时,N=13(此为TH为8位,TL为5位)
 方式1时,N=16(此为TH为8位,TL为8位)
 方式2时,N=8(此为TH为8位,TL为0位)                                                                                                                                       方式3时,N=8(此为TH为8位,TL为8位,只适用于T0,且T0被分成两个独立的8位计数器TH与TL)


根据定时时间和工作方式,通过公式:定时时间T=(2的N次方-X)12/单片机晶振频率,计算出时间常数X
把X转换成二进制数,高8位送给TH1,低8位送给TL1,就可以启动定时器开始定时了。

定时器的3种工作方式图解:

工作方式0:

工作方式1:

工作方式2:

工作方式3:

总结定时器的操作步骤如下:

1.选择工作方式(设置M0,M1的值) 

2.选择控制方式GATE(为0是只要软件设定好参数即可,为1则需要软件设定参数,且定时器/计数器的中断引脚需要为高电平)

3.确定定时器的工作模式,是定时模式还是计数模式 C/T.

4.给定时器设初值(设置THX与TLX)

5.开启定时器中断(设置ET0或ET1)

6.开启总中断(设置EA的值)

7.定时器/计数器的选择T0/T1(设置TR1或TR0的值)

例:设置一个LED灯每500ms的评率闪烁

#include<reg52.h>
 
sbit led = P1^0;
int i = 0;
 
void timer1_init()
{
    TMOD = 0x10; //定时器0选择工作方式1
    TH1 = 0x4C;     //设置初始值,定时50ms
    TL1 = 0x00; 
    EA = 1;             //打开总中断
    ET1 = 1;         //打开定时器0中断
    TR1 = 1;         //启动定时器0
}
 
void main()
{
    led = 1;
    timer1_init();//定时器1的初始化
    while(1)
    {
        if(i==10)
        {
          led = ~led;
          i = 0; //注意i需要零
        }
    }
}
 
void timer1() interrupt 3
{
    TH1 = 0x4C;     //设置初始值,定时50ms
    TL1 = 0x00;
    i++;
}
¡定时器操作步骤:

选择工作方式(设

¡定时器操作步骤:

选择工作方式(设置M1,M0)

选择控制方式(设置GATE)

选择定时器还是计数器模式(设置C/T)

给定时/计数器赋初值(设置THx和TLx

开启定时器中断(设置ET0或ET1

开启总中断(设置EA)

打开计数器(设置TR1或TR0)

置M1,M0)

选择控制方式(设置GATE)

选择定时器还是计数器模式(设置C/T)

给定时/计数器赋初值(设置THx和TLx

开启定时器中断(设置ET0或ET1)

开启总中断(设置EA)

打开计数器(设置TR1或TR0)

 

定时器操作步骤 

选择工作方式(设置M1,M0)

选择控制方式(设置GATE)

选择定时器还是计数器模式(设置C/ 

给定时/计数器赋初值(设置THx和TLx)

开启定时器中断(设置ET0或ET1

开启总中断(设置EA)

打开计数器(设置TR1或TR0)

 

由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0 
————————————————

SCON 串口控制寄存器

SM0、SM1工作方式控制位

SM2:多机通信控制位,1-允许、0-不允许

REN:串行接收允许位。1-允许、0-不允许

TB8:发送数据第九位

RB8:接收数据第九位

TI:发送中断标志位

RI:接收中断标志位

①SM0和SM1 :串行口工作方式选择位 ,两个选择位对应四种通信方式,如下图所示,其中fosc是振荡频率

SM2:多机通信控制位,主要用于方式2和方式3。

若SM2 = 1;则允许多机通信。多机通信协议规定,第9位数据(D8)为1,说明本帧数据为地址帧;若第9位数据为0,则本帧数据为数据帧。当一个89c51(主机)与多个89c51(从机)通信时,所有从机的SM2位都置1,主机首先发送的一帧数据为地址,即某从机号,其中第9位为1,所有的从机接收数据后,将其中第9位数据装入RB8中。各个从机根据接收到的第9位数据(RB8中)的值来决定从机是否再接收主机的信息、若(RB8)= 0,说明是数据帧,则使接收中断标志位RI = 0,信息丢失,若RB8 = 1,说明是地址帧,数据装入SBUF并置RI = 1,中断所有从机,被寻址的目标从机清除SM2,以接收主机发来的一帧数据,其它从机仍然保持SM2 = 1。

若SM2 = 0,即不属于多机通信情况,则接收完一帧数据后,不管第9位数据是0还是1,都置RI = 1,接收到的数据装入SBUF中。在方式0时SM2必须置0。在方式1时,若SM2 = 1,则只有接收到有效停止位时,RI才置1,以便接收下一帧数据。

REN:允许接收控制位,由软件置1或清0

REN = 1时,允许接收,相当于串行接收的开关

REN = 0时,禁止接收

在串行通信接收控制过程中,如果满足RI = 0和REN = 1的条件,就允许接收。

TB8:发送数据的第9位(D8)装入TB8中。在方式2或方式3中,根据发送数据的需求由软件置位或复位。在许多通信协议中可用作奇偶校验位,也可以在多机通信中作为发送地址帧或者数据帧的标志位。

RB8:接收数据的第9位,原理同TB8

TI:发送中断标志位,在一帧数据发送完时被置位。在串行发送到停止位的开始时由硬件置位,可用软件查询。它同时也申请中断。TI置位意味着向CPU提供“发送缓冲器SBUF已空”的信息,CPU可以准备发送下一帧数据。串行口发送中断被响应后,TI不会自动清0,必须软件清0.

RI:接收中断标志,在接收到一帧数据后由硬件置位。当RI = 1时,申请中断,表示一帧数据接收结束,并已装入接收SBUF中,要求CPU取走数据,CPU响应中断,取走数据。RI位也必须由软件来清0,。

串行发送中断标志TI和接收中断标志RI是同一个中断源,CPU事先不知道是发送中断TI还是接收中断RI产生的中断请求,所以,在全双工通信时,必须由软件来判别。复位时SCON所有位都清0.

/*
SMOD为PCON的最高位
9600==(2^SMOD / 32)*(T1溢出率)

T1溢出率==11059200/12/(256-TH)

9600=(1/32)*( 11059200/12/(256-TH) )

TH==256-11059200/12/32/9600==256-3=0xFD
*/

/*
*****************************************
**函数功能:串口初始化函数
*****************************************
*/
void UART_Init()
{
     
            TMOD = 0x20; //定时器1工作模式2,自动重装8位计数器
            TH1 = 0xfd;
            TL1 = 0xfd;   //定时器溢出时,会自动将高8位中的值赋值给低8位.比特率9600
            TR1 = 1;
            SM0 = 0;
            SM1 = 1;
            REN = 1;
            EA = 1;
            ES = 1;
}
/*
********************************************
**函数名称:串口中断函数
********************************************
*/
void UART() interrupt 4
{
    if(RI == 1)        //如果接收到计算机发的数据
        {
            num = SBUF;  //取出数据
            num++;       
            RI = 0;       //清除标志位
            SBUF = num;  //把数据加1后再发送给计算机
        }
        if(TI == 1)    //如果发送完毕
        {
            TI = 0;       //清除标志位
        }
}
————————————————

PCON 电源控制位寄存器

电源控制位寄存器PCON中只有SMOD位与串口工作有关,如下图所示

SMOD:波特率倍增位。在方式1、2、3中,当SMOD = 1时,波特率提高一倍。

 


http://chatgpt.dhexx.cn/article/a20LeYCs.shtml

相关文章

2021-912--51单片机串口通信--SCON方式1

计算机的通信分为&#xff1a;串行通信和并行通信 串行通信分为&#xff1a;异步通信和同步通信 异步通信&#xff1a;发送设备与接受设备有各自的时钟&#xff0c;通信时双方的时钟尽量保持一致&#xff0c; 以字符为单位进行传输&#xff0c; 字符与字符间的时间间隔是任意…

串行口控制寄存器(SCON)(转载自百度文库)

SCON是MCS-51单片机的一个可位寻址的专用寄存器&#xff0c;用于串行数据通信的控制。单元地址为98H&#xff0c;位地址为98H&#xff5e;9FH。寄存器的内容及位地址表示如下&#xff1a; 位地址 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H 位符号 SM0 SM1 SM2 …

51/STC12单片机SCON,PCON,TMOD寄存器定义及功能

串口工作方式寄存器SCON 串口工作方式寄存器SCON&#xff0c;SCON&#xff08;Serial Control Register)串行口控制寄存器&#xff0c;用于控制串行通信的方式选择、接收和发送&#xff0c;指示串口的状态。SCON既可以字节寻址&#xff0c;也可以位寻址&#xff0c;其字节地址…

TMOD、SCON、PCON寄存器的配置

TMOD控制寄存器 TMOD是定时器、计数器模式控制寄存器&#xff0c;它是一个逐位定义的8为寄存器&#xff0c;但只能使用字节寻址。 其各位是&#xff1a; 由上图我们就可以看出&#xff0c;这个寄存器控制了两个定时器/计数器 寄存器的高四位控制定时器1&#xff0c;低四位…

JDK 高版本没有VisualVM

VisualVM 是一款免费的&#xff0c;集成了多个 JDK 命令行工具的可视化工具&#xff0c;提供强大的分析能力&#xff0c;对 Java 应用程序做性能分析和调优。 在高版本JDK&#xff08;大于1.8或后期更新的1.8版本&#xff09;中已经不会再自动集成 VisualVM 1、下载&#xff…

visualvm下载和安装

visualvm下载和安装 官网下载地址&#xff1a; https://visualvm.github.io/index.html 电脑登录不上&#xff0c;可以使用手机打开&#xff0c; 附带我下载好的visualvm2.0.3版本的网盘地址&#xff1a;&#xff08;适用于Jdk1.8&#xff09; 链接&#xff1a;https://pan…

VisualVM的配置和使用

下载VisualVM&#xff1a;官网下载页面 解压缩后进入到etc目录 修改visualvm.conf配置文件 需要注意&#xff1a; 我当时使用的visualVM是2.0.3这个版本的只支持jdk8以前的&#xff0c;我本地配置的环境变量是jdk14&#xff0c;但是又不想配置jdk8作为环境变量&#xff0c;需…

Mac 系统下VisualVM的安装

1、preferences----plugins搜索插件visualvm 插件&#xff0c;点击下载。 2、下载完成后&#xff0c;在idea上配置visualvm参数:preferences----other settings----visualvm launcher其中第一个参数是在jdk中visualvm.exe;第二个参数是jdk的位置 3、按理说配置成功后重启idea,…

VisualVM 使用心得

JDK中有个好用的工具“VisualVM”可以实时可视化的查看到java程序内存变化情况&#xff0c;对于理解GC和java内存管理还是有很大帮助的&#xff0c;以前看论坛看帖子讲到java内存管理真是各说纷纭啊&#xff01;有人说“JVM的内存分为两块堆和栈”&#xff0c;还有人说"JV…

Mac上安装VisualVM

首先去下载 官网&#xff1a; https://visualvm.github.io/index.html然后访达找到应用程序&#xff0c;右键VisualVM显示包内容&#xff0c;找到&#xff1a; /Applications/VisualVM.app/Contents/Resources/visualvm/etc 下面的visualvm.conf文件 修改它 在文件最下面加…

Mac版VisualVM启动提示You are running VisualVM using Java Runtime Environment ( JRE ) . Please use

今天更新了VisualVM 2.0.5&#xff0c;启动的时候提示找不到jdk引用&#xff0c;于是到包内部的visualvm.conf中修改jdk引用地址。 visualvm.conf的路径 /Applications/VisualVM.app/Contents/Resources/visualvm/etc/visualvm.conf 将visualvm_jdkhome修改为类似以下的路径就…

VisualVM工具的下载及插件安装

文章目录 一.前言二.下载安装三.插件安装 一.前言 VisualVM作为GitHub的独立工具分发&#xff0c;并作为GraalVM的可选组件分发。两者都是具有相同功能的相同位。独立工具在任何兼容的JDK上运行&#xff0c;捆绑工具配置为使用主机GraalVM运行。 VisualVM也作为Java VisualVM…

IDEA-集成VisualVM插件,启动Java VisualVM

起因: 我忘了我之前起程序去关联Java VisualVM是咋配的了今天百度搜的时候意外发现idea可以直接起&#xff0c;只需要安装VisualVM插件然后启动Java VisualVM 安装VisualVM插件 路径: File->Setting->Plugins 操作:在marketplace里搜关键词VisualVM&#xff0c;然后点…

VisualVM【实践 01】工具VisualVM下载使用及插件Visual GC示例说明HashMap初始化容量initialCapacity的影响(源码及visualvm_215.zip分享)

VisualVM【官网】很难下载&#xff0c;懂得都懂 &#x1f622;&#xff0c;简单叙述一下下载的过程&#xff1a; 使用PC各种浏览器失败【❌】使用Android手机多个浏览器失败【❌】使用IOS手机多个浏览器&#xff0c;仅有Safari浏览器成功【&#x1f197;】 大家可以体会一下&…

深入理解Java虚拟机——VisualVM工具的下载及安装

目录 一、VisualVM工具的概述二、VisualVM工具的下载地址如下&#xff1a;三、VisualVM工具的安装步骤&#xff1a; 一、VisualVM工具的概述 VisualVM&#xff08;All-in-One Java Troubleshooting Tool&#xff09;是到目前为止随JDK发布的功能最强大的运行监视和故障处理程序…

vs = VirtualService

VirtualService 您是正确的。我混淆了Kubernetes中的资源类型。"vs"是Istio服务网格中的资源类型&#xff0c;代表Virtual Service&#xff08;虚拟服务&#xff09;。 Virtual Service是Istio中的一种路由规则&#xff0c;它定义了如何将请求路由到服务的不同版本…

深入理解java虚拟机(十一)VisualVM:多合-故障处理工具

文章目录 前言一、VisualVM兼容范围与插件安装二、生成、浏览堆转储快照三、分析程序性能四、BTrace动态日志跟踪结尾 前言 VisualVM在JDK 6 Update 7中首次发布&#xff0c;直到JRockit Mission Control与OracleJDK的融合工作完成之前&#xff0c;它都曾是Oracle主力推动的多…

visualvm安装并且讲解说明

Jvisualvm安装并且讲解说明 1.visualvm安装使用教程 1.visualvm安装使用教程 注意:JDK 1.8之前是自带的&#xff0c;我的是jdk11所以需要手动安装 安装软件地址: 链接&#xff1a;https://pan.baidu.com/s/1JEWpF6eyBCAVNo5rBEa08Q 提取码&#xff1a;8y37 安装教程 1.下载对应…

性能分析利器总结一《VisualVM》

VisualVM 随着JDK7而出现&#xff0c;位于JDK根目录下的bin目录下。运行环境需JDK1.6及以上&#xff0c;能监控JDK1.4以上版本的应用程序。 相比JConsole&#xff0c;感觉功能更强大&#xff0c;且可集成各类插件&#xff0c;使其更强大。Jconsole算是VisualVM的子集吧。另外…

VM 和 VC

一、vm 1、Vue的实例对象&#xff0c;以后简称vm。 (1) vm的隐式原型属性指向Vue的原型对象。 (2) VueComponent的原型对象的隐式原型属性指向Vue的原型对象。 二、vc 1、组件本质&#xff1a; 组件其实是一个名为VueComponent的构造函数&#xff0c;且不是程序员定义的&am…