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

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

QQ登錄

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

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

DTH11+單片機(jī)溫濕度源程序

[復(fù)制鏈接]
ID:385507 發(fā)表于 2020-1-8 23:16 | 顯示全部樓層 |閱讀模式
oth11溫濕度傳感器,at89c51單片機(jī)
設(shè)計(jì)要求:
①了解DTH1I溫濕度模塊的功能;
②利用T0實(shí)現(xiàn)1秒(或自定義時(shí)間)定時(shí),定時(shí)時(shí)間到,獲取當(dāng)前溫濕度值,在OLED
液晶上顯示溫濕度值;
③通過(guò)矩陣鍵盤和OLED液晶設(shè)計(jì)人機(jī)交互設(shè)置界面,可設(shè)置3檔溫濕度狀態(tài)(正常、
1級(jí)警報(bào)和2級(jí)警報(bào)),報(bào)警位置顯示在OLED液晶最后兩行,要求16個(gè)按鍵的功能分別為:
0~9、設(shè)置、左移、右移、上移、下移、確認(rèn);
④超限進(jìn)行報(bào)警和燈光指示,當(dāng)處于不同安全等級(jí)時(shí),給出不同的報(bào)警提示,利用51
mini板上的蜂鳴器和LED實(shí)現(xiàn),并且將安全等級(jí)反映在OLED界面上;
⑤要求OLED液晶第一-行為溫度值,第二行為濕度值,應(yīng)有字符加以區(qū)分;
⑥按下“設(shè)置"功能按鍵,可以進(jìn)入單獨(dú)設(shè)置界面,設(shè)置溫濕度報(bào)警值;
⑦制定通訊協(xié)議,可以在PC機(jī)通過(guò)串口助手獲取溫濕度值和系統(tǒng)運(yùn)行狀態(tài)(正常、1
級(jí)警報(bào)或2級(jí)警報(bào));
⑧制定通訊協(xié)議,可以在PC機(jī)通過(guò)串口助手設(shè)定溫濕度報(bào)警值。

單片機(jī)源程序如下:
  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. //默認(rèn)設(shè)定定時(shí)時(shí)間為1s
  12. unsigned int settingTime=100;//100*10ms=1000ms=1s
  13. //默認(rèn)設(shè)定報(bào)警溫度
  14. unsigned int settingTemp1=20;
  15. unsigned int settingTemp2=30;
  16. //默認(rèn)設(shè)定報(bào)警濕度
  17. unsigned int settingHumi1=50;
  18. unsigned int settingHumi2=60;
  19. extern int temp_value, humi_value;      //讀到的溫濕度值
  20. //溫濕度報(bào)警標(biāo)記
  21. unsigned char humiAlert=0,tempAlert=0;

  22. unsigned char  mode=0;//設(shè)置濕度模式:2,設(shè)置溫度模式: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. ////////////轉(zhuǎn)換成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. //溫度設(shè)置界面行光標(biāo)
  39. unsigned char tLineIndex = 0;
  40. //溫度設(shè)置界面列光標(biāo)
  41. unsigned char tRowIndex = 0;
  42. //濕度設(shè)置界面行光標(biāo)
  43. unsigned char hLineIndex = 0;
  44. //濕度設(shè)置界面列光標(biāo)
  45. unsigned char hRowIndex = 0;

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

  48. //按鍵處理函數(shù)
  49. void KeyFun()
  50. {
  51.     key = Check_KeyBoard();
  52.     if(key != 20)
  53.     {
  54.                         switch(key)
  55.                         {
  56.                                 case 10://設(shè)置
  57.                                         //在設(shè)置溫度濕度模式之間切換
  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.                                         //設(shè)置模式才可以按
  73.                                         if(mode!=0)
  74.                                         {
  75.                                                 //溫度設(shè)置
  76.                                                 if(mode==1)
  77.                                                 {
  78.                                                         if(tRowIndex<2)
  79.                                                         {
  80.                                                                 tRowIndex++;
  81.                                                         }
  82.                                                 }
  83.                                                 //濕度設(shè)置
  84.                                                 else
  85.                                                 {
  86.                                                         if(hRowIndex<2)
  87.                                                         {
  88.                                                                 hRowIndex++;
  89.                                                         }
  90.                                                 }
  91.                                         }
  92.                                         break;
  93.                                 case 12://右移
  94.                                         //設(shè)置模式才可以按
  95.                                         if(mode!=0)
  96.                                         {
  97.                                                 //溫度設(shè)置
  98.                                                 if(mode==1)
  99.                                                 {
  100.                                                         if(tRowIndex>0)
  101.                                                         {
  102.                                                                 tRowIndex--;
  103.                                                         }
  104.                                                 }
  105.                                                 //濕度設(shè)置
  106.                                                 else
  107.                                                 {
  108.                                                         if(hRowIndex>0)
  109.                                                         {
  110.                                                                 hRowIndex--;
  111.                                                         }
  112.                                                 }
  113.                                         }
  114.                                         break;
  115.                                 case 13://上移
  116.                                         //設(shè)置模式才可以按
  117.                                         if(mode!=0)
  118.                                         {
  119.                                                 //溫度設(shè)置
  120.                                                 if(mode==1)
  121.                                                 {
  122.                                                         if(tLineIndex>0)
  123.                                                         {
  124.                                                                 tLineIndex--;
  125.                                                         }
  126.                                                 }
  127.                                                 //濕度設(shè)置
  128.                                                 else
  129.                                                 {
  130.                                                         if(hLineIndex>0)
  131.                                                         {
  132.                                                                 hLineIndex--;
  133.                                                         }
  134.                                                 }
  135.                                         }
  136.                                         break;
  137.                                 case 14://下移
  138.                                         //設(shè)置模式才可以按
  139.                                         if(mode!=0)
  140.                                         {
  141.                                                 //溫度設(shè)置
  142.                                                 if(mode==1)
  143.                                                 {
  144.                                                         if(tLineIndex<2)
  145.                                                         {
  146.                                                                 tLineIndex++;
  147.                                                         }
  148.                                                 }
  149.                                                 //濕度設(shè)置
  150.                                                 else
  151.                                                 {
  152.                                                         if(hLineIndex<2)
  153.                                                         {
  154.                                                                 hLineIndex++;
  155.                                                         }
  156.                                                 }
  157.                                         }
  158.                                         break;
  159.                                 case 15://確認(rèn)
  160.                                         //設(shè)置模式才可以按確認(rèn)
  161.                                         if(mode!=0)
  162.                                         {
  163.                                                 mode=0;
  164.                                         }
  165.                                         break;
  166.                                 default://0-9:設(shè)定對(duì)應(yīng)光標(biāo)上的數(shù)值
  167.                                         //設(shè)置模式才可以按0-9
  168.                                         if(mode!=0)
  169.                                         {
  170.                                                 //溫度設(shè)置
  171.                                                 if(mode==1)
  172.                                                 {
  173.                                                         if(tLineIndex==0)//設(shè)定settingTemp1
  174.                                                         {
  175.                                                                 if(tRowIndex==0)//設(shè)置十位
  176.                                                                 {
  177.                                                                         unsigned char ge = settingTemp1%10;//舊的個(gè)位
  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)//設(shè)定settingTemp2
  187.                                                         {
  188.                                                                 if(tRowIndex==0)//設(shè)置十位
  189.                                                                 {
  190.                                                                         unsigned char ge = settingTemp2%10;//舊的個(gè)位
  191.                                                                         settingTemp2=key*10+ge;
  192.                                                                 }
  193.                                                                 else
  194.                                                                 {
  195.                                                                         unsigned char shi = settingTemp2/10;//舊的十位
  196.                                                                         settingTemp2=shi*10+key;
  197.                                                                 }
  198.                                                         }
  199.                                                 }
  200.                                                 //濕度設(shè)置
  201.                                                 else
  202.                                                 {
  203.                                                         if(hLineIndex==0)//設(shè)定settingHumi1
  204.                                                         {
  205.                                                                 if(hRowIndex==0)//設(shè)置十位
  206.                                                                 {
  207.                                                                         unsigned char ge = settingHumi1%10;//舊的個(gè)位
  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)//設(shè)定settingHumi2
  217.                                                         {
  218.                                                                 if(hRowIndex==0)//設(shè)置十位
  219.                                                                 {
  220.                                                                         unsigned char ge = settingHumi2%10;//舊的個(gè)位
  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;//填充溫度報(bào)警值
  247.         humiAlertDisBuf[10]='0'+humiAlert;//填充濕度報(bào)警值
  248.         LCD_P8x16Str(0,2,tempAlertDisBuf);//顯示溫度報(bào)警
  249.         LCD_P8x16Str(0,3,humiAlertDisBuf);//顯示濕度報(bào)警
  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;//填充溫度報(bào)警值
  260.         humiAlertDisBuf[10]='0'+humiAlert;//填充濕度報(bào)警值
  261.         UART1_SendStr(tempDisBuf);//發(fā)送溫度
  262.         UART1_SendStr(humiDisBuf);//發(fā)送濕度
  263.         UART1_SendStr(tempAlertDisBuf);//發(fā)送溫度報(bào)警
  264.         UART1_SendStr(humiAlertDisBuf);//發(fā)送濕度報(bào)警
  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)?'-':' ';//當(dāng)前修改行光標(biāo)指示
  272.         buf[5]='1';//填充Temp1
  273.         toString(buf+7,settingTemp1);//填充
  274.         LCD_P8x16Str(0,1,buf);//顯示settingTemp1
  275.         buf[1]=(tLineIndex==1)?'-':' ';//當(dāng)前修改行光標(biāo)指示
  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)?'-':' ';//當(dāng)前修改行光標(biāo)指示
  286.         buf[5]='1';//填充Temp1
  287.         toString(buf+7,settingHumi1);//填充
  288.         LCD_P8x16Str(0,1,buf);//顯示settingTemp1
  289.         buf[1]=(tLineIndex==1)?'-':' ';//當(dāng)前修改行光標(biāo)指示
  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();//初始化定時(shí)器0,用于定時(shí)檢測(cè)溫度濕度
  300.     UART1_Init(0xDc,0,1);
  301.     LCD_Init();
  302.    
  303.     while(1)
  304.     {
  305.                         //根據(jù)當(dāng)前模式顯示不同的界面
  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.                         //按鍵函數(shù)
  322.                         KeyFun();
  323.         
  324.                         //處理串口數(shù)據(jù)
  325.                         //協(xié)議:
  326.                         //設(shè)置定時(shí)時(shí)間:"*S1100#",其中1100表示1100ms,最大為9999ms(只能為4位)
  327.                         //設(shè)置溫度閾值:"*T1:50#",其中1表示閾值1,可為1,2;50表示設(shè)定該值為50(只能為2位)
  328.                         //設(shè)置濕度閾值:"*H1:50#",其中1表示閾值1,可為1,2;50表示設(shè)定該值為50(只能為2位)
  329.                         //獲取運(yùn)行參數(shù):"*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.                                 //判斷是否聲光報(bào)警
  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.                         //定時(shí)時(shí)間到,獲取一次溫濕度
  413.         getDHT11();
  414.    
  415.                                 //檢查溫度范圍是否需要報(bào)警,不報(bào)警tempAlert=0,一檔二檔報(bào)警分別為1,2
  416.                                 if(temp_value<=settingTemp1)
  417.                                 {
  418.                                         tempAlert=0;
  419.                                 }
  420.                                 else if(temp_value<=settingTemp2)
  421.                                 {
  422.                                         tempAlert=1;
  423. ……………………

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

所有資料51hei提供下載:
3.rar (113.75 KB, 下載次數(shù): 50)

回復(fù)

使用道具 舉報(bào)

ID:767530 發(fā)表于 2020-6-2 16:11 | 顯示全部樓層
兄弟有仿真圖嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品国产综合 | 中文字幕电影在线观看 | 性欧美精品一区二区三区在线播放 | 一级片成人 | 国产在线视频在线观看 | 99pao成人国产永久免费视频 | 精品欧美一区二区三区 | 亚洲精品视频网站在线观看 | 成人国产精品入口免费视频 | 中文字幕精品一区 | 国产精品久久 | 在线观看黄免费 | 欧美一区二区三区视频在线播放 | 亚洲一区二区在线视频 | 人人干天天干 | 亚洲视频精品 | 国产999精品久久久 午夜天堂精品久久久久 | 2020天天操| 色久影院| 看亚洲a级一级毛片 | 一级毛片免费 | 日韩精品一区二区在线 | 玖玖操 | 日韩一区二区在线看 | 久久久久久久亚洲精品 | 久久成人在线视频 | 亚洲免费精品 | 天天干夜夜操 | 国产av毛片 | 国产美女自拍视频 | 亚洲人成网亚洲欧洲无码 | 国产精品亚洲精品 | 五月婷婷丁香婷婷 | 欧美日韩国产一区二区三区 | 久久99精品国产 | 国产精品乱码一二三区的特点 | 久久国产精品久久久久久 | 亚洲一区二区三区在线视频 | 综合色在线 | 久久久久久久久久久福利观看 | 成人免费黄色 |