//用P1口外接8个LED,可以做成一个最常见的流水灯。
//灯光闪烁的时间间隔,可以使用软件延时,也可以使用定时器来控制。
//如果增加一个按键,则还可以控制灯的移动方向。
//电路如下:

//系统中,定时和按键,都采用了中断方式。

//即采用定时器0中断来控制延时时间,用外部中断0进行方向控制;
//通过按下按键,可以使左移、右移交替显示。
//为了练习C语言使用中断系统,控制软件采用C语言编制。
//程序如下:
//-------------------------------------------
#include <reg52.h>
#include <intrins.h>
unsigned char i = 0, temp;

unsigned char bdata j;            //在位寻址区定义字节变量
sbit j0 = j ^ 0;                  //定义位变量
//-------------------------------------------
void main(void)
{
    TMOD = 0x01;                    //设定T0定时方式1
    TH0 = (65536 - 10000) / 256;    //定时
    TL0 = (65536 - 10000) % 256;
    TR0 = 1;
    ET0 = 1;                        //允许T0中断
    PT0 = 1;                        //设定T0为高优先级

    IT0 = 1;                        //外部中断输入下降沿有效
    EX0 = 1;                        //允许X0中断
    EA = 1;                         //开放总中断

    temp = 0xfe;
    P1 = temp;
    while(1);
}
//-------------------------------------------
void T0_int(void) interrupt 1       //每隔10ms执行一次
{
    TH0 = (65536 - 10000) / 256;    //定时
    TL0 = (65536 - 10000) % 256;
    i++;
    if(i >= 100) {
      i = 0;
      if(j0 == 0) temp = _crol_(temp, 1);
      if(j0 == 1) temp = _cror_(temp, 1);
      P1 = temp;
}   }
//-------------------------------------------
void X0_int(void) interrupt 0 using 1
{
    unsigned char k;
    j0 = ~j0;                       //改变运动方向
    for(k = 200; k > 0; k--);       //延时一会再退出,以避免抖动
}
//===========================================================
下面是用汇编语言编写的控制程序,效果与C语言相同。
        ORG   0000H
        SJMP START
        ORG   0003H
        SJMP X0_INT
        ORG   000BH
        SJMP T0_INT
;-------------------------------------------
START:      
        MOV TMOD, #01H
        MOV TH0, #(65536 - 50000) / 256;     //定时
        MOV TL0, #(65536 - 50000) MOD 256;   //定时
        SETB TR0
        SETB ET0
        SETB IT0
        SETB EX0
        SETB PT0
        SETB EA
        MOV R3, #20
        MOV R2, #7FH
        MOV P1, R2
        SJMP $
;-------------------------------------------
X0_INT:
        CPL   F0
        JNB   P3.2, $      ;等待按键释放
        RETI
;-------------------------------------------
T0_INT:
        MOV TL0, #(65536 - 50000) MOD 256;   //定时
        MOV TH0, #(65536 - 50000) / 256;     //定时
        DJNZ R3, T0_END
        MOV R3, #20
        MOV A, R2
        JNB F0, DDD
        RL   A
        SJMP EEE
DDD:
        RR    A
EEE:
        MOV   R2, A
        MOV   P1, A
T0_END:
        RETI
;-------------------------------------------
        END
//===========================================================

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐