单片机 > 单片机程序设计 > 详情

51单片机汇编语言(五)

发布时间:2020-09-03 发布时间:
|
定时器 计数器

功能说明:

开始时接在单片机P1端口中的P1.7亮,用定时器延时60ms后P1.6亮,如此向右移动,移到最右端P1.0亮后,又回到最左端重新开始向右移动,不断循环。

程序:DS01.ASM

01:  START: MOV   R0, #8         ;设右移8次

02:         MOV   A,  #01111111B ;存入开始点亮灯位置

03:  LOOP:  MOV   P1, A          ;传送到P1并输出

04:         ACALL DELAY          ;调延时子程序            

05:         RR                ;右移一位

06:         DJNZ  R0, LOOP       ;判断移动次数

07:         JMP   START          ;重新设定显示值                 主程序      

 

08: DELAY:  MOV   TMOD,#00000001B; 设定TO工作在MODE1

09:         SETB   TR0           ; 启动TO开始计时

10:         MOV   TL0,#LOW(65536-60000) ; 装入低位

11:         MOV   TH0,#HIGH(65536-60000); 装入高位

12:         JNB    TF0,$          ; T0没有溢出等待 

13:         CLR    TF0            ; 产生溢出,清标志位             定时延时   

14:         RET                   ; 子程序返回                    子程序

15:         END                                                 程序结束

 

功能说明:

开始时P1.0亮,延时10秒后,左移至P1.1亮,如此左移到第6个灯(P1.5)亮后,再从头开始向左移动,1分钟循环一次。

程序:DS02.ASM

01:  START: MOV   R0, #6         ;设左移6次          

02:         MOV   A,  #11111110B ;存入开始点亮灯位置

03:  LOOP:  MOV   P1, A          ;传送到P1并输出

04:         ACALL DELAY          ;调延时子程序            

05:         RL                ;左移一位

06:         DJNZ  R0, LOOP       ;判断移动次数

07:         JMP   START          ;重新设定显示值                 主程序 

08:DELAY:  MOV   R1,#200        ;设置软件计数初值

09:         MOV   TMOD,#00000001B; 设定TO工作在MODE1

10:         SETB  TR0            ; 启动TO开始计时

11: AGAIN:  MOV   TL0,#LOW(65536-50000) ; 装入低位

12:         MOV   TH0,#HIGH(65536-50000); 装入高位

13: LOOP1:  JBC   TF0,LOOP2 ;TF0是1转移至LOOP2并清0  

14:        JMP   LOOP1

15:LOOP2:  DJNZ  R1,AGAIN  ;R1不是0,则转移至AGAIN           (定时加软

16:         CLR   TR0             ;是,则停止T0计时               件计数) 

17:         RET                   ; 子程序返回                     延时子程序

18:         END                                                  程序结束

 

功能说明:采用两个定时器合用,T0设置为定时方式,T1设置为计数方式。T0定时时间为50ms,计满产生的输出信号由P1.7口发光二极管显示。同时还将该信号输入到计数器T1(P3.5脚)作为T1的计数输入脉冲,当输入信号产生由1到0的跳变时触发计数器工作,使计数器的值增1。计数器T1的初始值设置为100,计满时所用的时间为50ms×2×100,即10s。并由P1.0端口发光二极管来显示,所以P1.0端口的灯每10s点亮或熄灭一次。

程序:DS03.ASM

01:        ORG   0000H     ; 起始地址

02:        JMP   MAIN      ; 跳到主程序MAIN处

03:        ORG   000BH     ; 定时器T0溢出入口地址

04:        JMP   EXT0      ; 跳到定时器中断EXT0处

05:        ORG   001BH     ; 计数器T1溢出入口地址

06:        JMP   EXT1      ; 跳到计数器中断EXT1处

07:        MOV   SP, #60H  ; 设置堆栈                               入口地址

08:  MAIN: MOV   TMOD, #01100001B;设T0模式1,T1模式2

09:        MOV   TL0, #LOW(65536-50000) ; 装入定时初值

10:        MOV   TH0, #HIGH(65536-50000);

11:        MOV   TL1, #(256-100)        ; 装入计数初值

12:        MOV   TH1, #(256-100);

13:        MOV   IE, #10001010B ; 开总中断及T0、T1中断

14:        SETB  TR0            ; 启动T0开始定时

15:        SETB  TR1            ; 启动T1开始计数

16:        JMP                ; 等待溢出                          主程序

17:  EXT0: MOV   TL0, #LOW(65536-50000) ;重加载

18:        MOV   TH0, #HIGH(65536-50000);

19:        CPL   P1.7        ; P1.7反相输出,并输入P3.5             T0中断

20:        RETI              ; T0中断子程序返回                     子程序

21:  EXT1: CPL   P1.0        ; P1.0反相输出                         T1中断

22:        RETI              ; T1中断子程序返回                     子程序

23:        END               ; 结束                                 程序结束

 



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM JTAG 调试原理