自学嵌入式 day43 中断系统

发布于:2025-08-08 ⋅ 阅读:(13) ⋅ 点赞:(0)
一、中断概念:

        cpu在处理一个任务时,外界来了一个更为紧急的事件,要求cpu暂停当前的工作,转而去处理这个紧急事件,处理完后再回之前的任务继续向下执行

二、中断源

        打断cpu执行当前任务的事件/源头

        个数:五个,外部中断0,timer0,外部中断1,timer1,UART(串口),优先级从左到右

三、外部中断:

        引脚电平变化所引发的中断

四、中断优先级

        在执行中断的过程中,如果外界又发生一次中断,比较优先级,先处理优先级高的

五、中断处理流程

        1、中断源发送出中断请求

        2、检查cpu是否允许中断,及该中断源是否被屏蔽

        3、比较中断的优先级

        4、保护现场

        5、执行中断服务函数

        6、恢复现场

六、中断寄存器

        1、IE:中断允许寄存器(可位寻址)

                1)EA(B7):手动置一,代表cpu响应允许所有的中断

                2)EX(B1):手动置一,代表外部中断0允许中断

        2、TCON寄存器:定时控制寄存器

                1)ITO(B0):置一,代表外部中断0下降沿触发中断

七、程序

        1、外部中断0初始化函数:

                1)P3寄存器中的第二个位置置一

                2)IE寄存器中的第7位和第0位置一

                3)TCON寄存器中的第0位置一

        2、编写中断服务函数

                void einto_handler(void) intereupt0

注:中断向量表:函数指针数组

八、定时器初值
九、定时器相关配置

        1、中断总开关:定时器开关

        2、TMOD寄存器配置:

                1)将TMOD寄存器低4位清零

                2)将TMOD寄存器第0位置1,第一位清零

        3、赋初值

        4、TCON寄存器(bit4)置1,开启计时

        5、IE寄存器配置

                1)IE寄存器B7置1,打开总开关

                2)IE寄存器B1置1,打开定时器0中断开关

十、PWM

        1、脉冲宽度调制器,引脚波形,引脚周期性发生电平翻转

        2、PWM周期:一个方波经历的时间,(从一个上升沿/下降沿到下一个上升沿/下降沿所经历的时间)

        3、PWM控制蜂鸣器以200频率进行工作,占空比为50%

注:有源蜂鸣器:有震荡源,无源蜂鸣器:无震荡源

#include <reg51.h>
#include "led.h"
#include "digiter.h"
#include "key.h"
unsigned int g_n = 0;
unsigned int g_i = 0;
#define HZ200 63035
#define HZ400 64285
#define HZ600 64701
#define HZ800 64910
#define HZ1000 65035

void Timer0_Handler(void) interrupt 1
{
    int ret = 0;
    unsigned short n = 0;
    ret = key_press();
    switch(ret)
    {
        case 1:
        {
             n = HZ200;
             break;
        }
        case 2:
        {
            n = HZ400;
            break;
        }
        case 3:
        {
            n = HZ600;
            break;
        }
        case 4:
        {
            n = HZ800;
            break;
        }
        case 5:
        {
            n = HZ1000;
            break;
        }
        default:
            break;
    }


    TH0 = n >> 8;
    TL0 = n;
    
    P2 ^= (1 << 1) ;    
    
}

void Timer0_Init(void)
{
    key_init();
    TMOD &= ~(0x0F << 0);          
    TMOD |= (1 << 0);

    TH0 = HZ200 >> 8;
    TL0 = HZ200;

    TCON |= (1 << 4);

    IE |= (1 << 7) | (1 << 1);
}


网站公告

今日签到

点亮在社区的每一天
去签到