找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4172|回复: 2
收起左侧

单片机超声波测距原理图及源程序

[复制链接]
ID:73526 发表于 2015-2-11 02:02 | 显示全部楼层 |阅读模式
本帖最后由 wangming 于 2015-2-11 02:07 编辑

         这是一款单片机超声波测距原理图,这款单片机超声波测距板电路简单,制作容易,无需进行调试,电路焊焊接好后,下装程序后即可工作。


超声波测距原理的详细解释详见:http://www.51hei.com/mcu/2294.html

  1. //////////////////////////////////////////////////////////////////////////////////////

  2. //             AT89C2051单片机超声波测距程序               //

  3. //                            编写:yuan_jia                              //

  4. //                             QQ:111716                                //

  5. //                               2014年7月                                 //

  6. //                             晶振:12MH                                //

  7. ////////////////////////////////////////////////////////////////////////////////////

  8. #include <REG2051.H>
  9. #define k1 P3_4
  10. #define csbout P3_5 //超声波发送
  11. #define csbint P3_7 //超声波接收
  12. #define csbc=0.034
  13. #define bg P3_3
  14. unsigned char csbds,opto,digit,buffer[3],xm1,xm2,xm0,key,jpjs;//显示标识
  15. unsigned char convert[10]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9段码
  16. unsigned int s,t,i, xx,j,sj1,sj2,sj3,mqs,sx1;
  17. bit cl;

  18. void csbcj();
  19. void delay(j); //延时函数
  20. void scanLED(); //显示函数
  21. void timeToBuffer(); //显示转换函数
  22. void keyscan();
  23. void k1cl();
  24. void k2cl();
  25. void k3cl();
  26. void k4cl();
  27. void offmsd();


  28. void main() //主函数
  29. {
  30. EA=1; //开中断
  31. TMOD=0x11; //设定时器0为计数,设定时器1定时
  32. ET0=1; //定时器0中断允许
  33. ET1=1; //定时器1中断允许
  34. TH0=0x00;
  35. TL0=0x00;
  36. TH1=0x9E;
  37. TL1=0x57;
  38. csbds=0;
  39. csbint=1;
  40. csbout=1;
  41. cl=0;
  42. ōpto=0xff;
  43. jpjs=0;
  44. sj1=45;
  45. sj2=200;
  46. sj3=400;
  47. k4cl();
  48. TR1=1;
  49. while(1)
  50. {
  51. keyscan();
  52. if(jpjs<1)
  53. {
  54. csbcj();
  55. if(s>sj3)
  56. {
  57. buffer[2]=0x76;
  58. buffer[1]=0x76;
  59. buffer[0]=0x76;
  60. }
  61. else if(s<sj1)
  62. {
  63. buffer[2]=0x40;
  64. buffer[1]=0x40;
  65. buffer[0]=0x40;
  66. }
  67. else timeToBuffer();
  68. }
  69. else timeToBuffer(); //将值转换成LED段码
  70. offmsd();
  71. scanLED(); //显示函数
  72. if(s<sj2)
  73. bg=0;
  74. bg=1;
  75. }
  76. }


  77. void scanLED() //显示功能模块
  78. {
  79. digit=0x04;
  80. for( i=0; i<3; i++) //3位数显示
  81. {
  82. P3=~digit&opto; //依次显示各位数
  83. P1=~buffer; //显示数据送P1口
  84. delay(20); //延时处理
  85. P1=0xff; //P1口置高电平(关闭)
  86. if((P3&0x10)==0) //判断3位是否显示完
  87. key=0;
  88. digit>>=1; //循环右移1位
  89. }
  90. }

  91. void timeToBuffer() //转换段码功能模块
  92. {
  93. xm0=s/100;
  94. xm1=(s-100*xm0)/10;
  95. xm2=s-100*xm0-10*xm1;
  96. buffer[2]=convert[xm2];
  97. buffer[1]=convert[xm1];
  98. buffer[0]=convert[xm0];
  99. }

  100. void delay(i)
  101. {
  102. while(--i);
  103. }

  104. void timer1int (void) interrupt 3 using 2
  105. {
  106. TH1=0x9E;
  107. TL1=0x57;
  108. csbds++;
  109. if(csbds>=40)
  110. {
  111. csbds=0;
  112. cl=1;
  113. }
  114. }

  115. void csbcj()
  116. {
  117. if(cl==1)
  118. {
  119. TR1=0;
  120. TH0=0x00;
  121. TL0=0x00;
  122. i=10;
  123. while(i--)
  124. {
  125. csbout=!csbout;
  126. }
  127. TR0=1;
  128. i=mqs; //盲区
  129. while(i--)
  130. {
  131. }
  132. i=0;
  133. while(csbint)
  134. {
  135. i++;
  136. if(i>=2450) //上限值
  137. csbint=0;
  138. }
  139. TR0=0;
  140. TH1=0x9E;
  141. TL1=0x57;
  142. t=TH0;
  143. t=t*256+TL0;
  144. s=t*csbc/2;
  145. TR1=1;
  146. cl=0;
  147. }
  148. }

  149. void keyscan() //健盘处理函数
  150. {
  151. xx=0;
  152. if(k1!=1) // 判断开关是否按下
  153. {
  154. delay(400); //延时去抖动
  155. if(k1!=1) // 判断开关是否按下
  156. {
  157. while(!k1)
  158. {
  159. delay(30);
  160. xx++;
  161. }
  162. if(xx>2000)
  163. {
  164. jpjs++;
  165. if(jpjs>4)
  166. jpjs=0;
  167. }
  168. xx=0;
  169. switch(jpjs)
  170. {
  171. case 1: k1cl();break;
  172. case 2: k2cl();break;
  173. case 3: k3cl();break;
  174. case 4: k4cl();break;
  175. }
  176. }
  177. }
  178. }



  179. void k1cl()
  180. {
  181. sj1=sj1+5;
  182. if(sj1>100)
  183. sj1=30;
  184. s=sj1;
  185. }
  186. void k2cl()
  187. {
  188. sj2=sj2+5;
  189. if(sj2>500)
  190. sj2=40;
  191. s=sj2;
  192. }

  193. void k3cl()
  194. {
  195. sj3=sj3+10;
  196. if(sj3>500)
  197. sj3=100;
  198. s=sj3;
  199. }

  200. void k4cl()
  201. {
  202. sx1=sj1-1;
  203. sx1=sx1/csbc;
  204. mqs=sx1/4.5;
  205. }

  206. void offmsd()
  207. {
  208. if (buffer[0] == 0x3f)
  209. buffer[0] = 0x00;
  210. }
复制代码



回复

使用道具 举报

ID:74956 发表于 2015-4-9 20:13 | 显示全部楼层
可以用吗
回复

使用道具 举报

ID:138687 发表于 2016-9-7 12:32 | 显示全部楼层
好用吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表