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

QQ登錄

只需一步,快速開始

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

單片機(jī)dht11溫濕度報(bào)警仿真加源碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:784818 發(fā)表于 2020-6-21 11:40 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
溫濕度報(bào)警仿真加源碼

51hei.gif (266.77 KB, 下載次數(shù): 127)

51hei.gif

27N`F@`6OEO5[QGJ]EFL$TB.png (52.94 KB, 下載次數(shù): 119)

27N`F@`6OEO5[QGJ]EFL$TB.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:784818 發(fā)表于 2020-7-14 08:47 | 只看該作者
源程序: DHT11最終版.7z (87.25 KB, 下載次數(shù): 209)

  1. #include "reg52.H"
  2. #include "stdio.h"
  3. #include "intrins.h"
  4. #include <math.h>

  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. #define DB P0//液晶并行數(shù)據(jù)接口
  8. sbit  RS = P2^0;//液晶指令數(shù)據(jù)信號(hào)
  9. sbit  RW = P2^1;//液晶讀寫信號(hào)
  10. sbit  E  = P2^2;//液晶使能信號(hào)

  11. sbit T_IO=P1^2;     //clk為DS1302的時(shí)鐘信號(hào)線
  12. sbit T_CLK=P1^7;    //DAT為DS1302的I/O數(shù)據(jù)線
  13. sbit T_RST=P2^3;    //RST為DS1302的RST信號(hào)線  

  14. uchar bdata datbyte;
  15. sbit datbyte0=datbyte^0;
  16. sbit datbyte7=datbyte^7;

  17. uchar time_1302[7]={0x00,0x00,0x00,0x03,0x07,0x03,0x08};//設(shè)置時(shí)間初始值數(shù)組
  18.                  //  秒   分   時(shí)   號(hào)  月份 星期  年
  19. //DS1302函數(shù)聲明
  20. void get_1302(uchar time[]);
  21. void write_ds1302(uchar dat);
  22. uchar r_1302(uchar add);
  23. void w_1302(uchar add,uchar dat);
  24. uchar read_ds1302(void);
  25. void init_1302(uchar *time);
  26. void change();
  27. uchar  times[9];//保存時(shí)間
  28. uchar  date[11];//保存日期

  29. unsigned char  key_value;//獲取到按鍵的值

  30. sbit  Data=P1^1;       //溫濕度IO
  31. signed char  humi_value;//濕度
  32. signed char  temp_value;//溫度

  33. unsigned char now_window;//當(dāng)前顯示窗口
  34. unsigned char curr_menu;
  35. #define  normal_mode  0x10//顯示模式
  36. #define  set_mode  0x20//設(shè)置模式

  37. signed char AlarmTL=10;                                // 溫度下限報(bào)警值
  38. signed char AlarmTH=30;                                // 溫度上限報(bào)警值
  39. signed char AlarmHL=40;                   // 濕度下限報(bào)警值
  40. signed char AlarmHH=80;                                // 濕度上限報(bào)警值

  41. unsigned char i;
  42. unsigned char cnt_100ms,cnt_500ms =0;
  43. unsigned char time_100ms_flag;
  44. //unsigned char open_del;//開鎖成功延時(shí)計(jì)數(shù)
  45. //unsigned char open_flag;//鎖狀態(tài)標(biāo)志
  46. sbit beep = P1^0;

  47. sbit LedTL_P   = P1^3;                        // 溫度過低報(bào)警指示燈
  48. sbit LedTH_P   = P1^4;                        // 溫度過高報(bào)警指示燈
  49. sbit LedHL_P   = P1^5;                        // 濕度過低報(bào)警指示燈
  50. sbit LedHH_P   = P1^6;                        // 濕度過高報(bào)警指示燈

  51. /*******************************************************************************
  52. * 函 數(shù) 名         : delay_ms
  53. * 函數(shù)功能                   : 延時(shí)函數(shù),延時(shí)1ms
  54. * 輸    入         : cnt
  55. * 輸    出         : 無
  56. * 說    名         : 該函數(shù)是在12MHZ晶振下,12分頻單片機(jī)的延時(shí)。
  57. *******************************************************************************/
  58. void delay_ms(unsigned int cnt)   //
  59. {
  60.         unsigned int x;
  61.         for( ; cnt>0; cnt--)
  62.         {
  63.                 for(x=110; x>0; x--);//軟件延時(shí)為1MS
  64.         }
  65. }
  66. #if 0
  67. void delay_us(unsigned int cnt)   //
  68. {
  69.         while(cnt--);
  70. }
  71. #endif
  72. /******************************************************
  73. ** 函數(shù)名:time_init
  74. ** 描述  :定時(shí)器初始化
  75. ** 輸入  :無
  76. ** 輸出  :無
  77. ******************************************************/
  78. void time_init(void)
  79. {
  80.           TMOD |= 0x01;//time0 工作方式為1
  81.           TH0 = 0xf8;//裝載初值
  82.           TL0 = 0x2f;//裝載初值,為2ms(65535-63535)
  83.       TR0 = 1;//開啟定時(shí)器
  84.           ET0 = 1;//打開中斷
  85.           EA=1;
  86. }
  87. /******************************************************
  88. ** 函數(shù)名:key_scan
  89. ** 描述  :按鍵掃描
  90. ** 輸入  :無
  91. ** 輸出  :無
  92. ******************************************************/
  93. void key_scan(void)
  94. {
  95.         static unsigned char key_in_flag = 0;//按鍵按下標(biāo)志
  96.         unsigned char key_l;//存儲(chǔ)掃描到行列值。
  97.         key_value = 20;//按鍵值清除
  98.         if((P3 & 0x0f) != 0x0f)//按鍵按下
  99.         {
  100.                 delay_ms(1);//按鍵消抖動(dòng)
  101.                 if(((P3 & 0x0f) != 0x0f) && (key_in_flag == 1))
  102.                 {
  103.                         key_in_flag = 0;//松手檢測(cè)防止一直觸發(fā)
  104.                         P3 = 0x0f;
  105.             //delay_ms(1);//按鍵消抖動(dòng)
  106.                         key_l = P3;//掃描得到按鍵值
  107.                         switch(key_l)
  108.                         {
  109.                                 //獲取按鍵值
  110.                                 case 0x0e:
  111.                                 {
  112.                                         key_value = 1;
  113.                                 }
  114.                                 break;
  115.                                 case 0x0d:
  116.                                 {
  117.                                         key_value = 2;
  118.                                 }
  119.                                 break;
  120.                                 case 0x0b:
  121.                                 {
  122.                                         key_value = 3;
  123.                                 }
  124.                                 break;
  125.                                 //case 0x70:
  126.                                 //break;
  127.                         }
  128.                 }
  129.         }
  130.         else
  131.         {
  132.                 key_in_flag = 1;//(按鍵松開標(biāo)志)
  133.         }

  134. }

  135. /*******************************************************************************
  136. * 函 數(shù) 名         : LcdWriteCom
  137. * 函數(shù)功能                   : 向LCD寫入一個(gè)字節(jié)的命令
  138. * 輸    入         : u8com
  139. * 輸    出         : 無
  140. *******************************************************************************/
  141. void lcd_wri_com(unsigned char com)          //寫入命令
  142. {
  143.         E = 0;         //使能清零
  144.         RS = 0;         //選擇寫入命令
  145.         RW = 0;         //選擇寫入

  146.         DB = com;
  147.         delay_ms(1);

  148.         E = 1;         //寫入時(shí)序
  149.         delay_ms(5);
  150.         E = 0;
  151. }

  152. /*******************************************************************************
  153. * 函 數(shù) 名         : LcdWriteData
  154. * 函數(shù)功能                   : 向LCD寫入一個(gè)字節(jié)的數(shù)據(jù)
  155. * 輸    入         : u8dat
  156. * 輸    出         : 無
  157. *******************************************************************************/

  158. void lcd_wri_data(unsigned char dat)//寫入數(shù)據(jù)
  159. {
  160.         E = 0;          //使能清零
  161.         RS = 1;          //選擇寫入數(shù)據(jù)
  162.         RW = 0;          //選擇寫入
  163.         DB = dat;
  164.         delay_ms(1);
  165.         E = 1;          //寫入時(shí)序
  166.         delay_ms(5);
  167.         E = 0;
  168. }
  169. /*******************************************************************************
  170. * 函 數(shù) 名         : WriString
  171. * 函數(shù)功能                   : 刷新屏幕顯示
  172. * 輸    入         : hang,add,*p
  173. * 輸    出         : 無
  174. *******************************************************************************/
  175. void wri_string(unsigned char y,unsigned char x,unsigned char *p)
  176. {
  177.         if(y==1)//如果選擇第一行
  178.                 lcd_wri_com(0x80+x);//選中地址
  179.         else
  180.                 lcd_wri_com(0xc0+x);//選中地址
  181.                 while(*p)
  182.                 {
  183.                         lcd_wri_data(*p);//寫入數(shù)據(jù)
  184.                         p++;
  185.                 }
  186. }
  187. /*******************************************************************************
  188. * 函 數(shù) 名         : lcd_write_char
  189. * 函數(shù)功能                   :
  190. * 輸    入         :
  191. * 輸    出         : 無
  192. *******************************************************************************/
  193. void lcd_write_char(unsigned char y, unsigned char x, unsigned char dat) //列x=0~15,行y=0,1
  194. {
  195.         unsigned char temp_l, temp_h;
  196.         if(y==1)//如果選擇第一行
  197.                 lcd_wri_com(0x80+x);//選中地址
  198.         else
  199.                 lcd_wri_com(0xc0+x);//選中地址
  200.         temp_l = dat % 10;
  201.     temp_h = dat / 10;
  202.     lcd_wri_data(temp_h + 0x30);          //convert to ascii
  203.     lcd_wri_data(temp_l + 0x30);
  204. }
  205. /*********************光標(biāo)控制***********************/
  206. void lcd1602_guanbiao(unsigned char y, unsigned char x,unsigned char on_off)
  207. {
  208.         if(on_off == 1)   //開光標(biāo)
  209.         {
  210.                 if(y==1)//如果選擇第一行
  211.                 lcd_wri_com(0x80+x);
  212.             else
  213.                 lcd_wri_com(0xc0+x);//將光標(biāo)移動(dòng)到秒個(gè)位
  214.                 lcd_wri_com(0x0f);//顯示光標(biāo)并且閃爍
  215.         }
  216.         else
  217.         {
  218.         if(y==1)//如果選擇第一行
  219.                 lcd_wri_com(0x80+x);
  220.             else
  221.                 lcd_wri_com(0xc0+x);//將光標(biāo)移動(dòng)到秒個(gè)位
  222.                 lcd_wri_com(0x0c);   //關(guān)光標(biāo)
  223.         }
  224. }

  225. /*******************************************************************************
  226. * 函 數(shù) 名       : LcdInit()
  227. * 函數(shù)功能                 : 初始化LCD屏
  228. * 輸    入       : 無
  229. * 輸    出       : 無
  230. *******************************************************************************/
  231. void lcd_init(void)                                                  //LCD初始化子程序
  232. {
  233.         lcd_wri_com(0x38);//置功能8位雙行
  234.         lcd_wri_com(0x0c);//顯示開關(guān)光標(biāo)
  235.         lcd_wri_com(0x06);//字符進(jìn)入模式屏幕不動(dòng)字符后移
  236.         delay_ms(5);//延時(shí)5ms
  237.         lcd_wri_com(0x01);  //清屏
  238.         wri_string(1,0,times);//初始化顯示
  239.         wri_string(1,6,date);
  240.         wri_string(2,0,"H:   %RH T:   C ");//初始化顯示
  241. }
  242. void DHT11_delay_us(unsigned char n)
  243. {
  244.     while(--n);
  245. }

  246. void DHT11_delay_ms(unsigned int z)
  247. {
  248.    unsigned int i,j;
  249.    for(i=z;i>0;i--)
  250.       for(j=110;j>0;j--);
  251. }

  252. void DHT11_start()
  253. {
  254.    Data=1;
  255.    DHT11_delay_us(2);
  256.    Data=0;
  257.    DHT11_delay_ms(30);   //延時(shí)18ms以上
  258.    Data=1;
  259.    DHT11_delay_us(30);
  260. }

  261. unsigned char DHT11_rec_byte()      //接收一個(gè)字節(jié)
  262. {
  263.    unsigned char i,dat=0;
  264.   for(i=0;i<8;i++)    //從高到低依次接收8位數(shù)據(jù)
  265.    {
  266.       while(!Data);   ////等待50us低電平過去
  267.       DHT11_delay_us(8);     //延時(shí)60us,如果還為高則數(shù)據(jù)為1,否則為0
  268.       dat<<=1;           //移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時(shí)直接移位
  269.       if(Data==1)    //數(shù)據(jù)為1時(shí),使dat加1來接收數(shù)據(jù)1
  270.          dat+=1;
  271.       while(Data);  //等待數(shù)據(jù)線拉低
  272.     }
  273.     return dat;
  274. }

  275. void DHT11_receive()      //接收40位的數(shù)據(jù)
  276. {
  277.     unsigned char R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
  278.     DHT11_start();
  279.     if(Data==0)
  280.     {
  281.         while(Data==0);   //等待拉高
  282.         DHT11_delay_us(40);  //拉高后延時(shí)80us
  283.         R_H=DHT11_rec_byte();    //接收濕度高八位
  284.         R_L=DHT11_rec_byte();    //接收濕度低八位
  285.         T_H=DHT11_rec_byte();    //接收溫度高八位
  286.         T_L=DHT11_rec_byte();    //接收溫度低八位
  287.         revise=DHT11_rec_byte(); //接收校正位

  288.         DHT11_delay_us(25);    //結(jié)束

  289.         if((R_H+R_L+T_H+T_L)==revise)      //校正
  290.         {
  291.             RH=R_H;
  292.             RL=R_L;
  293.             TH=T_H;
  294.             TL=T_L;
  295.         }
  296.         humi_value = RH;
  297.         temp_value = TH;
  298.     }
  299. }
  300. ……………………

  301. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼


評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:306124 發(fā)表于 2021-11-6 19:06 | 只看該作者
5345wegreg 發(fā)表于 2020-7-14 08:47
有的呢,怎么沒有

東西很不錯(cuò),nice!
回復(fù)

使用道具 舉報(bào)

地板
ID:491875 發(fā)表于 2021-12-17 20:03 | 只看該作者
按鍵沒有定義引腳吧
回復(fù)

使用道具 舉報(bào)

5#
ID:992677 發(fā)表于 2023-3-9 20:17 | 只看該作者
  1. ds1302.h(5): warning C318: can't open file 'main.h'
  2. DS1302.H(12): error C129: missing ';' before 'bdata'
復(fù)制代碼

下載了,為什么編譯不成功?
回復(fù)

使用道具 舉報(bào)

6#
ID:829453 發(fā)表于 2023-3-12 20:33 | 只看該作者
東西很不錯(cuò),nice!
回復(fù)

使用道具 舉報(bào)

7#
ID:1066411 發(fā)表于 2023-3-13 20:49 | 只看該作者
進(jìn)來觀摩學(xué)習(xí) 感謝樓主發(fā)提供的資料
回復(fù)

使用道具 舉報(bào)

8#
ID:952857 發(fā)表于 2023-4-24 13:19 | 只看該作者
回復(fù)

使用道具 舉報(bào)

9#
ID:368203 發(fā)表于 2024-11-9 11:16 | 只看該作者
東西不錯(cuò),但是仿真咋沒有呢
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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