找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4020|回复: 0
收起左侧

51单片机键控dht11温湿度检测系统 电路图加源程序

[复制链接]
ID:297110 发表于 2018-4-1 11:32 | 显示全部楼层 |阅读模式
爱奇艺20180401113137.png


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <absacc.h>
  4. #include <math.h>
  5.   
  6. #define uchar unsigned char
  7. #define uint unsigned int

  8. //定义四个输出端口
  9. sbit Led_jiashi=P3^4;                //加湿
  10. sbit Led_qushi=P3^3;                //去湿
  11. sbit Led_jiangwen=P3^1;                //降温
  12. sbit Led_shengwen=P3^2;                //升温
  13. //定义三个设置按键
  14. sbit Key_SET = P2^0;
  15. sbit Key_ADD = P2^1;
  16. sbit Key_SUB = P2^2;
  17. sbit Key_OK  = P2^3;
  18. //定义24C02数据口
  19. sbit SCL = P1^0;
  20. sbit SDA = P1^1;
  21. //定义DHT11数据口
  22. sbit DATA = P1^7;
  23. sbit buzz=P3^5;

  24. //定义LCD1602端口
  25. sbit E=P1^3;                //1602使能引脚
  26. //sbit RW=P2^6;                //1602读写引脚       
  27. sbit RS=P1^2;                //1602数据/命令选择引脚
  28. //定义全局变量
  29. uchar U8FLAG,U8temp,U8comdata,U8RH_data_H_temp,U8RH_data_L_temp,U8T_data_H_temp,U8T_data_L_temp,U8checkdata_temp;
  30. uchar U8RH_data_H,U8RH_data_L,U8T_data_H,U8T_data_L,U8checkdata;
  31. uchar Mode,humidity,temperature;
  32. char TH,TL,HH,HL;
  33. bit bdata FlagStartRH,hot,cold,humid,dry,BJ;

  34. //定时器0初始化
  35. void Timer0_Init()
  36. {
  37.         ET0 = 1;        //允许定时器0中断
  38.         TMOD = 0x11;       //定时器工作方式选择
  39.         TL0 = 0xFF;     
  40.         TH0 = 0x4B;     //定时器赋予初值
  41.         TR0 = 1;        //启动定时器
  42. }

  43. //定时器0中断
  44. void Timer0_ISR (void) interrupt 1 using 0
  45. {
  46.         uchar RHCounter;
  47.         TL0 = 0xFF;
  48.         TH0 = 0x4B;     //定时器赋予初值
  49.         RHCounter++;
  50.         if(RHCounter%10==0&&BJ==1)
  51.         buzz=!buzz;
  52.         else if(BJ==0)
  53.         buzz=1;
  54.         //每2秒钟启动一次温湿度转换
  55.     if (RHCounter >= 40)
  56.     {
  57.        FlagStartRH = 1;
  58.            RHCounter = 0;
  59.     }
  60. }

  61. /*********************************
  62.       BASE  DRIVE
  63. **********************************/
  64. void DELAY(unsigned int t)
  65. {
  66.         while(t!=0)
  67.         t--;
  68. }

  69. /******************************
  70.       IIC  DRIVE
  71. ******************************/
  72. void IICStart(void)
  73. {
  74.      SCL=0;  
  75.          DELAY(1);
  76.      SDA=1; SCL=1; DELAY(1);
  77.      SDA=0; DELAY(1);
  78.      SCL=0;
  79. }

  80. void IICStop(void)
  81. {
  82.          SDA=0;SCL=1; DELAY(1);
  83.      SDA=1; DELAY(1);
  84.      SCL=0;        
  85. }
  86. void SEND0(void)
  87. {
  88.         SDA=0;
  89.         SCL=1;
  90.         DELAY(1);
  91.         SCL=0;
  92. }

  93. void SEND1(void)
  94. {
  95.         SDA=1;
  96.         DELAY(1);
  97.         SCL=1;
  98.         DELAY(1);
  99.         SCL=0;
  100. }

  101. bit Check_Ack(void)
  102. {
  103.         unsigned char errtime=250;
  104.         DELAY(1);
  105.         SCL=1;
  106.         DELAY(1);
  107.         CY=SDA;
  108.         while(CY)
  109.         {
  110.                 errtime--;
  111.                 CY=SDA;
  112.                 if (!errtime)
  113.                 {
  114.                         IICStop();
  115.                         return 1;
  116.                 }
  117.         }
  118.         DELAY(1);
  119.         SCL=0;
  120.         return 0;
  121. }

  122. void Write_byte(unsigned char dat)
  123. {
  124.     unsigned char i;
  125.         for(i=0;i<8;i++)
  126.         {       
  127.                 if((dat<<i)&0x80)
  128.                 SEND1();
  129.                 else
  130.                 SEND0();
  131.         }
  132. }

  133. unsigned char Read_byte(void)
  134. {
  135.         unsigned char i,temp=0;     
  136.         for(i=0;i<8;i++)
  137.         {
  138.         SDA=1;
  139.             SCL=1;
  140.             DELAY(1);  
  141.                 if(SDA==1)
  142.                 {
  143.                         temp=temp<<1;
  144.                         temp=temp|0x01;
  145.                 }
  146.                 else
  147.                 temp=temp<<1;
  148.                  SCL=0;       
  149.           }
  150.           return temp;
  151. }

  152. /************************************
  153.       EEPROM  DRIVE
  154.           Addr:from 0x00-->
  155. *************************************/
  156. unsigned char rdeeprom(unsigned char addr)
  157. {
  158.         unsigned char temp=0;
  159.                 bit flag=0;
  160.                 IICStart();
  161.                 Write_byte(0xa0);
  162.         Check_Ack();
  163.                 Write_byte(addr);
  164.                 Check_Ack();
  165.                 IICStart();
  166.                 Write_byte(0xa1);
  167.                 Check_Ack();
  168.                 temp=Read_byte();
  169.                 SEND1();
  170.                 IICStop();
  171.             return temp;   
  172. }  
  173.    
  174.    
  175. void wrteeprom(unsigned char addr,unsigned char dat)
  176. {
  177.                IICStart();
  178.                 Write_byte(0xa0);
  179.                 Check_Ack();
  180.                 Write_byte(addr);
  181.                 Check_Ack();
  182.                 Write_byte(dat);
  183.                 Check_Ack();
  184.                 IICStop();
  185. }


  186. void Delay1(uint j)
  187. {
  188.     uchar i;
  189.     for(;j>0;j--)
  190.     {        
  191.                 for(i=0;i<27;i++);
  192.     }
  193. }

  194. void  Delay_10us(void)
  195. {
  196.     uchar i;
  197.     i--;
  198.     i--;
  199.     i--;
  200.     i--;
  201.     i--;
  202.     i--;
  203. }       

  204. void  COM(void)
  205. {
  206.     uchar i;
  207.     for(i=0;i<8;i++)          
  208.     {
  209.               U8FLAG=2;
  210.                    while((!DATA)&&U8FLAG++);
  211.                 Delay_10us();
  212.                 Delay_10us();
  213.                 Delay_10us();
  214.                   U8temp=0;
  215.         if(DATA)U8temp=1;
  216.                     U8FLAG=2;
  217.                 while((DATA)&&U8FLAG++);
  218.                    //超时则跳出for循环                  
  219.                    if(U8FLAG==1)break;
  220.                    //判断数据位是0还是1         
  221.                      
  222.                 // 如果高电平高过预定0高电平值则数据位为 1
  223.                     
  224.                 U8comdata<<=1;
  225.                    U8comdata|=U8temp;        //0
  226.     }//rof
  227. }

  228. //--------------------------------
  229. //-----温湿度读取子程序 ------------
  230. //--------------------------------
  231. //----以下变量均为全局变量--------
  232. //----温度高8位== U8T_data_H------
  233. //----温度低8位== U8T_data_L------
  234. //----湿度高8位== U8RH_data_H-----
  235. //----湿度低8位== U8RH_data_L-----
  236. //----校验 8位 == U8checkdata-----
  237. //----调用相关子程序如下----------
  238. //---- Delay();, Delay_10us();,COM();
  239. //--------------------------------
  240. uchar RH(void)
  241. {
  242.     //主机拉低18ms
  243.     DATA=0;
  244.         Delay1(180);  //原来为5
  245.         DATA=1;
  246.         //总线由上拉电阻拉高 主机延时20us
  247.         Delay_10us();
  248.         Delay_10us();
  249.         Delay_10us();
  250.         Delay_10us();
  251.         //主机设为输入 判断从机响应信号
  252.         DATA=1;
  253.         //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行          
  254.         if(!DATA)                 //T !          
  255.         {
  256.             U8FLAG=2;
  257.             //判断从机是否发出 80us 的低电平响应信号是否结束         
  258.             while((!DATA)&&U8FLAG++);
  259.             U8FLAG=2;
  260.             //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  261.             while((DATA)&&U8FLAG++);
  262.             //数据接收状态                 
  263.             COM();
  264.             U8RH_data_H_temp=U8comdata;
  265.             COM();
  266.             U8RH_data_L_temp=U8comdata;
  267.             COM();
  268.             U8T_data_H_temp=U8comdata;
  269.             COM();
  270.             U8T_data_L_temp=U8comdata;
  271.             COM();
  272.             U8checkdata_temp=U8comdata;
  273.             DATA=1;
  274.             //数据校验
  275.             U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  276.             if(U8temp==U8checkdata_temp)
  277.             {
  278.                       U8RH_data_H=U8RH_data_H_temp;
  279.                       U8RH_data_L=U8RH_data_L_temp;
  280.                       U8T_data_H=U8T_data_H_temp;
  281.                       U8T_data_L=U8T_data_L_temp;
  282.                       U8checkdata=U8checkdata_temp;
  283.             }
  284.                 return 1;
  285.         }
  286.         else   //传感器不响应
  287.         {
  288.            return 0;
  289.         }
  290. }

  291. /********************************************************************
  292. * 文件名  : 液晶1602显示.c
  293. * 描述    :  该程序实现了对液晶1602的控制。
  294. ***********************************************************************/


  295. /********************************************************************
  296. * 名称 : delay()
  297. * 功能 : 延时,延时时间大概为140US。
  298. * 输入 : 无
  299. * 输出 : 无
  300. ***********************************************************************/

  301. void delay()
  302. {
  303.         int i,j;
  304.         for(i=0; i<=10; i++)
  305.         for(j=0; j<=2; j++);
  306. }          
  307.        
  308. /********************************************************************
  309. * 名称 : enable(uchar del)
  310. * 功能 : 1602命令函数
  311. * 输入 : 输入的命令值
  312. * 输出 : 无
  313. ***********************************************************************/

  314. void enable(uchar del)
  315. {
  316.         P0 = del;
  317.         RS = 0;
  318.         E = 1;
  319.         delay();
  320.         E = 0;
  321.         delay();
  322. }

  323. /********************************************************************
  324. * 名称 : write(uchar del)
  325. * 功能 : 1602写数据函数
  326. * 输入 : 需要写入1602的数据
  327. * 输出 : 无
  328. ***********************************************************************/

  329. void write(uchar del)
  330. {
  331.         P0 = del;
  332.         RS = 1;
  333.         E = 1;
  334.         delay();
  335.         E = 0;
  336.         delay();
  337. }

  338. /********************************************************************
  339. * 名称 : L1602_init()
  340. * 功能 : 1602初始化,请参考1602的资料
  341. * 输入 : 无
  342. * 输出 : 无
  343. ***********************************************************************/
  344. void L1602_init(void)
  345. {
  346.        
  347.         enable(0x38);
  348.         enable(0x0c);
  349.         enable(0x06);
  350.         enable(0x01); //清屏要放在最后
  351. }

  352. /********************************************************************
  353. * 名称 : L1602_char(uchar hang,uchar lie,char sign)
  354. * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
  355.                  L1602_char(1,5,'b')
  356. * 输入 : 行,列,需要输入1602的数据
  357. * 输出 : 无
  358. ***********************************************************************/
  359. void L1602_char(uchar hang,uchar lie,char sign)
  360. {
  361.         uchar a;
  362.         if(hang == 1) a = 0x80;
  363.         if(hang == 2) a = 0xc0;
  364.         a = a + lie - 1;
  365.         enable(a);
  366.         write(sign);
  367. }

  368. /********************************************************************
  369. * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
  370. * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
  371.                   L1602_string(1,5,"ab cd ef;")
  372. * 输入 : 行,列,需要输入1602的数据
  373. * 输出 : 无
  374. ***********************************************************************/
  375. void L1602_string(uchar hang,uchar lie,uchar *p)
  376. {
  377.         uchar a;
  378.         if(hang == 1) a = 0x80;
  379.         if(hang == 2) a = 0xc0;
  380.         a = a + lie - 1;
  381.         enable(a);
  382.         while(1)
  383.         {
  384.                 if(*p == '\0') break;
  385.                 write(*p);
  386.                 p++;
  387.         }
  388. }

  389. //显示整型的温湿度数据用,共占用4位,其中一位符号位
  390. void L1602_int(uchar hang, uchar lie, int num)
  391. {
  392.    uint temp;
  393.    uint gewei,shiwei,baiwei,sign;
  394.    if (num >= 0)
  395.    sign = 0;
  396.    else
  397.    sign = 1;
  398.    temp = abs(num);
  399.    baiwei = temp / 100;
  400.    temp = temp - baiwei*100;
  401.    shiwei = temp / 10;
  402.    gewei = temp - shiwei*10;
  403.    num = abs(num);
  404.    if (num>=100)
  405.    {
  406.    //   L1602_char(hang, lie+1, baiwei+48);  
  407.           L1602_char(hang, lie+2, shiwei+48);  
  408.           L1602_char(hang, lie+3, gewei+48);  
  409.    }
  410.    else if (num>=10)
  411.    {
  412.       if (sign == 1)          
  413.           L1602_char(hang, lie+1, '-');
  414.           L1602_char(hang, lie+2, shiwei+48);  
  415.       L1602_char(hang, lie+3, gewei+48);
  416.    }
  417.    else
  418.    {
  419.       if (sign == 1)          
  420.           L1602_char(hang, lie+2, '-');
  421.           else
  422.           L1602_char(hang, lie+2, ' ');
  423.       L1602_char(hang, lie+3, gewei+48);  
  424.    }
  425. }

  426. void display()
  427. {
  428.         if(Mode==0)
  429.         {
  430.                 L1602_int(1,3,temperature);
  431.                 L1602_char(1,7,0xdf);
  432.                 L1602_int(1,12,humidity);

  433.                 if(hot==1&&cold==0&&humid==0&&dry==0)
  434.                 {L1602_string(2,1," It's very hot! ");BJ=1;}
  435.                 else if(hot==1&&cold==0&&humid==1&&dry==0)
  436.                 {L1602_string(2,1," Hot and humid! ");BJ=1;}
  437.                 else if(hot==1&&cold==0&&humid==0&&dry==1)
  438.                 {L1602_string(2,1,"  Hot and dry!  ");BJ=1;}
  439.                 else if(hot==0&&cold==1&&humid==0&&dry==0)
  440.                 {L1602_string(2,1," It's very cold!");BJ=1;}
  441.                 else if(hot==0&&cold==1&&humid==1&&dry==0)
  442.                 {L1602_string(2,1," Cold and humid!");BJ=1;}
  443.                 else if(hot==0&&cold==1&&humid==0&&dry==1)
  444.                 {L1602_string(2,1,"  Cold and dry! ");BJ=1;}
  445.                 else if(hot==0&&cold==0&&humid==1&&dry==0)
  446.                 {L1602_string(2,1,"It's very humid!");BJ=1;}
  447.                 else if(hot==0&&cold==0&&humid==0&&dry==1)
  448.                 {L1602_string(2,1," It's very dry! ");BJ=1;}
  449.                 else if(hot==0&&cold==0&&humid==0&&dry==0)
  450.                 {L1602_string(2,1,"Good environment");BJ=0;}
  451.         }                                                                          
  452. }

  453. /***按键函数***/
  454. void KEY()
  455. {
  456.         if(Key_SET==0)
  457.         {
  458.                 Delay1(200);
  459.                 if(Key_SET==0)
  460.                 {
  461.                         Mode++;
  462.                         if(Mode==1)
  463.                         {
  464.                                 L1602_string(1,1," TH:    C HH:  %");
  465.                                 L1602_char(1,8,0xdf);
  466.                                 L1602_string(2,1," TL:    C HL:  %");
  467.                                 L1602_char(2,8,0xdf);
  468.                                 L1602_int(1,4,TH);
  469.                                 L1602_int(1,12,HH);
  470.                                 L1602_int(2,4,TL);
  471.                                 L1602_int(2,12,HL);
  472.                                 enable(0x80+6);
  473.                                 enable(0x0f);
  474.                         }
  475.                         else if(Mode==2)
  476.                         {
  477.                                 enable(0x80+0x40+6);
  478.                                 enable(0x0f);
  479.                         }
  480.                         else if(Mode==3)
  481.                         {
  482.                                 enable(0x80+14);
  483.                                 enable(0x0f);
  484.                         }
  485.                         else if(Mode==4)
  486.                         {
  487.                                 enable(0x80+0x40+14);
  488.                                 enable(0x0f);
  489.                         }
  490.                         else if(Mode>=5)
  491.                         {
  492.                                 Mode=1;
  493.                                 enable(0x80+6);
  494.                                 enable(0x0f);
  495.                         }
  496.                         while(!Key_SET);
  497.                 }
  498.         }
  499.         else if(Key_ADD==0)
  500.         {
  501.                 Delay1(200);
  502.                 if(Key_ADD==0)
  503.                 {
  504.                         if(Mode==1)
  505.                         {
  506.                                 TH++;
  507.                                 if(TH>=100)
  508.                                 TH=99;
  509.                                 L1602_int(1,4,TH);
  510.                                 enable(0x80+6);
  511.                         }
  512.                         else if(Mode==2)
  513.                         {
  514.                                 TL++;
  515.                                 if(TL>=TH)
  516.                                 TL=TH-1;
  517.                                 L1602_int(2,4,TL);
  518.                                 enable(0x80+0x40+6);
  519.                         }
  520.                         else if(Mode==3)
  521.                         {
  522.                                 HH++;
  523.                                 if(HH>=100)
  524.                                 HH=99;
  525.                                 L1602_int(1,12,HH);
  526.                                 enable(0x80+14);
  527.                         }
  528.                         else if(Mode==4)
  529.                         {
  530.                                 HL++;
  531.                                 if(HL>=HH)
  532.                                 HL=HH-1;
  533.                                 L1602_int(2,12,HL);
  534.                                 enable(0x80+0x40+14);
  535.                         }
  536.                         while(!Key_ADD);
  537.                 }
  538.         }
  539.         else if(Key_SUB==0)
  540.         {
  541.                 Delay1(200);
  542.                 if(Key_SUB==0)
  543.                 {
  544.                         if(Mode==1)
  545.                         {
  546.                                 TH--;
  547.                                 if(TH<=TL)
  548.                                 TH=TL+1;
  549.                                 L1602_int(1,4,TH);
  550.                                 enable(0x80+6);
  551.                         }
  552.                         else if(Mode==2)
  553.                         {
  554.                                 TL--;
  555.                                 if(TL<=0)
  556.                                 TL=0;
  557.                                 L1602_int(2,4,TL);
  558.                                 enable(0x80+0x40+6);
  559.                         }
  560.                         else if(Mode==3)
  561.                         {
  562.                                 HH--;
  563.                                 if(HH<=HL)
  564.                                 HH=HL+1;
  565.                                 L1602_int(1,12,HH);
  566.                                 enable(0x80+14);
  567.                         }
  568.                         else if(Mode==4)
  569.                         {
  570.                                 HL--;
  571.                                 if(HL<=0)
  572.                                 HL=0;
  573.                                 L1602_int(2,12,HL);
  574.                                 enable(0x80+0x40+14);
  575.                         }
  576.                         while(!Key_SUB);
  577.                 }
  578.         }
  579.         if(Key_OK==0&&Mode!=0)
  580.         {
  581.                 Delay1(200);
  582.                 if(Key_OK==0)
  583.                 {
  584.                         L1602_string(1,1,"Tem:   C Hum:  %");
  585.                         L1602_string(2,1,"Good environment");
  586.                         Mode=0;
  587.                         wrteeprom(0,TH);
  588.                         Delay1(20);
  589.                         wrteeprom(1,TL);
  590.                         Delay1(20);
  591.                         wrteeprom(2,HH);
  592.                         Delay1(20);
  593.                         wrteeprom(3,HL);
  594.                         enable(0x0c);
  595.                         while(Key_OK==0);
  596.                 }
  597.         }
  598. }

  599. //数据初始化
  600. void Data_Init()
  601. {
  602.    Led_qushi = 1;
  603.    Led_jiashi=1;
  604.    Led_jiangwen = 1;
  605.    Led_shengwen = 1;
  606. }

  607. /********************************************************************
  608. * 名称 : Main()
  609. * 功能 : 主函数
  610. ***********************************************************************/





  611. void main()
  612. {
  613.     uint i, j, testnum;

  614.     EA = 0;

  615.         Timer0_Init();   

  616.     Data_Init();
  617.         EA = 1;

  618.         L1602_init();
  619.         L1602_string(1,1," Welcome to T&H ");
  620.         L1602_string(2,1," Control System!");
  621.          for (i=0;i<1000;i++)
  622.            for (j=0;j<1000;j++)
  623.            {;}
  624.      
  625.         L1602_string(1,1,"                ");
  626.         L1602_string(2,1,"                ");
  627.     L1602_string(1,1,"Tem:   C Hum:  %");
  628.         L1602_string(2,1,"Good environment");
  629.    
  630.    
  631.         TH=rdeeprom(0);         
  632.         Delay1(20);                  
  633.         TL=rdeeprom(1);
  634.         Delay1(20);
  635.         HH=rdeeprom(2);
  636.         Delay1(20);
  637.         HL=rdeeprom(3);

  638.         while(1)
  639.         {
  640. ……………………

  641. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

下载:
温湿度.rar (1.19 MB, 下载次数: 41)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表