【51单片机实验】INT0中断计数

来源:互联网 发布:淘宝微淘在哪 编辑:程序博客网 时间:2024/05/18 03:55

前言
—中断源—

  • 52单片机:6个中断源:

  • INT0:外部中断0,P3.2,引起:低电平、下降沿

    INT1:外部中断1,P3.3,引起:低电平、下降沿

    T0:定时器/计数器0中断,由T0计数器计满回零引起
    T1:定时器/计数器1中断,由T1计数器计满回零引起
    T2:定时器/计数器2中断,由T2计数器计满回零引起
    TI/RI:串行口中断,引起:串行端口完成一帧字符发送/接收
    中断源及优先级顺序
    优先级

    —51系列单片机中用于中断控制的寄存器为—

  • IE,中断允许控制寄存器,各位定义如下:

  • (外定0;外定1;串;空空;C)
    EX0(IE.0),外部中断0允许位;
    ET0(IE.1),定时/计数器T0中断允许位;
    EX1(IE.2),外部中断0允许位;
    ET1(IE.3),定时/计数器T1中断允许位;
    ES (IE.4),串行口中断允许位;
    ET2(IE.5),定时器/计数器2中断允许位(T2:51特有)
    EA (IE.7), CPU中断允许(总允许)位。
    有的芯片IE.5及IE.6没用定义。
    值为1,开中断;值为0,关中断
    中断允许寄存器IE
  • IP,中断优先级控制寄存器,各位定义如下:
  • (外定0;外定1;串定2;空空)
    PX0(IP.0),外部中断0优先级设定位;
    PT0(IP.1),定时/计数器T0优先级设定位;
    PX1(IP.2),外部中断0优先级设定位;
    PT1(IP.3),定时/计数器T1优先级设定位;
    PS (IP.4),串行口优先级设定位;
    //PT2(IP.5) ,52芯片是无效位,定时/计数器T2优先级设定位。
    IP.6和IP.7没有定义。
    中断优先级寄存器IP.png
    —中断嵌套—
     高优先级能打断低优先级-》中断嵌套;同优先级则不能,按照默认级别响应,若设置优先级,则按照设置顺序相应。
    —中断函数—

  • 中断函数是硬件或者操作系统自动调用
    也就是说只要满足触发条件,就会自动调用中断函数(此时主函数是停止的)。
    当中断函数执行完毕,又返回主函数继续执行主函数。
    然后这样不断的循环,反正只要是触发中断的条件一满足。
    就会自动进入中断(前提是你的中断的配置是正确的)
     
    实验一
    INT0中断计数
    流程图
    INT0中断
    程序分析

  • 计数按键:P3.2引脚(INT0),IE=0x81(1000 0001对应:EA,EX0,ET0,EX1,ET1,ES):允许INT0中断,

  • IT0=1:将INT0中断触发方式设为下降沿触发:按键按下,P3.2由高到低触发中断;
    未释放,则不会持续触发;
    只有 释放按键后再次按下,才会由跳变再次出发,累加计数值

  • 按键识别

    计数键:(中断方式:interrupt 0)
    中断触发识别,中断触发即表示计数键按下,中断例程EX_INT0将自动调用,Count累加,INT0:interrupt 0

    清零键(查询方式 while();)
    while(1);实现,循环轮询,不间断查看P3.4是否为0,若为0,清零键按下
    扩展
    可修改代码:交换计数键和清零键的工作方式。

    代码

/*每次按下计数键时,触发INT0中断,中断程序累加计数,计数值显示在3只数码管上,按下清零键时数码管清零。*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code DSY_CODE[] = {    0x3f,0x06,0x5b,0x4f,    0x66,0x6d,0x7d,0x07,    0x7f,0x6f,0x00};//0~9的数字编码,最后一位为黑屏uint Count = 0;sbit Clear_Key = P3 ^ 6;void Show_Count_ON_DSY()//显示计数值{    Display_Buffer[2] = Count / 100;//获取三个数位    Display_Buffer[1] = Count % 100 / 10;    Display_Buffer[0] = Count % 10;    if (Display_Buffer[2] == 0)//高位为0时不显示    {        Display_Buffer[2] = 0x0a;//0x0a即是10号,对应0x00        //高位为0时,如果第二位为0,则同样不显示        if (Display_Buffer[2] == 0)            Display_Buffer[1] = 0x0a;    }    P0 = DSY_CODE[Display_Buffer[0]];    P1 = DSY_CODE[Display_Buffer[1]];    P2 = DSY_CODE[Display_Buffer[2]];}void main(){    P0 = 0xff;    P1 = 0xff;    P2 = 0xff;    IE = 0x81;    IT0 = 1;    while (1)    {        if (Clear_Key == 0)            Count = 0;        Show_Count_ON_DSY();    }}void EX_INT0()interrupt 0{    Count++;}

后语
中断是单片机里的重要组成部分,在感觉学习吃力的同时,要掌控好学习进度。(学习时间:大约5小时,注意效率!)