方案 2:T0、T1 都用来定时,且定时 10ms;主程序中执行灯以 t=300ms 流水的 : 、 都用来定时, ; 操作; 闪烁的操作。 操作;按键扫描程序中执行灯以 t=300ms 闪烁的操作。 #include "reg51.h" sbit P1_0=P1^0; unsigned char i,j,temp,temp1; keyscan() { TMOD=0x11; /*用定时 计数器 1 也定时 10ms*/ 用定时/计数器 用定时 TH1=(65535-10000)/256; TL1=(65535-10000)%256; //TH1=0xD8;TL1=0xF0; EA=1; ET1=1; TR1=1; j=0; } void main() { temp=0xfe; temp1=0xff; TMOD=0x11; TH0=(65535-10000)/256; TL0=(65535-10000)%256; //TH0=0xD8;TL0=0xF0; EA=1;ET0=1; i=0; TR0=1; IT0=0; while(1) { if(P1_0==1) /*当 P1_0 检测到 1 时,执行相应按键扫描程序 执行相应按键扫描程序*/ 当 keyscan(); } } void time0_int(void) interrupt 1 { TH0=(65535-10000)/256; TL0=(65535-10000)%256; //TH0=0xD8;TL0=0xF0; i++; if(i==30) /*定时 计数器 0 中断服务程序 定时/计数器 中断服务程序*/ 定时 { P2=temp; /*使 8 盏灯流水亮 300ms*/ 使 if(temp==0xff) temp=(temp<<1); else temp=(temp<<1)+1; i=0; } } void time1_int(void) interrupt 3 /*定时 计数器 1 中断服务程序 定时/计数器 中断服务程序*/ 定时 { TH1=(65535-10000)/256; TL1=(65535-10000)%256; //TH1=0xD8;TL1=0xF0; j++; if(j==30) { temp1=~temp1; /*使 8 盏灯实现闪烁 使 盏灯实现闪烁*/ P2=temp1; j=0; } }