P1口转弯灯实验

一、实验目的

进一步了解P1口的使用,学习汇编语言编程方法及调试技巧。

 

二、实验目的

P1.0接开关上拨为5V,左转弯灯闪亮,P1.1接开关为5V时右转弯灯闪亮,P1.0P1.1接开关同时接5V或接地时,转弯灯均不闪亮。

 

三、实验程序框图

  1.png

四、实验原理图

2.png

 

五、实验步骤

1、P1.0 接开关K1P1.1接开关K2,用双头线将P1.4~P1.7分别接到发光二极管L1L2L7L8

2、连续运行程序HW02.asm,拨动开关K1K2,应看到转弯灯正确闪亮;

3、再用单步方式调试本程序时需修改延时子程序,(例可把延时程序第一个字节改成返回指令22H),以便观察。

 

五、实验结果

程序源代码

ORG 0000H

    LJMP PX00

    ORG 0080H

PX00:  MOV P1,#0FFH        ;初始化

PX03:   MOV A,P1

    MOV B,A

    ANL A,#03H

    CJNE A,#01H,PX01    ;满足只是P1.0为高条件

    JB 00H,PX04         ;闪烁标志位

    CLR P1.4

    CLR P1.5            ;开右灯

    SETB P1.6

    SETB P1.7           ;关左灯

    MOV R2,#20H

    LCALL DELY          ;延时

    SETB 00H            ;置标志位

    LJMP PX03           ;继续查找状态

PX04:  SETB P1.4

    SETB P1.5

    SETB P1.6

    SETB P1.7           ;关灯

    MOV R2,#20H

    LCALL DELY          ;延时

    CLR 00H             ;清标志位

    AJMP PX03           ;继续查找状态

PX01:  CJNE A,#02H,PX02    ;满足只是P1.1为高条件吗?

    JB 01H,PX05         ;判断标志位

    SETB P1.4

    SETB P1.5           ;开左灯

    CLR P1.6

    CLR P1.7            ;关右灯

    MOV R2,#20H

    LCALL DELY          ;延时

    SETB 01H            ;置标志位

    LJMP PX03           ;继续查找

PX05:  SETB P1.4

    SETB P1.5

    SETB P1.6           ;关灯

    SETB P1.7

    MOV R2,#20H

    LCALL DELY          ;延时

    CLR 01H             ;置标志位

    LJMP PX03           ;继续查找状态

PX02:  SETB P1.4

    SETB P1.5

    SETB P1.6

    SETB P1.7           ;关灯

    LJMP PX03           ;继续

   

DELY:  PUSH 02H            ;延时

DEL2:  PUSH 02H

DEL3:  PUSH 02H

DEL4:  DJNZ R2,DEL4

    POP 02H

    DJNZ R2,DEL3

    POP 02H

    DJNZ R2,DEL2

    POP 02H

    DJNZ R2,DELY

    RET

    END

 

实验现象及截图

实验现象:在未拨动K1K2开关时,P1各个LED灯不亮;当拨动开关K1,关闭开关K2时,P1左转向灯亮(L1L2);当关闭开关K1,拨动开关K2时,P1右转向灯亮(L7L8);当同时拨动开关K1K2时,P1各个LED灯不亮。

 

实验截图

未拨动K1K2开关

3.png

 

拨动开关K1,关闭开关K2

 

4.png

 

关闭开关K1,拨动开关K2

5.png


同时拨动开关K1K2

6.png

 

更改程序源代码

ORG 0000H

    LJMP PX00

    ORG 0080H

PX00:   MOV P1,#0FFH        ;初始化

PX03:   MOV A,P1

    MOV B,A

    ANL A,#03H

    CJNE A,#01H,PX01    ;满足只是P1.0为高条件

    JB 00H,PX04         ;闪烁标志位

    CLR P1.4

    CLR P1.5            ;开右灯

    SETB P1.6

    SETB P1.7           ;关左灯

    MOV R2,#80H

    LCALL DELY          ;延时

    SETB 00H            ;置标志位

    LJMP PX03           ;继续查找状态

PX04:   SETB P1.4

    SETB P1.5

    SETB P1.6

    SETB P1.7           ;关灯

    MOV R2,#80H

    LCALL DELY          ;延时

    CLR 00H             ;清标志位

    AJMP PX03           ;继续查找状态

PX01:   CJNE A,#02H,PX02    ;满足只是P1.1为高条件吗?

    JB 01H,PX05         ;判断标志位

    SETB P1.4

    SETB P1.5           ;开左灯

    CLR P1.6

    CLR P1.7            ;关右灯

    MOV R2,#80H

    LCALL DELY          ;延时

    SETB 01H            ;置标志位

    LJMP PX03           ;继续查找

PX05:   SETB P1.4

    SETB P1.5

    SETB P1.6           ;关灯

    SETB P1.7

    MOV R2,#80H

    LCALL DELY          ;延时

    CLR 01H             ;置标志位

    LJMP PX03           ;继续查找状态

PX02:   SETB P1.4

    SETB P1.5

    SETB P1.6

    SETB P1.7           ;关灯

    LJMP PX03           ;继续

   

DELY:   PUSH 02H            ;延时

DEL2:   PUSH 02H

DEL3:   PUSH 02H

DEL4:   DJNZ R2,DEL4

    POP 02H

    DJNZ R2,DEL3

    POP 02H

    DJNZ R2,DEL2

    POP 02H

    DJNZ R2,DELY

    RET

   END

 

实验现象:更改延时程序,是LED发光二极管闪亮时间改变。

 

五、实验体会

   此时实验较为简单,在按照电路图连线,接着运行代码指令即可,但是修改程序,使得延时增加,LED发光二极管闪亮时间改变,就涉及到DJNZ这条指令。DJNZ RN,REL 是一条件转移指令,先将工作寄存器Rn中的数减“1”,判断结果是否为“0”,不为“0”程序就跳转到行标为REL的地方执行,否则,为“0”就不转移,利用这条指令的功能修改增大R2寄存器变量的值,通过4个嵌套循环中使用DJNZ指令,这样就能使得延时增加,LED发光二极管闪亮时间改变。

 

版权声明:若无特殊注明,本文为《Chin》原创,转载请保留文章出处。
本文链接:https://www.qinor.cn/post-16.html
正文到此结束

热门推荐

发表吐槽

你肿么看?

你还可以输入 250 / 250 个字

嘻嘻 大笑 可怜 吃惊 害羞 调皮 鄙视 示爱 大哭 开心 偷笑 嘘 奸笑 委屈 抱抱 愤怒 思考 日了狗 胜利 不高兴 阴险 乖 酷 滑稽

评论信息框
可使用QQ号实时获取昵称+头像

私密评论

吃奶的力气提交吐槽中...


既然没有吐槽,那就赶紧抢沙发吧!