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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

超聲波測距+1602顯示 單片機(jī)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:380156 發(fā)表于 2019-7-20 09:30 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本人親自看視頻一手敲出來的   實(shí)測能用    代碼比較規(guī)范好看點(diǎn)

單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uint unsigned  int
  4. #define uchar unsigned char

  5. sbit in=P1^1;   //超聲波接收            就是ECHO
  6. sbit out=P1^0; // 發(fā)射                 就是TRIG

  7. //lcd1602端口定義

  8. sbit RS= P3^5;       //寄存器選擇位
  9. sbit RW = P3^6;        //讀寫選擇位
  10. sbit E = P3^4;        //使能
  11. sbit BF=P0^7;          //忙碌標(biāo)志

  12. #define LCD1602data P0


  13.   uint time;              //無符號整型
  14. unsigned  long s=0;                 //無符號長整型
  15. bit flag;                    //超聲波超出量程標(biāo)志位
  16.   uint s1,s2,s3;



  17. //  1602模塊語句

  18. //延時(shí)一毫秒

  19. void delay1ms()
  20. {
  21.          unsigned char i,j;
  22.          for(i=0;i<10;i++)
  23.          for(j=0;j<33;j++);
  24.          
  25. }

  26. //延時(shí)若干毫秒    入口參數(shù)N

  27. void delay(unsigned int n)
  28. {

  29. unsigned int i;
  30.          for(i=0;i<n;i++)
  31.    delay1ms();
  32.          
  33. }

  34. //判斷液晶忙碌狀態(tài)   
  35. // 返回值  result  result=1 忙碌   result=0 不忙

  36. bit BusyTest(void)
  37. {

  38.      bit result;      //為位類型    長度0或1
  39.             RS=0;
  40.             RW=1;        ///RS=0  RW=1   讀狀態(tài)
  41.             E=1;     //  e=1  允許讀寫
  42.            _nop_();    // kong操作
  43.      _nop_();
  44.            _nop_();
  45.            _nop_();
  46.            result=BF;    //將忙碌電平給RESULT
  47.              E=0;
  48.            return result;
  49.          
  50. }
  51.          

  52. //  將模式指令 顯示地址寫入液晶
  53. // 入口參數(shù) dictate

  54.         void Write_com (unsigned char  dictate)     //寫命令字   lcd_w_cmd
  55.         {
  56.        
  57.         while(BusyTest()==1);   //忙碌等待
  58.      RS=0;            //RS RW同時(shí)為0 才能寫入指令
  59.      RW=0;
  60.      E=0;                   //先置零  01跳變
  61.                
  62.                 _nop_();
  63.                 _nop_();             //空操作  硬件反應(yīng)
  64.                 LCD1602data=dictate;    //將數(shù)據(jù)送入P0口  寫入指令或地址
  65.                 _nop_();
  66.                 _nop_();
  67.                 _nop_();
  68.                 _nop_();
  69.            E=1;  
  70.      _nop_();
  71.      _nop_();               
  72.            _nop_();
  73.                  _nop_();
  74.             E=0;
  75.        
  76.         }
  77.   
  78. //指定字符顯示實(shí)際地址   入口參數(shù)x
  79.        
  80.         void WriteAddress(unsigned char x)

  81. {  
  82.     Write_com(x|0x80);        //顯示位置確定為80+地址碼X
  83.        
  84. }


  85.   //將字符寫入液晶    入口參數(shù)Y

  86. void WriteData(unsigned char y)       //lcd_w_dat

  87. {

  88.    while (BusyTest()==1);
  89.    RS=1;
  90.          RW=0;
  91.          E=0;       
  92.    LCD1602data=y;  // 將數(shù)據(jù)送入P0口   即將數(shù)據(jù)寫入液晶模塊
  93.          _nop_();
  94.          _nop_();
  95.          _nop_();
  96.          _nop_();
  97.           E=1;
  98.          _nop_();
  99.          _nop_();
  100.          _nop_();
  101.          _nop_();
  102.          
  103.          E=0;        //液晶模塊執(zhí)行命令
  104.          
  105.          }

  106. // LCD初始化
  107.          
  108.          void LcdInt(void)
  109.          {
  110.          
  111.          delay(15);
  112.                  Write_com(0x38);     //顯示模式設(shè)置  16*2 5*7點(diǎn)陣  8位數(shù)據(jù)口
  113.                  delay(5);
  114.                  Write_com(0x38);
  115.                  delay(5);
  116.                  Write_com(0x38);
  117.                  delay(5);              //3次寫設(shè)置模式
  118.         //write_com(0x0f);   顯示模式設(shè)置  顯示開  有光標(biāo)  光標(biāo)閃爍
  119. //  delay(5);                 
  120.          

  121.     Write_com(0x0c);     //  顯示開    不顯示光標(biāo)
  122.          delay(5);
  123.    
  124.     Write_com(0x06);     //  顯示模式設(shè)置     光標(biāo)右移 字符不移
  125.          delay(5);


  126.      Write_com(0x01);     //     清屏指令  以前內(nèi)容清楚
  127.          delay(5);

  128.          }

  129.          
  130.         //  ADD為顯示字符位置  在第二行顯示  X為顯示字符
  131.          //  調(diào)用函數(shù)注意  函數(shù)為顯示數(shù)字  display(10,9);  display(10,a)
  132.          //分別表示第二行第十位顯示數(shù)字9和A代表的數(shù)字
  133.          //  如果想把此函數(shù)改寫成顯示字母的
  134.          //  只需把最writedata(0x30+x)中的0x30+去掉
  135.          

  136.     display(unsigned char add , unsigned char x)
  137.   {
  138.      WriteAddress(0x00);
  139.     delay(5);

  140.     Write_com(0x80+0x40+add) ;
  141.    
  142.     WriteData(0x30+x);
  143. return 0;
  144.         }  

  145. LCD1602()//1602初顯示
  146.                 {
  147.                   LcdInt();
  148.                           delay(10);
  149.                          Write_com(0x01);  //清屏
  150.                           delay(5);
  151.                        
  152.                         WriteAddress(0x00);   //設(shè)置顯示地址為第一行第一個(gè)字   可以不寫  默認(rèn)也是第一行第一個(gè)字
  153.                        
  154.                         delay(5);
  155.                        
  156.         //第一行顯示  DISTANCE

  157.      WriteData('D');                       
  158.                  WriteData('i');
  159.                  WriteData('s');
  160.                  WriteData('t');
  161.                  WriteData('a');
  162.                  WriteData('n');
  163.                  WriteData('c');
  164.                  WriteData('e');
  165.                  WriteData(':');
  166. return 0;       
  167.                 }
  168.                

  169.    //以上1602模塊語句
  170.                
  171.                 void FS()      //  發(fā)送超聲波
  172.         {
  173.                
  174.             out=1;
  175.                         _nop_();
  176.                   _nop_();
  177.                         _nop_();
  178.                         _nop_();
  179.                         _nop_();
  180.                         _nop_();
  181.                         _nop_();
  182.                         _nop_();
  183.                         _nop_();
  184.                         _nop_();
  185.                         _nop_();
  186.                         _nop_();
  187.                         _nop_();
  188.                         _nop_();
  189.                         _nop_();
  190.                         _nop_();
  191.                         _nop_();
  192.                         _nop_();
  193.                         _nop_();
  194.                         _nop_();
  195.                        
  196.                         out=0;
  197.   }

  198. void count(void)//  計(jì)算并顯示超聲波測到距離

  199. {

  200.         time=TH0*256+TL0;
  201.                TH0=0;
  202.                TL0=0;
  203.          
  204.               s=(time*1.7)/100;      //算出來單位為CM
  205.             if ((s>700)||flag==1)    //超出測量范圍顯示ERROR
  206.                         {

  207.                                 flag=0;
  208.                                
  209.                                 Write_com(0x80+0x40+11);
  210.                         WriteData('E');   delay(5);
  211.                         WriteData('R');   delay(5);
  212.       WriteData('R');   delay(5);
  213.                         WriteData('O') ;  delay(5);
  214.                         WriteData('R') ;  delay(5);
  215.                   delay(500);
  216.                
  217.                          }
  218.    else
  219.          {
  220.                  s1=s%1000/100;
  221.                  s2=s%1000%100/10;
  222.                  s3=s%1000%10%10;
  223.       display(11,s1);            //s1  為上面的X     11為上面的Y
  224.                  WriteData('.');
  225.                    display(13,s2);
  226.                  display(14,s3);
  227.                  WriteData('m');
  228.                  delay(500);
  229.          }
  230.                
  231. }
  232.                
  233.                 void zd0() interrupt 1     //t0中斷用來計(jì)數(shù)器溢出   超過測量范圍
  234.                        
  235. {
  236.     flag=1;

  237. }
  238.                
  239. int main()
  240. {
  241.     LCD1602();
  242.         //while (1)
  243.    
  244.         TMOD=0X01;     //設(shè)置T0為方式1   GATE=0;
  245.         TH0=0;
  246.         TL0=0;
  247.         ET0=1;         //  允許T0中斷
  248.         EA=1;
  249.            while(1)
  250.                  {
  251.                     FS();
  252.                          while(!in);
  253.                          TR0=1;
  254.                          while (in);
  255.                           TR0=0;
  256.                          count();
  257.                
  258.                  }
  259.        
  260.         }
復(fù)制代碼

所有資料51hei提供下載:
超聲波測距22.zip (45.26 KB, 下載次數(shù): 90)


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

使用道具 舉報(bào)

沙發(fā)
ID:580104 發(fā)表于 2019-7-23 12:44 | 只看該作者
謝謝樓主。
回復(fù)

使用道具 舉報(bào)

板凳
ID:643576 發(fā)表于 2019-11-29 20:31 | 只看該作者
好評,看的很清楚,能不能給加個(gè)報(bào)警器,求程序
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成年人视频在线免费观看 | 青春草在线 | 一级免费毛片 | 国产欧美精品 | 精品久久九九 | 国产成人精品免费视频大全最热 | 欧美日韩久久 | 国产精品美女久久久 | 玖玖免费 | 97日日碰人人模人人澡分享吧 | 久久不卡| 国产精品日韩在线观看一区二区 | 黄色免费在线观看网站 | 成人午夜在线 | av黄色网| 91欧美激情一区二区三区成人 | 亚洲人在线播放 | 99久久国产 | 成人免费看电影 | 亚洲视频一区在线观看 | 四虎在线观看 | 久久99精品久久久 | 中文字幕第十五页 | 成人免费视频网站在线观看 | 成人不卡视频 | 中文字幕av在线一二三区 | 国产不卡视频在线 | 日韩成人精品在线观看 | 国产人成在线观看 | 天天干天天爱天天 | 伊人伊人网 | 伊人狼人影院 | 色久伊人 | 精品国产欧美一区二区 | 日韩a | 亚洲免费av一区 | 九九导航 | 毛片免费看 | 国产精品美女久久久久久久久久久 | 99pao成人国产永久免费视频 | 免费视频久久久久 |