YangHY 发表于 2026-1-5 20:40:13

普通外部中断 任务二 一进入主函数先执行while 显示0
按P33 低电平触发不松手显示1
按P47 低电平触发不松手显示2
数码管显示0:执行while函数 显示1:执行P3_I0中断
显示2:执行P4_I0中断

因为是普通外部中断40比41中断等级高,按住P33后再按P47
不管怎样都不会响应P47中断,倒过来按住P47后再按P33
肯定先执行P00的40号中断,然后假如松手P33,而P47不松手
就执行P47的41号中断,P47松手就返回while,使用AI8051U
特有的普通IO口中断,也是正常按优先级来

YangHY 发表于 2026-1-5 20:54:08

先把P4 调为最高中断优先级


void P4_IO_Init(void)   //P47端口用作中断初始化
{
      P4IM0 = 0X00; //P4口中断模式为低电平中断
      P4IM1 = 0xFF;
      P4INTE= 0X80; //使能 P4.7 口中断,7是最高位对应0X80

      PINIPH |=(1<<4);//设置P47口中断优先级为3级(最高)1<<4就是0x10
      PINIPL|=(1<<4);    //写入最高优先级,|是不影响其他位
//这样你会发现出问题了,定时器0的优先级都给搞低
//了,所以无法正常显示2,所以要去把定时器0 的优先级也调整到最高
      
}


接着要把定时器0 的优先级也调整到最高:



void Timer0_Init(void)                //1毫秒@24.000MHz
{
      TM0PS = 0x00;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
      AUXR &= 0x7F;                        //定时器时钟12T模式
      TMOD &= 0xF0;                        //设置定时器模式
      TL0 = 0x30;                              //设置定时初始值
      TH0 = 0xF8;                              //设置定时初始值
      TF0 = 0;                              //清除TF0标志
      TR0 = 1;                              //定时器0开始计时
      ET0 = 1;                              //使能定时器0中断

      IPH |=(1<<1);//把定时器0优先级设置为最高
      IP|=(1<<1);


}


这样就正常了

YangHY 发表于 2026-1-5 20:54:47

优先级是要规划的:

YangHY 发表于 2026-1-5 20:56:26

课后:

第十四课到此结束

YangHY 发表于 2026-1-9 19:02:01

先复习一下中断优先级:

例如把P4口中断优先级搞到最高:

void P4_IO_Init(void)   //P47端口用作中断初始化
{
        P4IM0 = 0X00; //P4口中断模式为低电平中断
        P4IM1 = 0xFF;
        P4INTE= 0X80; //使能 P4.7 口中断,7是最高位对应0X80

        PINIPH |=(1<<4);    //设置P47口中断优先级为3级(最高)
        PINIPL |=(1<<4);    //写入最高优先级加或|是不想干扰其他位
//这样你会发现出问题了,定时器0的优先级都给搞低
//了,所以无法正常显示2
       
}

YangHY 发表于 2026-1-9 19:04:26

然后我们把定时器0的中断优先级也调整到最高:

void Timer0_Init(void)                //1毫秒@24.000MHz
{
        TM0PS = 0x00;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x30;                                //设置定时初始值
        TH0 = 0xF8;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断

        IPH |=(1<<1);//把定时器0优先级设置为最高
        IP   |=(1<<1);//加或|是不想干扰其他位


}

YangHY 发表于 2026-1-9 19:07:58

这里定时器0 的优先级明显应该比端口4的优先级重要

其实现在大家都是最高级,但定时器是排在前面的,

应该没问题:

YangHY 发表于 2026-1-9 19:11:50

现在感觉前面没有试验箱的时候

看的太快了,好几个实验都没有好好做

毕竟是借的试验箱,操作时间有限,打算回过头去

重新再做一次!

前天收到试验箱了,感谢STC,感谢姚总和赵经理

先把第14集的实验再做一次!

YangHY 发表于 2026-1-9 19:18:14

先复习第13集:

14中断系统
中断系统是为使 CPU 具有对外界紧急事件的实时处理能力而设置的。
当中央处理机 CPU 正在处理某件事的时候外界发生了紧急事件请求,要求 CPU 暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向 CPU 请求中断,要求为它服务的时候,这就存在 CPU 优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。
当 CPU 正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果 CPU 能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。
用户可以用关总中断允许位(EA/IE.7)或相应中断的允许位屏蔽相应的中断请求,也可以用打开相应的中断允许位来使 CPU响应相应的中断申请,每一个中断源可以用软件独立地控制为开中断或关中断状态,部分中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优先级的中断。当两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。

总结一下:

当中央处理机 CPU正在处理某件事的另外界发生了紧急事件请求,CPU 暂停当前的工作,转而去处理这个紧急事件,处理完以后,再同到项京缺由每给地方,维体分水的工作,这样的过程称为中断,实现这种功能的部件称为中断系统。

YangHY 发表于 2026-1-9 19:20:19

中断是可以嵌套的:

CPU 总是先响应优先级别最高的中断请求
CPU 能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,每一个中断源可以用软件独立地控制为开中断或关中断
部分中断的优先级别均可用软件设置,高优先级的中断造求可以打断低优先级的中断

顺序如下图:
页: 48 49 50 51 52 53 54 55 56 57 [58] 59 60 61 62 63 64 65 66 67
查看完整版本: 第一课 序言《AI8051U的特点》