ORG 0000H
       SJMP START
       ORG 001BH ;T1中断入口.
       SJMP T1_INT
       ORG 0030H
START:
       MOV 50H,#60
       MOV 51H,#1
       JNB P1.0,LOOP1
       JNB P1.1,LOOP2	;按键扫描
       AJMP START

LOOP1:
       JNB P1.0,$	;等待按键松开
       MOV TMOD, #10H   ;设置T1定时方式1
       MOV TH1, #3CH    ;送入初始值.
       MOV TL1, #0B0H   ;定时50MS
       MOV IE, #10001000B ;开放总中断和T1中断.
       SETB TR1           ;启动T1
LP:    JB P1.0,LP	  ;等待按键再次被按下
       JNB P1.0,WAIT	  ;按键被再次按下

WAIT:  JNB P1.0,$	  ;等待按键松开
       CLR TR1		  ;关闭定时器
       JB P1.0,START	  ;返回主程序

T1_INT:
       MOV TH1, #3CH      ;重新送入初始值.
       MOV TL1, #0B0H     ;定时
       DJNZ 50H, T1_INT
       DJNZ 51H, T1_INT   ;等待1min
       CPL P3.5           ;输出方波
       RETI               ;中断返回

LOOP2: JNB P1.1,$		  ;等待按键松开
LP1:   ACALL DELAY_500us
       CPL P3.4		  ;取反,生成方波
       JNB P1.1,BACK	  ;按键再次被按下,返回主程序
       JB P1.1,LP1
BACK:  JNB P1.1,$
       JB P1.1,START

DELAY_500us:
       MOV R0,#249
       DJNZ R0,$
       RET
END

程序说明:

  1. P3.4 口输出 1ms 周期方波(软件定时):

    • 使用 LOOP2 部分的代码实现,通过 DELAY_500us 子程序实现 500us 的延时,然后对 P3.4 口进行取反操作,生成方波。
  2. P3.5 口输出 1 分钟周期方波(定时中断):

    • 使用 T1 定时器中断实现。
    • T1_INT 中断服务程序中的 DJNZ 指令修改为 60 次循环,每次循环时间为 50ms,共计 3 秒。
    • 每 3 秒对 P3.5 口进行取反操作,生成 1 分钟周期的方波。
  3. 按键扫描:

    • 程序中使用了 P1.0 和 P1.1 两个按键,用于控制方波的输出和停止。
  4. 程序流程:

    • 程序首先初始化定时器和中断,然后进入主循环。
    • 在主循环中,程序不断扫描按键,如果 P1.0 按下,则开始输出 1ms 周期的方波;如果 P1.1 按下,则开始输出 1 分钟周期的方波。
    • 按键松开后,程序停止输出方波。

注意:

  • 以上程序使用的是 8051 单片机,不同型号的单片机可能需要修改程序。
  • 程序中使用了 12MHz 晶振,如果使用其他频率的晶振,需要修改 DELAY_500us 子程序中的延时时间。
  • 程序仅供参考,实际使用时需要根据具体应用场景进行修改。
单片机 P3.4 口输出 1ms 周期方波(软件定时)和 P3.5 口输出 1 分钟周期方波(定时中断)程序

原文地址: https://www.cveoy.top/t/topic/fyvf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录