当前位置:   article > 正文

52单片机与MH-Sensor-Series模块使用简单检测车轮转速

mh-sensor-series

mh sensor series模块有四个口,VCC接5V,GND接地,还有A0与D0分别是模拟量与数字量的输出。

和单片机使用,就只用D0口即可.

使用单片机的外部中断进行引脚检测。可以选择P3^2或者P3^3.

这里选择外部中断1,工作模式2

还需要使用定时器中断来检测时间差。

如果使用,可以直接复制代码,然后修改引脚即可。使用的共阳极两段数码管。

  1. /*
  2. * @Author:Booksort
  3. * @fuc: 多少圈/秒,去151修改
  4. *
  5. */
  6. #include <REG52.H>
  7. #include <stdio.h>
  8. #define uint8 unsigned char
  9. #define uint32 unsigned int
  10. uint8 code Num_CA[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
  11. unsigned char PWM_T=0;
  12. unsigned char PWML=30;//左轮占空比
  13. unsigned char PWMR=30;//有轮占空比
  14. unsigned char Run_Flag=0;//电机模式->0-停止;1-运行
  15. static char Key_Up=0;
  16. sbit sm1=P2^0;
  17. sbit sm2=P2^1;
  18. //使能1-左
  19. sbit ENL=P1^2;
  20. sbit INL1=P1^3;
  21. sbit INL2=P1^4;
  22. //使能2-右
  23. sbit ENR=P1^5;
  24. sbit INR1=P1^6;
  25. sbit INR2=P1^7;
  26. //拨码开关
  27. sbit DialSwitch1=P2^5;
  28. sbit DialSwitch2=P2^6;
  29. //外部中断 P3^2,P3^3
  30. sbit Deng=P1^0;
  31. sbit KEY=P3^3;
  32. char Speed=0;
  33. uint8 t1=0;
  34. uint8 t2=0;
  35. uint32 TIME=0;
  36. char Tspeed=0;
  37. void delay_ms(int xms);
  38. void Display_Num_Fuc1(uint8 num);
  39. void Forward(void);
  40. void BackForward(void);
  41. void Run(void);
  42. void main(void)
  43. {
  44. TMOD |=0x01;
  45. TL0 = (65536-1000)%256; //设置定时初始值
  46. TH0 = (65536-1000)/256; //设置定时初始值
  47. ET0=1;
  48. IT1=0;
  49. EX1=1;
  50. EA=1;
  51. TR0 = 1; //定时器0开始计时
  52. while(1)
  53. {
  54. Run();
  55. Forward();
  56. if(DialSwitch1==0&&DialSwitch2==0)
  57. {
  58. PWML=100;
  59. PWMR=100;
  60. }
  61. else if(DialSwitch1==0&&DialSwitch2==1)
  62. {
  63. PWML=50;
  64. PWMR=50;
  65. }
  66. else if(DialSwitch1==1&&DialSwitch2==0)
  67. {
  68. PWML=10;
  69. PWMR=10;
  70. }
  71. else
  72. {
  73. PWML=0;
  74. PWMR=0;
  75. }
  76. if(Speed>=0&&Speed<=99)
  77. Display_Num_Fuc1(Speed);//显示多少圈每秒
  78. }
  79. }
  80. //定时器0中断
  81. void Timer0() interrupt 1
  82. {
  83. TL0 = (65536-1000)%256; //设置定时初始值
  84. TH0 = (65536-1000)/256; //设置定时初始值
  85. TIME++;
  86. if(PWM_T>200)//周期>>1ms*200=200ms
  87. {
  88. PWM_T=0;
  89. }
  90. if(Run_Flag==1)
  91. {
  92. if(PWM_T<=PWML)
  93. {
  94. ENL=1;
  95. }
  96. else
  97. {
  98. ENL=0;
  99. }
  100. if(PWM_T<=PWMR)
  101. {
  102. ENR=1;
  103. }
  104. else
  105. {
  106. ENR=0;
  107. }
  108. }
  109. else if(Run_Flag==0)
  110. {
  111. ENL=ENR=0;
  112. }
  113. PWM_T++;
  114. if(KEY==1&&Key_Up==1)
  115. {
  116. Key_Up=0;
  117. Deng=1;
  118. Tspeed++;
  119. }
  120. if(TIME>=1000)
  121. {
  122. Speed=Tspeed;
  123. Tspeed=0;
  124. TIME=0;
  125. }
  126. }
  127. //60*1000
  128. void exint1() interrupt 2
  129. {
  130. if(Key_Up==0)
  131. {
  132. Key_Up=1;
  133. t1=t2;
  134. Deng=0;
  135. }
  136. }
  137. void delay_ms(int xms)
  138. {
  139. int x,y;
  140. for(x=xms;x>=0;x--)
  141. {
  142. for(y=100;y>=0;y--)
  143. {}
  144. }
  145. }
  146. void Display_Num_Fuc1(uint8 num)
  147. {
  148. //2位数码管,显示区间[0,99],超过区间最大值,就变成区间最小值
  149. //数码管的2个位选,实时切换
  150. //使用数组来维护各个数码管显示的数字
  151. P0=0xFF;
  152. //P2=0x02;
  153. sm1=0;
  154. sm2=1;
  155. P0=Num_CA[num%10];
  156. num=num/10;
  157. //delay_ms(1);
  158. P0=0xFF;
  159. //P2=0x01;
  160. sm1=1;
  161. sm2=0;
  162. P0=Num_CA[num];
  163. //delay_ms(1);
  164. }
  165. void Run(void)
  166. {
  167. Run_Flag=1;
  168. }
  169. void Forward(void)
  170. {
  171. INL1=1;
  172. INL2=0;
  173. INR1=1;
  174. INR2=0;
  175. }
  176. void BackForward(void)
  177. {
  178. INL1=0;
  179. INL2=1;
  180. INR1=0;
  181. INR2=1;
  182. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/147779
推荐阅读
相关标签
  

闽ICP备14008679号