[讨论] 大家看看使用单片机如何测量电阻值?

leslie   2009-11-30 14:53 楼主
普通I/O口实现测量可调电阻,调节LED的闪烁频率!     

相信大家都见过用普通I/O口测量电阻方案,一直以来没有亲自动手制作.今天终于制作成功!实现用普通I/O测量可调电阻,调节LED闪烁频率!现与大家一起分享!

来源:PIC单片机交流论坛

1.jpg

2.jpg

3.jpg

回复评论 (2)

  1. //引入头文件*********************************************************
  2. #include "delay.h"
  3. #include "delay.c"
  4. #include "pic1684.h"

  5. //输入定义***********************************************************
  6. #define Key RA0 //按键输入
  7. #define InRc RA1 //测量输入

  8. //输出定义***********************************************************
  9. #define RcSu TRISA1 //输出设置

  10. //公用变量***********************************************************
  11. unsigned char cycle = 0; //计时母数
  12. unsigned char coune = 0; //时间计数

  13. //*******************************************************************
  14. //函数名称:port_init();
  15. //输入参数:无
  16. //输出参数:无
  17. //功能描述:端口设置
  18. //建造日期:2008.07.08
  19. //*******************************************************************
  20. void PortInit(void)
  21. {
  22. PORTA = 0x00; //
  23. PORTB = 0x00; //

  24. TRISA = 0x01; //A 口设置
  25. TRISB = 0x00; //B 口设置
  26. }

  27. //*******************************************************************
  28. //函数名称:IdsInit();
  29. //输入参数:无
  30. //输出参数:无
  31. //功能描述:中断设置
  32. //建造日期:2008.07.08
  33. //*******************************************************************
  34. void IdsInit(void)
  35. {
  36. OPTION = 0x87; //分频因子
  37. TMR0 = 0x3d; //定时初值
  38. T0IE = 1; //开启定时
  39. GIE = 1; //准许中断
  40. }

  41. //*******************************************************************
  42. //函数名称:DischargeOut();
  43. //输入参数:无
  44. //输出参数:无
  45. //功能描述:电容放电
  46. //建造日期:2008.07.08
  47. //*******************************************************************
  48. void DischargeOut(void)
  49. {
  50. InRc = 0; //置低电平
  51. RcSu = 0; //开始放电

  52. DelayMs(1); //放电时间
  53. }

  54. //*******************************************************************
  55. //函数名称:SurveyRc();
  56. //输入参数:无
  57. //输出参数:充电时间
  58. //功能描述:测量充电时间
  59. //建造日期:2008.07.08
  60. //*******************************************************************
  61. unsigned char SurveyRc(void)
  62. {
  63. unsigned char count = 0; //时间计数

  64. DischargeOut(); //电容放电
  65. RcSu = 1; //输入设置

  66. while (!InRc)
  67. {
  68. count++; //开始计时
  69. if (count == 100) break; //最大限时
  70. }

  71. return count; //返回时间
  72. }

  73. //*******************************************************************
  74. //函数名称:DataAdd(*buffer, size);
  75. //输入参数:缓冲区首址, 大小
  76. //输出参数:数据总和
  77. //功能描述:缓冲区所有数据相加
  78. //建造日期:2008.07.08
  79. //*******************************************************************
  80. unsigned int DataAdd(unsigned char *buffer, unsigned char size)
  81. {
  82. unsigned int add;
  83. unsigned char i;

  84. add = 0; //数据清零

  85. for (i = 0; i < size; i++)
  86. {
  87. add += buffer[i]; //数据相加
  88. }

  89. return add; //返回总和
  90. }

  91. //*******************************************************************
  92. //函数名称:DataMax(*buffer, size);
  93. //输入参数:缓冲区首址, 大小
  94. //输出参数:数据最大值
  95. //功能描述:选出缓冲区最大值
  96. //建造日期:2008.07.08
  97. //*******************************************************************
  98. unsigned char DataMax(unsigned char *buffer, unsigned char size)
  99. {
  100. unsigned char max, i;

  101. max = buffer[0]; //假设最大

  102. for (i = 1; i < size; i++)
  103. {
  104. if (max < buffer[i]) max = buffer[i]; //对比最大
  105. }

  106. return max; //最大数据
  107. }

  108. //*******************************************************************
  109. //函数名称:DataMin(*buffer, size);
  110. //输入参数:缓冲区首址, 大小
  111. //输出参数:数据最小大值
  112. //功能描述:选出缓冲区最小值
  113. //建造日期:2008.07.08
  114. //*******************************************************************
  115. unsigned char DataMin(unsigned char *buffer, unsigned char size)
  116. {
  117. unsigned char min, i;

  118. min = buffer[0]; //假设最小

  119. for (i = 1; i < size; i++)
  120. {
  121. if (min > buffer[i]) min = buffer[i]; //对比最小
  122. }

  123. return min; //最小数据
  124. }

  125. //*******************************************************************
  126. //函数名称:DataEqually(idend, isor);
  127. //输入参数:被除数,除数
  128. //输出参数:平均值
  129. //功能描述:使所数据相等
  130. //建造日期:2008.07.08
  131. //*******************************************************************
  132. unsigned char DataEqually(unsigned int idend, unsigned char isor)
  133. {
  134. return (idend / isor); //数据平均
  135. }

  136. //*******************************************************************
  137. //函数名称:FilterData();
  138. //输入参数:无
  139. //输出参数:平均值
  140. //功能描述:取样平均滤波
  141. //建造日期:2008.07.08
  142. //*******************************************************************
  143. unsigned char FilterData(void)
  144. {
  145. unsigned char i, max, min, data[10];
  146. unsigned int sum;

  147. for (i = 0; i < 10; i++) data[i] = SurveyRc(); //收集数据

  148. sum = DataAdd(data, 10); //数据相加
  149. max = DataMax(data, 10); //取最大值
  150. min = DataMin(data, 10); //取最小值

  151. return (DataEqually((sum - max - min), 8)); //取平均值
  152. }

  153. //*******************************************************************
  154. //函数名称:MonitorRC();
  155. //输入参数:无
  156. //输出参数:无
  157. //功能描述:监测电位器
  158. //建造日期:2008.07.08
  159. //*******************************************************************
  160. void MonitorRC(void)
  161. {
  162. static unsigned char value[8];
  163. unsigned char i, update;

  164. update = DataEqually((DataAdd(value, 8)), 8); //数据平均

  165. if (update != cycle) //数据变动
  166. {
  167. cycle = update; //更新周期
  168. coune = 0; //计数清零
  169. }

  170. for (i = 0; i < 7; i++) value[i] = value[i + 1]; //数据左移

  171. value[7] = FilterData(); //采集数据
  172. }

  173. //*******************************************************************
  174. //函数名称:TimeInt();
  175. //输入参数:无
  176. //输出参数:无
  177. //功能描述:定时中断服务
  178. //建造日期:2008.07.08
  179. //*******************************************************************
  180. void interrupt TimeInt(void)
  181. {
  182. coune++; //周期递增

  183. if (coune == cycle) //是否相等
  184. {
  185. coune = 0; //周期清零
  186. PORTB ^= 0x80; //输出指示
  187. }

  188. TMR0 = 0x3d; //定时初值
  189. T0IF = 0; //清除标志
  190. }

  191. //*******************************************************************
  192. //函数名称:main();
  193. //输入参数:无
  194. //输出参数:无
  195. //功能描述:主要程序
  196. //建造日期:2008.07.08
  197. //*******************************************************************
  198. void main(void)
  199. {
  200. PortInit(); //脚位设置
  201. IdsInit(); //中数设置

  202. while (1)
  203. {
  204. MonitorRC(); //启动监测
  205. DelayMs(5); //监测周期
  206. }
  207. }





11111.rar (34.21 KB)
(下载次数: 51, 2009-11-30 14:54 上传)
点赞  2009-11-30 14:54
点赞  2012-12-6 16:25
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复