• 外中断的应用


    前言

    软件基础操作参考这篇博客:

    LED数码管的静态显示与动态显示(Keil+Proteus)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_64066303/article/details/134101256?spm=1001.2014.3001.5501实验一:P1口上接8个LED灯,在外部中断0引脚接一只按钮开关K1。采用跳沿触发方式,当程序启动时,P1口上的8只LED灯全亮,每按下一次按钮开关K1,是的引脚接地,产生一个外中断请求,在中断服务程序中,让低4位的LED与高4位的LED交替闪烁5次。然后中断返回,控制8只LED再次全亮。

    实验二:P1口上接8个LED灯。在外部中断0输入引脚接一只按钮开关K1,在外部中断1输入引脚接一只按钮开关K2。当K1和K2均未按下时,P1口的8只LED呈流水灯显示;当K1按下再松开时,P1口的8只LED按照高4位和低4位交替闪烁10次,然后恢复到流水灯状态;当K2按下在松开时,P1口的8只LED按照整体闪烁10次,然后再恢复到流水灯显示,两个外中断的优先级相同。(K1和K2不能同时按下)

    单一外中断的应用

    keil

    根据实验的要求,在主函数里面就是一直保持P1口全亮,采用的是共阳极,所以在程序中给0就是表示全亮。

    在中断函数中,要交替闪烁5次就是把闪烁的部分循环5次即可,实现高4位和低4位交替闪烁其实就是高四位亮和低四位亮交替,前面提到给0就表示LED亮,所以就是先后给P1口赋值0x0F和0xF0,这要注意的是延迟部分,这个可能需要自己根据电脑来调试,延时时间太短的话,人眼捕捉不到这么快的变化,所以导致看到的是没有交替就结束了,所以这个需要自己来调整延时的时间。

    1. #include
    2. #define uchar unsigned char
    3. //延时函数
    4. void Delay(unsigned int i){
    5. unsigned int j;
    6. for(;i>0;i--){
    7. for(;j<1314;j++);
    8. }
    9. }
    10. //外部中断0,中断向量0003H
    11. void int0() interrupt 0 using 0{
    12. uchar m;
    13. EX0=0;//禁止外部中断0
    14. for(m=0;m<5;m++){//交替闪烁5次
    15. P1=0x0F;//低4位LED灭,高4位LED亮
    16. Delay(111213141516171819);//延时时间设置长一点
    17. P1=0xF0;//低4位LED亮,高4位LED灭
    18. Delay(111213141516171819);//延时时间设置长一点
    19. }
    20. EX0=1;//中断返回前,打开外部中断0
    21. }
    22. void main(){
    23. EA=1;//总中断允许
    24. EX0=1;//INT0开中断
    25. IT0=1;//选择外部中断为下降沿触发方式
    26. while(1){
    27. P1=0;
    28. }
    29. }

    Proteus

    所需Proteus元器件。

    元件名称Proteus关键字
    51单片机AT89C51
    复位按钮BUTTON
    电阻RES
    黄色LED灯LED-YELLOW
    电源POWER
    电阻GROUND

    这里要注意的是设置左边电阻的阻值,如果阻值太高会导致LED灯不亮。

    两个外中断的应用

    keil

    当需要多个中断源时,只需要增加相应的中断服务函数即可。

    就是之前按钮未按下前LED灯是全亮的,如今采用的是流水灯,按下K1高低位交替闪烁10次,按下k2整体闪烁10次,之后继续流水灯,流水灯部分可以采用数组也可以采用移位来实现。

    1. #include
    2. #define uchar unsigned char
    3. //延时函数
    4. void Delay(unsigned int i){
    5. unsigned int j;
    6. for(;i>0;i--){
    7. for(;j<1314;j++);
    8. }
    9. }
    10. void main(){
    11. uchar i;
    12. //流水灯显示数据数组
    13. uchar display[9]={0xFF,0xFe,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
    14. EA=1;//总中断允许
    15. EX0=1;//允许INT0中断
    16. EX1=1;//允许INT1中断
    17. IT0=1;//选择INT0为下降沿触发
    18. IT1=1;//选择INT1为下降沿触发
    19. IP=0;//两个外部中断均为低优先级
    20. while(1){
    21. for(i=0;i<9;i++){
    22. Delay(111213141516171819);
    23. P1=display[i];
    24. }
    25. }
    26. }
    27. //外中断0的中断服务函数(高、低4位显示10次)
    28. void int0() interrupt 0 using 1{
    29. uchar i;
    30. EX0=0;//禁止外部中断0
    31. EX1=0;//禁止外部中断1
    32. for(i=0;i<10;i++){
    33. P1=0x0F;
    34. Delay(111213141516171819);
    35. P1=0xF0;
    36. Delay(111213141516171819);
    37. }
    38. EX0=1;//中断返回前,打开外部中断0
    39. EX1=1;//中断返回前,打开外部中断1
    40. }
    41. //外中断1的中断服务函数(整体闪烁显示)
    42. void int1() interrupt 2 using 2{
    43. uchar i;
    44. EX0=0;//禁止外部中断0
    45. EX1=0;//禁止外部中断1
    46. for(i=0;i<10;i++){
    47. P1=0xFF;
    48. Delay(111213141516171819);
    49. P1=0;
    50. Delay(111213141516171819);
    51. }
    52. EX0=1;//中断返回前,打开外部中断0
    53. EX1=1;//中断返回前,打开外部中断1
    54. }

    Proteus

    所需要元器件参考单一外中断的应用部分的,就是在前者的基础上添加了一个按钮。

    参考链接

    2.单片机基础知识讲解--中断服务函数 - 知乎 (zhihu.com)icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/618472480?utm_id=0

    51单片机中断笔记 - 知乎 (zhihu.com)icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/593229489

    总结

    继续加油,一切都是最好的安排。

  • 相关阅读:
    45-命令行基础操作
    EasyCode整合mybatis-plus的配置
    MAC M1芯片安装mounty读写移动硬盘中的文件
    华为机考:HJ53 杨辉三角的变形
    领域驱动设计系列关键概念
    《FFmpeg Basics》中文版-02-显示帮助和功能
    java毕业生设计学术会议信息网站计算机源码+系统+mysql+调试部署+lw
    vue组件之间传参方式
    【LeetCode刷题(数据结构与算法)】:上下翻转二叉树
    angular 实现模块共享
  • 原文地址:https://blog.csdn.net/weixin_64066303/article/details/134360733