|
[例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ǔ)言分別編譯
電路圖
- #define uint unsigned int
- #include <reg51.h>
- #include <stdio.h>
- #include <intrins.h>
- uint temp=0xfe;
- void Delay(uint x);
- void main(void)
- {
- // Write your code here
-
- EA=1;
- EX0=1;
- EX1=1;
- IT0=1;
- IT1=1;
- IP=0;
- P1=0xFE;
-
- while (1)
- {
-
- Delay(500);
- temp=_crol_(temp,1);
- P1=temp;
- }
- }
-
- void Delay(uint x)
- {
- uint i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
-
- void INT_0() interrupt 0
- { int i;
- EX0=0;
- P1=0XF0;
- for(i=0;i<10;i++)
- {
- Delay(500);
- P1=~P1;
- }
- P1=0XFF;
- EX0=1;
-
-
- }
- void INT_1() interrupt 2
- { int i;
- EX1=0;
- P1=0;
- for(i=0;i<20;i++)
- {
- Delay(500);
- P1=~P1;
- }
- P1=0XFF;
- EX1=1;
-
-
- }
復(fù)制代碼- $NOMOD51
- $INCLUDE (8051.MCU)
- ;====================================================================
- ; DEFINITIONS
- ;====================================================================
- ;====================================================================
- ; VARIABLES
- ;====================================================================
- ;====================================================================
- ; RESET and INTERRUPT VECTORS
- ;====================================================================
- ; Reset Vector
- org 0000h
- jmp Start
- ORG 0003H
- LCALL INT_0
- ORG 0013H
- LCALL INT_1
- ;====================================================================
- ; CODE SEGMENT
- ;====================================================================
- org 0100h
- Start: SETB EA
- SETB EX0
- SETB EX1
- SETB IT0
- SETB IT1
- CLR PX0
- CLR PX1
- MOV A,#0FEH
- ORG 0200H
- Loop:
- MOV P1,A
- LCALL Dely
- RL A
- sjmp Loop
- sjmp $
- ORG 0300H
- INT_0: PUSH ACC
- PUSH PSW
- MOV R0,#10
-
- LOOP1: MOV A,#0FH
- MOV P1,A
- LCALL Dely
- CPL A
- MOV P1,A
- LCALL Dely
- DJNZ R0,LOOP1
- POP PSW
- POP ACC
- RETI
-
- INT_1: PUSH ACC
- PUSH PSW
- MOV R0,#10
- LOOP2:
- MOV A,#00H
- MOV P1,A
- LCALL Dely
- CPL A
- MOV P1,A
- LCALL Dely
- DJNZ R0,LOOP2
- POP PSW
- POP ACC
- RETI
- ORG 0400H
- Dely: MOV R1,#0FFH
- Dely1: MOV R2,#0FFH
- Dely2: DJNZ R2,$
- DJNZ R1,Dely1
- RET
-
-
- ; Write your code here
- ;====================================================================
- END
復(fù)制代碼
下面是我的個(gè)人問題,請(qǐng)大佬稍微看一眼
這個(gè)地方為社么不能直接P1=_cror_(P1,1),這么寫會(huì)導(dǎo)致LED0只亮一小會(huì),調(diào)出監(jiān)視窗口發(fā)現(xiàn)P1口全置1,不懂為什么
謝謝大佬
兩個(gè)中斷.zip
(36.1 KB, 下載次數(shù): 6)
2021-4-13 22:11 上傳
點(diǎn)擊文件名下載附件
proteus源文件
|
|