找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2068|回复: 2
收起左侧

两个简单单片机中断的应用及个人疑问

[复制链接]
ID:904756 发表于 2021-4-13 22:23 | 显示全部楼层 |阅读模式
[例6 2]如图6 10所示,在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2) 接有一只按钮开关K1。在外部中断1输。入引脚(P3.3) 接有一只按钮开关K2。要求K1和K2都未按下时,。P1口的8只LED呈流水灯显示,仅K1 (P3.2)按下再松开时,上下各4只LED交替闪烁10次,然后再回到流水灯显示。如果按下再松开K2 (P3.3)时,P1口的8只LED全部闪烁10次,然后再回到流水灯显示。设置两个外中断的优先级相同。要求:基于51单片机使用Proteus用汇编和C语言分别编译

电路图

电路图


  1. #define uint unsigned int
  2. #include <reg51.h>
  3. #include <stdio.h>
  4. #include <intrins.h>

  5. uint temp=0xfe;
  6. void Delay(uint x);
  7. void main(void)
  8. {
  9.    // Write your code here
  10.    
  11.    EA=1;
  12.    EX0=1;
  13.    EX1=1;
  14.    IT0=1;
  15.    IT1=1;
  16.    IP=0;
  17.    P1=0xFE;
  18.    
  19.    while (1)
  20.    {
  21.       
  22.       Delay(500);
  23.       temp=_crol_(temp,1);
  24.       P1=temp;
  25.    }
  26. }

  27. void Delay(uint x)
  28. {
  29.     uint i,j;
  30.     for(i=x;i>0;i--)
  31.        for(j=110;j>0;j--);
  32.     }
  33.    
  34. void INT_0() interrupt 0
  35.     {        int i;
  36.        EX0=0;
  37.        P1=0XF0;
  38.        for(i=0;i<10;i++)
  39.        {
  40.             Delay(500);
  41.             P1=~P1;
  42.        }
  43.        P1=0XFF;
  44.        EX0=1;
  45.       
  46.       
  47.       }
  48. void INT_1() interrupt 2
  49.     {        int i;
  50.        EX1=0;
  51.        P1=0;
  52.        for(i=0;i<20;i++)
  53.        {
  54.             Delay(500);
  55.             P1=~P1;
  56.        }
  57.        P1=0XFF;
  58.        EX1=1;
  59.       
  60.       
  61.       }
复制代码
  1. $NOMOD51
  2. $INCLUDE (8051.MCU)

  3. ;====================================================================
  4. ; DEFINITIONS
  5. ;====================================================================

  6. ;====================================================================
  7. ; VARIABLES
  8. ;====================================================================

  9. ;====================================================================
  10. ; RESET and INTERRUPT VECTORS
  11. ;====================================================================

  12.       ; Reset Vector
  13.       org   0000h
  14.       jmp   Start
  15.       ORG   0003H
  16.       LCALL INT_0
  17.       ORG   0013H
  18.       LCALL INT_1

  19. ;====================================================================
  20. ; CODE SEGMENT
  21. ;====================================================================

  22.       org   0100h
  23. Start:        SETB EA
  24.         SETB EX0
  25.         SETB EX1
  26.         SETB IT0
  27.         SETB IT1
  28.         CLR PX0
  29.         CLR PX1
  30.         MOV A,#0FEH
  31.         ORG 0200H
  32. Loop:        
  33.         MOV P1,A
  34.         LCALL Dely
  35.         RL A
  36.         sjmp Loop
  37.         sjmp $
  38.          ORG 0300H
  39. INT_0:        PUSH ACC
  40.         PUSH PSW
  41.         MOV R0,#10
  42.         
  43. LOOP1:        MOV A,#0FH
  44.         MOV P1,A
  45.         LCALL Dely
  46.         CPL A
  47.         MOV P1,A
  48.         LCALL Dely
  49.         DJNZ R0,LOOP1
  50.         POP PSW
  51.         POP ACC
  52.         RETI        
  53.         
  54. INT_1:        PUSH ACC
  55.         PUSH PSW
  56.         MOV R0,#10
  57. LOOP2:  
  58.         MOV A,#00H
  59.         MOV P1,A
  60.         LCALL Dely
  61.         CPL A
  62.         MOV P1,A
  63.         LCALL Dely
  64.         DJNZ R0,LOOP2
  65.         POP PSW
  66.         POP ACC
  67.         RETI
  68.         ORG 0400H
  69. Dely:        MOV R1,#0FFH
  70. Dely1:        MOV R2,#0FFH
  71. Dely2:        DJNZ R2,$
  72.         DJNZ R1,Dely1
  73.         RET
  74.         
  75.         
  76.       ; Write your code here


  77. ;====================================================================
  78.       END
复制代码

下面是我的个人问题,请大佬稍微看一眼

这个地方为社么不能直接P1=_cror_(P1,1),这么写会导致LED0只亮一小会,调出监视窗口发现P1口全置1,不懂为什么
1.png

谢谢大佬
两个中断.zip (36.1 KB, 下载次数: 6)
回复

使用道具 举报

ID:814525 发表于 2021-4-14 08:44 | 显示全部楼层
temp=_crol_(temp,1);  _crol_操作对象是char型。把变量temp改为char型变量,不要定义为int型。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:904756 发表于 2021-4-15 09:08 | 显示全部楼层
张天师 发表于 2021-4-14 08:44
temp=_crol_(temp,1);  _crol_操作对象是char型。把变量temp改为char型变量,不要定义为int型。

谢谢,细看了一下定义确实是char。我想知道为什么不能用循环左移直接对P1口操作
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表