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

QQ登錄

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

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

單片機(jī)DHT11溫濕度+1602液晶顯示程序

  [復(fù)制鏈接]
ID:434090 發(fā)表于 2019-3-23 18:57 | 顯示全部樓層 |閱讀模式
微信圖片_20190323184104.jpg

DHT11驅(qū)動(dòng)程序參考
http://www.torrancerestoration.com/bbs/dpj-112282-1.html
http://www.torrancerestoration.com/bbs/dpj-38067-1.html

1602驅(qū)動(dòng)程序參考
http://www.torrancerestoration.com/bbs/dpj-24671-1.html
  1. /*********************************************************************************************
  2. 程序名:    DHT11-1602
  3. 編寫人:    fby
  4. 編寫時(shí)間:  2019年3月21日
  5. 硬件支持:  STC89C52RC  DHT11  LCD1602
  6. 接口說(shuō)明:  DHT11:VCC DATA NC GND
  7. *********************************************************************************************
  8. 說(shuō)明:1、單片機(jī)是STC89C52RC,晶振頻率11.0592MHz,實(shí)驗(yàn)成功。
  9.           2、好東西要共享,大家隨意折騰~~
  10. *********************************************************************************************/
  11. #include<reg51.h>
  12. #include<intrins.h>

  13. #define uchar unsigned char        //無(wú)符號(hào)字符型類型數(shù)據(jù)
  14. #define uint unsigned int //無(wú)符號(hào)整型數(shù)據(jù)
  15. #define IODATA  P0

  16. uchar dat_r[4];          //用于存放從DHT11讀取到的數(shù)值

  17. sbit DATA=P2^2;   //定義數(shù)據(jù)線
  18. sbit RS=P1^0; //定義rs端口
  19. sbit RW=P1^1; //定義rw端口
  20. sbit E=P2^5; //定義en端口


  21. /*********************************************************************************************
  22. 函數(shù)名:延時(shí)函數(shù)
  23. 調(diào)  用:Delay30us();/Delay20ms();/Delay1s();
  24. 參  數(shù):無(wú)
  25. 返回值:無(wú)
  26. 結(jié)  果:延時(shí)相應(yīng)時(shí)間
  27. 備  注:振蕩晶體為11.0592MHz(所有延時(shí)函數(shù)Copy自STC-ISP(v6.85).exe)
  28. **********************************************************************************************/
  29. void Delay30us()                //@11.0592MHz-40
  30. {
  31.         unsigned char i;

  32.         i = 11;
  33.         while (--i);
  34. }


  35. void Delay20ms()                //@11.0592MHz
  36. {
  37.         unsigned char i, j;

  38.         i = 36;
  39.         j = 217;
  40.         do
  41.         {
  42.                 while (--j);
  43.         } while (--i);
  44. }


  45. void Delay1s()                //@11.0592MHz
  46. {
  47.         unsigned char i, j, k;

  48.         _nop_();
  49.         i = 8;
  50.         j = 1;
  51.         k = 243;
  52.         do
  53.         {
  54.                 do
  55.                 {
  56.                         while (--k);
  57.                 } while (--j);
  58.         } while (--i);
  59. }


  60. /*********************************************************************************************
  61. 函數(shù)名:DHT11啟動(dòng)函數(shù)
  62. 調(diào)  用:無(wú)
  63. 參  數(shù):無(wú)
  64. 返回值:無(wú)
  65. 結(jié)  果:DHT11開(kāi)始工作
  66. 備  注:
  67. **********************************************************************************************/
  68. void DHT11_start()                 // 主機(jī)控制DHT11開(kāi)始工作
  69. {
  70.    DATA=1;                                 // 主線空閑狀態(tài)
  71.    _nop_();
  72.    _nop_();
  73.    DATA=0;                                 // 主機(jī)發(fā)送開(kāi)始工作信號(hào)
  74.    Delay20ms();   //延時(shí)18ms以上
  75.    DATA=1;                                 // 拉高并延時(shí)等待DHT11響應(yīng)
  76.    Delay30us();
  77. }
  78. /*********************************************************************************************
  79. 函數(shù)名:DHT11讀數(shù)據(jù)函數(shù)
  80. 調(diào)  用:? = DHT11_rec_byte();
  81. 參  數(shù):無(wú)
  82. 返回值:
  83. 結(jié)  果:讀DHT11數(shù)據(jù)并保存到dat
  84. 備  注:
  85. **********************************************************************************************/

  86. uchar DHT11_rec_byte()      //接收一個(gè)字節(jié)
  87. {
  88.    uchar i,dat=0;
  89.   for(i=0;i<8;i++)    //從高到低依次接收8位數(shù)據(jù)
  90.    {         
  91.       while(!DATA);   ////等待50us低電平過(guò)去
  92.       Delay30us();
  93.           Delay30us();     //延時(shí)60us,如果還為高則數(shù)據(jù)為1,否則為0
  94.       dat<<=1;           //左移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時(shí)直接移位
  95.       if(DATA==1)    //數(shù)據(jù)為1時(shí),使dat加1來(lái)接收數(shù)據(jù)1
  96.          dat+=1;
  97.       while(DATA);  //等待數(shù)據(jù)線拉低   
  98.     }  
  99.     return dat;
  100. }

  101. /*********************************************************************************************
  102. 函數(shù)名:接收DHT11的40位的數(shù)據(jù)并校驗(yàn)
  103. 調(diào)  用:? = DHT11_receive();
  104. 參  數(shù):無(wú)
  105. 返回值:無(wú)
  106. 結(jié)  果:結(jié)果保存到dat_r[i]中
  107. 備  注:
  108. **********************************************************************************************/
  109. void DHT11_receive()      //接收40位的數(shù)據(jù)
  110. {
  111.     uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
  112.     DHT11_start();                 // 主機(jī)控制DHT11開(kāi)始工作
  113.     if(DATA==0)
  114.     {
  115.         while(DATA==0);   //等待拉高     
  116.         Delay30us();
  117.                 Delay30us();
  118.                 Delay30us();  //拉高后延時(shí)80us
  119.         R_H=DHT11_rec_byte();    //接收濕度高八位  
  120.         R_L=DHT11_rec_byte();    //接收濕度低八位  
  121.         T_H=DHT11_rec_byte();    //接收溫度高八位  
  122.         T_L=DHT11_rec_byte();    //接收溫度低八位
  123.         revise=DHT11_rec_byte(); //接收校正位

  124.         Delay30us();    //結(jié)束

  125.         if((R_H+R_L+T_H+T_L)==revise)      //校正
  126.         {
  127.             RH=R_H;
  128.             RL=R_L;
  129.             TH=T_H;
  130.             TL=T_L;
  131.         }
  132.         /*數(shù)據(jù)處理,方便顯示*/
  133.         dat_r[0]='0'+(RH/10);
  134.         dat_r[1]='0'+(RH%10);
  135.         dat_r[2]='0'+(TH/10);
  136.         dat_r[3]='0'+(TH%10);
  137.     }
  138. }

  139. /********************************************************************
  140. * 名稱 : bit Busy(void)
  141. * 功能 : 這個(gè)是一個(gè)讀狀態(tài)函數(shù),讀出函數(shù)是否處在忙狀態(tài)
  142. * 輸入 : 輸入的命令值
  143. * 輸出 : 無(wú)
  144. ***********************************************************************/
  145. void Busy(void)
  146. {
  147. bit busy_flag = 1;
  148. IODATA  = 0xff;
  149. RS = 0;          //指令關(guān)
  150. Delay30us();
  151. RW = 1;          //讀狀態(tài)
  152. Delay30us();
  153. E = 1;        //使能高電平
  154. while(1)
  155. {
  156. busy_flag = (bit)(IODATA  & 0x80); //強(qiáng)制取最高位
  157. if(busy_flag == 0)
  158. {
  159. break;
  160. }
  161. }
  162. E = 0;           //E 1->0,rs=0,rw=1,
  163.            //將數(shù)據(jù)寄存器內(nèi)的數(shù)據(jù)讀到DB0~DB7,分別將狀態(tài)標(biāo)志BF和地址計(jì)數(shù)器(AC)內(nèi)容讀到DB7和DB6~DB0。

  164. }

  165. /********************************************************************
  166. * 名稱 : lcd1602_write_cmd(uchar del)
  167. * 功能 : 1602命令函數(shù)
  168. * 輸入 : 輸入的命令值
  169. * 輸出 : 無(wú)
  170. ***********************************************************************/
  171. void lcd1602_write_cmd(uchar del)
  172. {
  173. RS = 0;
  174. Delay30us();
  175. RW = 0;
  176. Delay30us();
  177. E = 0;
  178. Delay30us();
  179. IODATA  = del;
  180. Delay30us();
  181. E = 1;
  182. Delay30us();
  183. E = 0;                        //E 1->0,rs=0,rw=0, 將指令代碼寫入指令寄存器中
  184. }

  185. /********************************************************************
  186. * 名稱 : lcd1602_write_data(uchar del)
  187. * 功能 : 1602寫數(shù)據(jù)函數(shù)
  188. * 輸入 : 需要寫入1602的數(shù)據(jù)
  189. * 輸出 : 無(wú)
  190. ***********************************************************************/

  191. void lcd1602_write_data(uchar del)
  192. {
  193. Busy();      
  194. Delay30us();
  195. RS = 1;
  196. Delay30us();
  197. RW = 0;
  198. Delay30us();
  199. E = 0;
  200. Delay30us();
  201. IODATA  = del;
  202. Delay30us();
  203. E = 1;
  204. Delay30us();
  205. E = 0;                          //E 1->0,rs=1,rw=0, 數(shù)據(jù)寫入數(shù)據(jù)寄存器中
  206. }

  207. /********************************************************************
  208. * 名稱 : lcd1602_init()
  209. * 功能 : 1602初始化,請(qǐng)參考1602的資料
  210. * 輸入 : 無(wú)
  211. * 輸出 : 無(wú)
  212. ***********************************************************************/
  213. void lcd1602_init(void)
  214. {
  215. Delay20ms();
  216. lcd1602_write_cmd(0x38);         //8位數(shù)據(jù),雙列,5*7字形
  217. Delay20ms();
  218. lcd1602_write_cmd(0x38);
  219. Delay20ms();
  220. lcd1602_write_cmd(0x38);
  221. Busy();
  222. lcd1602_write_cmd(0x08);// 只開(kāi)顯示
  223. Busy();   
  224. lcd1602_write_cmd(0x01);        //清屏
  225. Busy();
  226. lcd1602_write_cmd(0x06);//顯示地址遞增,即寫一個(gè)數(shù)據(jù)后,顯示位置右移一位
  227. Busy();
  228. lcd1602_write_cmd(0x0c);        //開(kāi)啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍
  229. }

  230. /********************************************************************
  231. * 名稱 : lcd1602_char(uchar hang,uchar lie,char sign)
  232. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符顯示"b" ,調(diào)用該函數(shù)如下
  233. L1602_char(1,5,'b')
  234. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  235. * 輸出 : 無(wú)
  236. ***********************************************************************/
  237. void lcd1602_char(uchar hang,uchar lie,char sign)
  238. {
  239. uchar a;
  240. if(hang == 1)
  241. {
  242. a = 0x80;
  243. }
  244. if(hang == 2)
  245. {
  246. a = 0xc0;
  247. }
  248. a = a + lie - 1;
  249. Busy();
  250. lcd1602_write_cmd(a);  //置數(shù)據(jù)存貯器地址
  251. Busy();
  252. lcd1602_write_data(sign);
  253. }

  254. /********************************************************************
  255. * 名稱 : lcd1602_string(uchar hang,uchar lie,uchar *p)
  256. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符開(kāi)始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
  257. L1602_string(1,5,"ab cd ef;")
  258. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  259. * 輸出 : 無(wú)
  260. ***********************************************************************/
  261. void lcd1602_string(uchar hang,uchar lie,uchar *p)
  262. {
  263. uchar a;
  264. if(hang == 1)
  265. {
  266. a = 0x80;
  267. }
  268. if(hang == 2)
  269. {
  270. a = 0xc0;
  271. }
  272. a = a + lie - 1;
  273. while(1)
  274. {
  275. Busy();
  276. lcd1602_write_cmd(a);
  277. Busy();
  278. lcd1602_write_data(*p);
  279. a++;
  280. p++;   
  281. if((*p == '\0')||(a==0x90)||(a==0xd0)) //字符結(jié)束或每行最后一個(gè)字符
  282. {
  283. break;
  284. }
  285. }
  286. }

  287. /*********************************************************************************************
  288. 函數(shù)名:主函數(shù)
  289. 調(diào)  用:無(wú)
  290. 參  數(shù):無(wú)
  291. 返回值:無(wú)
  292. 結(jié)  果:讀DHT11數(shù)據(jù)并送到1602顯示
  293. 備  注:
  294. **********************************************************************************************/
  295. void main (void)
  296. {
  297.         
  298.         Delay20ms();
  299.         lcd1602_init();                //LCD初始化
  300.         while(1)
  301.         {
  302.                 Delay1s();                //經(jīng)測(cè)試,兩次連讀要至少延時(shí)80ms        
  303.                 DHT11_receive();//接受數(shù)據(jù)
  304.                 lcd1602_string(1,1,"SHIDU:");
  305.                 lcd1602_string(2,1,"WENDU:");
  306.                 lcd1602_char(1,7,dat_r[0]);
  307.                 lcd1602_char(1,8,dat_r[1]);
  308.                 lcd1602_char(2,7,dat_r[2]);
  309.                 lcd1602_char(2,8,dat_r[3]);
  310.                 lcd1602_string(1,9,"%");
  311.                 lcd1602_char(2,9,0XDF);
  312.                 lcd1602_string(2,10,"C");
  313.                
  314.         }
  315. }
復(fù)制代碼

全部資料51hei下載地址:
DHT11-1602.rar (40.01 KB, 下載次數(shù): 594)

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:404454 發(fā)表于 2019-3-24 08:27 | 顯示全部樓層
支持,但顯示太復(fù)雜了,符號(hào)數(shù)字一目了然。
回復(fù)

使用道具 舉報(bào)

ID:483579 發(fā)表于 2019-4-7 13:23 來(lái)自手機(jī) | 顯示全部樓層
hu2018y 發(fā)表于 2019-3-24 08:27
支持,但顯示太復(fù)雜了,符號(hào)數(shù)字一目了然。

可以再普中的板子上實(shí)驗(yàn)嘛?
回復(fù)

使用道具 舉報(bào)

ID:503160 發(fā)表于 2019-4-11 09:27 | 顯示全部樓層
請(qǐng)問(wèn)有PROTEUS仿真圖嗎
回復(fù)

使用道具 舉報(bào)

ID:509459 發(fā)表于 2019-4-11 10:58 | 顯示全部樓層
學(xué)習(xí)學(xué)習(xí)                                             
回復(fù)

使用道具 舉報(bào)

ID:403562 發(fā)表于 2019-4-11 17:26 | 顯示全部樓層
寧小小 發(fā)表于 2019-4-7 13:23
可以再普中的板子上實(shí)驗(yàn)嘛?

不行,我試了
回復(fù)

使用道具 舉報(bào)

ID:514728 發(fā)表于 2019-4-24 13:14 | 顯示全部樓層
不錯(cuò)啊
學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:501681 發(fā)表于 2019-4-29 13:37 | 顯示全部樓層
寧小小 發(fā)表于 2019-4-7 13:23
可以再普中的板子上實(shí)驗(yàn)嘛?

我試了好像不顯示
回復(fù)

使用道具 舉報(bào)

ID:576600 發(fā)表于 2019-7-25 20:26 | 顯示全部樓層
非常感謝,下載一次點(diǎn)亮,溫濕度顯示正常。
回復(fù)

使用道具 舉報(bào)

ID:576600 發(fā)表于 2019-7-25 20:26 | 顯示全部樓層
寧小小 發(fā)表于 2019-4-7 13:23
可以再普中的板子上實(shí)驗(yàn)嘛?

可以的,我試了,顯示正常。
回復(fù)

使用道具 舉報(bào)

ID:589811 發(fā)表于 2019-7-28 11:22 | 顯示全部樓層
寧小小 發(fā)表于 2019-4-7 13:23
可以再普中的板子上實(shí)驗(yàn)嘛?

可以的,重新定義一下引腳就可以
回復(fù)

使用道具 舉報(bào)

ID:599167 發(fā)表于 2019-8-11 17:36 | 顯示全部樓層
正好找這個(gè),居然還真的有
回復(fù)

使用道具 舉報(bào)

ID:664479 發(fā)表于 2019-12-15 18:03 | 顯示全部樓層
為什么我的液晶顯示屏(就復(fù)制了這個(gè)程序)顯示不了啊   用的溫濕度模塊兒也都是一樣的  但是就是沒(méi)有數(shù)據(jù)
回復(fù)

使用道具 舉報(bào)

ID:654535 發(fā)表于 2019-12-19 11:05 | 顯示全部樓層
我在protus實(shí)現(xiàn)你的程序?yàn)槭裁磳?shí)現(xiàn)不了啊,lm0161黑頻
回復(fù)

使用道具 舉報(bào)

ID:341833 發(fā)表于 2020-1-19 23:54 | 顯示全部樓層
顯示不了呀
回復(fù)

使用道具 舉報(bào)

ID:687485 發(fā)表于 2020-1-20 08:49 | 顯示全部樓層
想下載學(xué)習(xí)一下。
回復(fù)

使用道具 舉報(bào)

ID:745988 發(fā)表于 2020-5-7 20:04 | 顯示全部樓層
老哥,我用你的程序,咋1062屏上還是啥都不顯示。
回復(fù)

使用道具 舉報(bào)

ID:745988 發(fā)表于 2020-5-7 20:14 | 顯示全部樓層
我的那個(gè)數(shù)值咋顯示不清楚呢
回復(fù)

使用道具 舉報(bào)

ID:757900 發(fā)表于 2020-6-15 20:40 來(lái)自手機(jī) | 顯示全部樓層
不錯(cuò)謝謝分享 有你更精彩
回復(fù)

使用道具 舉報(bào)

ID:780711 發(fā)表于 2020-6-16 14:19 | 顯示全部樓層
請(qǐng)問(wèn)為什么在proteus上面仿真沒(méi)有顯示
回復(fù)

使用道具 舉報(bào)

ID:803001 發(fā)表于 2020-8-4 10:29 | 顯示全部樓層
lqqqqqqqq 發(fā)表于 2020-6-16 14:19
請(qǐng)問(wèn)為什么在proteus上面仿真沒(méi)有顯示

我也是
回復(fù)

使用道具 舉報(bào)

ID:981034 發(fā)表于 2021-11-16 08:23 | 顯示全部樓層
謝謝,有注釋
回復(fù)

使用道具 舉報(bào)

ID:1047453 發(fā)表于 2022-10-12 17:43 | 顯示全部樓層

把那個(gè)data rs rw 還有e的引腳改一下就可以了
回復(fù)

使用道具 舉報(bào)

ID:1013894 發(fā)表于 2022-12-5 20:08 | 顯示全部樓層
前排過(guò)來(lái)學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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