名奢网 名表 最新资讯 查看内容

8052计数器(定时器0和计数器1)

2023-1-18 10:04| 发布者: 挖安琥| 查看: 163| 评论: 0

放大 缩小
简介:之前由于同窗的一个小实验,需求用到频率计,所以自己想搞一个出来,于是网上找了很多资料,简单的有用单片机的定时器和计数器的分离来测其信号的频率,还有的是c8051f的捕获功用,想来想去,还是想用用自己熟习的80 ...

之前由于同窗的一个小实验,需求用到频率计,所以自己想搞一个出来,于是网上找了很多资料,简单的有用单片机的定时器和计数器的分离来测其信号的频率,还有的是c8051f的捕获功用,想来想去,还是想用用自己熟习的8052的计数器功用,究竟平常都用的是定时器功用,很少用到计数器功用,以便愈加深化的运用8052,以后再学习C8051F。


搞了好几天,时钟没有结果,计数功用倒是有了,但是不能在1s的时间里计数,很是头痛,忽然有一天,我的同窗找到了一段代码,说是能够运转的,于是我拿过来,把LED改了一改,烧录之后,还真的胜利了!甚是大喜啊!这里附上源代码;


  1. /*******http://hi.baidu.com/zhangjiayue123/home************************************


  2. 函数功用:51单片机制造的频率计(当然这个频率计的频率范围是有限制的理论值为2Hz-1MHz)


  3. 编译环境:keil4


  4. 设计思想:测频率,其实就是一个定时计数的过程,在一定时间内,检测脉冲的个数,最后用脉冲个数除以时间便能够得到频率


  5. 修正 : LiMing WangQiDong


  6. 板子 : CCDZ-C board


  7. CPU : STC89C52RC


  8. 晶振 : 12MHz


  9. 修正部分: LED显现部分 4位显现 2Hz - 9999Hz


  10. 版本 : 0.1.0


  11. ********http://hi.baidu.com/zhangjiayue123/home****************************************/


  12. #include <reg52.h>


  13. #include <intrins.h>


  14. #define uchar unsigned char


  15. #define uint unsigned int


  16. sbit dula=P2^6;


  17. sbit wela=P2^7;


  18. //uchar seg_du[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管的段选


  19. uchar seg_du[]={


  20. 0x3f, 0x06, 0x5b, 0x4f,


  21. 0x66, 0x6d, 0x7d, 0x07,0x7f,0x6f}; //数码管的段选


  22. uchar dbuf[4]={0,0,0,0}; //用来装显现数据的空数组


  23. uint count;


  24. uint cou,cou1;


  25. void delay(void) //延时函数用于数码管动态扫描


  26. {


  27. uchar i;


  28. for(i=0;i<110;i++)


  29. ;


  30. }


  31. void display() // 数码管显现函数


  32. {


  33. dula=1;


  34. P0=seg_du[dbuf[3]];


  35. dula=0;


  36. P0=0xff;


  37. wela=1;


  38. P0=0xfe;


  39. wela=0;


  40. delay();


  41. //


  42. dula=1;


  43. P0=seg_du[dbuf[2]];


  44. dula=0;


  45. P0=0xff;


  46. wela=1;


  47. P0=0xfd;


  48. wela=0;


  49. delay();


  50. //


  51. dula=1;


  52. P0=seg_du[dbuf[1]];


  53. dula=0;


  54. P0=0xff;


  55. wela=1;


  56. P0=0xfb;


  57. wela=0;


  58. delay();


  59. //


  60. dula=1;


  61. P0=seg_du[dbuf[0]];


  62. dula=0;


  63. P0=0xff;


  64. wela=1;


  65. P0=0xf7;


  66. wela=0;


  67. delay();


  68. }


  69. void timer0 (void )interrupt 1 //定时器中缀,用与定时计数


  70. {


  71. count++;


  72. if(count == 4000) //定时1s,


  73. {


  74. count=0; // 将定时标记清零


  75. TR1=0; //关闭计数器


  76. cou1=TL1-6; //将小于250次脉冲的计数加上


  77. dbuf[3]=(cou*250+cou1)/1000;


  78. dbuf[2]=((cou*250+cou1)%1000)/100;


  79. dbuf[1]=((cou*250+cou1)%100)/10;


  80. dbuf[0]=(cou*250+cou1)%10; //显现处置函数


  81. cou=0; //计数器清零


  82. TL1=6; // 翻开计数器中缀


  83. TR1=1; //开启计数器,使之工作


  84. }


  85. }


  86. void time1(void )interrupt 3 //计数器中缀,用于计数


  87. {


  88. cou++;


  89. }


  90. void time0_init() //初始化


  91. {


  92. TMOD=0x62; // 设置定时器0,和的方式


  93. TH0=6;


  94. TL0=6; //定时器的初值,用于中缀一次计时250us


  95. ET0=1; //开定时器0中缀


  96. TR0=1; //开定时器0


  97. }


  98. void time1_init() // 计数器1初始化


  99. {


  100. TH1=6;


  101. TL1=6; //装载计数器的初值


  102. ET1=1; //开计数器1 中缀


  103. TR1=1; //开计数器1


  104. EA=1; //开总中缀


  105. }


  106. void main()


  107. {


  108. count=0;


  109. time0_init();


  110. time1_init();


  111. while(1)


  112. {


  113. display();


  114. }


  115. }


也感激网上的网友提供,


结果还是能够的,只不外和自由四位显现,附上几张照片:

8052计数器(定时器0和计数器1)

8052计数器(定时器0和计数器1)


信号发作器的频率为5.677kHZ,LED上显现还能够吧。。。


原文链接:



路过

雷人

握手

鲜花

鸡蛋
已有 0 人参与

会员评论

最新文章

文章列表

 名表回收网手机版

官网微博:名表回收网服务平台

今日头条二维码 1 微信公众号二维码 1 抖音小程序二维码 1
浙江速典奢贸易有限公司 网站经营许可证 备案号:浙ICP备19051835号2012-2022
名表回收网主要专注于手表回收,二手名表回收/销售业务,可免费鉴定(手表真假),评估手表回收价格,正规手表回收公司,浙江实体店,支持全国范围上门回收手表
返回顶部