(1)采用定时器与计数器相结合的方法使 P1.1 所接的发光二极管亮 1 秒、灭 1 秒,周而复始。(查询方式、中断方式)
分析:晶振频率40MHZ,机器周期为(1/40)*12=03μs,采用工作方式1最大定时为2^16*0.3≈20ms。若采用20ms为半周期,20ms*2*25需要两根线,P1.0接T1,以T1作计数器,T0作定时器则:计数初值(-65535)补=0001H,(-25)补=E7H
ORG 0000H
MAIN:
CLR P1.1
SETB P1.0
MOV TMOD,#61H
MOV TH1,#0E7H
MOV TL1,#0E7H
SETB TR1
LOOP1:
CPL P1.1
LOOP2:
MOV TH0,#00H
MOV TL0,#01H
SETB TR0
LOOP3:
JBC TF0,LOOP4
SJMP LOOP3
LOOP4:
CPL P1.0
JBC TF1,LOOP1
AJMP LOOP2
END
对应C语言代码:
#include<reg51.h>
#define uchar unsigned char
sbit P1_0=P1^0;
sbit P1_1=P1^1;
timer0()interrupt 1 using 1
{
P1_0=!P1_0;
TH0=-33334/256;
TL0=-33334%256;
}
timer1()interrupt 3 using 2
{
P1_1=!P1_1;
}
main(){
P1_1=0;
P1_0=1;
TMOD=0x61;
TH0=-33334/256;
TL0=-33334%256;
TH1=-50;
TL1=-50;
IP=0x08;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
while(1);
}
10ms*2*50,10ms/0.3μs≈33333,(-33333)补=7DCBH
ORG 0000H
SJMP MAIN
ORG 000BH
SJMP TINT0
MAIN:
MOV R0,#64H
CLR P1.1
MOV TMOD,#01H
MOV TH0,#7DH
MOV TL0,#0CBH
SETB EA
SETB ET0
SETB TR0
SJMP $
TINT0:
CPL P1.0
DJNZ R0,BACK
CPL P1.1
MOV R0,#64H
BACK:
MOV TH0,#7DH
MOV TL0,#0CBH
RETI
END
对应C语言代码:
#include<reg51.h>
#define uchar unsigned char
uchar counter;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
timer0()interrupt 1 using 1
{
P1_0=!P1_0;
TH0=-33334/256;
TL0=-33334%256;
if(counter==100){
counter=0;
P1_1=!P1_1;
}
else
counter++;
}
main(){
counter=0;
P1_1=0;
P1_0=1;
TMOD=0x01;
TH0=-33334/256;
TL0=-33334%256;
EA=1;
ET0=1;
TR0=1;
while(1);
}