zoukankan      html  css  js  c++  java
  • 中断结合代码分析

    中断结合代码分析

    中断结构图

     

     

     

    所有中断程序需要完成的步骤

    中断响应条件

    •  此中断源的中断允许位为1;
    •  CPU开中断(即EA=1);
    •  中断源有中断请求;

    以上三条同时满足时,CPU才有可能响应中断。因为串口中断和定时器中断还需要其他设置条件,即这个条件只是说明了第一张图中IE需要设置,中断条件完整还需要设置TCON,SCON,定时器中断及串口中断还要加上TMOD的设置以及TH0和TL0初值问题。

    外部中断程序步骤:

    对应代码:蓝色是外加条件,红色任何中断的必要条件,任何中断条件所必须设置的

    • IT0=1;//跳变沿出发方式(下降沿)中断触发方式
    • EX0=1;//打开 INT0 的中断允许。中断源的中断允许
    • EA=1;//打开总中断CPU开中断
    • 当外部中断源触发中断源响应进入中断程序
     1 void Int0Init()  //外部中断的条件设置
     2 {
     3       //设置 INT0
     4      IT0=1;//跳变沿出发方式(下降沿)
     5      EX0=1;//打开 INT0 的中断允许。
     6      EA=1;//打开总中断
     7 }
     8 
     9 
    10 void Int0() interrupt 0 //外部中断 0 的中断函数
    11 {
    12       //写入要完成的任务
    13 }

    定时器中断程序步骤:

    初始化程序应完成如下工作:

    • 对TMOD赋值,以确定T0和T1的工作方式。
    • 计算初值,并将其写入TH0、TL0或TH1、TL1。
    • 中断方式时,则对IE赋值,开放中断。
    • 使TR0或TR1置位,启动定时/计数器定时或计数。

     对应代码:蓝色是外加条件,红色任何中断的必要条件,任何中断条件所必须设置的

    • TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
    • TH0=0XFC; //给定时器赋初值,定时1ms
    • TL0=0X18;
    • ET0=1;//打开定时器0中断允许 中断源的中断允许
    • EA=1;//打开总中断 打开总中断CPU开中断
    • TR0=1;//打开定时器  开始计数
    • 当定时器溢出时中断开始即中断源发生响应
     1 void Timer0Init()
     2 {
     3     TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
     4     TH0=0XFC;    //给定时器赋初值,定时1ms
     5     TL0=0X18;    
     6     ET0=1;//打开定时器0中断允许
     7     EA=1;//打开总中断
     8     TR0=1;//打开定时器            
     9 }
    10 
    11 void Timer0() interrupt 1
    12 {
    13       //发生定时器中断索要完成的任务    
    14 }

    串口中断程序步骤:

    串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。具体步骤如下:
    ●确定串行口控制(编程SCON寄存器确定串口工作方式SM0,SM1,允许串口接受REN);
    ●确定T1(定时器)的工作方式(编程TMOD寄存器);
    ●计算T1的初值,装载TH1、TL1;
    ●串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。中断源的中断允许   打开总中断CPU开中断
          ——打开允许中断,依次打开串口允许中断位ES,总中断允许位EA(=1,允许)
    ●启动T1(编程TCON中的TR1位);
    当串口有中断请求时(串口有数据传输时)即中断源发生响应,开始进入中断程序

    在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。

    对应代码:蓝色是外加条件,红色任何中断的必要条件,任何中断条件所必须设置的

    • SCON=0X50; //设置为工作方式1
    • TMOD=0X20; //设置计数器工作方式2
    • PCON=0X80; //波特率加倍
    • TH1=0XF3; //计数器初始值设置,注意波特率是4800的
    • TL1=0XF3;
    • ES=1; //打开接收中断
    • EA=1; //打开总中断
    • TR1=1; //打开计数器
     1 void UsartInit()
     2 {
     3     SCON=0X50;            //设置串口为工作方式1
     4     TMOD=0X20;            //设置计数器工作方式2
     5     PCON=0X80;            //波特率加倍
     6     TH1=0XF3;                //计数器初始值设置,注意波特率是4800的
     7     TL1=0XF3;
     8     ES=1;                        //打开接收中断
     9     EA=1;                        //打开总中断
    10     TR1=1;                    //打开计数器
    11 }
    12 
    13 void Usart() interrupt 4
    14 {
    15     u8 receiveData;
    16 
    17     receiveData=SBUF;//出去接收到的数据
    18     RI = 0;//清除接收中断标志位
    19     SBUF=receiveData;//将接收到的数据放入到发送寄存器
    20     while(!TI);             //等待发送数据完成
    21     TI=0;                         //清除发送完成标志位
    22 }
  • 相关阅读:
    python的三个函数map、filter、reduce详解
    python 对文件进行切分行
    sed 命令匹配行操作
    停止学习框架
    JS中双等号“==”使用情况
    JavaScript中数组迭代方法
    JavaScript中replace()方法的第二个参数解析
    Vue生命周期
    JS中浮点数精度误差解决
    大量DOM操作的解决方案
  • 原文地址:https://www.cnblogs.com/zhj868/p/12513768.html
Copyright © 2011-2022 走看看