[例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语言分别编译
电路图
- #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;
-
-
- }
复制代码- $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
复制代码
这个地方为社么不能直接P1=_cror_(P1,1),这么写会导致LED0只亮一小会,调出监视窗口发现P1口全置1,不懂为什么
谢谢大佬
两个中断.zip
(36.1 KB, 下载次数: 6)
|