找回密码
 注册会员
搜索附件  

超声波模块.pdf

 

超声波的工作原理与超声波模块资料:
应群友要求分享超声波的工作原理与超声波模块资料
超声波例程
  1. //************************************************************************************
  2. //URM37V3.0超声波模块是通过串口通讯的,也可以设置成PWM输出模式及开关量输出模式,
  3. //这些都是通过串口操作,具体详情请到http://www.dfrobot.cn下载使用手册查看!
  4. //本程序是使用DF-URFV1.0作控制板,串口读取方式(比较实用、简单),使用1602LCD显示,
  5. //使用MODE及+/L两个按键作功能切换和舵机角度控制,具体程序如下:
  6. //************************************************************************************

  7. //***********************************URM37_51DEMO.H*******************************

  8. #include<AT89X51.H>
  9. #include<INTRINS.H>

  10. #define uchar unsigned char
  11. #define uint unsigned int


  12. #define LCD_E P0_7 //使能线,R/W = 0,E电平低有效;R/W = 1,E电平高有效
  13. #define LCD_RW P0_6 //'1'读操作,'0'写操作
  14. #define LCD_RS P0_5 //'0'操作指令寄存器,'1'操作数据寄存器
  15. #define LED P0_4 //LCD背光

  16. #define ModeKey P0_3 //模式选择按钮

  17. #define TemperKey P0_2

  18. #define LCD_DATA P2 //8数据线


  19. //*********************************************************************************

  20. //***********************************HD44780.C*************************************

  21. #include"URM37_51demo.H"

  22. void Delay_ms(uchar ms)
  23. {
  24. uchar i;
  25. for(;ms>0;ms--)
  26. for(i=250;i>0;i--)
  27. {

  28. _nop_();
  29. _nop_();
  30. }
  31. }

  32. void LCD_WRITE_COMM(uchar comm) //写命令
  33. {


  34. LCD_RS = 0;
  35. LCD_RW = 0;

  36. LCD_E = 1;
  37. LCD_DATA = comm; //写8位
  38. LCD_E = 0;


  39. Delay_ms(2);
  40. }

  41. void LCD_WRITE_DATA(uchar Data)//写数据
  42. {

  43. LCD_RS = 1;
  44. LCD_RW = 0;

  45. LCD_E = 1;
  46. LCD_DATA = Data; //写8位
  47. LCD_E = 0;


  48. Delay_ms(2);
  49. }



  50. void LCD_Init(void)
  51. {
  52. Delay_ms(15);


  53. LCD_RS = 0;
  54. LCD_RW = 0;

  55. LCD_E = 1;
  56. LCD_DATA = 0x00; //上电初使
  57. LCD_E = 0;
  58. Delay_ms(5);

  59. LCD_E = 1;
  60. LCD_E = 0;
  61. Delay_ms(5);


  62. LCD_E = 1;
  63. LCD_E = 0;
  64. Delay_ms(5);


  65. LCD_E = 1;
  66. LCD_DATA = 0x02; //2行显示,5×7点阵
  67. LCD_E = 0;
  68. Delay_ms(5);

  69. LCD_WRITE_COMM(0x0c); //开显示,开光标,开字符闪烁
  70. LCD_WRITE_COMM(0x06); //显示后自动加一,光标移动
  71. LCD_WRITE_COMM(0x01); //清显示
  72. LCD_WRITE_COMM(0x38); //选择8线接口方式,2行显示,5×7点阵
  73. LCD_WRITE_COMM(0x80); //

  74. }

  75. //******************************************************************************

  76. //*****************************URM37_COM.C***********************************

  77. #include"URM37_51demo.H"

  78. extern void LCD_Init(void);
  79. extern void LCD_WRITE_DATA(uchar);
  80. extern void LCD_WRITE_COMM(uchar);
  81. extern void Delay_ms(uchar);


  82. uchar Data_buf[4];
  83. uchar Send_buf[4];
  84. uchar Receive_buf[4];
  85. uchar Temper_Oder[4]={0x11,0x00,0x00,0x11};//读温度命令
  86. uchar Du_dec[7]={29,65,100,135,170,206,241};//舵机角度
  87. uchar time,sum,Mode,Mode_flag;

  88. void MCU_Initi(void) //MCU初始化
  89. {
  90. TMOD = 0X21;//波特率发生器T1工作在模式2上
  91. SCON = 0X50;//设串口工作方式1,收发状态
  92. PCON = 0X00;//波特率不加倍
  93. TL1 = 0XFD;//设波特率为9600
  94. TH1 = 0XFD;
  95. TR1 = 1; //开
  96. }

  97. void LCD_logo(void) //LOGO显示
  98. {
  99. uchar i;
  100. uchar LOGO[]=" URM37 V3.0 ";
  101. i = 0;

  102. LCD_WRITE_COMM(0x80);
  103. while(LOGO!=NULL)
  104. {
  105. LCD_WRITE_DATA(LOGO);
  106. i++;
  107. }
  108. }



  109. void Receive(uchar *p)//串口接收
  110. {
  111. uchar i,n=100;
  112. for(i=0;i<4;i++)
  113. {
  114. while(RI==0); //等待串行中断
  115. *(p+i)=SBUF;
  116. RI = 0; //清TI,必须软件清除
  117. while(--n); //延时

  118. }

  119. }


  120. void Send_com(uchar *p)//串口发送
  121. {
  122. uchar i,n=100;
  123. for(i=0;i<4;i++)
  124. {

  125. SBUF = *(p+i);
  126. while(TI==0); //等待串行中断
  127. TI = 0; //清TI,必须软件清除
  128. while(--n); //延时

  129. }


  130. }


  131. uchar Efficacy(uchar x)//效验和
  132. {
  133. uchar i,temp=0;

  134. if(x==1)
  135. {
  136. for(i=0;i<3;i++)
  137. {
  138. temp=temp+Send_buf;//发送效验和
  139. }
  140. }
  141. if(x==2)
  142. {
  143. for(i=0;i<3;i++)
  144. {
  145. temp=temp+Receive_buf;//接收效验和
  146. }
  147. }
  148. return temp;
  149. }


  150. void HEX_TO_DEC(uint source,uchar * object)//16进制转10进制
  151. {
  152. uchar i;

  153. for(i=0;i<4;i++)
  154. {
  155. *(object+i) = source % 10;
  156. source/=10;
  157. }
  158. return;
  159. }


  160. void Dis_Temper(void)//温度显示
  161. {
  162. uchar i;
  163. uchar Temp;
  164. uchar x;
  165. uchar y;
  166. uchar TemperData;
  167. uchar Dis[]="Temperature: ";
  168. i = 0;

  169. LCD_WRITE_COMM(0xc0);
  170. while(Dis!=NULL)
  171. {
  172. LCD_WRITE_DATA(Dis);
  173. i++;
  174. }

  175. x=Receive_buf[1]<<4;
  176. y=Receive_buf[2]>>4;
  177. TemperData = ((x&0xf0)|(y&0x0f))&0xff;
  178. Temp = TemperData/10;
  179. LCD_WRITE_DATA(0x30+Temp);
  180. Temp= TemperData%10;
  181. LCD_WRITE_DATA(0x30+Temp);
  182. LCD_WRITE_DATA('C');

  183. }


  184. void Dis_Distance(void)//角度与距离显示
  185. {
  186. uchar i;
  187. uchar tem;
  188. uchar temp;
  189. uchar Data[4];
  190. uchar du[]="Du: ";
  191. uchar Distance[]="D: ";
  192. i=0;
  193. LCD_WRITE_COMM(0xc0);
  194. while(du!=NULL)
  195. {
  196. LCD_WRITE_DATA(du);
  197. i++;
  198. }
  199. tem=Du_dec[Mode]/100;
  200. LCD_WRITE_DATA(0x30+tem);
  201. tem=(Du_dec[Mode]%100)/10;
  202. LCD_WRITE_DATA(0x30+tem);
  203. tem=(Du_dec[Mode]%100)%10;
  204. LCD_WRITE_DATA(0x30+tem);
  205. LCD_WRITE_DATA(0x20);

  206. i=0;
  207. while(Distance!=NULL)
  208. {
  209. LCD_WRITE_DATA(Distance);
  210. i++;
  211. }


  212. tem=Receive_buf[1];
  213. temp=(uchar)(((tem<<8)&0xff00)|Receive_buf[2]);
  214. HEX_TO_DEC(temp,Data);
  215. LCD_WRITE_DATA(0x30+Data[2]);//米
  216. LCD_WRITE_DATA('.');
  217. LCD_WRITE_DATA(0x30+Data[1]);//分米
  218. LCD_WRITE_DATA(0x30+Data[0]);//厘米
  219. LCD_WRITE_DATA('m');

  220. }


  221. void main(void)
  222. {
  223. uchar i;
  224. uchar Mod,flag; //模式记数
  225. MCU_Initi();
  226. LCD_Init();
  227. LCD_logo();

  228. Mode_flag=0;
  229. sum=0;
  230. Mode = 0;
  231. flag = 0;
  232. Mod = 0;

  233. while(1)
  234. {

  235. LED = 0;//背光亮
  236. TemperKey = 1;
  237. if(TemperKey == 0)//按键舵机角度控制
  238. {
  239. Delay_ms(10);
  240. if(TemperKey == 0)
  241. {
  242. if(Mode==0)
  243. flag=0;
  244. if(Mode==6)
  245. flag=1;
  246. if(flag==0)
  247. Mode++;
  248. else Mode--;
  249. }
  250. while(!TemperKey);
  251. }

  252. ModeKey = 1;
  253. if(ModeKey == 0)//功能切换模式
  254. {
  255. Delay_ms(10);
  256. if(ModeKey == 0)
  257. {
  258. if(Mod == 1)
  259. Mod = 0;
  260. else
  261. Mod++;
  262. }
  263. while(!ModeKey);
  264. }

  265. switch(Mod)
  266. {
  267. case 0: for(i=0;i<4;i++)//温度读取
  268. Send_buf=Temper_Oder;

  269. Send_com(Send_buf);
  270. Receive(Receive_buf);
  271. Dis_Temper();
  272. Delay_ms(100);
  273. break;

  274. case 1: Send_buf[0]=0x22;//距离读取
  275. Send_buf[1]=0x05+Mode*6;
  276. Send_buf[2]=0x00;
  277. Send_buf[3]=Efficacy(1);
  278. Delay_ms(50);
  279. Send_com(Send_buf);
  280. Receive(Receive_buf);
  281. Dis_Distance();
  282. Delay_ms(50);
  283. break;


  284. default : break;
  285. }

  286. }

  287. }


  288. //************************************************************************
复制代码
超声波模块资料


非常之感谢感谢机器人


jaychou9456于2010-12-12 16:18补充以下内容:
大哥  你真牛X
非常之感谢感谢机器人


jaychou9456于2010-12-12 16:18补充以下内容:
大哥  你真牛X



风吹叶动于2011-1-1 18:34补充以下内容:
非常之感谢感谢机器人


jaychou9456于2010-12-12 16:18补充以下内容:
大哥  你真牛X



风吹叶动于2011-1-1 18:34补充以下内容:
非常之感谢感谢机器人


jaychou9456于2010-12-12 16:18补充以下内容:
大哥  你真牛X



风吹叶动于2011-1-1 18:35补充以下内容:
非常之感谢感谢机器人


jaychou9456于2010-12-12 16:18补充以下内容:
大哥  你真牛X
刚做了,可惜没钱,不然可以参考下

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-23 18:58 , Processed in 0.030579 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部