找回密码
 立即注册

QQ登录

只需一步,快速开始

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

不懂就问:我在51黑找的一个US100超声波程序 怎么每次开关测一次距不可以实时更新

[复制链接]
ID:404630 发表于 2019-9-27 20:53 | 显示全部楼层 |阅读模式
下面是程序,有大神告诉一下小白要如何解决吗?在这个论坛下载的
  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    =  P2 ^ 1;   //
  10.     sbit     Ecno1    =  P2 ^ 0;   //
  11.         sbit     Trig2    =  P3 ^ 2;        //
  12.     sbit     Ecno2    =  P3 ^ 3;        //
  13.         sbit     Trig3    =  P1 ^ 2;   //
  14.     sbit     Ecno3    =  P1 ^ 3;   //   
  15.         sbit     Trig4    =  P3 ^ 0;        //
  16.     sbit     Ecno4    =  P3 ^ 1;        //
  17. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  18. #define LCD_data  P0             //数据口
  19. sbit LCD_RS  =  P3^5;            //寄存器选择输入
  20. sbit LCD_RW  =  P3^6;            //液晶读/写控制
  21. sbit LCD_EN  =  P3^4;            //液晶使能控制
  22. sbit LCD_PSB =  P3^1;            //串/并方式控制
  23. sbit wela    =  P2^6;
  24. sbit dula    =  P2^7;

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

  27. bit lcd_busy();
  28. void Lcd_init(void);
  29. void LCD_Write_string(uchar *str);
  30. void LCD_set_xy( unsigned char x, unsigned char y );
  31. void  StartModule() ;
  32. void Clr_Scr();
  33. unsigned char code num[]={"0123456789 :."};
  34. unsigned char code table1[]={"前方距离:"};
  35. unsigned char code table2[] ={"后方距离:"};
  36. unsigned char code table3[] ={"左方距离:"};
  37. unsigned char code table4[] ={"右方距离:"};
  38. unsigned char code M[] =  {"CM"};
  39. unsigned int  time1=0;
  40. unsigned int  time2=0;
  41. unsigned int  time3=0;
  42. unsigned int  time4=0;
  43.          long S1=0;
  44.                  long S2=0;
  45.                  long S3=0;
  46.                  long S4=0;
  47.          bit  flag =0;

  48.                  
  49. unsigned char disbuff[4]={ 0,0,0,0,};
  50. /******************************************************************************/
  51. /*******************************************************************/
  52. /*                                                                 */
  53. /*  延时函数                                                       */
  54. /*                                                                 */
  55. /*******************************************************************/
  56. void delay(uint x)
  57. {
  58.     uint i,j;
  59.     for(i= x;i>0;i--)
  60.         for(j=110;j>0;j--);
  61. }
  62. void lcd_wcmd(uchar cmd)
  63. {                          
  64.    while(lcd_busy());
  65.     LCD_RS = 0;
  66.     LCD_RW = 0;
  67.     LCD_EN = 0;
  68.     _nop_();
  69.     _nop_();
  70.     P0 = cmd;
  71.     delayNOP();
  72.     LCD_EN = 1;
  73.     delayNOP();
  74.     LCD_EN = 0;  
  75. }

  76. void Lcd_init(void)        //初始化LCD
  77. {

  78.     LCD_PSB = 1;         //并口方式

  79.     lcd_wcmd(0x34);      //扩充指令操作
  80.     delay(5);
  81.     lcd_wcmd(0x30);      //基本指令操作
  82.     delay(5);
  83.     lcd_wcmd(0x0C);      //显示开,关光标
  84.     delay(5);
  85.     lcd_wcmd(0x01);      //清除LCD的显示内容
  86.     delay(5);  
  87. }

  88. bit lcd_busy()
  89. {                          
  90.     bit result;
  91.     LCD_RS = 0;
  92.     LCD_RW = 1;
  93.     LCD_EN = 1;
  94.     delayNOP();
  95.     result = (bit)(P0&0x80);
  96.     LCD_EN = 0;
  97.     return(result);
  98. }
  99. /******************************************************************************/
  100. /*void Write_char(uchar dat) //写指令或数据
  101. {
  102.    while(lcd_busy());
  103.     LCD_RS = 1;
  104.     LCD_RW = 0;
  105.     LCD_EN = 0;
  106.     P0 = dat;
  107.     delayNOP();
  108.     LCD_EN = 1;
  109.     delayNOP();
  110.     LCD_EN = 0;
  111. }
  112.   */


  113. /******************************************************************************/
  114. void Delaynms(unsigned int di) //延时
  115. {
  116.         unsigned int da,db;
  117.          for(da=0;da<di;da++)
  118.                    for(db=0;db<10;db++);
  119. }

  120. /******************************************************************************/

  121. void Clr_Scr(void)//清屏函数
  122. {
  123.         lcd_wcmd(0x01);
  124. }

  125. /******************************************************************************/
  126. void LCD_set_xy( unsigned char X, unsigned char Y )//设置LCD显示的起始位置,X为行,Y为列
  127. {        

  128.    uchar  pos;
  129.    if (X==0)
  130.      {X=0x80;}
  131.    else if (X==1)
  132.      {X=0x90;}
  133.    else if (X==2)
  134.      {X=0x88;}
  135.    else if (X==3)
  136.      {X=0x98;}
  137.    pos = X+Y ;  
  138.    lcd_wcmd(pos);     //显示地址

  139. }
  140. void lcd_wdat(uchar dat)
  141. {                          
  142.    while(lcd_busy());
  143.     LCD_RS = 1;
  144.     LCD_RW = 0;
  145.     LCD_EN = 0;
  146.     P0 = dat;
  147.     delayNOP();
  148.     LCD_EN = 1;
  149.     delayNOP();
  150.     LCD_EN = 0;
  151. }
  152. /******************************************************************************/

  153.                
  154. void LCD_Write_string(uchar *str)//D′è?×?·?′?oˉêy
  155. {
  156.         
  157.         
  158.         for(;*str!='\0';str++)
  159.         {
  160.                         lcd_wdat(*str);
  161.                         delay(2);
  162.         }
  163.         
  164. }



  165. /******************************************************************************/
  166. void LCD_Write_number(unsigned char s)//        数字显示函数
  167. {        


  168.                 lcd_wdat(num[s]);
  169.             Delaynms(1);
  170. }
  171. /******************************************************************************/
  172. void Lcd_Mark2(void)
  173. {
  174.         Clr_Scr();//清屏
  175.         LCD_set_xy(0,0);
  176.         LCD_Write_string("前方");//
  177.         LCD_set_xy(0,7);
  178.         LCD_Write_string("CM");
  179.         LCD_set_xy(1,0);
  180.         LCD_Write_string("后方");//
  181.         LCD_set_xy(1,7);
  182.         LCD_Write_string("CM");        
  183.         LCD_set_xy(2,0);
  184.     LCD_Write_string("左方");//
  185.         LCD_set_xy(2,7);
  186.         LCD_Write_string("CM");        
  187.         LCD_set_xy(3,0);
  188.     LCD_Write_string("右方");//
  189.         LCD_set_xy(3,7);
  190.         LCD_Write_string("CM");
  191. }

  192. /********************************************************/
  193.     void Conut1(void)
  194.         {
  195.            time1=TH0*256+TL0;
  196.            TH0=0x00;
  197.            TL0=0x00;
  198.            S1=time1*1.87/100;       //          11.0592M晶振
  199.            if(flag==1)                      //超出测量
  200.           {         
  201.            flag=0;
  202.            LCD_set_xy( 0, 5 );
  203. LCD_Write_string("超");
  204.          
  205.            }
  206.          else
  207.           {
  208.            disbuff[1]=S1%1000/100;
  209.            disbuff[2]=S1%1000%100/10;
  210.            disbuff[3]=S1%1000%100%10;
  211.            LCD_set_xy( 0, 5 );
  212.            LCD_Write_number(disbuff[1]);
  213.            LCD_Write_number(disbuff[2]);
  214.            LCD_set_xy( 0, 6 );
  215.            LCD_Write_number(disbuff[3]);
  216.           }
  217.         }
  218.         
  219.         /****************************************************/
  220. void Conut2(void)
  221.         {
  222.            time2=TH0*256+TL0;
  223.            TH0=0x00;
  224.            TL0=0x00;
  225.            S2=time2*1.87/100;       //          11.0592M晶振
  226.            if(flag==1)                      //超出测量
  227.           {         
  228.            flag=0;
  229.            LCD_set_xy( 1, 5 );
  230. LCD_Write_string("超");
  231.          
  232.            }
  233.          else
  234.           {
  235.            disbuff[1]=S2%1000/100;
  236.            disbuff[2]=S2%1000%100/10;
  237.            disbuff[3]=S2%1000%100%10;
  238.            LCD_set_xy( 1, 5 );
  239.            LCD_Write_number(disbuff[1]);
  240.            LCD_Write_number(disbuff[2]);
  241.            LCD_set_xy( 1, 6 );
  242.            LCD_Write_number(disbuff[3]);

  243.           }
  244.         }
  245.         /****************************************************/
  246. void Conut4(void)
  247.         {
  248.            time4=TH0*256+TL0;
  249.            TH0=0x00;
  250.            TL0=0x00;
  251.            S4=time4*1.87/100;       //          11.0592M晶振
  252.            if(flag==1)                      //超出测量
  253.           {         
  254.            flag=0;
  255.            LCD_set_xy( 2, 5 );
  256.        LCD_Write_string("超");
  257.          
  258.            }
  259.          //else
  260.           //{
  261.            disbuff[1]=S4%1000/100;
  262.            disbuff[2]=S4%1000%100/10;
  263.            disbuff[3]=S4%1000%100%10;
  264.            LCD_set_xy( 2, 5 );
  265.            LCD_Write_number(disbuff[1]);
  266.            LCD_Write_number(disbuff[2]);
  267.            LCD_set_xy( 2, 6 );
  268.            LCD_Write_number(disbuff[3]);

  269.           //}
  270.         }
  271.         /****************************************************/
  272. void Conut3(void)
  273.         {
  274.            time3=TH0*256+TL0;
  275.            TH0=0x00;
  276.            TL0=0x00;
  277.            S3=time3*1.87/100;       //          11.0592M晶振
  278.            if(flag==1)                      //超出测量
  279.           {         
  280.            flag=0;
  281.            LCD_set_xy( 3, 5 );
  282.            LCD_Write_string("超");
  283.          
  284.            }
  285.          else
  286.           {
  287.            disbuff[1]=S3%1000/100;
  288.            disbuff[2]=S3%1000%100/10;
  289.            disbuff[3]=S3%1000%100%10;
  290.            LCD_set_xy( 3, 5 );
  291.            LCD_Write_number(disbuff[1]);
  292.            LCD_Write_number(disbuff[2]);
  293.            LCD_set_xy( 3, 6 );
  294.            LCD_Write_number(disbuff[3]);

  295.           }
  296.         }
  297. void changkuan()
  298. {


  299. }
  300. /********************************************************/

  301. void delay20us(void)   //误差 -0.016637731481us
  302. {
  303.     unsigned char a,b;
  304.     for(b=1;b>0;b--)
  305.         for(a=52;a>0;a--);
  306.      //if Keil,require use intrins.h
  307. }

  308. void Delay5ms()                //@11.0592MHz
  309. {
  310.         unsigned char i, j;

  311.         i = 54;
  312.         j = 199;
  313.         do
  314.         {
  315.                 while (--j);
  316.         } while (--i);
  317. }



  318. void Delay50ms()                //@11.0592MHz
  319. {
  320.         unsigned char i, j, k;

  321.         i = 3;
  322.         j = 26;
  323.         k = 223;
  324.         do
  325.         {
  326.                 do
  327.                 {
  328.                         while (--k);
  329.                 } while (--j);
  330.         } while (--i);
  331. }

  332.         
  333.         
  334.         
  335.         void Delay300ms()                //@11.0592MHz
  336. {
  337.         unsigned char i, j, k;

  338.         i = 13;
  339.         j = 156;
  340.         k = 83;
  341.         do
  342.         {
  343.                 do
  344.                 {
  345.                         while (--k);
  346.                 } while (--j);
  347.         } while (--i);
  348. }

  349. /********************************************************/
  350.      void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  351.   {
  352.     flag=1;                                                         //中断溢出标志
  353.   }
  354. /********************************************************/
  355.    void  StartModule1()                          //超声波触发函数
  356.   {   Trig1=0;
  357.          delay20us();
  358.           Trig1=1;
  359.           delay20us();                                                //发射一个大于10us的脉冲,触发超声波发射
  360.           Trig1=0;
  361.   }
  362.   /******************************************************/
  363.   void  StartModule2()                          //超声波触发函数
  364.   {   Trig2=0;
  365.          delay20us();
  366.           Trig2=1;
  367.           delay20us();                                                //发射一个大于10us的脉冲,触发超声波发射
  368.           Trig2=0;
  369.   }
  370.   /******************************************************/
  371.   void  StartModule3()                          //超声波触发函数
  372.   {   Trig3=0;
  373.          delay20us();
  374.           Trig3=1;
  375.           delay20us();                                                //发射一个大于10us的脉冲,触发超声波发射
  376.           Trig3=0;
  377.   }
  378.   /******************************************************/
  379.   void  StartModule4()                          //超声波触发函数
  380.   {   Trig4=0;
  381.          delay20us();
  382.           Trig4=1;
  383.           delay20us();                                                //发射一个大于10us的脉冲,触发超声波发射
  384.           Trig4=0;
  385.   }
  386. /********************************************************/
  387. void main(void)
  388. {  
  389.     TMOD=0x01;                   //设T0为方式1
  390.         TH0=0x00;
  391.         TL0=0x00;
  392.         TR0=1;
  393.         ET0=1;             //允许T0中断
  394.         EA=1;                           //开启总中断        

  395.         Lcd_init();       //设置液晶显示器
  396.         Clr_Scr();        //清屏        
  397.         Delaynms(1000);
  398.         Lcd_init();       //
  399.     Lcd_Mark2();
  400.         Delaynms(1000);

  401.         while(1)
  402.         {  

  403.          StartModule1();                      //发出信号
  404.           Ecno1 =1;                                 //把Ecno脚置高后等待高电平回波信号         
  405.          while(!Ecno1);                //当Ecno为零时等待               
  406.          TR0=1;                            //开启计数
  407.          while(Ecno1);            //当RX为1计数并等待
  408.          TR0=0;                                //关闭计数
  409.          Conut1();
  410.          delay(200);

  411.         StartModule2();                      //发出信号
  412.           Ecno2 =1;                                 //把Ecno脚置高后等待高电平回波信号         
  413.          while(!Ecno2);                //当Ecno为零时等待               
  414.          TR0=1;                            //开启计数
  415.          while(Ecno2);            //当RX为1计数并等待
  416.          TR0=0;                                //关闭计数
  417.          Conut2();
  418.          delay(250);
  419.                  StartModule4();                      //发出信号
  420.           Ecno4 =1;                                 //把Ecno脚置高后等待高电平回波信号         
  421.          while(!Ecno4);                //当Ecno为零时等待               
  422.          TR0=1;                            //开启计数
  423.          while(Ecno4);            //当RX为1计数并等待
  424.          TR0=0;                                //关闭计数
  425.          Conut4();
  426.          delay(300);                //延时时间即为液晶屏的刷新周期

  427.         StartModule3();                      //发出信号
  428.           Ecno3 =1;                                 //把Ecno脚置高后等待高电平回波信号         
  429.          while(!Ecno3);                //当Ecno为零时等待               
  430.          TR0=1;                            //开启计数
  431.          while(Ecno3);            //当RX为1计数并等待
  432.          TR0=0;                                //关闭计数
  433.          Conut3();
  434.          delay(350);


  435.          
  436.         }

  437. }      
复制代码
      

回复

使用道具 举报

ID:123289 发表于 2019-9-28 16:15 | 显示全部楼层
你先画个流程画并走通它,而后再写程序。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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