YangHY 发表于 2026-1-23 12:13:08

我们马上写个中断函数:

void INT1_Init(void) //INT1中断(上升沿和下降沿)P33按下,0可同时支持上升沿和下降沿
{
        IT1 = 1;                        //下降沿中断,0是上升沿和下降沿都可以
        EX1 = 1;                        //打开中断允许
        EA = 1;                                //打开总中断
}

void INT_ISR(void) interrupt 2//INT1中断(上升沿和下降沿)P33按下,可同时支持上升沿和下降沿
{
        P04 = !P04;
        P05 = !P05;
        P06 = !P06;
        P07 = !P07;
       
        //P33按下,P01就取反
}

YangHY 发表于 2026-1-23 12:14:22

刚才都中断函数时在io.c里写的
我们在io.h里声明一下:
#ifndef __IO_H
#define __IO_H

#include "config.h"                        //调用头文件

#define ROW1        P06                        //端口定义
#define ROW2        P07
#define COL1        P00
#define COL2        P01
#define COL3        P02
#define COL4        P03

#define HC595_SER         P34
#define HC595_RCK         P35
#define HC595_SCK         P32

extern u8 key_num ;

void LED0_Blink(void);
void LED1_Blink(void);
void LED2_Blink(void);

void KEY_Task(void);
void Task_1(void);
void SEG_Task(void);
void Init_595(void);
void PW_write_Task(void);

void INT1_Init(void);

#endif

YangHY 发表于 2026-1-23 12:15:30

接着找主函数初始化调用

void main(void)
{
        Sys_init();                                                                                //系统初始化
        usb_init();                                     //USB CDC 接口配置

    IE2 |= 0x80;                                    //使能USB中断
        Timer0_Init();                                                                        //定时器初始化
        Init_595();
        INT1_Init();//外部中断1(P33按下)中断初始化                                                                        //外部中断1初始化
       
    EA = 1;                                                                                        //IE |= 0X80;
       
        P40 = 0;
       
        while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
//        WDT_CONTR = 0X24;
       
        while(1)
        {
               
      if (bUsbOutReady)                                                        //如果接收到了数据
      {
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                       
            usb_OUT_done();                                                        //
      }
//                Task_Pro_Handler_Callback();                                //执行功能函数
//                if(P33 !=0)
//                        WDT_CONTR = 0X34;//看门狗和任务调度函数都关闭,只剩下LED3秒取反一次
               
                P00 = !P00;
                P01 = !P01;
                P02 = !P02;
                P03 = !P03;
               
               
               
                Delay3000ms();
               
/*不信中断,可以用下面代码替换
                if(P33==0)
                {
                        P04 = !P04;
                        P05 = !P05;
                        P06 = !P06;
                        P07 = !P07;
               
                }
你会发现,P33就很不灵光了吧?*/
        }
}

YangHY 发表于 2026-1-23 12:33:39

之所以要3秒延时,就是反应出外部中断的作用

不用外部中断,这3S内都不搭理你,哪怕你把P33按烂!

编译链接下载:

3秒P00的LED变化一次

YangHY 发表于 2026-1-23 12:35:05

有外部中断1的情况下

按P33,随时反应,很灵光!

YangHY 发表于 2026-1-23 12:38:56

把外部中断1去掉

直接在主函数循环添加按下P33点亮LEDP01

你会发现基本上没应答,没反应的!

YangHY 发表于 2026-1-23 12:43:15

课后小练习:

利用光栅,来给雕刻机搞个保护开关

主要是外部中断启动后立马关电源!

红外光栅传感器不贵,100多久买的到

第十三课到此结束!

YangHY 发表于 2026-1-26 20:47:15

今天我们继续学习第十四集 IO中断(所有普通IO都支持的“外部中断")

这和传统的8051不同,普通的IO口也支持“外部中断”

YangHY 发表于 2026-1-26 20:52:02

和传统外部中断比较:

YangHY 发表于 2026-1-26 21:07:11

选择合适的中断模式:

这个和模式寄存器设置和相似
页: 73 74 75 76 77 78 79 80 81 82 [83] 84 85 86 87 88 89 90 91 92
查看完整版本: 第一课 序言《AI8051U的特点》