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

QQ登錄

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

搜索
查看: 12221|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)控制溫濕度傳感器DHt11程序錯(cuò)誤 求幫助

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:274459 發(fā)表于 2018-1-10 18:31 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)源程序如下:
  1. //51單片機(jī)控制溫濕度傳感器DHT11 然后在LCD1602上顯示當(dāng)前的溫濕度及單位 其中濕度在第一行顯示 溫度在第二行顯示。單片機(jī)為YL-9最小系統(tǒng)。
  2. # include <reg51.h>
  3. # include <intrins.h>
  4. typedef unsigned char BYTE;
  5. typedef unsigned int WORD;
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. sbit io=P1^0;//dht11data端接單片機(jī)的P1^0口//
  9. sbit rw=P2^1;//一下三行是設(shè)置lcd1602的使能端//
  10. sbit rs=P2^0;
  11. sbit ep=P2^2;
  12. typedef bit BOOL;//此聲明一個(gè)布爾型變量即真或假//
  13. uchar data_byte;
  14. uchar RH,RL,TH,TL;
  15. //***************延時(shí)函數(shù)*************************************
  16. void delay(uchar ms) //延時(shí)模塊//
  17. {
  18.   uchar i;
  19.   while(ms--)               
  20.       
  21. for(i=0;i<100;i++);
  22. }
  23. void delay1()//一個(gè)for循環(huán)大概需要8個(gè)多機(jī)器周期 一個(gè)機(jī)器周期為1us 晶振為12MHz  也就是說(shuō)本函數(shù)延時(shí)8us多 此延時(shí)函數(shù)必須德稍微精確一點(diǎn)
  24. {
  25.   uchar i;
  26.   for(i=0;i<1;i++);
  27. }

  28. //***************************************************************
  29. //lcd模塊//
  30. BOOL lcd_bz()//測(cè)試lcd忙碌狀態(tài) 返回值為布爾型數(shù)值 真或假 '1'.'0'  
  31. ~ 1 / 5 ~
  32. {
  33. BOOL result;
  34.   rs=0;          // 讀忙信號(hào)
  35.   rw=1;
  36.   ep=1;
  37. _nop_();
  38.   _nop_();
  39.   _nop_();
  40.   _nop_();
  41.   result = (BOOL)(P2&0x80);
  42.   ep=0;
  43.   result ;
  44. }   
  45. void write_cmd(uchar cmd)//寫(xiě)指令//
  46. {
  47.   while (lcd_bz());
  48.   rs=0;
  49.   rw=0;
  50.   ep=0;
  51.   _nop_();
  52.   _nop_();
  53.   P0=cmd ;
  54.   _nop_();
  55.   _nop_();
  56.   _nop_();
  57.   _nop_();
  58.   ep=1;
  59.   _nop_();
  60.   _nop_();
  61.   _nop_();
  62.   _nop_();
  63.   ep=0;
  64. }
  65. void write_addr(uchar addr)//寫(xiě)地址//
  66. {
  67.   write_cmd(addr|0x80);//LCD第一行的首地址為0x80 第二行的首地址為0x80+0x40=0xc0
  68. }
  69. void write_byte(uchar dat) //寫(xiě)字節(jié)//
  70. {
  71.   while (lcd_bz());
  72.   rs=1;
  73.   rw=0;
  74.   ep=0;
  75.   _nop_();
  76.   _nop_();
  77.   P0=dat ;
  78.   _nop_();
  79.   _nop_();
  80.   _nop_();
  81.   _nop_();
  82.   ep=1;
  83.   _nop_();
  84.   _nop_();
  85.   _nop_();
  86.   _nop_();
  87.   ep=0;
  88. }
  89. void lcd_init() //lcd初始化//
  90. {
  91.   write_cmd(0x38);//設(shè)置LCD兩行顯示 一個(gè)數(shù)據(jù)由5*7點(diǎn)陣表示,數(shù)據(jù)由8跟線傳輸
  92.   delay(1);
  93.   write_cmd(0x0c);//清除屏幕顯示
  94.   delay(1);
  95.   write_cmd(0x06);//設(shè)定輸入方式 增量不移位
  96. ~ 2 / 5 ~
  97.   delay(1);
  98.   write_cmd(0x01);//開(kāi)整體顯示 關(guān)光標(biāo) 不閃爍
  99.   delay(1);
  100. }
  101. void display(uchar addr,uchar q)//在某一地址上顯示內(nèi)容 adder表示的是地址偏移量 q表示顯示的字符或數(shù)字//
  102. {
  103.   delay(10);  write_addr(addr);
  104.   write_byte(q);
  105.   delay(1);//修改此時(shí)間 可以改變LCD上數(shù)值跳變的數(shù)度
  106. }
  107. //**************************dht11測(cè)試某塊*************************************//
  108. void start()//開(kāi)始信號(hào)
  109. {
  110.   io=1;
  111.   delay1();
  112.   io=0;
  113.   delay(25);// 主機(jī)把總線拉低必須大于18ms 保證DHT11能檢測(cè)到起始信號(hào)
  114.   io=1;    //發(fā)送開(kāi)始信號(hào)結(jié)束后 拉高電平延時(shí)20-40us
  115.   delay1();//以下三個(gè)延時(shí)函數(shù)差不多為24us 符合要求
  116.   delay1();
  117.   delay1();
  118. }
  119. uchar receive_byte()//接收一個(gè)字節(jié)//
  120. {
  121.   uchar i,temp;
  122.   for(i=0;i<8;i++)//接收8bit的數(shù)據(jù)
  123.   {
  124.     while(!io);//等待50us的低電平開(kāi)始信號(hào)結(jié)束
  125.     delay1();//開(kāi)始信號(hào)結(jié)束之后 延時(shí)26us-28us 以下三個(gè)延時(shí)函數(shù)
  126.     delay1();
  127.     delay1();
  128.     temp=0;//時(shí)間為26us-28us 表示接收的為數(shù)據(jù)'0'
  129.     if(io==1)
  130.     temp=1; //如果26us-28us之后 還為高電平 則表示接收的數(shù)據(jù)為'1'
  131.     while(io);//等待數(shù)據(jù)信號(hào)高電平 '0'為26us-28us '1'為70us
  132. ~ 3 / 5 ~
  133.     data_byte<<=1;//接收的數(shù)據(jù)為高位在前 右移
  134.     data_byte|=temp;
  135.   }
  136.   return data_byte;
  137. }
  138.    
  139. void receive()//接收數(shù)據(jù)//
  140. {
  141.   uchar T_H,T_L,R_H,R_L,check,num_check,i;
  142.   start();//開(kāi)始信號(hào)//
  143.   io=1;  //主機(jī)設(shè)為輸入 判斷從機(jī) DHT11 響應(yīng)信號(hào)
  144.   if(!io)//判斷從機(jī)是否有低電平響應(yīng)信號(hào)//
  145.   {
  146.     while(!io);//判斷從機(jī)發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束//
  147.     while(io);//判斷從機(jī)發(fā)出 80us 的高電平是否結(jié)束 如結(jié)束則主機(jī)進(jìn)入數(shù)據(jù)接收狀態(tài)
  148.     R_H=receive_byte();//濕度高位
  149.     R_L=receive_byte();//濕度低位
  150.     T_H=receive_byte();//溫度高位
  151.     T_L=receive_byte();//溫度低位
  152.     check=receive_byte();//校驗(yàn)位
  153.     io=0; //當(dāng)最后一bit數(shù)據(jù)接完畢后 從機(jī)拉低電平50us//
  154.     for(i=0;i<7;i++)//差不多50us的延時(shí)
  155.     delay1();
  156.     io=1;//總線由上拉電阻拉高 進(jìn)入空閑狀態(tài)
  157.     num_check=R_H+R_L+T_H+T_L;
  158.     if(num_check==check)//判斷讀到的四個(gè)數(shù)據(jù)之和是否與校驗(yàn)位相同
  159.     {
  160.   RH=R_H;
  161.   RL=R_L;
  162.   TH=T_H;
  163.   TL=T_L;
  164.   check=num_check;
  165.     }
  166.   }
  167. }
  168. //*****************************************************************************
  169. void main()//主函數(shù)模塊//
  170. {
  171. ~ 4 / 5 ~
  172.   lcd_init();//初始化LCD
  173.   while(1)
  174.   {
  175.     receive();//接收數(shù)據(jù)
  176. display(0x00,'R');//LCD的第一行顯示
  177. display(0x01,':');
  178. display(0x02,RH/10+0x30); //0x30表示 帶字庫(kù)的LCD1602中0x30的位置放有數(shù)字0 RH/10+0x30即表示濕度的十位數(shù)字在字庫(kù)RH/10+0x30的位置處放著
  179. display(0x03,RH%10+0x30);
  180. display(0X04,'%');
  181. display(0x40,'T');//LCD的第二行顯示
  182. display(0x41,':');
  183. display(0x42,TH/10+0x30);
  184. display(0x43,TH%10+0x30);
  185. display(0x44,0xdf);//以下兩個(gè)是溫度單位的處理
  186. display(0x45,0x43);
  187.   }
  188. }
復(fù)制代碼

以上代碼51hei提供下載:
51單片機(jī)控制溫濕度傳感器DH.doc (24.5 KB, 下載次數(shù): 102)


評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
spirit小杰 + 5 能不能私發(fā)完整的代碼給我,急需 謝謝

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:260698 發(fā)表于 2018-10-11 00:52 | 只看該作者
樓主自己都沒(méi)把程序弄明白!
回復(fù)

使用道具 舉報(bào)

板凳
ID:808911 發(fā)表于 2020-7-28 18:36 | 只看該作者
是程序有問(wèn)題還是什么,為什么不能生產(chǎn)hex文件
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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