久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1455|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

不懂就問:我在51黑找的一個(gè)US100超聲波程序 怎么每次開關(guān)測一次距不可以實(shí)時(shí)更新

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:404630 發(fā)表于 2019-9-27 20:53 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
下面是程序,有大神告訴一下小白要如何解決嗎?在這個(gè)論壇下載的
  1. /**************************************************************/
  2.   //使用時(shí)將US100跳帽拔下,使其設(shè)置為電平觸發(fā)模式
  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             //數(shù)據(jù)口
  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.     // 函數(shù)聲明
  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. /*  延時(shí)函數(shù)                                                       */
  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);      //擴(kuò)充指令操作
  80.     delay(5);
  81.     lcd_wcmd(0x30);      //基本指令操作
  82.     delay(5);
  83.     lcd_wcmd(0x0C);      //顯示開,關(guān)光標(biāo)
  84.     delay(5);
  85.     lcd_wcmd(0x01);      //清除LCD的顯示內(nèi)容
  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) //寫指令或數(shù)據(jù)
  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) //延時(shí)
  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)//清屏函數(shù)
  122. {
  123.         lcd_wcmd(0x01);
  124. }

  125. /******************************************************************************/
  126. void LCD_set_xy( unsigned char X, unsigned char Y )//設(shè)置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)//        數(shù)字顯示函數(shù)
  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中斷用來計(jì)數(shù)器溢出,超過測距范圍
  351.   {
  352.     flag=1;                                                         //中斷溢出標(biāo)志
  353.   }
  354. /********************************************************/
  355.    void  StartModule1()                          //超聲波觸發(fā)函數(shù)
  356.   {   Trig1=0;
  357.          delay20us();
  358.           Trig1=1;
  359.           delay20us();                                                //發(fā)射一個(gè)大于10us的脈沖,觸發(fā)超聲波發(fā)射
  360.           Trig1=0;
  361.   }
  362.   /******************************************************/
  363.   void  StartModule2()                          //超聲波觸發(fā)函數(shù)
  364.   {   Trig2=0;
  365.          delay20us();
  366.           Trig2=1;
  367.           delay20us();                                                //發(fā)射一個(gè)大于10us的脈沖,觸發(fā)超聲波發(fā)射
  368.           Trig2=0;
  369.   }
  370.   /******************************************************/
  371.   void  StartModule3()                          //超聲波觸發(fā)函數(shù)
  372.   {   Trig3=0;
  373.          delay20us();
  374.           Trig3=1;
  375.           delay20us();                                                //發(fā)射一個(gè)大于10us的脈沖,觸發(fā)超聲波發(fā)射
  376.           Trig3=0;
  377.   }
  378.   /******************************************************/
  379.   void  StartModule4()                          //超聲波觸發(fā)函數(shù)
  380.   {   Trig4=0;
  381.          delay20us();
  382.           Trig4=1;
  383.           delay20us();                                                //發(fā)射一個(gè)大于10us的脈沖,觸發(fā)超聲波發(fā)射
  384.           Trig4=0;
  385.   }
  386. /********************************************************/
  387. void main(void)
  388. {  
  389.     TMOD=0x01;                   //設(shè)T0為方式1
  390.         TH0=0x00;
  391.         TL0=0x00;
  392.         TR0=1;
  393.         ET0=1;             //允許T0中斷
  394.         EA=1;                           //開啟總中斷        

  395.         Lcd_init();       //設(shè)置液晶顯示器
  396.         Clr_Scr();        //清屏        
  397.         Delaynms(1000);
  398.         Lcd_init();       //
  399.     Lcd_Mark2();
  400.         Delaynms(1000);

  401.         while(1)
  402.         {  

  403.          StartModule1();                      //發(fā)出信號(hào)
  404.           Ecno1 =1;                                 //把Ecno腳置高后等待高電平回波信號(hào)         
  405.          while(!Ecno1);                //當(dāng)Ecno為零時(shí)等待               
  406.          TR0=1;                            //開啟計(jì)數(shù)
  407.          while(Ecno1);            //當(dāng)RX為1計(jì)數(shù)并等待
  408.          TR0=0;                                //關(guān)閉計(jì)數(shù)
  409.          Conut1();
  410.          delay(200);

  411.         StartModule2();                      //發(fā)出信號(hào)
  412.           Ecno2 =1;                                 //把Ecno腳置高后等待高電平回波信號(hào)         
  413.          while(!Ecno2);                //當(dāng)Ecno為零時(shí)等待               
  414.          TR0=1;                            //開啟計(jì)數(shù)
  415.          while(Ecno2);            //當(dāng)RX為1計(jì)數(shù)并等待
  416.          TR0=0;                                //關(guān)閉計(jì)數(shù)
  417.          Conut2();
  418.          delay(250);
  419.                  StartModule4();                      //發(fā)出信號(hào)
  420.           Ecno4 =1;                                 //把Ecno腳置高后等待高電平回波信號(hào)         
  421.          while(!Ecno4);                //當(dāng)Ecno為零時(shí)等待               
  422.          TR0=1;                            //開啟計(jì)數(shù)
  423.          while(Ecno4);            //當(dāng)RX為1計(jì)數(shù)并等待
  424.          TR0=0;                                //關(guān)閉計(jì)數(shù)
  425.          Conut4();
  426.          delay(300);                //延時(shí)時(shí)間即為液晶屏的刷新周期

  427.         StartModule3();                      //發(fā)出信號(hào)
  428.           Ecno3 =1;                                 //把Ecno腳置高后等待高電平回波信號(hào)         
  429.          while(!Ecno3);                //當(dāng)Ecno為零時(shí)等待               
  430.          TR0=1;                            //開啟計(jì)數(shù)
  431.          while(Ecno3);            //當(dāng)RX為1計(jì)數(shù)并等待
  432.          TR0=0;                                //關(guān)閉計(jì)數(shù)
  433.          Conut3();
  434.          delay(350);


  435.          
  436.         }

  437. }      
復(fù)制代碼
      

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:123289 發(fā)表于 2019-9-28 16:15 | 只看該作者
你先畫個(gè)流程畫并走通它,而后再寫程序。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91免费版在线观看 | 国产乱码久久久久久一区二区 | 国产内谢 | 亚洲精品一区二区三区蜜桃久 | 久久免费视频1 | 日韩综合在线视频 | 色综合久久久 | 国产精品国产成人国产三级 | 久久精品一级 | 日韩国产欧美 | 中文字幕成人在线 | 久久久久久av | 久久亚洲天堂 | 亚洲色视频 | 欧美人成在线视频 | 少妇诱惑av| av片免费 | 亚洲电影第1页 | 久久久国产精品一区 | 亚洲免费一区二区 | 精品视频一区二区三区 | 成人精品在线视频 | 国产精品亚洲综合 | 毛片一级片 | 国产精品日韩高清伦字幕搜索 | 亚洲成人久久久 | 久久久久久国产精品免费免费男同 | 人人cao | 亚洲欧美一区二区三区在线 | 亚洲免费人成在线视频观看 | 91精品国产综合久久久久久首页 | 日韩精品激情 | 麻豆一区二区三区 | 日本aa毛片a级毛片免费观看 | av中文在线| 久久久久免费观看 | 国产免费一区二区三区 | 色花av| 羞羞视频一区二区 | 国产第一页在线播放 | 超碰在线免费av |