国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊(cè)
搜索

基于51單片機(jī)的LCD12864超聲波測(cè)距+溫濕度顯示代碼

[復(fù)制鏈接]
樓主
coolfire 發(fā)表于 2021-4-30 02:13:37 | 只看該作者 |倒序?yàn)g覽 |閱讀模式
89c52rc單片機(jī)控制超聲波測(cè)距和讀取實(shí)時(shí)的溫濕度情況,按鍵控制切換注釋準(zhǔn)確。
完整程序: 整合版本加按鍵C源碼.zip (61.35 KB, 售價(jià): 1 E幣)
單片機(jī)源程序部分如下: 完整源碼請(qǐng)查看附件
  1. #include <reg52.h>                         //51 的頭文件
  2. #include <intrins.h>                       //超聲波的固有函數(shù)頭文件
  3. #define uchar unsigned char                //表示之后代碼中的“uchar”全部代表“unsigned char”
  4. #define uint unsigned int                  //定義uint為無符號(hào)整型。
  5. #define LCD_databus P2                     //定義LCD的數(shù)據(jù)口為P2
  6. //全局變量定義
  7. unsigned int time;                       //聲明無符號(hào)類型 time
  8. unsigned int S,s_false;                  //聲明無符號(hào)類型  
  9. unsigned long num1;                      //聲明無符號(hào)長整數(shù)
  10. bit flag;
  11. //12864液晶顯示定義
  12. uchar code sj1[]={"<<超聲波測(cè)距儀>>"};
  13. uchar code sj4[]={"當(dāng)前距離:"};
  14. uchar code sj5[]={"錯(cuò)誤 "};
  15. uchar dht_num=0; //用于while循環(huán)中計(jì)數(shù),超時(shí)則跳出循環(huán)
  16. uchar code table[]={"溫度:"};
  17. uchar code table1[]={"濕度:"};
  18. uchar code table2[]={"℃"};
  19. uchar dht_d1=0,dht_d2=0        ;        //依次為濕度整數(shù)部分和濕度小數(shù)部
  20. uchar dht_t1=0,dht_t2=0        ;  //依次為溫度整數(shù)部分和溫度小數(shù)部分
  21. uchar dht_j=0;              //和校驗(yàn),可選擇是否使用,具體參照數(shù)據(jù)手
  22. uchar i,t11,t12,d11,d12;
  23. uchar t21,t22,d21,d22;
  24. //超聲波引腳定義                                                
  25. sbit Trig =P1^0;          //定義引腳      
  26. sbit Echo =P1^1;
  27. //12864液晶引腳定義
  28. sbit RS=P0^7;          //命令數(shù)據(jù)
  29. sbit RW=P0^6;          //讀寫
  30. sbit EN =P0^5;
  31. sbit dht_dat=P1^2; //用哪個(gè)I/O口自選,注意不要用P2口
  32. //定義按鍵
  33. sbit key1 = P3^5;  
  34. sbit key2 = P3^4;
  35. /*****************ms延時(shí)函數(shù)*********************************/
  36. void delay(uint z)
  37. {
  38.         uint x,y;
  39.         for(x=z;x>0;x--)
  40.                 for(y=110;y>0;y--);
  41. }
  42. /*****************20us延時(shí)函數(shù)*********************************/
  43. void delay_20us()
  44. {
  45.         uchar a;
  46.         for(a=0;a<100;a++);
  47. }

  48. /*****************ms延時(shí)函數(shù)*********************************/
  49. void dh11delayms(uint xms)
  50. {
  51. uint i,j;
  52. for(i=xms;i>0;i--)
  53.         for(j=110;j>0;j--);
  54. }
  55. /*****************us延時(shí)函數(shù)*****************************/
  56. void delay_10us()
  57. {
  58.         _nop_();
  59.         _nop_();
  60.         _nop_();
  61.         _nop_();
  62.         _nop_();
  63.         _nop_();
  64. }

  65. /*寫指令函數(shù)*/
  66. /*rs=l,rw=l,en=高脈沖,D0-D7=指令碼。*/
  67. void write_cmd(uchar cmd)
  68. {
  69.         RS=0;
  70.         RW=0;
  71.         EN=0;
  72.         LCD_databus=cmd;
  73.         dh11delayms(5);
  74.         EN=1;
  75.         dh11delayms(5);
  76.         EN=0;
  77. }

  78. /***************************寫顯示數(shù)據(jù)************************/
  79. /*rs=h,rw=l,*/
  80. void write_dat(uchar date)
  81. {
  82. RS=1;
  83. RW=0;
  84. EN=0;
  85. LCD_databus=date;
  86. dh11delayms(5);
  87. EN=1;
  88. dh11delayms(5);
  89. EN=0;
  90. }

  91. /*****************初始化************************/
  92. void DH11init()
  93. {        
  94.         EN=0;
  95.         RW=0;
  96.      

  97.         write_cmd(0x30);                //基本指令操作
  98.         dh11delayms(5);
  99.         write_cmd(0x0c);                //顯示開,關(guān)光標(biāo)
  100.         dh11delayms(5);
  101.         write_cmd(0x06);
  102.         dh11delayms(2);
  103.         write_cmd(0x01);                //清除顯示內(nèi)容
  104.         dh11delayms(5);
  105.                                 
  106.                                                                                                         
  107. }
  108. void dht_init()
  109. {
  110.    dh11delayms(1000);          //DHT11上電前準(zhǔn)備時(shí)間,大概1s
  111.    dht_dat=1;             //         //總線準(zhǔn)備
  112. }
  113. uchar read_date()        //接收一個(gè)8位數(shù)據(jù),先高位后低位
  114. {
  115.         uchar i,dat;
  116.         for(i=0;i<8;i++)   //也就是說程序是循環(huán)八次,把判斷有“1”輸出到dat中,然后輸出一個(gè)八位的數(shù)據(jù)。
  117.         {
  118.                 dht_num=2;
  119.                 while((dht_dat==0)&&(dht_num++)); //dht_dat 數(shù)據(jù)線由DH11拉低準(zhǔn)備發(fā)送數(shù)據(jù)
  120.                 delay_10us();
  121.                                 delay_10us();
  122.                 delay_10us();
  123.                                 delay_10us();
  124.                 dat=dat<<1;
  125.                 if(dht_dat==1)
  126.                 {
  127.                         dht_num=2;
  128.                         dat=dat|0x01;  //如果來自DQ的數(shù)據(jù)是高電平1,則把1放到dat的最低位
  129.                         while((dht_dat==1)&&(dht_num++));

  130.                 }
  131.         }
  132.         return dat;        
  133. }

  134. void get_temp()        //給DHT11一個(gè)開始信號(hào),然后讀取一次數(shù)據(jù),共五個(gè)8位字節(jié)
  135. {
  136.         dht_dat=0;
  137.         dh11delayms(25);
  138.         dht_dat=1;        //單片機(jī)給起始脈沖信號(hào)

  139.         delay_10us();
  140.         delay_10us();
  141.         delay_10us();
  142.         delay_10us();
  143.         dht_dat=1;         //稍作延時(shí),等待DHT11返回響應(yīng)(響應(yīng)為低電 平)
  144.         if(dht_dat==0)         //有響應(yīng)才接收數(shù)據(jù),否則不作處理
  145.         {
  146.                 dht_num=2;
  147.                 while((dht_dat==0)&&(dht_num++));
  148.                 dht_num=2;
  149.                 while((dht_dat==1)&&(dht_num++));
  150.                 dht_d1=read_date();
  151.                 dht_d2=read_date();
  152.                 dht_t1=read_date();
  153.                 dht_t2=read_date();
  154.                 dht_j=read_date(); //一次讀出五個(gè)數(shù)據(jù)
  155.         }
  156.         dht_dat=1;        //釋放總線
  157.         dh11delayms(10);

  158.         d11=dht_d1/10;
  159.         d12=dht_d1%10;
  160.         t11=dht_t1/10;
  161.         t12=dht_t1%10;
  162.                
  163.                 d21=dht_d2/10;
  164.         d22=dht_d2%10;
  165.         t21=dht_t2/10;
  166.         t22=dht_t2%10;
  167.                                    
  168. }

  169. //2864液晶寫命令函數(shù)
  170. void xmn(unsigned char com)
  171. {
  172.         RS=0;
  173.         LCD_databus=com;
  174.         delay(5);
  175.         EN=1;
  176.         delay(5);
  177.         EN=0;
  178. }
復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

手機(jī)版|小黑屋|ELEOK |網(wǎng)站地圖

GMT+8, 2026-5-26 04:09

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復(fù) 返回頂部 返回列表