定时器0的应用提高
方式0的使用:
示例代码:使用方式0使得led灯一秒钟闪烁
//这个程序比较简单,需要明白的是定时器0方式0是一个1 //13位的计数器,所以最大的数为2的13次方,8192,并且TL0中的高三位没有用 //因此除以的也不是256,而是32,定时器0方式00需要注意的是,最大数字因为是8192 //因此定时5000为定时5ms,定时一秒要进入中断200次 #include<reg52.h> #define uint unsigned int #define uchar unsigned char uchar num; sbit led = P1^0; void main() { TMOD = 0x0; TH0 = (8192-5000)/32; TL0 =(8192-5000)%32; EA = 1; ET0 = 1; TR0 = 1; while(1); } void t0()interrupt 1 { TH0= (8192-5000)/32; TL0= (8192-5000)%32; num++; if(num==200) { num=0; led = ~led; } }
方式2的使用:(8位自动重装的8位定时器)
使用方式2的优点:方式2适合用来做特别精确的脉冲信号发生器,因为其中只有一个8位计数器,THX高八位常数缓冲器,当TLX八位溢出的适合,THX将自动的填充到TLX中,从而避免了反复重装初值带来的精度误差,由于使用方式2要求高精度,所以晶振也必须是12M的晶振,这样才能精确的计时;
示例代码:使用方式2使得led灯一秒钟闪烁
//因为定时器0方式2是一个8位自动重装的定时器,所以初值一般是6 //这是因为装入6的话,THX=250,TLX=250,这样一次定时的时间是2.5毫秒 //由于是自动重装,所以,定时器0方式-不用重装初值 //这里的num是uint的类型,这里要注意 #include<reg52.h> #define uint unsigned int #define uchar unsigned char uint num; sbit led = P1^0; void main() { TMOD = 0x02; TH0 = 6; TL0 =6; EA = 1; ET0 = 1; TR0 = 1; while(1) { if(num==4000) { num=0; led = ~led; } } } void t0()interrupt 1 { num++; }
方式3的使用:
方式3只适用于定时器T0,当T1设置位方式3时,定时器T1不计数,方式3将T0分成两个独立的8位计数器TL0和TH0,这里注意的是,由于定时器方式3相当于是两个计数器,所以,这时候TH0这个计数器将占用T1的中断请求位,所以方式3使用的时候,T1不要使用中断,在这种情况下,T1通常是用来当作是串行口的波特率发生器
示例代码:使用方式3中的低8位使得led灯一秒钟闪烁,高八位使得led灯0.5秒闪烁
/*方式3只适用于定时器T0,当T1设置位方式3时, 定时器T1不计数,方式3将T0分成两个独立的8位计数器TL0和TH0o注意的是,? 哨定时器方式3相当于是两个计数器,所以,这时候TH0这个计数器将占用T1的中断请求位,所 苑绞?使用的时候,T1不要使用中断,在这种情况下,T1通常是用来当作是串行口的波特率发生器*/ #include<reg52.h> #define uint unsigned int #define uchar unsigned char uint num1,num2; sbit led1 = P1^0; sbit led2 = P1^1; void main() { TMOD = 0x03; TH0 = 6; TL0 =6; EA = 1; ET0 = 1; ET1 =1; TR0 = 1; TR1 = 1; while(1) { if(num1>=4000) { num1=0; led1 = ~led1; } if(num2 >= 2000) { num2=0; led2 = ~led2; } } } void TL0_timer()interrupt 1 { TL0 = 6; num1++; } void TH0_timer() interrupt 3 { TH0 = 6; num2++; }
综合程序:
//利用计数器0工作方式1,用一根导线,连接GND引脚,用另外的一根导线 //去接触T0(P3^4),没接触一下,计数器技术一次,然后将说记录的数值显示在 //数码管的前两位,然后计数满100清零 #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula = P2^6; sbit wela = P2^7; uchar code table[] ={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delayms(uint); void display(uchar shi,uchar ge) { dula =1; P0 = table[shi]; dula =0; P0 = 0xff; wela = 1; P0 = 0xfe; wela = 0; delayms(5); dula = 1; P0 = table[ge]; dula = 0; P0 = 0xff; wela = 1; P0 = 0xfd; wela = 0; delayms(5); } void delayms(uint xms) { uint i,j; for(i = xms;i>0;i--) for(j=110;j>0;j--); } uint read() { uchar t1,th1,th2; uint val; while(1) { th1 = TH0 ; t1 = TL0; th2 = TH0 ; if(th1 == th2) break; } val = th1*256+t1; return val; } void main() { uchar a,b; uint num; TMOD = 0x05; TH0 = 0; TL0 = 0; TR0 = 1; while(1) { num = read(); if(num>100) { num = 0; TH0 = 0; TL0 = 0; } a = num/10; b = num%10; display(a,b); } }
版权所有,转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3348305.html