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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC89C51最小系統+HC-SR04+LCD12864(超聲波測距儀)源碼

[復制鏈接]
跳轉到指定樓層
樓主

單片機源程序如下:
  1. /////////////////////////////////////////////////////////////////
  2. /***********************超聲波模塊程序**************************/
  3. /////////////////////////////////////////////////////////////////
  4. #include <reg52.h>
  5. #include <intrins.h>
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. //全局變量定義
  9. unsigned int time;
  10. unsigned int S,s_false;
  11. unsigned long num1;
  12. bit flag;
  13. //12864液晶顯示定義
  14. uchar code sj1[]={"<<超聲波測距儀>>"};
  15. uchar code sj2[]={"  榆林學院      "};
  16. uchar code sj3[]={"測量范圍5cm-2m  "};
  17. uchar code sj4[]={"當前距離:"};
  18. uchar code sj5[]={"錯誤 "};
  19. //超聲波引腳定義                                                
  20. sbit Trig =P1^1;          //定義引腳        
  21. sbit Echo =P3^2;
  22. //12864液晶引腳定義
  23. sbit lcdrs=P3^5;          //命令數據
  24. sbit lcdrw=P3^6;          //讀寫
  25. sbit lcde =P3^4;
  26. sbit LCD_PSB=P3^7;
  27. //時鐘調整按鍵引腳定義
  28. sbit rad=P2^4;
  29. sbit rsu=P2^5;
  30. sbit mad=P2^6;
  31. sbit msu=P2^7;

  32. sbit rst=P3^1;            //DS1302復位端,低電平關閉  
  33. //延時函數
  34. void delay(uint z)
  35. {
  36.         uint x,y;
  37.         for(x=z;x>0;x--)
  38.                 for(y=110;y>0;y--);
  39. }
  40. void delay_20us()
  41. {
  42.         uchar a;
  43.         for(a=0;a<100;a++);
  44. }
  45. //2864液晶寫命令函數
  46. void xmn(unsigned char com)
  47. {
  48.         lcdrs=0;
  49.         P0=com;
  50.         delay(5);
  51.         lcde=1;
  52.         delay(5);
  53.         lcde=0;
  54. }
  55. //2864液晶寫數據函數
  56. void xsj(unsigned char zifu)
  57. {
  58.         lcdrs=1;
  59.         P0=zifu;
  60.         delay(5);
  61.         lcde=1;
  62.         delay(5);
  63.         lcde=0;
  64. }
  65. //2864液晶顯示函數1
  66. void xs1()
  67. {
  68.         uchar i;
  69.         xmn(0x80);
  70.         for(i=0;i<16;i++)
  71.         {
  72.                 xsj(sj1[i]);
  73.         }
  74.         xmn(0x90);
  75.         for(i=0;i<16;i++)
  76.         {
  77.                 xsj(sj2[i]);
  78.         }
  79.         xmn(0x88);
  80.         for(i=0;i<16;i++)
  81.         {
  82.                 xsj(sj3[i]);
  83.         }
  84.         xmn(0x98);
  85.         for(i=0;i<16;i++)
  86.         {
  87.                 xsj(sj4[i]);
  88.         }
  89. }
  90. //2864液晶顯示函數2
  91. void xs2(uint t_emp)
  92. {
  93.         uchar qian,bai,shi,ge;
  94.         qian=t_emp/1000;
  95.         bai=(t_emp%1000)/100;
  96.         shi=(t_emp%100)/10;
  97.         ge=t_emp%10;

  98.         xmn(0x9d);
  99.         xsj(0x30+qian);
  100.         delay(1);
  101.         xsj(0x30+bai);
  102.         delay(1);
  103.         xsj(0x30+shi);
  104.         delay(1);
  105.         xsj(0x30+ge);
  106.         delay(1);
  107.         xsj('c');
  108.         delay(1);
  109.         xsj('m');
  110.         delay(100);
  111. }
  112. //超聲波計數函數
  113. void T0_time() interrupt 1  //T0中斷用來計數器溢出,超過測距范圍
  114. {
  115.         flag=0;                  //中斷溢出標志,失敗
  116.         TH0=0;
  117.         TL0=0;
  118.         TR0=0;                   //關閉計數
  119. }
  120. //中斷定時函數
  121. void T1_timer() interrupt 3 //中斷
  122. {
  123.         TH1=(65536-50000)/256;
  124.         TL1=(65536-50000)%256;
  125.         num1++;
  126. }
  127. //超聲波模塊啟動函數
  128. void StartModule()          //啟動模塊
  129. {
  130.         Trig=1;                 //啟動一次模塊
  131.         _nop_();_nop_();_nop_();_nop_();_nop_();
  132.         _nop_();_nop_();_nop_();_nop_();_nop_();
  133.         _nop_();_nop_();_nop_();_nop_();_nop_();
  134.         _nop_();_nop_();_nop_();_nop_();_nop_();
  135.         _nop_();
  136.         Trig=0;
  137. }
  138. //超聲波測試距離計算函數
  139. void Count(void)
  140. {
  141.         uchar i;
  142.         time=TH0*256+TL0;
  143.         TH0=0;
  144.         TL0=0;
  145.         S=(time*1.8)/100+2;               //算出來是CM
  146.         if(((S<5)||(S>=600))||flag==0)  //超出測量范圍顯示“-”失敗
  147.         {
  148.                 //flag=1;
  149.                 s_false=1000;
  150.                 xmn(0x9d);
  151.                 for(i=0;i<6;i++)
  152.                 {
  153.                         xsj(sj5[i]);
  154.                 }
  155.                 //(s_false);
  156.         }
  157.         else
  158.         {
  159.                 xs2(S);
  160.         }
  161. }
  162. //12864液晶初始化函數
  163. void init()
  164. {LCD_PSB=1;
  165.         delay(100);
  166.         xmn(0x30);
  167.         delay_20us();
  168.         xmn(0x30);
  169.         delay_20us();
  170.         xmn(0x0c);
  171.         delay_20us();
  172.         xmn(0x01);
  173.         delay_20us();
  174.         xmn(0x06);
  175.         delay_20us();
  176. }
  177. //主函數
  178. void main()
  179. {
  180.         //unsigned char TempCyc;
  181.         rst=0;           //關閉板上DS1302
  182.         
  183.         P0=0XFF;
  184.         
  185.         
  186.         P0=0XFF;

  187.         P0=0X00;

  188.         
  189.         P0=0X00;


  190.         delay(500);    //啟動等待,等LCM講入工作狀態
  191.         lcdrw=0;
  192.         init();        //LCM初始化
  193.         delay(500);    //延時片刻(可不要)
  194.         while(1)
  195.         {
  196.                 TMOD=0x11; //設T0為方式1,GATE=1;
  197.                 TH0=0;
  198.                 TL0=0;
  199.                 ET0=1;     //允許T0中斷
  200.                 ET1=1;
  201.                 TR1=1;
  202.                 EA=1;      //開啟總中斷

  203.                 xs1();

  204.                 Trig=0;
  205.                 Echo=0;
  206.                 while(1)
  207.                 {
  208.                         StartModule();
  209.                         flag=1;
  210.                         //while(!Echo);      //當echo為零時等待
  211.                         while((!Echo)&&flag);//當echo為零時等待,中斷flag跳出等待
  212.                         TR0=1;               //開啟計數
  213.                         while(Echo&&flag);   //當echo為1計數并等待
  214.                         TR0=0;               //關閉計數
  215.                         Count();             //計算
  216.                         delay(120);          //80MS
  217.                 }
  218.         }
  219. }
復制代碼

所有資料51hei提供下載:
51單片機控制超聲波測距.zip (62.84 KB, 下載次數: 112)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久这里只有精品首页 | 亚洲 91| av高清毛片 | 97caoporn国产免费人人 | 天天综合久久 | 91精品国产91久久综合桃花 | 国产精品欧美日韩 | 精品一区二区久久久久久久网站 | 日韩亚洲一区二区 | 毛片的网址 | 亚洲永久| 91精品国产综合久久香蕉麻豆 | 美女天天操 | 国产资源在线观看 | 99婷婷| 欧美一区二区三区在线看 | 久久剧场 | 日韩激情网 | 精品欧美乱码久久久久久 | 欧美一区不卡 | 亚洲精品日韩欧美 | 国产成人精品999在线观看 | 欧美一区2区三区4区公司 | www天天操| 91精品国产手机 | 日韩一区二区三区在线视频 | 夜夜骑首页 | 午夜精品一区二区三区在线视 | 99精品欧美一区二区蜜桃免费 | 国产午夜精品视频 | 国产精品美女www爽爽爽视频 | 精品免费在线 | 蜜桃一区| 国产精品久久久久久一区二区三区 | 99精品久久久国产一区二区三 | 久久高清免费视频 | 成人在线不卡 | 天天色影视综合 | 精品伦精品一区二区三区视频 | 国内久久 | 91视频精选 |