找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3290|回复: 1
打印 上一主题 下一主题
收起左侧

单片机温湿度检测系统设计DHT22,HC-06,OLED(SPI)

[复制链接]
跳转到指定楼层
楼主
DHT22程序是在百度文库找的DHT11程序修改过来的,OLED程序为中景园OLED给的参考程序

电路原理图如下:


单片机源程序如下:
  1. #include "STC12C5a60s2.H"
  2. #include "oled.h"
  3. #include "dht11.h"
  4. #include "intrins.h"
  5. extern unsigned int F16T,F16RH;
  6. unsigned long vot = 0;
  7. unsigned int  _125us =0;
  8. unsigned int _100ms=0;
  9. unsigned int a;
  10. bit _1s_flag = 0;
  11. bit _100ms_flag=0;
  12. bit flag=0;
  13. unsigned int temp;
  14. unsigned int temp1;
  15. unsigned char AD_cnt=0;
  16. unsigned int AD_max,AD_sum,AD_data,AD_value=0;
  17. unsigned int AD_min=0xffff;
  18. //-------------------------------------------------
  19. #define SAMPLE_CNT  10
  20. #define ADC_POWER 0x80           // ADC电源
  21. #define ADC_FLAG  0x10          // ADC转换结束标志
  22. #define ADC_START 0x08          // ADC启动控制位
  23. #define ADC_SPEEDLL 0X00  // 540 clocks
  24. #define ADC_SPEEDL  0X20  // 360 clocks
  25. #define ADC_SPEEDH  0X40  // 180 clocks
  26. #define ADC_SPEEDHH 0X60  // 90 clocks
  27. #define AUXR1_ADRJ  0x04  // 转换结果数据格式控制
  28. /*------------------------------------------------
  29.               ADC初始化函数
  30. ------------------------------------------------*/
  31. void ADC_Init(void)
  32. {
  33.         P1ASF=0x07;                 // P1.0→P1.3为模拟量输入通道
  34.         ADC_RES=0;
  35.         ADC_RESL=0;
  36.         ADC_CONTR=ADC_CONTR|ADC_POWER|ADC_SPEEDLL;  // 开启AD转换器电源,设定转换速度为540 clocks        
  37.         AUXR1&=~AUXR1_ADRJ;  // 转换结果高8位放ADC_RES,低2位放ADC_RESL,左对齐               
  38. }
  39. /*------------------------------------------------
  40.             AD转换函数
  41. ------------------------------------------------*/
  42. unsigned int AD_Read(unsigned char channel)
  43. {
  44.         ADC_CONTR=ADC_CONTR|ADC_START|channel;         // 启动AD转换,选择转换通道
  45.    _nop_(); _nop_(); _nop_(); _nop_();                 // 等待成功设置ADC_CONTR
  46.         while(!(ADC_CONTR&ADC_FLAG));  // 等待转换结束        
  47.         ADC_CONTR=ADC_CONTR&(~ADC_FLAG)&(~ADC_START);         // 清转换结束标志,关闭AD转换
  48.         //ADC_CONTR&=0xef;                                        // 清除ADC_FLAG位
  49.         return(ADC_RES*4+ADC_RESL);  // 转换结果高8位放ADC_RES,低2位放ADC_RESL,左对齐                                                                                 
  50. }  

  51. //-------------------------------------------------




  52. //-------------------------------------------------
  53. void UsartInit()
  54. {        
  55.         SCON=0X50;                        //设置为工作方式1
  56.         TMOD=0X20;                        //设置计数器工作方式2
  57.         PCON=0X80;                        //波特率加倍
  58.         TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
  59.         TL1=0XF3;
  60.         ES=1;                                                //打开接收中断
  61.         EA=1;                                                //打开总中断
  62.         TR1=1;                                        //打开计数器
  63. }
  64. void InitTimer0(void)
  65. {
  66.     TMOD = TMOD|0x01;   
  67.     TH0 = 0x0FA;
  68.     TL0 = 0x24;
  69.     EA = 1;
  70.     ET0 = 1;
  71.     TR0 = 1;
  72. }
  73. void timetable()
  74. {
  75.         if(_100ms>=800)
  76.         {
  77.                 _100ms=0;
  78.                 _100ms_flag=1;        
  79.         }
  80.         if(_125us>=8000)
  81.         {
  82.                 _125us=0;
  83.                 _1s_flag=1;
  84.         }         
  85. }
  86. void display ()
  87. {
  88.                 u8 t;
  89.                  u8 x;
  90.                 u8 y;        

  91.                 if(flag==0)                  //温度正数
  92.                 {
  93.                         OLED_ShowChar(0,2,32);
  94.                         OLED_ShowChar(18,2,32);
  95.                         OLED_ShowChar(36,2,32);
  96.                         OLED_ShowChar(72,2,32);           ////清屏
  97.                         t=F16T/100+48;
  98.                         if(t<=48) t=' ';
  99.                         OLED_ShowChar(18,2,t);         //10位
  100.                            t=F16T%100/10+48;
  101.                         OLED_ShowChar(36,2,t);         //个位
  102.                         t=F16T%10+48;
  103.                         OLED_ShowChar(72,2,t);         //小数点后一位
  104.                 }
  105.                 else           //温度负数
  106.                 {
  107.                         OLED_ShowChar(0,2,32);
  108.                         OLED_ShowChar(18,2,32);
  109.                         OLED_ShowChar(36,2,32);
  110.                         OLED_ShowChar(72,2,32);           ////清屏
  111.                         OLED_ShowChar(0,2,'-');
  112.                         t=F16T/100+48;
  113.                         if(t<=48) t=' ';
  114.                         OLED_ShowChar(18,2,t);         //10位
  115.                            t=F16T%100/10+48;
  116.                         OLED_ShowChar(36,2,t);         //个位
  117.                         t=F16T%10+48;
  118.                         OLED_ShowChar(72,2,t);         //小数点后一位
  119.                
  120.                 }


  121.                 //湿度
  122.                 OLED_ShowChar(0,4,32);
  123.                 OLED_ShowChar(18,4,32);
  124.                 OLED_ShowChar(54,4,32);           ////清屏
  125.                 x=F16RH/100+48;
  126.                 if(x<=48) x=' ';
  127.                 OLED_ShowChar(0,4,x);           //10位
  128.                    x=F16RH%100/10+48;
  129.                 OLED_ShowChar(18,4,x);           //个位
  130.         
  131.                 x=F16RH%10+48;
  132.                 OLED_ShowChar(54,4,x);           //小数点后一位
  133.                
  134.         

  135.                    //电压
  136.                 OLED_ShowChar(0,6,32);
  137.                 OLED_ShowChar(18,6,32);
  138.                 OLED_ShowChar(54,6,32);    //清屏
  139.                 OLED_ShowChar(72,6,32);                                                                                                           //xx.xx
  140.                 y=(unsigned char)(temp1/1000+48);
  141.                 if(y<=48) y=' ';
  142.                 OLED_ShowChar(0,6,y);           //10位
  143.                    y=(unsigned char)(temp1%1000/100+48);
  144.                 OLED_ShowChar(18,6,y);           //个位
  145.                 y=(unsigned char)(temp1%1000%100/10+48);
  146.                 OLED_ShowChar(54,6,y);           //小数点后一位        
  147.                 y=(unsigned char)(temp1%10+48);
  148.                 OLED_ShowChar(72,6,y);            //小数点后两位               
  149. }

  150. void  main(void)
  151. {        
  152.          //        bitinit ();
  153.                 //ADinit();
  154.                 AUXR = AUXR|0x80;  // T0, 1T Mode
  155.                 ADC_Init();
  156.                 OLED_Init();                        //初始化OLED
  157.                 OLED_Clear();
  158.                 UsartInit();                          
  159.                 InitTimer0();           //初始化定时器0
  160.                
  161.                 OLED_ShowCHinese(0,0,0);//温                                                                                                  0 18 36 54 72 90 108
  162.                 OLED_ShowCHinese(18,0,1);//湿
  163.                 OLED_ShowCHinese(36,0,2);//度
  164.                 OLED_ShowCHinese(54,0,3);//检
  165.                 OLED_ShowCHinese(72,0,4);//测
  166.                 OLED_ShowCHinese(90,0,5);//系
  167.                 OLED_ShowCHinese(108,0,6);//统
  168.                 OLED_ShowString(90,6,"V");    //V
  169.                 OLED_ShowChar(36,6,46);           //.          电压
  170.                 OLED_ShowChar(54,2,46);         //.    温度
  171.                 OLED_ShowChar(36,4,46);           //.        湿度
  172.                 OLED_ShowString(72,4,"%RH");    //%RH
  173.                 OLED_ShowString(90,2,"C");//C
  174.                
  175.         while(1)
  176.         {        

  177.                 timetable();
  178.                 if(_100ms_flag==1)
  179.                 {
  180.                         _100ms_flag=0;
  181.                         if(AD_cnt<10)        // 多次读AD进行数字滤波                        
  182.                         {
  183.                                 AD_value=AD_Read(1);
  184.                                 if(AD_value>AD_max) AD_max=AD_value;
  185.                                 if(AD_value<AD_min) AD_min=AD_value;
  186.                                 AD_sum=AD_sum+AD_value;
  187.                                 AD_cnt++;        
  188.                         }
  189.                         else  
  190.                         {
  191.                                 AD_sum=AD_sum-AD_max-AD_min;
  192.                                 AD_value=AD_sum/8;        
  193.                                 temp=AD_value;
  194.                                 vot=(unsigned long)(temp)*5*100*2;
  195.                                 temp1=(unsigned int)(vot/1023);
  196.                                 AD_max=0;
  197.                                 AD_min=0xffff;
  198.                                 AD_value=0;
  199.                                 AD_cnt=0;
  200.                                 AD_sum=0;
  201.                                 
  202.                         }
  203.         
  204.                 }
  205.                 if(_1s_flag==1)
  206.                 {
  207.                         _1s_flag=0;        
  208.                         getDHT11();        
  209.                         if(F16T>0x8000)           //用于判断DHT22温度是否为负数 1xxx xxxx xxxx xxxx
  210.                         {
  211.                                 flag=1;
  212.                                 F16T=F16T&0x7fff;
  213.                         }
  214.                         else {flag=0;}         
  215.                         display();        
  216.                 }        
  217.         }                  
  218. }

  219. void Timer0Interrupt(void) interrupt 1                                //定时中断
  220. {
  221.         //125us
  222.     TH0 = 0x0FA;
  223.     TL0 = 0x24;
  224.            _125us++;
  225.         _100ms++;
  226.         
  227. }



  228. void Usart() interrupt 4                                  //串口中断
  229. {
  230.         u8 receiveData;
  231.         receiveData=SBUF;//出去接收到的数据
  232.         RI = 0;//清除接收中断标志位
  233.         if(receiveData=='1')                  //湿度
  234.         {
  235.                 SBUF=' ';
  236.                 while(!TI);                                  //等待发送数据完成
  237.                 TI=0;                                                 //清除发送完成标志位        

  238.                 SBUF='\n';
  239.                 while(!TI);                                  //等待发送数据完成
  240.                 TI=0;
  241.                
  242.                 SBUF=F16RH/100+'0';                           //十位
  243.                 while(!TI);                                  //等待发送数据完成
  244.                 TI=0;
  245.         
  246.                 SBUF=F16RH%100/10+'0';                        //个位
  247.                 while(!TI);                                  //等待发送数据完成
  248.                 TI=0;

  249.                 SBUF='.';
  250.                 while(!TI);                                  //等待发送数据完成
  251.                 TI=0;

  252.                 SBUF=F16RH%10+'0';
  253.                 while(!TI);                                  //等待发送数据完成
  254.                 TI=0;

  255.                 SBUF='%';
  256.                 while(!TI);                                  //等待发送数据完成
  257.                 TI=0;
  258.         }


  259.         if(receiveData=='2')                 //温度
  260.         {
  261.                 if(flag==0)
  262.                 {
  263.                         SBUF=' ';
  264.                         while(!TI);                                  //等待发送数据完成
  265.                         TI=0;                                                 //清除发送完成标志位        
  266.         
  267.                         SBUF='\n';
  268.                         while(!TI);                                  //等待发送数据完成
  269.                         TI=0;
  270.                         
  271.                         SBUF=F16T/100+'0';                           //十位
  272.                         while(!TI);                                  //等待发送数据完成
  273.                         TI=0;
  274.                
  275.                         SBUF=F16T%100/10+'0';                        //个位
  276.                         while(!TI);                                  //等待发送数据完成
  277.                         TI=0;
  278.         
  279.                         SBUF='.';
  280.                         while(!TI);                                  //等待发送数据完成
  281.                         TI=0;
  282.         
  283.                         SBUF=F16T%10+'0';
  284.                         while(!TI);                                  //等待发送数据完成
  285.                         TI=0;
  286.         
  287.                         SBUF='C';
  288.                         while(!TI);                                  //等待发送数据完成
  289.                         TI=0;

  290.                         
  291.                 }
  292.                 if(flag==1)
  293.                 {
  294.                         SBUF=' ';
  295.                         while(!TI);                                  //等待发送数据完成
  296.                         TI=0;                                                 //清除发送完成标志位        
  297.         
  298.                         SBUF='\n';
  299.                         while(!TI);                                  //等待发送数据完成
  300.                         TI=0;

  301.                         SBUF='-';
  302.                         while(!TI);                                  //等待发送数据完成
  303.                         TI=0;                                                 //清除发送完成标志位
  304.                         
  305.                         SBUF=F16T/100+'0';                           //十位
  306.                         while(!TI);                                  //等待发送数据完成
  307.                         TI=0;
  308.                
  309.                         SBUF=F16T%100/10+'0';                        //个位
  310.                         while(!TI);                                  //等待发送数据完成
  311.                         TI=0;
  312.         
  313.                         SBUF='.';
  314.                         while(!TI);                                  //等待发送数据完成
  315.                         TI=0;
  316.         
  317.                         SBUF=F16T%10+'0';
  318.                         while(!TI);                                  //等待发送数据完成
  319.                         TI=0;
  320.         
  321.                         SBUF='C';
  322.                         while(!TI);                                  //等待发送数据完成
  323.                         TI=0;

  324.                         
  325.                 }
  326.         }


  327.         if(receiveData=='3')                //电压
  328.         {
  329.                 SBUF=' ';
  330.                 while(!TI);                                  //等待发送数据完成
  331.                 TI=0;                                                 //清除发送完成标志位        

  332.                 SBUF='\n';
  333.                 while(!TI);                                  //等待发送数据完成
  334.                 TI=0;

  335.                 a=temp1/1000+48;
  336.                 if(a==48)
  337.                 {
  338.                         SBUF=' ';
  339.                 }
  340.                 else {SBUF=temp1/1000+48;}
  341.                 while(!TI);                                  //等待发送数据完成
  342.                 TI=0;

  343.                 SBUF=temp1%1000/100+48;
  344.                 while(!TI);                                  //等待发送数据完成
  345.                 TI=0;

  346.                 SBUF='.';
  347.                 while(!TI);                                  //等待发送数据完成
  348.                 TI=0;

  349.                 SBUF=temp1%1000%100/10+48;
  350.                 while(!TI);                                  //等待发送数据完成
  351.                 TI=0;

  352.                 SBUF=temp1%10+48;
  353.                 while(!TI);                                  //等待发送数据完成
  354.                 TI=0;

  355.                 SBUF='V';
  356.                 while(!TI);                                  //等待发送数据完成
  357.                 TI=0;

  358.                
  359.         }

  360.                                                 
  361. }
复制代码

所有资料51hei提供下载:
新建文件夹.rar (90.04 KB, 下载次数: 72)


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:585455 发表于 2019-7-26 15:14 | 只看该作者
感謝無私分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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