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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機DHT11溫濕度+1602液晶顯示程序

  [復制鏈接]
跳轉到指定樓層
樓主


DHT11驅動程序參考
http://www.zg4o1577.cn/bbs/dpj-112282-1.html
http://www.zg4o1577.cn/bbs/dpj-38067-1.html

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

  13. #define uchar unsigned char        //無符號字符型類型數據
  14. #define uint unsigned int //無符號整型數據
  15. #define IODATA  P0

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

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


  21. /*********************************************************************************************
  22. 函數名:延時函數
  23. 調  用:Delay30us();/Delay20ms();/Delay1s();
  24. 參  數:無
  25. 返回值:無
  26. 結  果:延時相應時間
  27. 備  注:振蕩晶體為11.0592MHz(所有延時函數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. 函數名:DHT11啟動函數
  62. 調  用:無
  63. 參  數:無
  64. 返回值:無
  65. 結  果:DHT11開始工作
  66. 備  注:
  67. **********************************************************************************************/
  68. void DHT11_start()                 // 主機控制DHT11開始工作
  69. {
  70.    DATA=1;                                 // 主線空閑狀態
  71.    _nop_();
  72.    _nop_();
  73.    DATA=0;                                 // 主機發送開始工作信號
  74.    Delay20ms();   //延時18ms以上
  75.    DATA=1;                                 // 拉高并延時等待DHT11響應
  76.    Delay30us();
  77. }
  78. /*********************************************************************************************
  79. 函數名:DHT11讀數據函數
  80. 調  用:? = DHT11_rec_byte();
  81. 參  數:無
  82. 返回值:
  83. 結  果:讀DHT11數據并保存到dat
  84. 備  注:
  85. **********************************************************************************************/

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

  101. /*********************************************************************************************
  102. 函數名:接收DHT11的40位的數據并校驗
  103. 調  用:? = DHT11_receive();
  104. 參  數:無
  105. 返回值:無
  106. 結  果:結果保存到dat_r[i]中
  107. 備  注:
  108. **********************************************************************************************/
  109. void DHT11_receive()      //接收40位的數據
  110. {
  111.     uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
  112.     DHT11_start();                 // 主機控制DHT11開始工作
  113.     if(DATA==0)
  114.     {
  115.         while(DATA==0);   //等待拉高     
  116.         Delay30us();
  117.                 Delay30us();
  118.                 Delay30us();  //拉高后延時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();    //結束

  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.         /*數據處理,方便顯示*/
  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. * 功能 : 這個是一個讀狀態函數,讀出函數是否處在忙狀態
  142. * 輸入 : 輸入的命令值
  143. * 輸出 : 無
  144. ***********************************************************************/
  145. void Busy(void)
  146. {
  147. bit busy_flag = 1;
  148. IODATA  = 0xff;
  149. RS = 0;          //指令關
  150. Delay30us();
  151. RW = 1;          //讀狀態
  152. Delay30us();
  153. E = 1;        //使能高電平
  154. while(1)
  155. {
  156. busy_flag = (bit)(IODATA  & 0x80); //強制取最高位
  157. if(busy_flag == 0)
  158. {
  159. break;
  160. }
  161. }
  162. E = 0;           //E 1->0,rs=0,rw=1,
  163.            //將數據寄存器內的數據讀到DB0~DB7,分別將狀態標志BF和地址計數器(AC)內容讀到DB7和DB6~DB0。

  164. }

  165. /********************************************************************
  166. * 名稱 : lcd1602_write_cmd(uchar del)
  167. * 功能 : 1602命令函數
  168. * 輸入 : 輸入的命令值
  169. * 輸出 : 無
  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寫數據函數
  188. * 輸入 : 需要寫入1602的數據
  189. * 輸出 : 無
  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, 數據寫入數據寄存器中
  206. }

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

  230. /********************************************************************
  231. * 名稱 : lcd1602_char(uchar hang,uchar lie,char sign)
  232. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符顯示"b" ,調用該函數如下
  233. L1602_char(1,5,'b')
  234. * 輸入 : 行,列,需要輸入1602的數據
  235. * 輸出 : 無
  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);  //置數據存貯器地址
  251. Busy();
  252. lcd1602_write_data(sign);
  253. }

  254. /********************************************************************
  255. * 名稱 : lcd1602_string(uchar hang,uchar lie,uchar *p)
  256. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調用該函數如下
  257. L1602_string(1,5,"ab cd ef;")
  258. * 輸入 : 行,列,需要輸入1602的數據
  259. * 輸出 : 無
  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)) //字符結束或每行最后一個字符
  282. {
  283. break;
  284. }
  285. }
  286. }

  287. /*********************************************************************************************
  288. 函數名:主函數
  289. 調  用:無
  290. 參  數:無
  291. 返回值:無
  292. 結  果:讀DHT11數據并送到1602顯示
  293. 備  注:
  294. **********************************************************************************************/
  295. void main (void)
  296. {
  297.         
  298.         Delay20ms();
  299.         lcd1602_init();                //LCD初始化
  300.         while(1)
  301.         {
  302.                 Delay1s();                //經測試,兩次連讀要至少延時80ms        
  303.                 DHT11_receive();//接受數據
  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. }
復制代碼

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

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:404454 發表于 2019-3-24 08:27 | 只看該作者
支持,但顯示太復雜了,符號數字一目了然。
回復

使用道具 舉報

板凳
ID:483579 發表于 2019-4-7 13:23 來自手機 | 只看該作者
hu2018y 發表于 2019-3-24 08:27
支持,但顯示太復雜了,符號數字一目了然。

可以再普中的板子上實驗嘛?
回復

使用道具 舉報

地板
ID:503160 發表于 2019-4-11 09:27 | 只看該作者
請問有PROTEUS仿真圖嗎
回復

使用道具 舉報

5#
ID:509459 發表于 2019-4-11 10:58 | 只看該作者
學習學習                                             
回復

使用道具 舉報

6#
ID:403562 發表于 2019-4-11 17:26 | 只看該作者
寧小小 發表于 2019-4-7 13:23
可以再普中的板子上實驗嘛?

不行,我試了
回復

使用道具 舉報

7#
ID:514728 發表于 2019-4-24 13:14 | 只看該作者
不錯啊
學習了
回復

使用道具 舉報

8#
ID:501681 發表于 2019-4-29 13:37 | 只看該作者
寧小小 發表于 2019-4-7 13:23
可以再普中的板子上實驗嘛?

我試了好像不顯示
回復

使用道具 舉報

9#
ID:576600 發表于 2019-7-25 20:26 | 只看該作者
非常感謝,下載一次點亮,溫濕度顯示正常。
回復

使用道具 舉報

10#
ID:576600 發表于 2019-7-25 20:26 | 只看該作者
寧小小 發表于 2019-4-7 13:23
可以再普中的板子上實驗嘛?

可以的,我試了,顯示正常。
回復

使用道具 舉報

11#
ID:589811 發表于 2019-7-28 11:22 | 只看該作者
寧小小 發表于 2019-4-7 13:23
可以再普中的板子上實驗嘛?

可以的,重新定義一下引腳就可以
回復

使用道具 舉報

12#
ID:599167 發表于 2019-8-11 17:36 | 只看該作者
正好找這個,居然還真的有
回復

使用道具 舉報

13#
ID:664479 發表于 2019-12-15 18:03 | 只看該作者
為什么我的液晶顯示屏(就復制了這個程序)顯示不了啊   用的溫濕度模塊兒也都是一樣的  但是就是沒有數據
回復

使用道具 舉報

14#
ID:654535 發表于 2019-12-19 11:05 | 只看該作者
我在protus實現你的程序為什么實現不了啊,lm0161黑頻
回復

使用道具 舉報

15#
ID:341833 發表于 2020-1-19 23:54 | 只看該作者
顯示不了呀
回復

使用道具 舉報

16#
ID:687485 發表于 2020-1-20 08:49 | 只看該作者
想下載學習一下。
回復

使用道具 舉報

17#
ID:745988 發表于 2020-5-7 20:04 | 只看該作者
老哥,我用你的程序,咋1062屏上還是啥都不顯示。
回復

使用道具 舉報

18#
ID:745988 發表于 2020-5-7 20:14 | 只看該作者
我的那個數值咋顯示不清楚呢
回復

使用道具 舉報

19#
ID:757900 發表于 2020-6-15 20:40 來自手機 | 只看該作者
不錯謝謝分享 有你更精彩
回復

使用道具 舉報

20#
ID:780711 發表于 2020-6-16 14:19 | 只看該作者
請問為什么在proteus上面仿真沒有顯示
回復

使用道具 舉報

21#
ID:803001 發表于 2020-8-4 10:29 | 只看該作者
lqqqqqqqq 發表于 2020-6-16 14:19
請問為什么在proteus上面仿真沒有顯示

我也是
回復

使用道具 舉報

22#
ID:981034 發表于 2021-11-16 08:23 | 只看該作者
謝謝,有注釋
回復

使用道具 舉報

23#
ID:1047453 發表于 2022-10-12 17:43 | 只看該作者

把那個data rs rw 還有e的引腳改一下就可以了
回復

使用道具 舉報

24#
ID:1013894 發表于 2022-12-5 20:08 | 只看該作者
前排過來學習一下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区免费 | 欧美日韩免费视频 | 日韩中文字幕一区 | 综合久久综合久久 | 久久精品视频播放 | 国产欧美日韩在线一区 | 久久久精彩视频 | 伊人伊人伊人 | www国产亚洲精品久久网站 | 成人精品视频免费 | 亚洲精品日本 | 日本一区二区三区四区 | 欧美一级片在线观看 | 亚洲一区二区高清 | 亚洲精品字幕 | 亚洲精品欧洲 | 欧美色综合一区二区三区 | 欧美日韩一本 | 国产精品一区在线观看 | 亚洲国产精品一区二区三区 | 久久99精品国产麻豆婷婷 | 国产 日韩 欧美 制服 另类 | 亚洲一区二区免费看 | 午夜视频在线视频 | 亚洲精品在线播放 | 国产精品中文 | 91精品国产综合久久福利软件 | 国产一区二区不卡 | 欧美日韩在线免费观看 | 日韩精品久久久 | 日韩三区 | 久久美女网 | 欧美国产日韩一区二区三区 | 欧美精品二区三区 | 日韩一区二区三区精品 | 一区二区在线 | 日本精品在线播放 | 成人av免费播放 | 视频一区二区在线观看 | 人妖一区 | 伦理二区 |