由于定时时间较长,一个定时器/计数器不能直接实现,一个定时器/计数器最长定时时间为65ms多一点,可以用以下两种方法实现。 (1)方法一
用定时/计数器T0产生周期性为10ms的定时,然后用一个变量对10ms计数50次。系统时钟为12MHz,定时/计数器T0定时10ms,计数值N为10000,选方式1,方式控制字为00000001B(01H),则初值X为X=65 536-10 000。
AU1171615141312111028272625242322213233343536373839P3.7/RDP3.6/WRP3.5/T1P3.4/T0P3.3/INT1P3.2/INT0P3.1/TXDP3.0/RXDP2.7/A15P2.6/A14P2.5/A13P2.4/A12P2.3/A11P2.2/A10P2.1/A9P2.0/A8P0.7/AD7P0.6/AD6P0.5/AD5P0.4/AD4P0.3/AD3P0.2/AD2P0.1/AD1P0.0/AD0AT89C51P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.087654321BEAALEPSEN313029VCCRST9D1XTAL218R2470RXTAL119D0R1470R #include
unsigned char i; //定义计数变量 void main( )
21
{ i=0; //初始化 TMOD=0x01;
TH0=(65536-10000)/256; TL0=(65536-10000)%6; EA=1; ET0=1; TR0=1; while(1); }
void time0_int(void) interrupt 1 //中断服务程序 { TH0=(65536-10000)/256; //重载初始值 TL0=(65536-10000)%6; //重载初始值
i++; //每发生一次中断,计数变量加1 if (i==50) //发生50次中断,定时0.5ms { P1_1=!P1_1;
i=0; //计数变量清零 } } (2)方法二
用定时/计数器T1计数实现,对10ms计数50次。定时/计数器T1工作于计数方式时,计数脉冲通过T1(P3.5)输入。设定时/计数器T0定时时间到对P1.0取反一次,则T1(P3.5)每10ms产生一
22
个计数脉冲,那么定时500ms只需计数25次,设定时/计数器T1工作于方式2,初值X=256-25=231,TH1=TL1=231。因为定时/计数器T0工作于方式1,定时方式,则这时方式控制字为01100001B(61H)。定时/计数器T0和T1都采用中断方式工作。
U1171615141312111028272625242322213233343536373839P3.7/RDP3.6/WRP3.5/T1P3.4/T0P3.3/INT1P3.2/INT0P3.1/TXDP3.0/RXDP2.7/A15P2.6/A14P2.5/A13P2.4/A12P2.3/A11P2.2/A10P2.1/A9P2.0/A8P0.7/AD7P0.6/AD6P0.5/AD5P0.4/AD4P0.3/AD3P0.2/AD2P0.1/AD1P0.0/AD0AT89C51P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.087654321VCCD1R2470REAALEPSEN313029A9B18RSTXTAL2XTAL119 #include
{ TMOD=0x61; //初始化 TH0=(65536-10000)/256; TL0=(65536-10000)%6; TH1=231;TL1=231; EA=1; ET0=1; ET1=1; TR0=1; TR1=1;
23
while(1); }
void time0_int(void) interrupt 1 //T0中断服务程序 { TH0=(65536-10000)/256; //重载初始值 TL0=(65536-10000)%6; //重载初始值 P1_0=!P1_0; }
void time1_int(void) interrupt 3 //T1中断服务程序 { P1_1=!P1_1; }
【例4-18】设系统时钟频率为12MHz,编程实现:P1.1引脚上输出周期为1s,占空比为20%的脉冲信号
根据输出要求,脉冲信号在一个周期内高电平占0.2s,低电平占0.8s,超出了定时器的最大定时间隔,因此利用定时器0产生一个基准定时配合软件计数来实现。取50ms作为基准定时,采用工作方式1,这样这个周期需要20个基准定时,其中高电平占4个基准定时。 #include
unsigned char i; //定义计数变量 void main( )
{ i=0; //初始化 TMOD=0x01;
TH0=(65536-50000)/256;
24
TL0=(65536-50000)%6; EA=1; ET0=1; TR0=1; while(1); }
void time0_int(void) interrupt 1 //中断服务程序 { TH0=(65536-50000)/256; //重载初始值 TL0=(65536-50000)%6; i=i+1;
if(i==4) P1_1=0; //高电平时间到变低 else if(i==20) //周期时间到变高 { P1_1=1;
i=0; //计数变量清零 } }
25