//用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
//===========================================================