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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6362|回復(fù): 4
收起左側(cè)

單片機(jī)超聲波測(cè)距和DHT11溫濕度模塊在1602液晶上顯示Proteus仿真程序

  [復(fù)制鏈接]
ID:594353 發(fā)表于 2019-8-8 11:16 | 顯示全部樓層 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei截圖20190808110602.png


大一學(xué)生自己編程,供大家參考,仿真在下面
顯示效果----------第一行為距離-------第二行為溫濕度


注釋從keil復(fù)制過(guò)來(lái)的,不知為何變成了問(wèn)號(hào)

單片機(jī)源程序如下:
  1.         #include<reg52.h>   
  2. #include <intrins.h>  
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. sbit rs=P3^5;            //1602的數(shù)據(jù)/指令選擇控制線
  6. sbit en=P3^4;          //1602的使能控制線
  7. sbit trig=P0^6;      //超聲波測(cè)距模塊Trig
  8. sbit echo=P0^7;     //超聲波測(cè)距模塊Echo
  9. float distance;    //測(cè)量所得距離
  10. uchar code xianshi[]={"Distance: cm"} ;
  11. uchar code table[]={"0123456789"};


  12. uchar str1[2];         //存儲(chǔ)濕度數(shù)組
  13. uchar str2[2];          //存儲(chǔ)溫度數(shù)組
  14. sbit DATA = P3^7;//溫濕度傳感器DHT11數(shù)據(jù)接入端
  15. void display2();

  16. uchar TH_data,TL_data,RH_data,RL_data;

  17. uchar TH_temp,TL_temp,RH_temp,RL_temp;

  18. uchar check;

  19. uchar com_data,untemp,temp;

  20. uchar respond;

  21. void delay(uint n)   //延時(shí)函數(shù)                       
  22. {
  23.     uint x,y;
  24.     for(x=n;x>0;x--)
  25.     for(y=112;y>0;y--);
  26. }



  27. void delay_ms(uchar ms)// 毫秒延時(shí)函數(shù)

  28. {       uchar i;
  29.    while(ms--)
  30.      {
  31.         for(i = 0; i< 250; i++)
  32.             {
  33.       _nop_();
  34.       _nop_();
  35.       _nop_();
  36.       _nop_();         //4us延時(shí)
  37.              }
  38.      }

  39. }

  40. void delay_us()                   //10us延時(shí)程序
  41. {
  42.     uchar i;
  43.     i--;
  44.     i--;
  45.     i--;
  46.     i--;
  47.     i--;
  48.     i--;

  49. }               





  50. uchar receive()  // 把電平信息轉(zhuǎn)化為數(shù)據(jù)》》高電平持續(xù)26-28us為1;持續(xù)70us為0

  51. {     uchar i;
  52.       com_data=0;
  53.       for(i=0;i<8;i++)   
  54.     {         respond=1;                                         
  55.               while((!DATA)&&respond++);         //當(dāng)總線變?yōu)楦唠娖綍r(shí),等待30us檢測(cè),若保持則為1;若變?yōu)榈蛣t為0;
  56.                     delay_us();
  57.                     delay_us();
  58.                             delay_us();

  59.                     if(DATA)

  60.                     {temp=1;
  61.                      respond=1;
  62.               while((DATA)&&respond++);

  63.                     }
  64.                     else
  65.                      temp=0;         

  66.                   com_data<<=1;

  67.                  com_data|=temp;          // 將八位二進(jìn)制的數(shù)移位保存在com_data中
  68.       }

  69.           return(com_data);            //返回至函數(shù) receive

  70. }



  71. void read_DATA()                 

  72. {
  73.          DATA=0;

  74.          delay_ms(18);
  75.                                                          
  76.          DATA=1;                   //主機(jī)拉低18ms

  77.          
  78.          delay_us();

  79.          delay_us();

  80.          delay_us();

  81.          delay_us();  //DATA總線由上拉電阻拉高 主機(jī)延時(shí)20us


  82.          DATA=1;

  83.             

  84.          if(!DATA)     //判斷從機(jī)是否有低電平響應(yīng)信號(hào),如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行

  85.          {

  86.                 respond=1;

  87.                

  88.                 while((!DATA)&& respond++);         //判斷從機(jī)發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束

  89.                 respond=1;

  90.                

  91.                 while(DATA && respond++);   //判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)

  92.                

  93.                 RH_temp = receive();

  94.                 RL_temp = receive();

  95.                 TH_temp = receive();

  96.                 TL_temp = receive();

  97.                 check = receive();     //數(shù)據(jù)接收狀態(tài)

  98.                 DATA=1;     

  99.                  

  100.                 untemp=(RH_temp+RL_temp+TH_temp+TL_temp);  

  101.                 if(untemp==check)           //數(shù)據(jù)校驗(yàn)

  102.                 {

  103.                          RH_data = RH_temp;

  104.                          RL_data = RL_temp;

  105.                          TH_data = TH_temp;

  106.                          TL_data = TL_temp;

  107.                 }

  108.         }

  109.         //濕度部分

  110.          str1[0] = RH_data/10;

  111.          str1[1] = RH_data%10;

  112.          //溫度部分

  113.          str2[0] =TH_data/10;

  114.          str2[1] =TH_data%10;


  115. }         


  116. void lcd_com(uchar com)     //命令函數(shù)      
  117. {
  118.     rs=0;                //選擇指令寄存器
  119.     P2=com;            //把命令字送入P0
  120.     delay(5);         //延時(shí)一小會(huì)兒,讓1602準(zhǔn)備接收數(shù)據(jù)
  121.     en=1;
  122.         delay(5);           //使能線電平變化,命令送入1602的8位數(shù)據(jù)口,這點(diǎn)非常重要
  123.     en=0;
  124. }


  125. void lcd_dat(uchar dat)    //數(shù)據(jù)函數(shù)   
  126. {
  127.     rs=1;             //選擇數(shù)據(jù)寄存器
  128.     P2=dat;         //把要顯示的數(shù)據(jù)送入P0
  129.     delay(5);      //延時(shí)一小會(huì)兒,讓1602準(zhǔn)備接收數(shù)據(jù),也就是檢測(cè)忙信號(hào),這點(diǎn)非常重要。
  130.     en=1;         //使能線電平變化,數(shù)據(jù)送入1602的8位數(shù)據(jù)口
  131.     en=0;
  132.   }


  133. void lcd_init()         //1602液晶初始化函數(shù)   
  134. {
  135.     lcd_com(0x38);       //8位數(shù)據(jù),雙列,5*7字形  ,用到功能設(shè)定指令   
  136.     lcd_com(0x0c);      //開(kāi)啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍,用到顯示開(kāi)關(guān)控制指令
  137.     lcd_com(0x06);     //顯示地址遞增,即寫一個(gè)數(shù)據(jù)后,顯示位置右移一位,用到了寫入模式設(shè)置指令
  138.     lcd_com(0x01);    //清屏,用到了清屏指令
  139. }


  140. void lcd_xianshi()       //液晶顯示函數(shù)      
  141. {
  142.             uint i;
  143.        lcd_com(0x80);
  144.         for(i=0;i<10;i++)
  145.                   lcd_dat(xianshi[i]);

  146.                   
  147.       
  148.         lcd_com(0x80+0x0e);//單位是厘米//
  149.         for(i;i<14;i++)
  150.                  lcd_dat(xianshi[i]);
  151. }





  152. void measuring()   //距離測(cè)量函數(shù)
  153. {
  154.      float time;
  155.          time=TH0*256+TL0;//把計(jì)時(shí)器的的值讀取到time
  156.          time*=12/11.0592;
  157.          distance=time *0.016 ;

  158.          
  159. }


  160. void display(uint x)        //        測(cè)量結(jié)果顯示函數(shù)
  161. {
  162.         uint bai,shi,ge;
  163.         bai=x/100;
  164.         shi=(x/10%10);         //或shi=x%100/10
  165.         ge=(x%10);
  166.                
  167.         
  168.         lcd_com(0x80+0x09);
  169.         lcd_dat(table[bai]);
  170.         lcd_dat(table[shi]);
  171.         lcd_dat(table[ge]);
  172.         
  173.       
  174.                 TL0=0;
  175.         TH0=0;
  176. }

  177. void main()           
  178. {   

  179.    

  180.      lcd_init();          //液晶初始化      
  181.      TMOD=0x01;        
  182.      TL0=0;
  183.      TH0=0;
  184.      EA=1;                 //定時(shí)器初始化  
  185.      trig=0;
  186.      echo=1;

  187.          
  188.       while(1)
  189.         {

  190.                  
  191.                 lcd_xianshi();   //液晶顯示特定字符        
  192.                 trig=1;
  193.                 delay(50);
  194.                 trig=0;
  195.             
  196.                 while(!echo);                 
  197.                  TR0=1;                     //echo為高電平時(shí)打開(kāi)計(jì)時(shí)器
  198.                 while(echo);
  199.                 TR0=0;                           //echo為低電平時(shí)關(guān)閉計(jì)時(shí)器
  200.         
  201.          measuring() ;
  202.                 display(distance);
  203.                   
  204.                 display2();
  205.                 delay_ms(60) ;

  206.               
  207.         }
  208.                  
  209. }



  210. void display2()

  211. {
  212.                 read_DATA();
  213.         lcd_com(0x80+0x40);
  214.         lcd_dat(table[str1[0]]);
  215.         lcd_dat(table[str1[1]]);
  216.                 lcd_com(0x80+0x49);
  217.         lcd_dat(table[str2[0]]);
  218.                 lcd_dat(table[str2[1]]);



  219. }
復(fù)制代碼
0.png

所有資料51hei提供下載:
超聲波測(cè)距與溫濕度模塊 1602液晶仿真.zip (86.46 KB, 下載次數(shù): 214)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:495323 發(fā)表于 2019-10-14 11:27 來(lái)自手機(jī) | 顯示全部樓層
加油,
回復(fù)

使用道具 舉報(bào)

ID:62865 發(fā)表于 2019-10-14 14:41 | 顯示全部樓層
注釋從keil復(fù)制過(guò)來(lái)的,變成了問(wèn)號(hào),,,->設(shè)置KEIL的字體為簡(jiǎn)體中文就可以了
回復(fù)

使用道具 舉報(bào)

ID:484435 發(fā)表于 2019-10-16 15:16 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:648485 發(fā)表于 2019-11-24 17:38 | 顯示全部樓層
為什么仿真圖中用的是AT89C51,而程序中定義的卻是reg52.h呢?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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