找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2493|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机+US-100超声波测距的跳远数据测量排序仪源程序

[复制链接]
跳转到指定楼层
楼主
这是帮别人做的一个小玩意儿,主要是通过超声波来测量跳远的距离然后进行排序,有记录破纪录会报警,更新记录,显示每次跳远的距离。显示前三名。  具体端口看程序,电路图只是辅助。。。。。。 算了算了 我还是搬出来代码吧    。

US-100超声波测距模块可实现2cm~4.5m的非接触测距功能,拥有2.4~5.5V的宽电压输入范围,静态功耗低于2mA,自带温度传感器对测距结果进行校正,同时具有GPIO,串口等多种通信方式,内带看门狗,工作稳定可靠。

电路原理图如下:


单片机源程序如下:
  1.   /**************************************************************/
  2.   //使用时将US100跳帽拔下,使其设置为电平触发模式
  3.   /***************************************************************/
  4.         #include   <reg52.h>
  5.         #include   <intrins.h>
  6.         #define uint unsigned int
  7.     #define uchar unsigned char        
  8.     //引脚定义
  9.     sbit     Trig1    =  P3 ^ 3;   //
  10.     sbit     Ecno1    =  P3 ^ 2;   //

  11. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  12. #define LCD_data  P0             //数据口
  13. sbit LCD_RS  =  P3^5;            //寄存器选择输入
  14. sbit LCD_RW  =  P3^6;            //液晶读/写控制
  15. sbit LCD_EN  =  P3^4;            //液晶使能控制
  16. sbit LCD_PSB =  P3^7;            //串/并方式控制
  17. sbit wela    =  P2^6;
  18. sbit dula    =  P2^7;
  19. sbit beep    =  P2^0;
  20. sbit KEY  = P1^4;   //测距按键
  21. int tt=0,cc=1;
  22. int jilu=50;

  23. uchar code num12864[]=        
  24. {


  25. };
  26. // 函数声明              
  27. void Write_char(uchar dat);

  28. bit lcd_busy();
  29. void Lcd_init(void);
  30. void LCD_Write_string(uchar *str);
  31. void LCD_set_xy( unsigned char x, unsigned char y );
  32. void  StartModule() ;
  33. void Clr_Scr();
  34. unsigned char code num[]={"0123456789:."};
  35. unsigned char code M[] =  {"M"};
  36. unsigned int  time1=0;
  37. unsigned int  time2=0;
  38. unsigned int  time3=0;
  39. unsigned int  time4=0;
  40. long s=0;
  41.          long s1=0;
  42.             long s2=0;
  43.             long s3=0;
  44.             long s4=0;
  45.             long s5=0;
  46.             long s6=0;
  47.             long s7=0;
  48.             long s8=0;
  49.             long s9=0;
  50.             long s10=0;
  51.             long s11=0;
  52.             long s12=0;                                            
  53.             long s13=0;
  54.          bit  flag =0;

  55.          
  56. unsigned char disbuff1[4]={ 0,0,0,0,};
  57. unsigned char disbuff2[4]={ 0,0,0,0,};
  58. unsigned char disbuff3[4]={ 0,0,0,0,};
  59. unsigned char disbuff4[4]={ 0,0,0,0,};
  60. unsigned char disbuff5[4]={ 0,0,0,0,};        
  61. unsigned char disbuff6[4]={ 0,0,0,0,};        
  62. /******************************************************************************/
  63. /*******************************************************************/
  64. /*                                                                 */
  65. /*  延时函数                                                       */
  66. /*                                                                 */
  67. /*******************************************************************/
  68. void delay(uint x)
  69. {
  70.     uint i,j;
  71.     for(i= x;i>0;i--)
  72.         for(j=110;j>0;j--);
  73. }
  74. void lcd_wcmd(uchar cmd)
  75. {                          
  76.    while(lcd_busy());
  77.     LCD_RS = 0;
  78.     LCD_RW = 0;
  79.     LCD_EN = 0;
  80.     _nop_();
  81.     _nop_();
  82.     P0 = cmd;
  83.     delayNOP();
  84.     LCD_EN = 1;
  85.     delayNOP();
  86.     LCD_EN = 0;  
  87. }

  88. void Lcd_init(void)        //初始化LCD
  89. {

  90.     LCD_PSB = 1;         //并口方式
  91.    
  92.     lcd_wcmd(0x34);      //扩充指令操作
  93.     delay(5);
  94.     lcd_wcmd(0x30);      //基本指令操作
  95.     delay(5);
  96.     lcd_wcmd(0x0C);      //显示开,关光标
  97.     delay(5);
  98.     lcd_wcmd(0x01);      //清除LCD的显示内容
  99.     delay(5);  
  100. }

  101. bit lcd_busy()
  102. {                          
  103.     bit result;
  104.     LCD_RS = 0;
  105.     LCD_RW = 1;
  106.     LCD_EN = 1;
  107.     delayNOP();
  108.     result = (bit)(P0&0x80);
  109.     LCD_EN = 0;
  110.     return(result);
  111. }
  112. /******************************************************************************/
  113. /*void Write_char(uchar dat) //写指令或数据
  114. {
  115.    while(lcd_busy());
  116.     LCD_RS = 1;
  117.     LCD_RW = 0;
  118.     LCD_EN = 0;
  119.     P0 = dat;
  120.     delayNOP();
  121.     LCD_EN = 1;
  122.     delayNOP();
  123.     LCD_EN = 0;
  124. }
  125.   */


  126. /******************************************************************************/
  127. void Delaynms(unsigned int di) //延时
  128. {
  129.         unsigned int da,db;
  130.          for(da=0;da<di;da++)
  131.                    for(db=0;db<10;db++);
  132. }

  133. /******************************************************************************/

  134. void Clr_Scr(void)//清屏函数
  135. {
  136.         lcd_wcmd(0x01);
  137. }

  138. /******************************************************************************/
  139. void LCD_set_xy( unsigned char X, unsigned char Y )//设置LCD显示的起始位置,X为行,Y为列
  140. {        
  141.                         
  142.    uchar  pos;
  143.    if (X==0)
  144.      {X=0x80;}
  145.    else if (X==1)
  146.      {X=0x90;}
  147.    else if (X==2)
  148.      {X=0x88;}
  149.    else if (X==3)
  150.      {X=0x98;}
  151.    pos = X+Y ;  
  152.    lcd_wcmd(pos);     //显示地址

  153. }
  154. void lcd_wdat(uchar dat)
  155. {                          
  156.    while(lcd_busy());
  157.     LCD_RS = 1;
  158.     LCD_RW = 0;
  159.     LCD_EN = 0;
  160.     P0 = dat;
  161.     delayNOP();
  162.     LCD_EN = 1;
  163.     delayNOP();
  164.     LCD_EN = 0;
  165. }
  166. /******************************************************************************/

  167.                
  168. void LCD_Write_string(uchar *str)//D′è?×?·?′?oˉêy
  169. {
  170.         
  171.         
  172.         for(;*str!='\0';str++)
  173.         {
  174.                         lcd_wdat(*str);
  175.                         delay(2);
  176.         }
  177.         
  178. }



  179. /******************************************************************************/
  180. void LCD_Write_number(unsigned char s)//        数字显示函数
  181. {        


  182.         lcd_wdat(num[s]);
  183.             Delaynms(1);
  184. }
  185. /******************************************************************************/
  186. void Lcd_Mark2(void)
  187. {
  188.         Clr_Scr();//清屏
  189.         LCD_set_xy(0,0);
  190.         LCD_Write_string("第一名:");//
  191.         LCD_set_xy(0,5);
  192.         LCD_Write_string("m");
  193.         LCD_set_xy(1,0);
  194.         LCD_Write_string("第二名:");//
  195.         LCD_set_xy(1,5);
  196.         LCD_Write_string("m");        
  197.         LCD_set_xy(2,0);
  198.     LCD_Write_string("第三名:");//
  199.         LCD_set_xy(2,5);
  200.         LCD_Write_string("m");        
  201.         LCD_set_xy(3,0);
  202.     LCD_Write_string("xyz");//
  203.    // LCD_Write_string("5");//
  204.         LCD_set_xy(3,5);
  205.         LCD_Write_string("m");
  206. }

  207. /********************************************************
  208. 函数名称:void LCD12864_image12864( uchar code *pPicture )
  209. 函数作用:LCD12864显示一张128*64的图片
  210. 参数说明:输入参数为字模数组,可以用图片取模软件获得
  211. ********************************************************/
  212. void LCD12864_image12864( uchar code *pPicture )
  213. {
  214.     unsigned char i,j;
  215.         lcd_wcmd( 0x34 ) ;
  216.         lcd_wcmd( 0x36 ) ;
  217.         for(i=0;i<32;i++)
  218.         {
  219.                 lcd_wcmd( 0x80+i);
  220.                 lcd_wcmd( 0x80 );
  221.                 for(j=0;j<8;j++)
  222.                 {
  223.                         lcd_wdat( ~pPicture[i*16+j*2] );
  224.                         lcd_wdat( ~pPicture[i*16+j*2+1] );
  225.                 }
  226.         }

  227.         for(i=0;i<32;i++)
  228.         {
  229.                 lcd_wcmd( 0x80+i) ;
  230.                 lcd_wcmd( 0x88 );
  231.                 for(j=0;j<8;j++)
  232.                 {
  233.                         lcd_wdat( ~pPicture[32*16+i*16+j*2] );
  234.                         lcd_wdat( ~pPicture[32*16+i*16+j*2+1] );
  235.                 }
  236.         }
  237.         lcd_wcmd( 0x30 ) ;
  238. }


  239.   void now()
  240.   {
  241.            LCD_set_xy( 3, 5 );
  242.            LCD_Write_number(disbuff5[1]);
  243.            LCD_Write_string(".");
  244.            LCD_Write_number(disbuff5[2]);         
  245.            LCD_Write_number(disbuff5[3]);        
  246. }
  247. /********************************************************/
  248.     void Conut1(void)
  249.         {
  250.            time1=TH0*256+TL0;
  251.            TH0=0x00;
  252.            TL0=0x00;
  253.            s1=(time1*1.70)/100;       //          11.0592M晶振
  254.            
  255.          
  256.           if(flag==1)                      //超出测量
  257.           {         
  258.            flag=0;
  259.            LCD_set_xy( 0, 5 );
  260.        LCD_Write_string("   ");  
  261.            }
  262.          if(tt==1)
  263.           {
  264.            s2=s1;
  265.            
  266.            tt++;     //不在采集

  267.           }
  268.           if(tt==3)
  269.           {s3=s1;        
  270.            if(s3>=s2) {s5=s3;s3=s2;s2=s5;}
  271.            if(s3<s2&&s3>=s4) {s2=s2;s3=s3;s4=s4;}
  272.            tt++;
  273.           }

  274.           if(tt==5)
  275.           {s4=s1;
  276.            //now();
  277.            if(s4>=s2) {s6=s4;s4=s3;s3=s2;s2=s6;}
  278.            if(s4>s3) {s2=s2;s6=s4;s4=s3;s3=s6;}
  279.            if(s4<=s3) {s2=s2;s3=s3;s4=s4;}
  280.            if(s3>=s2) {s5=s3;s3=s2;s2=s5;}
  281.            if(s3<s2&&s3>=s4) {s2=s2;s3=s3;s4=s4;}
  282.           // now();
  283.            tt++;
  284.           }

  285.           if(s2>jilu)  
  286.           {
  287.           jilu=s2;
  288.           beep=0;
  289.           delay(500);
  290.           beep=1;
  291.           }

  292.           if(cc%2==0)
  293.           {
  294.          //now();
  295.            if(s1>=s2) {s5=s2;s3=s5;s2=s1;s4=s4; }
  296.            if(s1>=s3&&s1<s2) {s5=s3;s3=s1;s2=s2;s4=s5; }
  297.            if(s1>=s4&s1<s3)        {s4=s1;s2=s2;s3=s3;}
  298.             now();
  299.            cc++;
  300.            }
  301.            disbuff1[1]=s2%1000/100;
  302.            disbuff1[2]=s2%1000%100/10;
  303.            disbuff1[3]=s2%1000%100%10;
  304.            disbuff2[1]=s3%1000/100;
  305.            disbuff2[2]=s3%1000%100/10;
  306.            disbuff2[3]=s3%1000%100%10;
  307.            disbuff3[1]=s4%1000/100;
  308.            disbuff3[2]=s4%1000%100/10;
  309.            disbuff3[3]=s4%1000%100%10;
  310.            disbuff4[1]=jilu%1000/100;
  311.            disbuff4[2]=jilu%1000%100/10;
  312.            disbuff4[3]=jilu%1000%100%10;
  313.            disbuff5[1]=s1%1000/100;
  314.            disbuff5[2]=s1%1000%100/10;
  315.            disbuff5[3]=s1%1000%100%10;

  316.            LCD_set_xy( 0, 4 );
  317.            LCD_Write_number(disbuff1[1]);                     
  318.            LCD_Write_string(".");
  319.            LCD_Write_number(disbuff1[2]);
  320.            LCD_Write_number(disbuff1[3]);

  321.            LCD_set_xy( 1, 4 );
  322.            LCD_Write_number(disbuff2[1]);
  323.            LCD_Write_string(".");
  324.            LCD_Write_number(disbuff2[2]);           
  325.            LCD_Write_number(disbuff2[3]);

  326.            LCD_set_xy( 2, 4 );
  327.            LCD_Write_number(disbuff3[1]);
  328.            LCD_Write_string(".");
  329.            LCD_Write_number(disbuff3[2]);         
  330.            LCD_Write_number(disbuff3[3]);
  331.            
  332.            
  333.            LCD_set_xy( 3, 2 );
  334.            LCD_Write_number(disbuff4[1]);
  335.            LCD_Write_string(".");
  336.            LCD_Write_number(disbuff4[2]);         
  337.            LCD_Write_number(disbuff4[3]);
  338.             
  339.             
  340.            }


  341.         
  342. /********************************************************/

  343. void delay20us(void)   //误差 -0.016637731481us
  344. {
  345.     unsigned char a,b;
  346.     for(b=1;b>0;b--)
  347.         for(a=52;a>0;a--);
  348.      //if Keil,require use intrins.h
  349. }

  350. void Delay5ms()                //@11.0592MHz
  351. {
  352.         unsigned char i, j;

  353.         i = 54;
  354.         j = 199;
  355.         do
  356.         {
  357.                 while (--j);
  358.         } while (--i);
  359. }



  360. void Delay50ms()                //@11.0592MHz
  361. {
  362.         unsigned char i, j, k;

  363.         i = 3;
  364.         j = 26;
  365.         k = 223;
  366.         do
  367.         {
  368.                 do
  369.                 {
  370.                         while (--k);
  371.                 } while (--j);
  372.         } while (--i);
  373. }

  374.         
  375.         
  376.         
  377.         void Delay300ms()                //@11.0592MHz
  378. {
  379.         unsigned char i, j, k;

  380.         i = 13;
  381.         j = 156;
  382.         k = 83;
  383.         do
  384.         {
  385.                 do
  386.                 {
  387.                         while (--k);
  388.                 } while (--j);
  389.         } while (--i);
  390. }

  391. /********************************************************/
  392.      void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  393.   {
  394.     flag=1;                                                         //中断溢出标志
  395.   }
  396. /********************************************************/
  397.    void  StartModule1()                          //超声波触发函数
  398.   {   Trig1=0;
  399.          delay20us();
  400.           Trig1=1;
  401.           delay20us();                                                //发射一个大于10us的脉冲,触发超声波发射
  402.           Trig1=0;
  403.   }

  404. void main(void)
  405. {  
  406.      TMOD=0x01;                   //设T0为方式1
  407.         TH0=0x00;
  408. ……………………

  409. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
多路超声波测试(实物).zip (253.14 KB, 下载次数: 28)




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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