定时器0的应用提高

方式0的使用:

示例代码:使用方式0使得led灯一秒钟闪烁

  1. //这个程序比较简单,需要明白的是定时器0方式0是一个1
  2. //13位的计数器,所以最大的数为2的13次方,8192,并且TL0中的高三位没有用
  3. //因此除以的也不是256,而是32,定时器0方式00需要注意的是,最大数字因为是8192
  4. //因此定时5000为定时5ms,定时一秒要进入中断200次
  5. #include<reg52.h>
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. uchar num;
  9. sbit led = P1^0;
  10. void main()
  11. {
  12. TMOD = 0x0;
  13. TH0 = (8192-5000)/32;
  14. TL0 =(8192-5000)%32;
  15. EA = 1;
  16. ET0 = 1;
  17. TR0 = 1;
  18. while(1);
  19. }
  20. void t0()interrupt 1
  21. {
  22. TH0= (8192-5000)/32;
  23. TL0= (8192-5000)%32;
  24. num++;
  25. if(num==200)
  26. {
  27. num=0;
  28. led = ~led;
  29. }
  30. }

View Code

方式2的使用:(8位自动重装的8位定时器)

使用方式2的优点:方式2适合用来做特别精确的脉冲信号发生器,因为其中只有一个8位计数器,THX高八位常数缓冲器,当TLX八位溢出的适合,THX将自动的填充到TLX中,从而避免了反复重装初值带来的精度误差,由于使用方式2要求高精度,所以晶振也必须是12M的晶振,这样才能精确的计时;

示例代码:使用方式2使得led灯一秒钟闪烁

  1. //因为定时器0方式2是一个8位自动重装的定时器,所以初值一般是6
  2. //这是因为装入6的话,THX=250,TLX=250,这样一次定时的时间是2.5毫秒
  3. //由于是自动重装,所以,定时器0方式-不用重装初值
  4. //这里的num是uint的类型,这里要注意
  5. #include<reg52.h>
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. uint num;
  9. sbit led = P1^0;
  10. void main()
  11. {
  12. TMOD = 0x02;
  13. TH0 = 6;
  14. TL0 =6;
  15. EA = 1;
  16. ET0 = 1;
  17. TR0 = 1;
  18. while(1)
  19. {
  20. if(num==4000)
  21. {
  22. num=0;
  23. led = ~led;
  24. }
  25. }
  26. }
  27. void t0()interrupt 1
  28. {
  29. num++;
  30. }

View Code

方式3的使用:
方式3只适用于定时器T0,当T1设置位方式3时,定时器T1不计数,方式3将T0分成两个独立的8位计数器TL0和TH0,这里注意的是,由于定时器方式3相当于是两个计数器,所以,这时候TH0这个计数器将占用T1的中断请求位,所以方式3使用的时候,T1不要使用中断,在这种情况下,T1通常是用来当作是串行口的波特率发生器

示例代码:使用方式3中的低8位使得led灯一秒钟闪烁,高八位使得led灯0.5秒闪烁

  1. /*方式3只适用于定时器T0,当T1设置位方式3时,
  2. 定时器T1不计数,方式3将T0分成两个独立的8位计数器TL0和TH0o注意的是,?
  3. 哨定时器方式3相当于是两个计数器,所以,这时候TH0这个计数器将占用T1的中断请求位,所
  4. 苑绞?使用的时候,T1不要使用中断,在这种情况下,T1通常是用来当作是串行口的波特率发生器*/
  5. #include<reg52.h>
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. uint num1,num2;
  9. sbit led1 = P1^0;
  10. sbit led2 = P1^1;
  11. void main()
  12. {
  13. TMOD = 0x03;
  14. TH0 = 6;
  15. TL0 =6;
  16. EA = 1;
  17. ET0 = 1;
  18. ET1 =1;
  19. TR0 = 1;
  20. TR1 = 1;
  21. while(1)
  22. {
  23. if(num1>=4000)
  24. {
  25. num1=0;
  26. led1 = ~led1;
  27. }
  28. if(num2 >= 2000)
  29. {
  30. num2=0;
  31. led2 = ~led2;
  32. }
  33. }
  34. }
  35. void TL0_timer()interrupt 1
  36. {
  37. TL0 = 6;
  38. num1++;
  39. }
  40. void TH0_timer() interrupt 3
  41. {
  42. TH0 = 6;
  43. num2++;
  44. }

View Code

 综合程序:

  1. //利用计数器0工作方式1,用一根导线,连接GND引脚,用另外的一根导线
  2. //去接触T0(P3^4),没接触一下,计数器技术一次,然后将说记录的数值显示在
  3. //数码管的前两位,然后计数满100清零
  4. #include<reg52.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. sbit dula = P2^6;
  8. sbit wela = P2^7;
  9. uchar code table[] ={0x3f,0x06,0x5b,0x4f,
  10. 0x66,0x6d,0x7d,0x07,
  11. 0x7f,0x6f,0x77,0x7c,
  12. 0x39,0x5e,0x79,0x71};
  13. void delayms(uint);
  14. void display(uchar shi,uchar ge)
  15. {
  16. dula =1;
  17. P0 = table[shi];
  18. dula =0;
  19. P0 = 0xff;
  20. wela = 1;
  21. P0 = 0xfe;
  22. wela = 0;
  23. delayms(5);
  24. dula = 1;
  25. P0 = table[ge];
  26. dula = 0;
  27. P0 = 0xff;
  28. wela = 1;
  29. P0 = 0xfd;
  30. wela = 0;
  31. delayms(5);
  32. }
  33. void delayms(uint xms)
  34. {
  35. uint i,j;
  36. for(i = xms;i>0;i--)
  37. for(j=110;j>0;j--);
  38. }
  39. uint read()
  40. {
  41. uchar t1,th1,th2;
  42. uint val;
  43. while(1)
  44. {
  45. th1 = TH0 ;
  46. t1 = TL0;
  47. th2 = TH0 ;
  48. if(th1 == th2)
  49. break;
  50. }
  51. val = th1*256+t1;
  52. return val;
  53. }
  54. void main()
  55. {
  56. uchar a,b;
  57. uint num;
  58. TMOD = 0x05;
  59. TH0 = 0;
  60. TL0 = 0;
  61. TR0 = 1;
  62. while(1)
  63. {
  64. num = read();
  65. if(num>100)
  66. {
  67. num = 0;
  68. TH0 = 0;
  69. TL0 = 0;
  70. }
  71. a = num/10;
  72. b = num%10;
  73. display(a,b);
  74. }
  75. }

View Code

版权所有,转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3348305.html

 

版权声明:本文为fengdashen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/fengdashen/p/3348305.html