006-中断

人工智能40

利用中断消除数码管的显示抖动

中断

引例:烧水,电视,电话,在某个场景下同时发生,此刻人作为处理这些问题的唯一主体,就需要有一个轻重缓急,按照紧迫程度(优先级)去解决这些问题。

中断使能寄存器——IE的控制位(8位控制):

  • 第7位 EA——总中断, 为1时打开(总开关)
  • 第1位 ET0——定时器0中断使能,为1时打开(相当于闹钟开关)

注意:

  • 中断函数不需要调用,达到中断条件自动进入。
  • 刷新时间固定1ms,不会受到计算过程的影响。
  • 中断函数定义时,格式为:
    void InterruptTime0() interrupt 1
    其中的1表示中断函数编号,其计算方式为:x*8+3=?,?为中断向量地址的十进制值,例如本例采用T0中断,对应地址为0x000B=11,所以x=1。
    006-中断
  • 中断优先级分为固有优先级和抢占优先级:
    固有优先级:几个中断同时发生时,先处理优先级默认高的程序,处理过程中对其他一切中断不予响应。
    抢占优先级:同时发生中断,优先级高的西先响应,在处理中断过程中,出现更高级别优先级,则先执行更改级别优先级再回来处理当前优先级。

实验一:我们对【005-数码管的使用】中 方案三 的程序进行改动,使用中断函数以解决抖动问题。

#include<reg52.h>   //&#x5934;&#x6587;&#x4EF6;

sbit LS1 = P2^2;    //74LS138&#x63A7;&#x5236;&#x7AEF;
sbit LS2 = P2^3;
sbit LS3 = P2^4;

unsigned char shu_ma_guan[16] = {
    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,    //0~F&#x7684;&#x5BF9;&#x5E94;&#x503C;
    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//&#x5168;&#x5C40;&#x53D8;&#x91CF;
unsigned char LedBuff[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //&#x5B9A;&#x4E49;8&#x4E2A;&#x6570;&#x7801;&#x7BA1;&#x521D;&#x59CB;&#x72B6;&#x6001;&#x5747;&#x4E3A;00000000&#xFF0C;&#x5373;&#x90FD;&#x4E0D;&#x663E;&#x793A;
unsigned char flag1s = 0;   //&#x4E00;&#x79D2;&#x5230;&#x8FBE;&#x6807;&#x5FD7;&#x4F4D;&#xFF0C;&#x4E3A;1&#x5373;&#x8868;&#x793A;&#x5230;&#x8FBE;&#x4E00;&#x79D2;
unsigned int cnt = 0;
unsigned char i = 0;

void main()     //&#x4E3B;&#x51FD;&#x6570;
{
    unsigned long sec = 0;

    TMOD = 0x01;    //&#x5B9A;&#x65F6;&#x5668;&#x5B9A;&#x4E49;&#xFF0C;&#x6676;&#x632F;12Mhz,&#x6BCF;&#x6B21;1ms
    TH0 = 0xFC;
    TL0 = 0x18;
    TR0 = 1;    //&#x6253;&#x5F00;&#x5B9A;&#x65F6;&#x5668;
    EA = 1;         //&#x6253;&#x5F00;&#x4E2D;&#x65AD;&#x603B;&#x5F00;&#x5173;
    ET0 = 1;    //&#x6253;&#x5F00;&#x5B9A;&#x65F6;&#x5668;0&#x4E2D;&#x65AD;&#x5F00;&#x5173;

    while(1)
    {
        if(flag1s == 1 )    //&#x5224;&#x65AD;&#x662F;&#x5426;&#x5230;&#x4E00;&#x79D2;
        {
            flag1s = 0; //&#x65F6;&#x95F4;&#x5230;&#x8FBE;&#x4E00;&#x79D2;&#xFF0C;&#x6807;&#x5FD7;&#x590D;&#x4F4D;
            sec++;      //&#x65F6;&#x95F4;&#x5230;&#x8FBE;&#x4E00;&#x79D2;&#x81EA;&#x52A8;&#x52A0;1
            LedBuff[0] = shu_ma_guan[sec%10];   //&#x786E;&#x5B9A;&#x6570;&#x7801;&#x7BA1;&#x5728;&#x67D0;&#x4E2A;&#x65F6;&#x95F4;&#x65F6;&#x5404;&#x4E2A;&#x4F4D;&#x7684;&#x663E;&#x793A;&#x6570;&#x5B57;
            LedBuff[1] = shu_ma_guan[sec/10%10];
            LedBuff[2] = shu_ma_guan[sec/100%10];
            LedBuff[3] = shu_ma_guan[sec/1000%10];
            LedBuff[4] = shu_ma_guan[sec/10000%10];
            LedBuff[5] = shu_ma_guan[sec/100000%10];
            LedBuff[6] = shu_ma_guan[sec/1000000%10];
            LedBuff[7] = shu_ma_guan[sec/10000000%10];
        }
     }
}

//&#x4E2D;&#x65AD;&#x51FD;&#x6570;
void InterruptTime0() interrupt 1   //&#x51FD;&#x6570;&#x540D;&#x4E2D;&#x5728;&#xFF1A;Interrupt&#x2014;&#x2014;&#x4E2D;&#x65AD;&#x51FD;&#x6570;&#xFF0C;Time0&#x2014;&#x2014;&#x5B9A;&#x65F6;&#x5668;0&#x4E2D;&#x65AD;
                    //&#x4E0D;&#x8981;&#x5FD8;&#x8BB0;interrupt&#x5173;&#x952E;&#x5B57;&#x53CA;1(1&#x7684;&#x8BA1;&#x7B97;&#x770B;&#x6587;&#x7AE0;&#x5F00;&#x5934;)
{
    TH0 = 0xFC; /&#x5B9A;&#x4E49;&#x5B9A;&#x65F6;&#x5668;
    TL0 = 0x18; //&#x6CE8;&#x610F;&#xFF1A;&#x53F3;&#x79FB;TF0&#x6EA2;&#x51FA;&#x65F6;&#xFF0C;&#x8FDB;&#x5165;&#x5B9A;&#x65F6;&#x5668;&#x4E2D;&#x65AD;&#x786C;&#x4EF6;&#x81EA;&#x52A8;&#x6E05;&#x96F6;&#xFF0C;&#x4E0D;&#x5728;&#x9700;&#x8981;&#x8F6F;&#x4EF6;&#x6E05;&#x96F6;&#xFF0C;&#x7701;&#x7565;&#x8BED;&#x53E5;TF0=0&#xFF1B;
    cnt++;      //TFO&#x6EA2;&#x51FA;&#x4E00;&#x6B21;&#xFF0C;&#x81EA;&#x52A8;&#x52A0;1
    if(cnt == 1000)     /&#x65F6;&#x95F4;&#x5230;&#x8FBE;&#x4E00;&#x79D2;
    {
        cnt = 0;    //&#x590D;&#x4F4D;&#xFF0C;&#x4ECE;&#x65B0;&#x8BA1;&#x6B21;
        flag1s = 1; //1&#x79D2;&#x5230;&#x8FBE;&#x6807;&#x5FD7;&#x7F6E;1
    }

    P0 = 0x00;  //&#x6D88;&#x9664;&#x9B3C;&#x5F71;&#xFF0C;&#x4F7F;&#x5F97;&#x6570;&#x7801;&#x7BA1;&#x7684;&#x6240;&#x6709;&#x6BB5;&#x5168;&#x706D;
    switch(i)   //&#x6570;&#x7801;&#x7BA1;&#x5237;&#x65B0;
    {
        case 0: LS3=0;LS2=0;LS1=0;i++;P0=LedBuff[0];break;
        case 1: LS3=0;LS2=0;LS1=1;i++;P0=LedBuff[1];break;
        case 2: LS3=0;LS2=1;LS1=0;i++;P0=LedBuff[2];break;
        case 3: LS3=0;LS2=1;LS1=1;i++;P0=LedBuff[3];break;
        case 4: LS3=1;LS2=0;LS1=0;i++;P0=LedBuff[4];break;
        case 5: LS3=1;LS2=0;LS1=1;i++;P0=LedBuff[5];break;
        case 6: LS3=1;LS2=1;LS1=0;i++;P0=LedBuff[6];break;
        case 7: LS3=1;LS2=1;LS1=1;i=0;P0=LedBuff[7];break;
        default: break;
    }
}
</reg52.h>

Original: https://www.cnblogs.com/Yang-shihao/p/14353178.html
Author: shihao_Yang
Title: 006-中断

相关文章
人工智能

Python-Tensorflow图像数字验证码识别

啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可以到 建议专区 反馈...
人工智能

Tensorflow手写数字识别

Tensorflow手写数字识别 前言 一、关于mnist数据集 二、搭建过程 * 1.导入数据集 2.数据集预处理 3.构建全连接层模型 4.梯度下降求最小Loss 5.测试集查看模型训练精度 6....