找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2068|回復(fù): 2
收起左側(cè)

兩個(gè)簡(jiǎn)單單片機(jī)中斷的應(yīng)用及個(gè)人疑問

[復(fù)制鏈接]
ID:904756 發(fā)表于 2021-4-13 22:23 | 顯示全部樓層 |閱讀模式
[例6 2]如圖6 10所示,在單片機(jī)P1口上接有8只LED。在外部中斷0輸入引腳(P3.2) 接有一只按鈕開關(guān)K1。在外部中斷1輸。入引腳(P3.3) 接有一只按鈕開關(guān)K2。要求K1和K2都未按下時(shí),。P1口的8只LED呈流水燈顯示,僅K1 (P3.2)按下再松開時(shí),上下各4只LED交替閃爍10次,然后再回到流水燈顯示。如果按下再松開K2 (P3.3)時(shí),P1口的8只LED全部閃爍10次,然后再回到流水燈顯示。設(shè)置兩個(gè)外中斷的優(yōu)先級(jí)相同。要求:基于51單片機(jī)使用Proteus用匯編和C語(yǔ)言分別編譯

電路圖

電路圖


  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.       }
復(fù)制代碼
  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
復(fù)制代碼

下面是我的個(gè)人問題,請(qǐng)大佬稍微看一眼

這個(gè)地方為社么不能直接P1=_cror_(P1,1),這么寫會(huì)導(dǎo)致LED0只亮一小會(huì),調(diào)出監(jiān)視窗口發(fā)現(xiàn)P1口全置1,不懂為什么
1.png

謝謝大佬
兩個(gè)中斷.zip (36.1 KB, 下載次數(shù): 6)
回復(fù)

使用道具 舉報(bào)

ID:814525 發(fā)表于 2021-4-14 08:44 | 顯示全部樓層
temp=_crol_(temp,1);  _crol_操作對(duì)象是char型。把變量temp改為char型變量,不要定義為int型。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:904756 發(fā)表于 2021-4-15 09:08 | 顯示全部樓層
張?zhí)鞄?發(fā)表于 2021-4-14 08:44
temp=_crol_(temp,1);  _crol_操作對(duì)象是char型。把變量temp改為char型變量,不要定義為int型。

謝謝,細(xì)看了一下定義確實(shí)是char。我想知道為什么不能用循環(huán)左移直接對(duì)P1口操作
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表