1.试验使命
用AT89S51单片机的守时/计数器T0发生一秒的守时时刻,作为秒计数时刻,当一秒发生时,秒计数加1,秒计数到60时,主动从0开端。硬件电路如下图所示
2.电路原理图
(1.把“单片机体系”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显现模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。
(2.把“单片机体系”区域中的P2.0/A8-P2.7/A15端口用8芯排线连接到“四路静态数码显现模块”区域中的任一个a-h端口上;要求:P2.0/A8对应着a,P2.1/A9对应着b,……,P2.7/A15对应着h。
4.程序设计内容
AT89S51单片机的内部16位守时/计数器是一个可编程守时/计数器,它既能够作业在13位守时方法,也能够作业在16位守时方法和8位守时方法。只需经过设置特别功用寄存器TMOD,即可完结。守时/计数器何时作业也是经过软件来设定TCON特别功用寄存器来完结的。
现在咱们挑选16位守时作业方法,关于T0来说,最大守时也只要65536us,即65.536ms,无法到达咱们所需求的1秒的守时,因而,咱们有必要经过软件来处理这个问题,假定咱们取T0的最大守时为50ms,即要守时1秒需求经过20次的50ms的守时。关于这20次咱们就能够选用软件的方法来计算了。
因而,咱们设定TMOD=00000001B,即TMOD=01H
下面咱们要给T0守时/计数器的TH0,TL0装入预置初值,经过下面的公式能够计算出
TH0=(216-50000)/256
TL0=(216-50000)MOD256
当T0在作业的时分,咱们怎么得知50ms的守时时刻已到,这回咱们经过检测TCON特别功用寄存器中的TF0标志位,假如TF0=1表明守时时刻已到。
5.程序框图
SECONDEQU30H
TCOUNTEQU31H
ORG00H
START:MOVSECOND,#00H
MOVTCOUNT,#00H
MOVTMOD,#01H
MOVTH0,#(65536-50000)/256
MOVTL0,#(65536-50000)MOD256
SETBTR0
DISP:MOVA,SECOND
MOVB,#10
DIVAB
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP0,A
MOVA,B
MOVCA,@A+DPTR
MOVP2,A
WAIT:JNBTF0,WAIT
CLRTF0
MOVTH0,#(65536-50000)/256
MOVTL0,#(65536-50000)MOD256
INCTCOUNT
MOVA,TCOUNT
CJNEA,#20,NEXT
MOVTCOUNT,#00H
INCSECOND
MOVA,SECOND
CJNEA,#60,NEX
MOVSECOND,#00H
NEX:LJMPDISP
NEXT:LJMPWAIT
TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
7.C言语源程序(查询法)
#include
unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsignedcharsecond;
unsignedchartcount;
voidmain(void)
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
tcount=0;
second=0;
P0=dispcode[second/10];
P2=dispcode[second%10];
while(1)
{
if(TF0==1)
{
tcount++;
if(tcount==20)
{
tcount=0;
second++;
if(second==60)
{
second=0;
}
P0=dispcode[second/10];
P2=dispcode[second%10];
}
TF0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
}
}
1.汇编源程序(中止法)
SECONDEQU30H
TCOUNTEQU31H
ORG00H
LJMPSTART
ORG0BH
LJMPINT0X
START:MOVSECOND,#00H
MOVA,SECOND
MOVB,#10
DIVAB
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP0,A
MOVA,B
MOVCA,@A+DPTR
MOVP2,A
MOVTCOUNT,#00H
MOVTMOD,#01H
MOVTH0,#(65536-50000)/256
MOVTL0,#(65536-50000)MOD256
SETBTR0
SETBET0
SETBEA
SJMP$
INT0X:
MOVTH0,#(65536-50000)/256
MOVTL0,#(65536-50000)MOD256
INCTCOUNT
MOVA,TCOUNT
CJNEA,#20,NEXT
MOVTCOUNT,#00H
INCSECOND
MOVA,SECOND
CJNEA,#60,NEX
MOVSECOND,#00H
NEX:MOVA,SECOND
MOVB,#10
DIVAB
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP0,A
MOVA,B
MOVCA,@A+DPTR
MOVP2,A
NEXT:RETI
TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
2.C言语源程序(中止法)
#include
unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsignedcharsecond;
unsignedchartcount;
voidmain(void)
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
tcount=0;
second=0;
P0=dispcode[second/10];
P2=dispcode[second%10];
while(1);
}
voidt0(void)interrupt1using0
{
tcount++;
if(tcount==20)
{
tcount=0;
second++;
if(second==60)
{
second=0;
}
P0=dispcode[second/10];
P2=dispcode[second%10];
}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}