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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

  [復制鏈接]
跳轉到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)



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


注釋從keil復制過來的,不知為何變成了問號

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


  12. uchar str1[2];         //存儲濕度數組
  13. uchar str2[2];          //存儲溫度數組
  14. sbit DATA = P3^7;//溫濕度傳感器DHT11數據接入端
  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)   //延時函數                       
  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)// 毫秒延時函數

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

  39. }

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

  49. }               





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

  51. {     uchar i;
  52.       com_data=0;
  53.       for(i=0;i<8;i++)   
  54.     {         respond=1;                                         
  55.               while((!DATA)&&respond++);         //當總線變為高電平時,等待30us檢測,若保持則為1;若變為低則為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;          // 將八位二進制的數移位保存在com_data中
  68.       }

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

  70. }



  71. void read_DATA()                 

  72. {
  73.          DATA=0;

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

  77.          
  78.          delay_us();

  79.          delay_us();

  80.          delay_us();

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


  82.          DATA=1;

  83.             

  84.          if(!DATA)     //判斷從機是否有低電平響應信號,如不響應則跳出,響應則向下運行

  85.          {

  86.                 respond=1;

  87.                

  88.                 while((!DATA)&& respond++);         //判斷從機發出 80us 的低電平響應信號是否結束

  89.                 respond=1;

  90.                

  91.                 while(DATA && respond++);   //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態

  92.                

  93.                 RH_temp = receive();

  94.                 RL_temp = receive();

  95.                 TH_temp = receive();

  96.                 TL_temp = receive();

  97.                 check = receive();     //數據接收狀態

  98.                 DATA=1;     

  99.                  

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

  101.                 if(untemp==check)           //數據校驗

  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)     //命令函數      
  117. {
  118.     rs=0;                //選擇指令寄存器
  119.     P2=com;            //把命令字送入P0
  120.     delay(5);         //延時一小會兒,讓1602準備接收數據
  121.     en=1;
  122.         delay(5);           //使能線電平變化,命令送入1602的8位數據口,這點非常重要
  123.     en=0;
  124. }


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


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


  140. void lcd_xianshi()       //液晶顯示函數      
  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()   //距離測量函數
  153. {
  154.      float time;
  155.          time=TH0*256+TL0;//把計時器的的值讀取到time
  156.          time*=12/11.0592;
  157.          distance=time *0.016 ;

  158.          
  159. }


  160. void display(uint x)        //        測量結果顯示函數
  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;                 //定時器初始化  
  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為高電平時打開計時器
  198.                 while(echo);
  199.                 TR0=0;                           //echo為低電平時關閉計時器
  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. }
復制代碼


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


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:495323 發表于 2019-10-14 11:27 來自手機 | 只看該作者
加油,
回復

使用道具 舉報

板凳
ID:62865 發表于 2019-10-14 14:41 | 只看該作者
注釋從keil復制過來的,變成了問號,,,->設置KEIL的字體為簡體中文就可以了
回復

使用道具 舉報

地板
ID:484435 發表于 2019-10-16 15:16 | 只看該作者
謝謝分享
回復

使用道具 舉報

5#
ID:648485 發表于 2019-11-24 17:38 | 只看該作者
為什么仿真圖中用的是AT89C51,而程序中定義的卻是reg52.h呢?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区在线观看免费视频 | 免费一区二区三区 | 亚洲一区二区三区桃乃木香奈 | 久久国产欧美日韩精品 | 亚洲视频自拍 | 亚洲午夜av久久乱码 | 久久精品1| 欧美一区在线视频 | 国产99视频精品免费视频7 | 精品成人av| 国产在线观看一区二区 | 国产在线精品一区二区三区 | 日韩电影一区二区三区 | 91九色麻豆 | 日韩中文字幕在线观看 | 91久久久精品国产一区二区蜜臀 | 国产女人与拘做受免费视频 | 国产美女特级嫩嫩嫩bbb片 | 国产91在线视频 | 国产精品资源在线 | 亚州av | 美女福利网站 | 亚洲一区二区三区在线 | 国内精品视频在线观看 | 亚洲精品在线视频 | 亚洲精品中文字幕在线观看 | 视频一区 国产精品 | 亚洲三区在线 | 人人玩人人干 | 日韩精品免费 | av天天操| 亚洲精品日韩一区二区电影 | 午夜影视| 免费一级淫片aaa片毛片a级 | 欧美激情视频一区二区三区在线播放 | 成人精品视频在线观看 | 九九精品在线 | 精品国产乱码久久久久久蜜柚 | 国产精品久久久久久高潮 | 欧美精品一区二区在线观看 | 91精品国产乱码久久久久久久 |