单片机学习小组
直播中

王飞云

7年用户 1432经验值
私信 关注

什么是中断?CPU如何知道是哪一个中断呢

什么是中断?CPU如何知道是哪一个中断呢?C语言如何去编写我们的中断系统函数?

回帖(1)

丁欣如

2022-2-25 14:27:56
1、规范使用我们的单片机开发板
   
    (1)、给单片机通电之后,
                不要用手触摸引脚
        
    (2)、芯片不能装反
   
    (3)、先关闭单片机电源,再撤掉数据线
   

2、LED流水灯


/*------------------按键 ---------------------*/

我们51单片机。一共是配置有4个独立的按键

   
        key1  ===》 P3^3
        key2  ===》 P3^4
        key3  ===》 P3^6
        key4  ===》 P3^7
        
        ***it key1 = P3^3;
        if(key1 == 0)
        {
            执行语句1;
        }
        else
        {
            ````````;
        }
   
    练习:
        编写一个按键控制LED灯的函数;
            测试没有小抖动的程序与消除抖动之间的区别。


/*-------------------模块化编程----------------*/

1、对工程进行模块化划分
    一个模块一个.c
        一个.c 对应一个 .h
   
    在.c 文件中 , 一个功能一个函数
   
    在*.c文件中,如果需要需要用到其他模块的函数
        怎么办?
            #include "****.h"
            去包含
   
    在.c文件中 , 每一个函数, 我们需要对它进行功能注释, 方便以后进行复习回顾
   
   
   

    练习:
        把我们的工程进行模块化
        
        
    全局变量 、 局部变量
   
    int a ;
   
    void sum()
    {
        int b = 1 , c = 2;
        a = b + c;
    }
   
    void chu()
    {
        int b = 2 , c = 1;
        a = b / c;
    }

    main()
    {
        sum();
        chu();
    }

/---------* 蜂鸣器 * ------- /
蜂鸣器:
    蜂鸣器威廉希尔官方网站 :
        使用的PNP型三极管 驱动蜂鸣器 , 当P0^7为低电平时,PN结
        正向偏置,三极管导通,蜂鸣器发出声音:
        
        ***it beep = P0^7;

        练习:
            通过按键,操作我们的蜂鸣器



========================================================
/---------------------中断------------------------/

1、问题的引入
        while(1)
        {
            if( 0 == key1 )
                ;
            
            if( 0 == key2 )
                ;
        }
        
        上面这种检测按键是否按下的方式:
            称之为    “轮询”
            
   
2、轮询
    轮流的询问 , (相当于 CPU 一直询问按键 1 与 按键 2 , 是否按下)
    显然 , 轮询去判断按键 ,有什么缺点?
        
        (1)、 占用CPU
        (2)、 轮询存在时间差

   
    我们这里用的方式是一直在等待 , 那么有没有一种方法 , 不用去登 ,
    而是当有按键按下或者弹起的时候 , 来通知 “我”
   
   
==》》 中断系统
   

1、什么是中断?
        
        我们一般把打断CPU执行顺序的事件 , 称之为中断 ,
        
        C51中断原理
            当特定的中断产生时 , CPU会立即切换到中断模式
            打断我们main函数的执行 , 到指定的地址去执行中断处理函数。
            
        
        例子:
            看综艺
            玩游戏、打电话
        


    中断源:
        产生中断事件的设备
        
        C51中 支持 5 个中断
            
            外部中断0         P3^2
            定时器0中断
            外部中断1        P3^3
            定时器1中断
            串口中断
            
    那么当中断产生之后 , 我们如何知道是哪一个中断呢?我们该去哪里找

    CPU如何知道是哪一个中断:
        
        中断向量表
            
            不同的中断 , 对应的不同的入口地址
         

[tr]编号中断源:入口地址[/tr]
0外部中断00003H
1定时器0中断 000BH
2外部中断10013H
3定时器1中断 001BH
4串口中断 0023H
编号才编程当中最需要用到的
        所以请多看、多记编号
           

C51中断的配置
            外部中断0 、 1:
               
                触发方式:
                    低电平触发:        IT0 = 0      IT1 = 0
                    下降沿触发:        IT0 = 1         IT1 = 1
                    
               
                中断开关:
                    EX0  ->  外部中断 0
                    EX1  ->  外部中断 1
                            使能外部中断  EX0  EX1  , 置 1
               
                中断总开关
               
                    EA = 1
               
        
        C语言如何去编写我们的中断系统函数
        
        
        1、中断初始化
        
        2、编写中断服务函数
                   
        练习:   
            通过外部按键中断 ,去打断我们main执行的流水灯 ,
                中断服务函数(另一种花样的流水灯程序)
               
        
        伪代码:
        
   
                /*-----------中断初始化函数---------------*/
            
            void  interrupt_init()
            {
                //配置外部中断1 , 低电平触发:
                //使能外部中断1
                //开启中断总允许
            }


            /*------------中断服务函数---------------*/
            void  interrupt(void)  interrupt  编号
            {
                //用户自由编写
            }

实例

#include"interrupt.h"
#include"led.h"
#include"key.h"
#include



        /*-----------中断初始化函数---------------*/
                       
                        void  interrupt_init()
                        {
                                IT1 = 0;   //配置外部中断1,低电平触发
                                EX1 = 1;   //使能外部中断1
                                EA  = 1;   //开启中断总允许
                        }


                        /*------------中断服务函数---------------*/
                        void  interrupt_IT1(void)  interrupt 2
                        {
                                led_huayang();
                        }

        
/*-------------数码管-------------*/

数码管:
    准备来说,是LED数码管
        
        是由多个发光二极管封装在一起组成“8”字型的器件
        
        对应的LED引脚已经在内部连接成功,总共8个LED
        
        分别对应的字母为
        
            a , b , c ,d , e , f , g ,dp

        
        例如:
            显示数字 “2”
            
            a亮,b亮,c灭 , d亮 ,e亮 ,f灭 ,g亮 ,dp亮
            
            0010 0100        ==》    0x24
            我们16进制对应的二进制表达式:
                低字节是在右边
                    所以我们的寄存器P0组的P0^0对应的
                    是最右边的比特
                        
                        所以需要从右开始依次对P0组进行改写




                    
                    
                        0010 0100
                                    0x24
                        进行寄存器整体赋值
            
            P0 = 0x24;
            
            在点亮我们的数码管之前:
                要开启相应的位选 , 也就是开关
               
                是的我们的a~dp把条引线去作用于对应的数码管

位选代码

#include"shumaguan.h"
#include"delay.h"
#include

***it w1 = P1^0;
***it w2 = P1^1;
***it w3 = P1^2;
***it w4 = P1^3;

void show_0718(){
        w4 = 0;
        P0 = 0xc0;
        delay_ms(1);
        w4 = 1;
      
        w3 = 0;
        P0 = 0xf8;
        delay_ms(1);
        w3 = 1;
      
        w2 = 0;
        P0 = 0xf9;
        delay_ms(1);
        w2 = 1;
      
        w1 = 0;
        P0 = 0x7f;
        delay_ms(1);
        w1 = 1;
}
         

   
   
总结今天讲的内容:
   
    蜂鸣器、按键 、模块化编程、数码管 、中断
   
    1、外部按键中断实现所有的数码管依次从0显示到9
        
        中断用外部中断1 , 下降沿触发的方式
        
        (用到延时函数)

   
举报

更多回帖

发帖
×
20
完善资料,
赚取积分