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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2390|回復: 2
打印 上一主題 下一主題
收起左側

超聲波測距+1602顯示 單片機程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:380156 發表于 2019-7-20 09:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本人親自看視頻一手敲出來的   實測能用    代碼比較規范好看點

單片機源程序如下:
  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; // 發射                 就是TRIG

  7. //lcd1602端口定義

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

  12. #define LCD1602data P0


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



  17. //  1602模塊語句

  18. //延時一毫秒

  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. //延時若干毫秒    入口參數N

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

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

  34. //判斷液晶忙碌狀態   
  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   讀狀態
  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. // 入口參數 dictate

  54.         void Write_com (unsigned char  dictate)     //寫命令字   lcd_w_cmd
  55.         {
  56.        
  57.         while(BusyTest()==1);   //忙碌等待
  58.      RS=0;            //RS RW同時為0 才能寫入指令
  59.      RW=0;
  60.      E=0;                   //先置零  01跳變
  61.                
  62.                 _nop_();
  63.                 _nop_();             //空操作  硬件反應
  64.                 LCD1602data=dictate;    //將數據送入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. //指定字符顯示實際地址   入口參數x
  79.        
  80.         void WriteAddress(unsigned char x)

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


  85.   //將字符寫入液晶    入口參數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;  // 將數據送入P0口   即將數據寫入液晶模塊
  93.          _nop_();
  94.          _nop_();
  95.          _nop_();
  96.          _nop_();
  97.           E=1;
  98.          _nop_();
  99.          _nop_();
  100.          _nop_();
  101.          _nop_();
  102.          
  103.          E=0;        //液晶模塊執行命令
  104.          
  105.          }

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

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


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

  128.          }

  129.          
  130.         //  ADD為顯示字符位置  在第二行顯示  X為顯示字符
  131.          //  調用函數注意  函數為顯示數字  display(10,9);  display(10,a)
  132.          //分別表示第二行第十位顯示數字9和A代表的數字
  133.          //  如果想把此函數改寫成顯示字母的
  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);   //設置顯示地址為第一行第一個字   可以不寫  默認也是第一行第一個字
  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()      //  發送超聲波
  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)//  計算并顯示超聲波測到距離

  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中斷用來計數器溢出   超過測量范圍
  234.                        
  235. {
  236.     flag=1;

  237. }
  238.                
  239. int main()
  240. {
  241.     LCD1602();
  242.         //while (1)
  243.    
  244.         TMOD=0X01;     //設置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.         }
復制代碼

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


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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区视频 | 中文字幕一区在线观看视频 | 亚洲区视频 | 黄色操视频| 中文字幕一二三区 | 久久高清 | 午夜网站视频 | 一级一级一级毛片 | 国产精品久久片 | 久久精品国产免费一区二区三区 | 日韩精品一区二 | 日本不卡免费新一二三区 | 久久无毛| 精品综合久久久 | 欧美国产日韩在线 | 午夜三级在线观看 | 久久久久久亚洲精品 | 国产aⅴ爽av久久久久久久 | 99久久久久久99国产精品免 | 黄色高清视频 | 午夜久久av | 在线观看你懂的网站 | 99视频免费看 | 国产精品毛片无码 | 99久久99 | 青青久久 | 日本黄色短片 | 精品国产乱码 | 在线黄色网 | 91九色麻豆 | 中文字幕精品一区二区三区精品 | 国产在线观看一区二区三区 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 中文在线一区二区 | 国内精品久久久久久 | 国产真实精品久久二三区 | 精品国产乱码久久久久久88av | 午夜私人影院在线观看 | 91精品导航| 精品一区二区三区91 | 久久久久久毛片免费观看 |