• 中断计数器定时器串口通信


    1、(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。

    2、(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。

    3、TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。

    CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。

    EX0(IE.0),外部中断0允许位;

    ET0(IE.1),定时/计数器T0中断允许位;

     EX1(IE.2),外部中断0允许位;

    ET1(IE.3),定时/计数器T1中断允许位;

    ES(IE.4),串行口中断允许位;

    EA (IE.7), CPU中断允许(总允许)位。

    1、TCON的中断标志

    IT0(TCON.0),外部中断0触发方式控制位。
            当IT0=0时,为电平触发方式。
            当IT0=1时,为边沿触发方式(下降沿有效)。
    IE0(TCON.1),外部中断0中断请求标志位。
    IT1(TCON.2),外部中断1触发方式控制位。
    IE1(TCON.3),外部中断1中断请求标志位。
    TF0(TCON.5),定时/计数器T0溢出中断请求标志位。
    TF1(TCON.7),定时/计数器T1溢出中断请求标志位。

     同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:

    中断源

    中断响应条件
    中断源有中断请求;
    此中断源的中断允许位为1;
    CPU开中断(即EA=1)。

     以外部中断0为例:

    主程序中需要有以下代码:
    EA=1;//打开总中断开关
    EX0=1;//开外部中断0
    IT0=0/1;//设置外部中断的触发方式

    中断服务函数:

    void   int0   ()  interrupt   0    using  1
    {
      do anything that you want
    }

     

    定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器THx和TLx组成。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。

     定时/计数器的控制

    51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。
        1、工作方式寄存器TMOD
           工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:

    GATE是门控位, GATE=0时,用于控制定时器的启动是否受外部中断源信号的影响。只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了INT0/1引脚为高电平这一条件。
    C/T :定时/计数模式选择位。C/T =0为定时模式;C/T =1为计数模式。
    M1M0:工作方式设置位。定时/计数器有四种工作方式。

    2、控制寄存器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类同。

    定时器模式时有:N=t/ Tcy
    计数初值计算的公式为:X=213-N。
    定时器的初值还可以采用计数个数直接取补法获得。
    计数模式时,计数脉冲是T0引脚上的外部脉冲。

           门控位GATE具有特殊的作用。当GATE=0时,经反相
    后使或门输出为1,此时仅由TR0控制与门的开启,与门输出
    1时,控制开关接通,计数开始;当GATE=1时,由外中断引
    脚信号控制或门的输出,此时控制与门的开启由外中断引脚
    信号和TR0共同控制。当TR0=1时,外中断引脚信号引脚的
    高电平启动计数,外中断引脚信号引脚的低电平停止计数。
    这种方式常用来测量外中断引脚上正脉冲的宽度。

    定时/计数器的工作方式

    http://www.cnblogs.com/kldsw/p/8644433.html

    计数器初值的计算

    机器周期也就是CPU完成一个基本操作所需要的时间。
    机器周期=1/单片机的时钟频率。
    51单片机内部时钟频率是外部时钟的12分频。也就是说当外部晶振的频率输入到单片机里面的时候要进行12分频。比如说你用的是12MHZ的晶振,那么单片机内部的时钟频率就是12/12MHZ,当你使用12MHZ的外部晶振的时候。机器周期=1/1M=1us。
    而我们定时1ms的初值是多少呢,1ms/1us=1000。也就是要计数1000个数,初值=65535-1000+1(因为实际上计数器计数到66636才溢出)=64536=FC18H

    初始化程序应完成如下工作:
    对TMOD赋值,以确定T0和T1的工作方式。
    计算初值,并将其写入TH0、TL0或TH1、TL1。
    中断方式时,则对EA赋值,开放定时器中断。
    使TR0或TR1置位,启动定时/计数器定时或计数

    以定时器0模式工作方式1为例:

    主程序中需要有以下代码:

    TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

    TH0=0XFC; //给定时器赋初值,定时1ms
    TL0=0X18;
    ET0=1;//打开定时器0中断允许
    EA=1;//打开总中断
    TR0=1;//打开定时器

     

    中断服务函数:

    void Timer0() interrupt 1
    {
       static u16 i;
       TH0=0XFC; //给定时器赋初值,定时1ms
       TL0=0X18;
       i++;
       if(i==1000)
        {
          i=0;
          led=~led;
        }
    }

     

    串口通信原理

    http://www.cnblogs.com/kldsw/p/8644301.html 

    串行通信常见的错误校验

    1、奇偶校验
          在发送数据时,数据位尾随的1位为奇偶校验位(1或0)。奇校验时,数据
    中“1”的个数与校验位“1”的个数之和应为奇数;偶校验时,数据中“1”的个数
    与校验位“1”的个数之和应为偶数。接收字符时,对“1”的个数进行校验,若发
    现不一致,则说明传输数据过程中出现了差错。
    2、代码和校验
          代码和校验是发送方将所发数据块求和(或各字节异或),产生一个字节
    的校验字符(校验和)附加到数据块末尾。接收方接收数据同时对数据块(除
    校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行
    比较,相符则无差错,否则即认为传送过程中出现了差错。
    3、循环冗余校验
          这种校验是通过某种数学运算实现有效信息与校验位之间的循环校验,常
    用于对磁盘信息的传输、存储区的完整性校验等。这种校验方法纠错能力强,
    广泛应用于同步通信中。

    传输速率

     比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps)。如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位、1个停止位、8个数据位),这时的比特率为:
               10位×240个/秒 = 2400 bps

    传输距离与传输速率的关系

    串行接口或终端直接传送串行信息位流的最大距离与传输速率及传输线的电气特性有关。当传输线使用每0.3m(约1英尺)有50PF电容的非平衡屏蔽双绞线时,传输距离随传输速率的增加而减小。当比特率超过1000 bps 时,最大传输距离迅速下降,如9600 bps 时最大距离下降到只有76m(约250英尺)。

    2、功能特性

    采用RS-232C接口存在的问题

    1、传输距离短,传输速率低
         RS-232C总线标准受电容允许值的约束,使用时传输距离一般不要超过15米(线路条件好时也不超过几十米)。最高传送速率为20Kbps。

    2、有电平偏移
         RS-232C总线标准要求收发双方共地。通信距离较大时,收发双方的地电位差别较大,在信号地上将有比较大的地电流并产生压降。

    3、抗干扰能力差
          RS-232C在电平转换时采用单端输入输出,在传输过程中当干扰和噪声混在正常的信号中。为了提高信噪比,RS-232C总线标准不得不采用比较大的电压摆幅。

    80C51串行口的结构

    有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H ;接收器是双缓冲结构 ;发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误。

    80C51串行口的控制寄存器

    SCON 是一个特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志:

    SM0和SM1为工作方式选择位,可选择四种工作方式:

    SM2,多机通信控制位,主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。
        在方式0时,SM2必须是0。在方式1时,如果SM2=1,则只有接收到有效停止位时,RI才置1。
    REN,允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。

     TB8,在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。
       在方式0和方式1中,该位未用。

    RB8,在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。

    TI,发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。

    RI,接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。

    PCON中只有一位SMOD与串行口工作有关 :

    80C51串行口的工作方式

    http://www.cnblogs.com/kldsw/p/8644375.html

    波特率的计算

    在串行通信中,收发双方对发送或接收数据的速率要有约定。
    通过软件可对单片机串行口编程为四种工作方式,其中方式0和
    方式2的波特率是固定的,而方式1和方式3的波特率是可变的,
    由定时器T1的溢出率来决定。

    串行口的四种工作方式对应三种波特率。由于输入的移位时钟
    的来源不同,所以,各种方式的波特率计算公式也不相同。

    方式0的波特率 =  fosc/12
    方式2的波特率 =(2SMOD/64)· fosc
    方式1的波特率 =(2SMOD/32)·(T1溢出率)
    方式3的波特率 =(2SMOD/32)·(T1溢出率)

    当T1作为波特率发生器时,最典型的用法是使T1工作在自动再装入的8位定时器方式(即方式2,且TCON的TR1=1,以启动定时器)。这时溢出率取决于TH1中的计数值。
             T1 溢出率 = fosc /{12×[256 -(TH1)]}
         在单片机的应用中,常用的晶振频率为:12MHz和11.0592MHz。所以,选用的波特率也相对固定。常用的串行口波特率以及各参数的关系如表所示。

    串口如何使用

    串行口工作之前,应对其进行初始化,主要是设置产
    生波特率的定时器1、串行口控制和中断控制。具体
    步骤如下:
    确定T1的工作方式(编程TMOD寄存器);
    计算T1的初值,装载TH1、TL1;
    启动T1(编程TCON中的TR1位);
    确定串行口控制(编程SCON寄存器);
    串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。

    以串口工作方式1为例:

    主程序中需要有以下代码:

    SCON=0X50; //设置为工作方式1
    TMOD=0X20; //设置计数器工作方式2
    PCON=0X80; //波特率加倍
    TH1=0XF3; //计数器初始值设置,注意波特率是4800的
    TL1=0XF3;
    ES=1; //打开接收中断
    EA=1; //打开总中断
    TR1=1; //打开计数器

     

    中断服务函数:

    void Usart() interrupt 4
    {
      u8 receiveData;

      receiveData=SBUF;//出去接收到的数据
      RI = 0;//清除接收中断标志位
      SBUF=receiveData;//将接收到的数据放入到发送寄存器
      while(!TI); //等待发送数据完成
      TI=0; //清除发送完成标志位
    }

  • 相关阅读:
    LeetCode 222. Count Complete Tree Nodes
    k8s控制节点etcd删除并重新加入
    k8s证书延长时间(二)
    二进制安装多master节点的k8s集群(2)
    kubeadm安装多master节点的k8s集群(1)
    OutOfMemoryError异常总结
    使用线程
    操作系统基础
    java 代码执行顺序
    jvm的内存模型
  • 原文地址:https://www.cnblogs.com/kldsw/p/8644006.html
Copyright © 2020-2023  润新知