这是一个使用软件定时和定时中断生成方波的程序。P3.4口输出周期为1ms的方波,采用软件定时实现;P3.5口输出周期为1分钟的方波,采用定时中断实现。单片机的晶振频率为12MHz。

程序的主要逻辑如下:

  1. 初始化变量50H为20,51H为30,用于计数。
  2. 进入LOOP1循环,等待按键P1.0被按下。
  3. 检测按键P1.0是否松开,如果未松开则继续等待。
  4. 配置T1定时器为方式1,设置初始值TH1为3CH,TL1为0B0H,定时50ms。
  5. 开放总中断和T1中断,并启动T1定时器。
  6. 进入LP循环,等待按键P1.0再次被按下。
  7. 检测按键P1.0是否松开,如果未松开则继续等待。
  8. 关闭定时器TR1,检测按键P1.0是否被按下,如果被按下则返回主程序。
  9. 进入T1_INT中断服务程序,重新设置初始值TH1为3CH,TL1为0B0H,定时。
  10. 使用循环计数器50H和51H等待30s。
  11. 取反输出P3.5口,生成方波。
  12. 中断返回。
  13. 如果按键P1.1被按下,进入LOOP2循环。
  14. 等待按键P1.1松开。
  15. 调用延时函数DELAY_500us,延时500us。
  16. 取反输出P3.4口,生成方波。
  17. 检测按键P1.1是否被按下,如果被按下则返回主程序。
  18. 如果按键P1.1未被按下,继续循环。
  19. 返回主程序。

延时函数DELAY_500us用于延时500us,通过循环计数器R0实现。

       ORG 0000H
       SJMP START
       ORG 001BH ;T1中断入口.
       SJMP T1_INT
       ORG 0030H
START:
       MOV 50H,#20
       MOV 51H,#30
       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   ;等待30s
       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
单片机P3.4口输出1ms方波(软件定时)和P3.5口输出1分钟方波(定时中断)程序

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

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