找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3046|回复: 1
收起左侧

DTH11+单片机温湿度源程序

[复制链接]
ID:385507 发表于 2020-1-8 23:16 | 显示全部楼层 |阅读模式
oth11温湿度传感器,at89c51单片机
设计要求:
①了解DTH1I温湿度模块的功能;
②利用T0实现1秒(或自定义时间)定时,定时时间到,获取当前温湿度值,在OLED
液晶上显示温湿度值;
③通过矩阵键盘和OLED液晶设计人机交互设置界面,可设置3档温湿度状态(正常、
1级警报和2级警报),报警位置显示在OLED液晶最后两行,要求16个按键的功能分别为:
0~9、设置、左移、右移、上移、下移、确认;
④超限进行报警和灯光指示,当处于不同安全等级时,给出不同的报警提示,利用51
mini板上的蜂鸣器和LED实现,并且将安全等级反映在OLED界面上;
⑤要求OLED液晶第一-行为温度值,第二行为湿度值,应有字符加以区分;
⑥按下“设置"功能按键,可以进入单独设置界面,设置温湿度报警值;
⑦制定通讯协议,可以在PC机通过串口助手获取温湿度值和系统运行状态(正常、1
级警报或2级警报);
⑧制定通讯协议,可以在PC机通过串口助手设定温湿度报警值。

单片机源程序如下:
  1. #include <STC12C5A60S2.H>
  2. #include<dht11.h>
  3. #include<oled12864.H>
  4. #include<uart.h>
  5. #include<keyboard.h>

  6. sbit led = P3^1;
  7. sbit beep = P3^2;

  8. //变量定义

  9. unsigned char getUart[8],Recv_Val,getUart_i;

  10. unsigned char key,c0;



  11. //默认设定定时时间为1s
  12. unsigned int settingTime=100;//100*10ms=1000ms=1s
  13. //默认设定报警温度
  14. unsigned int settingTemp1=20;
  15. unsigned int settingTemp2=30;
  16. //默认设定报警湿度
  17. unsigned int settingHumi1=50;
  18. unsigned int settingHumi2=60;
  19. extern int temp_value, humi_value;      //读到的温湿度值
  20. //温湿度报警标记
  21. unsigned char humiAlert=0,tempAlert=0;

  22. unsigned char  mode=0;//设置湿度模式:2,设置温度模式:1,正常模式:0

  23. void timer0Init()
  24. {
  25.     TMOD = (TMOD&0xF0)|0X01;
  26.     ET0 = 1;
  27.     EA = 1;
  28.     TH0 = (65536-50000)/256;
  29.     TL0 = (65536-50000)%256;
  30.     TR0 = 1;
  31. }
  32. ////////////转换成ASII码//////////////////
  33. void toString(unsigned char* array,unsigned char dat)
  34. {
  35.     array[0] = dat/10+0x30;
  36.     array[1] = dat%10+0x30;
  37. }

  38. //温度设置界面行光标
  39. unsigned char tLineIndex = 0;
  40. //温度设置界面列光标
  41. unsigned char tRowIndex = 0;
  42. //湿度设置界面行光标
  43. unsigned char hLineIndex = 0;
  44. //湿度设置界面列光标
  45. unsigned char hRowIndex = 0;

  46. //串口接收一条指令完成
  47. bit recvComplete=0;

  48. //按键处理函数
  49. void KeyFun()
  50. {
  51.     key = Check_KeyBoard();
  52.     if(key != 20)
  53.     {
  54.                         switch(key)
  55.                         {
  56.                                 case 10://设置
  57.                                         //在设置温度湿度模式之间切换
  58.                                         if(mode==0)
  59.                                         {
  60.                                                 mode=1;
  61.                                         }
  62.                                         else if(mode==1)
  63.                                         {
  64.                                                 mode=2;
  65.                                         }
  66.                                         else if(mode==2)
  67.                                         {
  68.                                                 mode=1;
  69.                                         }
  70.                                         break;
  71.                                 case 11://左移
  72.                                         //设置模式才可以按
  73.                                         if(mode!=0)
  74.                                         {
  75.                                                 //温度设置
  76.                                                 if(mode==1)
  77.                                                 {
  78.                                                         if(tRowIndex<2)
  79.                                                         {
  80.                                                                 tRowIndex++;
  81.                                                         }
  82.                                                 }
  83.                                                 //湿度设置
  84.                                                 else
  85.                                                 {
  86.                                                         if(hRowIndex<2)
  87.                                                         {
  88.                                                                 hRowIndex++;
  89.                                                         }
  90.                                                 }
  91.                                         }
  92.                                         break;
  93.                                 case 12://右移
  94.                                         //设置模式才可以按
  95.                                         if(mode!=0)
  96.                                         {
  97.                                                 //温度设置
  98.                                                 if(mode==1)
  99.                                                 {
  100.                                                         if(tRowIndex>0)
  101.                                                         {
  102.                                                                 tRowIndex--;
  103.                                                         }
  104.                                                 }
  105.                                                 //湿度设置
  106.                                                 else
  107.                                                 {
  108.                                                         if(hRowIndex>0)
  109.                                                         {
  110.                                                                 hRowIndex--;
  111.                                                         }
  112.                                                 }
  113.                                         }
  114.                                         break;
  115.                                 case 13://上移
  116.                                         //设置模式才可以按
  117.                                         if(mode!=0)
  118.                                         {
  119.                                                 //温度设置
  120.                                                 if(mode==1)
  121.                                                 {
  122.                                                         if(tLineIndex>0)
  123.                                                         {
  124.                                                                 tLineIndex--;
  125.                                                         }
  126.                                                 }
  127.                                                 //湿度设置
  128.                                                 else
  129.                                                 {
  130.                                                         if(hLineIndex>0)
  131.                                                         {
  132.                                                                 hLineIndex--;
  133.                                                         }
  134.                                                 }
  135.                                         }
  136.                                         break;
  137.                                 case 14://下移
  138.                                         //设置模式才可以按
  139.                                         if(mode!=0)
  140.                                         {
  141.                                                 //温度设置
  142.                                                 if(mode==1)
  143.                                                 {
  144.                                                         if(tLineIndex<2)
  145.                                                         {
  146.                                                                 tLineIndex++;
  147.                                                         }
  148.                                                 }
  149.                                                 //湿度设置
  150.                                                 else
  151.                                                 {
  152.                                                         if(hLineIndex<2)
  153.                                                         {
  154.                                                                 hLineIndex++;
  155.                                                         }
  156.                                                 }
  157.                                         }
  158.                                         break;
  159.                                 case 15://确认
  160.                                         //设置模式才可以按确认
  161.                                         if(mode!=0)
  162.                                         {
  163.                                                 mode=0;
  164.                                         }
  165.                                         break;
  166.                                 default://0-9:设定对应光标上的数值
  167.                                         //设置模式才可以按0-9
  168.                                         if(mode!=0)
  169.                                         {
  170.                                                 //温度设置
  171.                                                 if(mode==1)
  172.                                                 {
  173.                                                         if(tLineIndex==0)//设定settingTemp1
  174.                                                         {
  175.                                                                 if(tRowIndex==0)//设置十位
  176.                                                                 {
  177.                                                                         unsigned char ge = settingTemp1%10;//旧的个位
  178.                                                                         settingTemp1=key*10+ge;
  179.                                                                 }
  180.                                                                 else
  181.                                                                 {
  182.                                                                         unsigned char shi = settingTemp1/10;//旧的十位
  183.                                                                         settingTemp1=shi*10+key;
  184.                                                                 }
  185.                                                         }
  186.                                                         else if(tLineIndex==1)//设定settingTemp2
  187.                                                         {
  188.                                                                 if(tRowIndex==0)//设置十位
  189.                                                                 {
  190.                                                                         unsigned char ge = settingTemp2%10;//旧的个位
  191.                                                                         settingTemp2=key*10+ge;
  192.                                                                 }
  193.                                                                 else
  194.                                                                 {
  195.                                                                         unsigned char shi = settingTemp2/10;//旧的十位
  196.                                                                         settingTemp2=shi*10+key;
  197.                                                                 }
  198.                                                         }
  199.                                                 }
  200.                                                 //湿度设置
  201.                                                 else
  202.                                                 {
  203.                                                         if(hLineIndex==0)//设定settingHumi1
  204.                                                         {
  205.                                                                 if(hRowIndex==0)//设置十位
  206.                                                                 {
  207.                                                                         unsigned char ge = settingHumi1%10;//旧的个位
  208.                                                                         settingHumi1=key*10+ge;
  209.                                                                 }
  210.                                                                 else
  211.                                                                 {
  212.                                                                         unsigned char shi = settingHumi1/10;//旧的十位
  213.                                                                         settingHumi1=shi*10+key;
  214.                                                                 }
  215.                                                         }
  216.                                                         else if(hLineIndex==1)//设定settingHumi2
  217.                                                         {
  218.                                                                 if(hRowIndex==0)//设置十位
  219.                                                                 {
  220.                                                                         unsigned char ge = settingHumi2%10;//旧的个位
  221.                                                                         settingHumi2=key*10+ge;
  222.                                                                 }
  223.                                                                 else
  224.                                                                 {
  225.                                                                         unsigned char shi = settingHumi2/10;//旧的十位
  226.                                                                         settingHumi2=shi*10+key;
  227.                                                                 }
  228.                                                         }
  229.                                                 }
  230.                                         }
  231.                                         break;
  232.                         }
  233.                 }
  234. }

  235. void displayNormal()
  236. {
  237.         unsigned char tempDisBuf[]="Temp:00C";//显示温度
  238.         unsigned char humiDisBuf[]="Humi:00%";//显示湿度
  239.         unsigned char humiAlertDisBuf[]="HumiAlert:0";//显示湿度
  240.         unsigned char tempAlertDisBuf[]="TempAlert:0";//显示湿度
  241.         LCD_Fill(0x00);  //清屏
  242.         toString(tempDisBuf+5,temp_value);//填充温度
  243.         toString(tempDisBuf+5,humi_value);//填充湿度
  244.         LCD_P8x16Str(0,0,tempDisBuf);//显示温度
  245.         LCD_P8x16Str(0,1,humiDisBuf);//显示湿度
  246.         tempAlertDisBuf[10]='0'+tempAlert;//填充温度报警值
  247.         humiAlertDisBuf[10]='0'+humiAlert;//填充湿度报警值
  248.         LCD_P8x16Str(0,2,tempAlertDisBuf);//显示温度报警
  249.         LCD_P8x16Str(0,3,humiAlertDisBuf);//显示湿度报警
  250. }

  251. void sendStatus()
  252. {
  253.         unsigned char tempDisBuf[]="Temp:00C\r\n";//显示温度
  254.         unsigned char humiDisBuf[]="Humi:00%\r\n";//显示湿度
  255.         unsigned char humiAlertDisBuf[]="HumiAlert:0\r\n";//显示湿度
  256.         unsigned char tempAlertDisBuf[]="TempAlert:0\r\n";//显示湿度
  257.         toString(tempDisBuf+5,temp_value);//填充温度
  258.         toString(tempDisBuf+5,humi_value);//填充湿度
  259.         tempAlertDisBuf[10]='0'+tempAlert;//填充温度报警值
  260.         humiAlertDisBuf[10]='0'+humiAlert;//填充湿度报警值
  261.         UART1_SendStr(tempDisBuf);//发送温度
  262.         UART1_SendStr(humiDisBuf);//发送湿度
  263.         UART1_SendStr(tempAlertDisBuf);//发送温度报警
  264.         UART1_SendStr(humiAlertDisBuf);//发送湿度报警
  265. }

  266. void displaySetTemp()
  267. {
  268.         unsigned char buf[]=" Temp1=00";
  269.         LCD_Fill(0x00);  //清屏
  270.         LCD_P8x16Str(0,0,"Temp Setting");
  271.         buf[0]=(tLineIndex==0)?'-':' ';//当前修改行光标指示
  272.         buf[5]='1';//填充Temp1
  273.         toString(buf+7,settingTemp1);//填充
  274.         LCD_P8x16Str(0,1,buf);//显示settingTemp1
  275.         buf[1]=(tLineIndex==1)?'-':' ';//当前修改行光标指示
  276.         buf[5]='2';//填充Temp2
  277.         toString(buf+7,settingTemp2);//填充
  278.         LCD_P8x16Str(0,2,buf);//显示settingTemp2
  279. }

  280. void displaySetHumi()
  281. {
  282.         unsigned char buf[]=" Humi1=00";
  283.         LCD_Fill(0x00);  //清屏
  284.         LCD_P8x16Str(0,0,"Humi Setting");
  285.         buf[0]=(tLineIndex==0)?'-':' ';//当前修改行光标指示
  286.         buf[5]='1';//填充Temp1
  287.         toString(buf+7,settingHumi1);//填充
  288.         LCD_P8x16Str(0,1,buf);//显示settingTemp1
  289.         buf[1]=(tLineIndex==1)?'-':' ';//当前修改行光标指示
  290.         buf[5]='2';//填充Temp2
  291.         toString(buf+7,settingHumi2);//填充
  292.         LCD_P8x16Str(0,2,buf);//显示settingTemp2
  293. }

  294. void main()
  295. {
  296.                 unsigned int tmpTime=0;
  297.                 unsigned int tmpVal=0;
  298.                 unsigned char tmpCharVal=0;
  299.     timer0Init();//初始化定时器0,用于定时检测温度湿度
  300.     UART1_Init(0xDc,0,1);
  301.     LCD_Init();
  302.    
  303.     while(1)
  304.     {
  305.                         //根据当前模式显示不同的界面
  306.                         switch(mode)
  307.                         {
  308.                                 case 0:
  309.                                         displayNormal();
  310.                                         break;
  311.                                 case 1:
  312.                                         displaySetTemp();
  313.                                         break;
  314.                                 case 2:
  315.                                         displaySetHumi();
  316.                                         break;
  317.                                 default:
  318.                                         break;
  319.                         }
  320.         
  321.                         //按键函数
  322.                         KeyFun();
  323.         
  324.                         //处理串口数据
  325.                         //协议:
  326.                         //设置定时时间:"*S1100#",其中1100表示1100ms,最大为9999ms(只能为4位)
  327.                         //设置温度阈值:"*T1:50#",其中1表示阈值1,可为1,2;50表示设定该值为50(只能为2位)
  328.                         //设置湿度阈值:"*H1:50#",其中1表示阈值1,可为1,2;50表示设定该值为50(只能为2位)
  329.                         //获取运行参数:"*G#"
  330.         if(recvComplete==1)
  331.                                 {
  332.                                         switch(getUart[1])
  333.                                         {
  334.                                                 case 'S':
  335.                                                         tmpTime = (getUart[2]-'0')*1000+(getUart[3]-'0')*100+(getUart[4]-'0')*10+(getUart[5]-'0');
  336.                                                         if(tmpTime<9999)
  337.                                                         {
  338.                                                                 settingTime=tmpTime;
  339.                                                         }
  340.                                                         else
  341.                                                         {
  342.                                                                 UART1_SendStr("Set timer0 error!\r\n");
  343.                                                         }
  344.                                                         break;
  345.                                                 case 'T':
  346.                                                         tmpCharVal = getUart[2]-'0';
  347.                                                         tmpVal = (getUart[4]-'0')*10+(getUart[5]-'0');
  348.                                                         if((tmpVal<99)&&(tmpCharVal<3)&&(tmpCharVal>0))
  349.                                                         {
  350.                                                                 if(tmpCharVal==1)
  351.                                                                 {
  352.                                                                         settingTemp1 = tmpVal;
  353.                                                                 }
  354.                                                                 else
  355.                                                                 {
  356.                                                                         settingTemp2 = tmpVal;
  357.                                                                 }
  358.                                                         }
  359.                                                         else
  360.                                                         {
  361.                                                                 UART1_SendStr("Set Temp value error!\r\n");
  362.                                                         }
  363.                                                         break;
  364.                                                 case 'H':
  365.                                                         tmpCharVal = getUart[2]-'0';
  366.                                                         tmpVal = (getUart[4]-'0')*10+(getUart[5]-'0');
  367.                                                         if((tmpVal<99)&&(tmpCharVal<3)&&(tmpCharVal>0))
  368.                                                         {
  369.                                                                 if(tmpCharVal==1)
  370.                                                                 {
  371.                                                                         settingHumi1 = tmpVal;
  372.                                                                 }
  373.                                                                 else
  374.                                                                 {
  375.                                                                         settingHumi2 = tmpVal;
  376.                                                                 }
  377.                                                         }
  378.                                                         else
  379.                                                         {
  380.                                                                 UART1_SendStr("Set Humi value error!\r\n");
  381.                                                         }
  382.                                                         break;
  383.                                                 case 'G':
  384.                                                         sendStatus();
  385.                                                         break;
  386.                                         }
  387.                                         recvComplete=0;
  388.                                 }
  389.                                
  390.                                 //判断是否声光报警
  391.                                 if((humiAlert>0)||(tempAlert>0))
  392.                                 {
  393.                                         beep=1;
  394.                                         led=1;
  395.                                 }
  396.                                 else
  397.                                 {
  398.                                         beep=0;
  399.                                         led=0;
  400.                                 }
  401.      }
  402. }
  403. void Timer0_Int()   interrupt 1
  404. {
  405.                 //10ms中断一次
  406.     TH0 = (65536-10000)/256;
  407.     TL0 = (65536-10000)%256;
  408.    
  409.     c0++;
  410.     if(c0==settingTime)
  411.     {
  412.                         //定时时间到,获取一次温湿度
  413.         getDHT11();
  414.    
  415.                                 //检查温度范围是否需要报警,不报警tempAlert=0,一档二档报警分别为1,2
  416.                                 if(temp_value<=settingTemp1)
  417.                                 {
  418.                                         tempAlert=0;
  419.                                 }
  420.                                 else if(temp_value<=settingTemp2)
  421.                                 {
  422.                                         tempAlert=1;
  423. ……………………

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

所有资料51hei提供下载:
3.rar (113.75 KB, 下载次数: 50)
回复

使用道具 举报

ID:767530 发表于 2020-6-2 16:11 | 显示全部楼层
兄弟有仿真图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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