标题: 基于单片机超声波测距资料 [打印本页]

作者: 18313855332    时间: 2016-10-31 21:09
标题: 基于单片机超声波测距资料
自己动手下载吧:
超声波测距 main.rar (1.11 KB, 下载次数: 22)

  1. /*
  2. 超声波测距
  3. 8-29 HC-SR04模块用有-2cm的误差,
  4.                                         但是US-015模块是正确的

  5. 编程思路
  6.         测距动作
  7.                 开20us的Trig
  8.                 等待Echo上升
  9.                 一旦上升开定时器
  10.                 Echo下降时关定时器
  11.                 输出定时器的值
  12.         主程序
  13.                 循环测距动作
  14.                 间隔1s
  15.         定时器中断
  16.                 复位

  17. 准确性
  18.         与计算公式有关
  19.         与被测物体的表面积大小有关
  20.         与角度有关
  21. */
  22. #include <stdio.h>
  23. #include <intrins.h>
  24. #include <math.h>
  25. #include <STC12C5A60S2.H>

  26. sbit hcsr04_trig = P2^0;//发
  27. sbit hcsr04_echo = P3^2;//收 INT0
  28. sbit hcsr04_test = P2^1;//测试

  29. unsigned char data hcsr04_tl        = 0;
  30. unsigned char data hcsr04_th        = 0;
  31. unsigned int        data hcsr04_s        = 0;

  32. void Delay20us()                //@11.0592MHz
  33. {
  34.         unsigned char i;

  35.         _nop_();
  36.         i = 52;
  37.         while (--i);
  38. }

  39. void Delay1000ms()                //@11.0592MHz
  40. {
  41.         unsigned char i, j, k;

  42.         i = 43;
  43.         j = 6;
  44.         k = 203;
  45.         do
  46.         {
  47.                 do
  48.                 {
  49.                         while (--k);
  50.                 } while (--j);
  51.         } while (--i);
  52. }

  53. void UART_init()
  54. {
  55.         PCON        = 0x00;
  56.         SCON        = 0x50;//0101 0000
  57.         TMOD        |= 0x20 ;
  58.         TH1                = 0xFD;//9600bps
  59.         TL1                = 0xFD;
  60.         ET1                = 0;
  61.         ES                = 0;//1时开串口中断
  62.         TR1                = 1;

  63.         TI                 = 1;
  64.         puts("HC-SR04 \t--------");
  65.         Delay20us();        
  66.         puts("UART_init \t-");
  67.         Delay20us();        
  68. }

  69. void t0_init()
  70. {
  71.         TMOD         |= 0x01;//T0工作方式1------16位
  72.         TH0         = 0x00;
  73.         TL0         = 0x00;        
  74.         ET0         = 1;//T0中断
  75.         EA                 = 1;        
  76.         
  77.         puts("t0_init \t-");
  78.         Delay20us();        
  79. }

  80. void t0ser() interrupt 1
  81. {
  82.         TH0 = 0;
  83.         TL0 = 0;
  84. }

  85. /*
  86. HC-SR04 模块工作原理
  87. 1.Trig触发测距 >=10us 高电平
  88. 2.模块自动发送8个40kHz方波
  89.         自动检测是否有信号返回
  90. 3.当有信号返回时,
  91. */
  92. void hcsr04()
  93. {        
  94.         TR0 = 0;
  95.         TH0        = 0;
  96.         TL0 = 0;
  97.         
  98.         hcsr04_trig = 1;
  99.         Delay20us();
  100.         hcsr04_trig = 0;
  101.         Delay20us();
  102.         while(!hcsr04_echo);        
  103.         TR0 = 1;
  104.         while(hcsr04_echo);
  105.         TR0 = 0;
  106.         
  107.         // hcsr04_s = (TH0*256+TL0)/58;        
  108.         hcsr04_s =(TH0*256+TL0+59)*0.0172;
  109. }

  110. void main(void)
  111. {        
  112.         UART_init();        
  113.         t0_init();        

  114.         while(1)
  115.         {        
  116.                 hcsr04();
  117.                 printf("MAIN \thcsr04_s = %d\n",
  118.                         hcsr04_s);        
  119.                 Delay1000ms();                                
  120.         }        
  121. }
复制代码







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1