找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1956|回复: 1
收起左侧

单片机超声波测距程序资料(HC-SR04)

[复制链接]
ID:1001583 发表于 2022-3-13 17:38 | 显示全部楼层 |阅读模式

  1. /******************************************************************************/
  2. /*  Name:  LCD12864(St7920/St7921)+超声波测距模块+STC89C52                    */
  3. /*  HC-SR04 超声波测距模块 DEMO 程序                                                                              */
  4. /*  晶振:11.0592M                                                            */
  5. /*  接线:模块TRIG接 P1.2  ECH0 接P1.1                                                                                  */
  6. /*      RS(CS)    接  P3.3;                                                                                                       */
  7. /*      RW(SID)   接  P3.4;                                                                                              */
  8. /*      E(SCLK)   接  P3.5;                                                                                                  */
  9. /*      PSB       接  GND 串行模式                                                                                      */
  10. /******************************************************************************/
  11.     #include   <AT89X51.H>
  12.         #include   <intrins.h>        
  13. //引脚定义
  14.     sbit     RX    =  P1 ^ 1;
  15.     sbit     TX    =  P1 ^ 2;
  16.     sbit     CS    =  P3 ^ 3;        //片选 高电平有效 单片LCD使用时可固定高电平
  17.     sbit     SID   =  P3 ^ 4;        //数据
  18.     sbit     SCLK  =  P3 ^ 5;        //时钟

  19. //Function Definition 函数声明
  20. void Delay(int num);
  21. void Init_DS18B20(void);
  22. unsigned char ReadOneChar(void);
  23. void WriteOneChar(unsigned char dat);
  24. unsigned int ReadTemperature(void);
  25. void clock_out(unsigned char dd);
  26. unsigned char clock_in(void);
  27. unsigned char read_clock(unsigned char ord);
  28. void write_clock(unsigned char ord, unsigned char dd);
  29. void Disp(void);
  30. void id_case1_key(void);
  31. void id_case2_key(void);
  32. void Set_time(unsigned char sel,bit sel_1);
  33. void Timer0_Init(void);
  34. void Init_1302(void);
  35. void Set_Bell(unsigned char sel, bit sel_1);
  36. void Bell(void);
  37. //12864
  38. void Write_char(bit start, unsigned char ddata);
  39. void Send_byte(unsigned char bbyte);
  40. void Delaynms(unsigned int di);
  41. void Lcd_init(void);
  42. void Disp_img(unsigned char *img);
  43. void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s);
  44. void LCD_set_xy( unsigned char x, unsigned char y );
  45. unsigned char code num[]={"0123456789 :.-"};
  46. unsigned char code waves[]={"超声波测距系统"};
  47. unsigned char code znwk[] ={"智能微控工作室"};
  48. unsigned char code CM[] =  {"M"};
  49. unsigned int  time=0;
  50.          long S=0;
  51.          bit  flag =0;
  52. unsigned char disbuff[4]           ={ 0,0,0,0,};
  53. unsigned char code logo[]={  
  54. /*--  调入了一幅图像:logo.bmp  -- */
  55. /*--  宽度x高度=128x64 欢迎使用本产品LOGO --*/
  56. /*--  调入了一幅图像:C:\Documents and Settings\lwd\桌面\新建文件夹\X.bmp  --*/
  57. /*--  宽度x高度=128x64  --*/
  58. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  59. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  60. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  61. 0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,
  62. 0x00,0x00,0x00,0xE0,0x00,0x00,0x0C,0x00,0x00,0x40,0x70,0x00,0x00,0x00,0x80,0x00,
  63. 0x00,0x00,0x00,0xE0,0x00,0x00,0x1E,0x00,0x00,0x60,0x70,0x00,0x00,0x0F,0xE0,0x00,
  64. 0x00,0x00,0x01,0xC0,0x00,0x60,0x3C,0x00,0x00,0xE0,0x60,0x00,0x1F,0xFF,0xE0,0x00,
  65. 0x00,0x00,0x03,0x80,0x00,0x70,0x70,0x40,0x00,0xE0,0x7E,0x00,0x1F,0xE0,0xC0,0x00,
  66. 0x00,0x00,0x03,0x00,0x00,0x73,0xC3,0xF0,0x01,0xC3,0xFC,0x00,0x38,0xE1,0xC0,0x00,
  67. 0x00,0x03,0xC6,0x3C,0x00,0x33,0x9F,0xF0,0x03,0x8F,0xC0,0x00,0x30,0xC1,0xC0,0x00,
  68. 0x00,0x3F,0xEF,0xFE,0x00,0x03,0x1C,0xE0,0x07,0x01,0xCC,0x00,0x31,0xF1,0x80,0x00,
  69. 0x00,0x79,0xDF,0xBC,0x00,0x06,0x18,0xC0,0x0E,0x01,0xFE,0x00,0x77,0xF9,0x80,0x00,
  70. 0x00,0x01,0xB0,0x30,0x01,0xC6,0x19,0xC0,0x1E,0x7F,0xDE,0x00,0x6F,0x83,0x80,0x00,
  71. 0x00,0x23,0xAC,0x60,0x0F,0xE6,0xF1,0x80,0x3E,0x7B,0x38,0x00,0x61,0x83,0x00,0x00,
  72. 0x00,0x37,0x0E,0x00,0x0F,0xC7,0xB7,0x80,0xEC,0x63,0x30,0x00,0xE3,0x03,0x00,0x00,
  73. 0x00,0x3E,0x0E,0x00,0x01,0x8F,0x37,0x01,0xCC,0x6F,0xF0,0x00,0xC7,0xF7,0x00,0x00,
  74. 0x00,0x1E,0x0C,0x00,0x03,0x1E,0x66,0x03,0x0C,0x7F,0x00,0x01,0xFF,0xE6,0x00,0x00,
  75. 0x00,0x1E,0x1C,0x00,0x03,0x1C,0x60,0x02,0x19,0xAC,0x00,0x01,0x96,0x06,0x00,0x00,
  76. 0x00,0x3E,0x3E,0x00,0x03,0x18,0x60,0x00,0x19,0xFC,0x00,0x03,0x86,0x0E,0x00,0x00,
  77. 0x00,0x7E,0x36,0x00,0x03,0x00,0xC0,0x00,0x38,0x78,0x00,0x03,0x06,0x0C,0x00,0x00,
  78. 0x00,0xE6,0x67,0x00,0x03,0x00,0xC0,0x00,0x30,0x78,0x00,0x06,0x0C,0x0C,0x00,0x00,
  79. 0x01,0xC6,0xC3,0x80,0x7F,0xF0,0xC0,0x00,0x30,0xFE,0x00,0x0E,0x0C,0x1C,0x00,0x00,
  80. 0x03,0x81,0x83,0xC0,0x78,0xFF,0x80,0x00,0x61,0xCF,0x80,0x1C,0x08,0x18,0x00,0x00,
  81. 0x06,0x07,0x03,0xE0,0x00,0x1F,0xFF,0xE0,0x67,0x07,0xE0,0x38,0x18,0xF8,0x00,0x00,
  82. 0x08,0x0E,0x01,0xF8,0x00,0x07,0xFF,0x80,0xCE,0x03,0xF8,0x60,0x00,0x70,0x00,0x00,
  83. 0x00,0x18,0x01,0xF8,0x00,0x01,0xFC,0x00,0xC0,0x01,0xFC,0xC0,0x00,0x70,0x00,0x00,
  84. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,
  85. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  86. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  87. 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  88. 0x00,0x00,0x06,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  89. 0x00,0x00,0x07,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  90. 0x00,0x00,0x06,0x00,0x00,0x00,0x0C,0xE0,0x00,0x01,0xE0,0x00,0x00,0x00,0x00,0x00,
  91. 0x00,0x00,0x0E,0x00,0x00,0x00,0x3F,0xE0,0x00,0xFF,0xF0,0x00,0x38,0x00,0xE0,0x00,
  92. 0x00,0x00,0x0C,0x00,0x00,0x0F,0xFF,0x80,0x00,0xF8,0xF0,0x00,0x38,0x00,0xE0,0x00,
  93. 0x00,0x00,0x0C,0xF0,0x00,0x0F,0xC7,0x00,0x00,0x60,0xE0,0x00,0x38,0x00,0xE0,0x00,
  94. 0x00,0x00,0x1F,0xF0,0x00,0x01,0x8E,0x00,0x00,0x60,0xC0,0x00,0x70,0x01,0xC0,0x00,
  95. 0x00,0x07,0xFF,0x80,0x00,0x01,0x8C,0x00,0x00,0xE1,0x80,0x00,0x70,0x01,0xC0,0x00,
  96. 0x00,0x07,0xF8,0x00,0x00,0x01,0x98,0x00,0x00,0xDF,0xC0,0x00,0x70,0x01,0xC0,0x00,
  97. 0x00,0x00,0x78,0x00,0x00,0x01,0xBF,0xE0,0x00,0xFF,0x00,0x00,0x60,0x01,0x80,0x00,
  98. 0x00,0x00,0xFC,0x00,0x00,0x7F,0xFF,0xE0,0x00,0xC0,0x00,0x00,0xE0,0x03,0x80,0x00,
  99. 0x00,0x01,0xFE,0x00,0x00,0x7F,0xF8,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,
  100. 0x00,0x03,0xB7,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x3C,0x00,0xC0,0x03,0x00,0x00,
  101. 0x00,0x07,0x67,0x00,0x00,0x60,0x00,0x00,0x03,0x9F,0xFE,0x00,0x80,0x02,0x00,0x00,
  102. 0x00,0x0E,0x63,0x80,0x00,0xE0,0x00,0x01,0xFF,0xCF,0x1E,0x01,0x80,0x06,0x00,0x00,
  103. 0x00,0x1C,0xE1,0xE0,0x00,0xC0,0x00,0x00,0xE3,0x9C,0x38,0x01,0x80,0x06,0x00,0x00,
  104. 0x00,0x38,0xC1,0xF8,0x01,0xC0,0x00,0x00,0xC3,0x18,0x30,0x00,0x00,0x00,0x00,0x00,
  105. 0x00,0xE0,0xFC,0xFE,0x03,0x80,0x00,0x01,0xC7,0x18,0x60,0x00,0x00,0x00,0x00,0x00,
  106. 0x01,0xDF,0xF8,0xFE,0x03,0x00,0x00,0x01,0x8E,0x1B,0xE0,0x07,0x00,0x1C,0x00,0x00,
  107. 0x07,0x07,0x80,0x00,0x07,0x00,0x00,0x01,0xFF,0x3F,0xE0,0x07,0x00,0x1C,0x00,0x00,
  108. 0x0C,0x03,0x80,0x00,0x0E,0x00,0x00,0x01,0xF0,0x38,0x00,0x0F,0x00,0x3C,0x00,0x00,
  109. 0x00,0x03,0x00,0x00,0x1C,0x00,0x00,0x01,0x00,0x20,0x00,0x06,0x00,0x18,0x00,0x00,
  110. 0x00,0x03,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  111. 0x00,0x03,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  112. 0x00,0x02,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  113. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  114. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  115. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  116. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  117. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  118. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  119. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  120. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  121. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  122. };

  123. /******************************************************************************/
  124. void Lcd_init(void)        //初始化LCD
  125. {
  126.         Delaynms(10); //启动等待,等LCM讲入工作状态
  127.           CS=1;
  128.           Write_char(0,0x30);  //8 位介面,基本指令集
  129.           Write_char(0,0x0c);  //显示打开,光标关,反白关
  130.           Write_char(0,0x01);  //清屏,将DDRAM的地址计数器归零  
  131. }

  132. /******************************************************************************/
  133. void Write_char(bit start, unsigned char ddata) //写指令或数据
  134. {
  135.         unsigned char start_data,Hdata,Ldata;
  136.           if(start==0)
  137.                 start_data=0xf8;         //写指令
  138.     else   
  139.             start_data=0xfa;  //写数据

  140.           Hdata=ddata&0xf0;                  //取高四位
  141.           Ldata=(ddata<<4)&0xf0;  //取低四位
  142.           Send_byte(start_data);          //发送起始信号
  143.           Delaynms(5); //延时是必须的
  144.           Send_byte(Hdata);              //发送高四位
  145.           Delaynms(1);  //延时是必须的
  146.           Send_byte(Ldata);                  //发送低四位
  147.           Delaynms(1);  //延时是必须的
  148. }

  149. /******************************************************************************/
  150. void Send_byte(unsigned char bbyte) //发送一个字节
  151. {
  152.         unsigned char i;
  153.          for(i=0;i<8;i++)
  154.            {
  155.                    SID=bbyte&0x80; //取出最高位
  156.                  SCLK=1;
  157.                    SCLK=0;
  158.                    bbyte<<=1; //左移
  159.            }  
  160. }

  161. /******************************************************************************/
  162. void Delaynms(unsigned int di) //延时
  163. {
  164.         unsigned int da,db;
  165.          for(da=0;da<di;da++)
  166.                    for(db=0;db<10;db++);
  167. }

  168. /******************************************************************************/
  169. void Disp_img(unsigned char  *img)        //图形方式12864显示字模221 横向取膜
  170. {
  171.         unsigned char i,j;
  172.         unsigned int k = 0;

  173.         Write_char(0,0x36); //图形方式
  174.         for(i=0;i<32;i++)
  175.           {
  176.                 Write_char(0,0x80+i);
  177.                 Write_char(0,0x80);
  178.             for(j=0;j<16;j++)
  179.                 {
  180.                         Write_char(1,img[k++]);
  181.                 }
  182.           }

  183.          for(i=0;i<32;i++)
  184.           {
  185.                 Write_char(0,0x80+i);
  186.                 Write_char(0,0x88);
  187.             for(j=0;j<16;j++)
  188.                 {
  189.                         Write_char(1,img[k++]);
  190.                   }
  191.         }
  192. }
  193.         
  194. /******************************************************************************/
  195. void Clr_Scr(void)//清屏函数
  196. {
  197.         Write_char(0,0x01);
  198. }

  199. /******************************************************************************/
  200. void LCD_set_xy( unsigned char x, unsigned char y )
  201. {        //设置LCD显示的起始位置,X为行,Y为列
  202.     unsigned char address;
  203.         switch(x)
  204.         {
  205.                 case 0: address = 0x80 + y; break;   
  206.             case 1: address = 0x80 + y; break;
  207.                 case 2: address = 0x90 + y; break;
  208.                     case 3: address = 0x88 + y; break;
  209.                 case 4: address = 0x98 + y; break;
  210.                 default:address = 0x80 + y; break;
  211.         }
  212.     Write_char(0, address);
  213. }

  214. /******************************************************************************/
  215. void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
  216. {        //        中英文字符串显示函数
  217.         LCD_set_xy( X, Y );

  218.     while (*s)
  219.     {
  220.                 Write_char( 1, *s );
  221.             s ++;
  222.                 Delaynms(1);
  223.         }
  224. }

  225. /******************************************************************************/
  226. void LCD_Write_number(unsigned char s)//        数字显示函数
  227. {        
  228.         Write_char(1,num[s]);
  229.         Delaynms(1);
  230. }
  231. /******************************************************************************/
  232. void Lcd_Mark2(void)
  233. {
  234.         Clr_Scr();//清屏
  235.         LCD_Write_string(1,0,znwk);//
  236.         LCD_Write_string(2,0,waves);//        
  237.         LCD_Write_string(3,7,CM);//        
  238. }

  239. /********************************************************/
  240.     void Conut(void)
  241.         {
  242.            time=TH0*256+TL0;
  243.            TH0=0;
  244.            TL0=0;
  245.            S=time*1.87/100;       //算出来是CM          11。0592M晶振
  246.            if(flag==1)                      //超出测量
  247.           {         
  248.            flag=0;
  249.            LCD_set_xy( 3, 4 );
  250.            LCD_Write_number(13);
  251.            LCD_Write_number(12);
  252.            LCD_set_xy( 3, 5 );
  253.            LCD_Write_number(13);
  254.            LCD_Write_number(13);
  255.          
  256.            }
  257.          else
  258.           {
  259.            disbuff[1]=S%1000/100;
  260.            disbuff[2]=S%1000%100/10;
  261.            disbuff[3]=S%1000%10 %10;
  262.            LCD_set_xy( 3, 4 );
  263.            LCD_Write_number(disbuff[1]);
  264.            LCD_Write_number(12);
  265.            LCD_set_xy( 3, 5 );
  266.            LCD_Write_number(disbuff[2]);
  267.            LCD_Write_number(disbuff[3]);
  268.           }
  269.         }
  270. /********************************************************/
  271. void delayms(unsigned int ms)
  272. {
  273.         unsigned char i=100,j;
  274.         for(;ms;ms--)
  275.         {
  276.                 while(--i)
  277.                 {
  278.                         j=10;
  279.                         while(--j);
  280.                 }
  281.         }
  282. }
  283. /********************************************************/
  284.      void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  285.   {
  286.     flag=1;                                                         //中断溢出标志
  287.   }
  288. /********************************************************/
  289.    void  StartModule()                          //T1中断用来扫描数码管和计800MS启动模块
  290.   {
  291.           TX=1;                                         //800MS  启动一次模块
  292.           _nop_();
  293.           _nop_();
  294.           _nop_();
  295.           _nop_();
  296.           _nop_();
  297.           _nop_();
  298.           _nop_();
  299.           _nop_();
  300.           _nop_();
  301.           _nop_();
  302.           _nop_();
  303.           _nop_();
  304.           _nop_();
  305.           _nop_();
  306.           _nop_();
  307.           _nop_();
  308.           _nop_();
  309.           _nop_();
  310.           _nop_();
  311.           _nop_();
  312.           _nop_();
  313.           TX=0;
  314.   }
  315. /********************************************************/
  316. void main(void)
  317. {  
  318.     TMOD=0x01;                   //设T0为方式1,GATE=1
  319.         TH0=0;
  320.         TL0=0;
  321.         TR0=1;

  322.         Lcd_init();       //设置液晶显示器
  323.         Clr_Scr();        //清屏        
  324.         Disp_img(logo);          //显示欢迎使用本产品LOGO
  325.         Delaynms(1000);
  326.         Lcd_init();       //从图形显示状态下返回
  327.     Lcd_Mark2();


  328.         while(1)
  329.         {
  330.          StartModule();         
  331.                                          //计算
  332.          while(!RX);                //当RX为零时等待
  333.          TR0=1;                            //开启计数
  334.          while(RX);                        //当RX为1计数并等待
  335.          TR0=0;                                //关闭计数
  336.          Conut();
  337.          delayms(80);                //80MS

  338.         }

  339. }      
复制代码
      

资料清单
清单.png

超声波测距资料(HC-SR04)_TB.zip

2.69 MB, 下载次数: 58, 下载积分: 黑币 -5

回复

使用道具 举报

ID:195496 发表于 2023-11-25 10:54 | 显示全部楼层
接收部分的电路没有完全看明白,四个运放是怎么工作的?有人能讲一下吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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