标题: STC12C5A60S2+DHT11温湿度传感器+数码管 [打印本页]

作者: bai_yun    时间: 2017-12-3 13:00
标题: STC12C5A60S2+DHT11温湿度传感器+数码管
附件文件为c,h的文本格式。


单片机源程序如下:
  1. /************************************************
  2. 项  目:温、湿度测量程序
  3. 单片机:STC12C5A60S2
  4. 传感器:DHT11
  5. 日  期:04.09
  6. ************************************************/

  7. #include <stc12c5a60s2.h>
  8. #include "delay.h"

  9. #define uint unsigned int
  10. #define uchar unsigned char

  11. sbit io = P2^0;                        //定义数据端口

  12. uchar data_byte;                //定义全局变量
  13. uchar RH,RL,TH,TL;                //定义全局变量

  14. unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};        // 显示段码值0~9
  15. uchar  TempData[5];                         //存储显示值的全局变量

  16. /******************** DHT11测试模块**********************/
  17. void start()                        //开始信号
  18. {
  19.         io=1;
  20.         delayus(10);
  21.         io=0;
  22.         delayms(30);                //10~60之间
  23.         io=1;
  24.         delayus(100);                //关键时间:35-250之间
  25. }

  26. /**********************接收一个字节**********************/
  27. uchar receive_byte()                       
  28. {
  29.         uchar i,temp,count;
  30.         for(i=0;i<8;i++)
  31.         {
  32.                 count=2;
  33.                 while((!io)&&count++)               
  34.                 temp=0;
  35.                 delayus(150);                                //关键时间:10~23之间
  36.                 if(io==1)temp=1;
  37.                 count=2;
  38.                 while((io)&&count++);
  39.                 if(count==1)break;
  40.                 data_byte<<=1;
  41.                 data_byte|=temp;
  42.         }
  43.         return data_byte;
  44. }

  45. /************************接收数据************************/

  46. void receive()                                       
  47. {
  48.         uchar T_H,T_L,R_H,R_L,check,num_check;
  49.         uchar count;

  50.         start();                                        //开始信号               
  51.         io=1;       
  52.         if(!io)                                                //读取DHT11响应信号
  53.         {
  54.                 count=2;
  55.                 while((!io)&&count++);        //DHT11高电平80us是否结束
  56.                 count=2;
  57.                 while((io)&&count++);               
  58.                 R_H=receive_byte();
  59.                 R_L=receive_byte();
  60.                 T_H=receive_byte();
  61.                 T_L=receive_byte();       
  62.                 check=receive_byte();
  63.                
  64.                 io=0;                                       
  65.                    delayms(1);                                //拉低延时               
  66.                 io=1;               
  67.                 num_check=R_H+R_L+T_H+T_L;
  68.                        
  69.                 if(num_check=check)
  70.                 {
  71.                         RH=R_H;
  72.                         RL=R_L;
  73.                         TH=T_H;
  74.                         TL=T_L;
  75.                         check=num_check;               
  76.                 }               
  77.         }
  78. }

  79. /**********************************************************************
  80.                                                         显示子函数
  81. **********************************************************************/
  82. void display()
  83. {       
  84.           P2=0xef;
  85.         P0=TempData[0];               
  86.         delayms(20);
  87.         P2=0xff;
  88.        
  89.         P2=0xdf;
  90.         P0=TempData[1];       
  91.         delayms(20);
  92.         P2=0xff;

  93.         P2=0xbf;
  94.         P0=TempData[2];
  95.         delayms(20);
  96.         P2=0xff;

  97.         P2=0x7f;
  98.         P0=TempData[3];       
  99.         delayms(20);
  100.         P2=0xff;
  101. }

  102. /*******************************************************************
  103.                                                定时器初始化子函数
  104. *******************************************************************/
  105. void InitTimer(void)                       
  106. {                                                                                                                                          
  107.         TMOD |= 0x01;                          //定义定时器T0,工作方式1   

  108.         TH0=(65536-20000)/256;
  109.         TL0=(65536-20000)%256;                        //50ms

  110.         ET0=1;
  111.         TR0=1;
  112.         EA = 1;                                //开总中断
  113.        
  114. }

  115. /***************************主函数**************************/
  116. void main()
  117. {
  118.         P0M0=0xFF;                                                //定义P0口为推挽输出 1111 1111
  119. //        P2M0=0xF0;                                                //定义P2.4 ~ P2.7口为推挽输出  1111 0000

  120.         InitTimer();

  121.         delayms(10);
  122.        
  123.         while(1)
  124.         {       
  125.                
  126.                 receive();               
  127.                
  128.                 TempData[0]=DuanMa[RH/10];                               
  129.                 TempData[1]=DuanMa[RH%10];                                                               
  130.                
  131.                 TempData[2]=DuanMa[TH/10];                       
  132.                 TempData[3]=DuanMa[TH%10];
  133.                
  134.                 delayms(20);
  135. ……………………

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

所有资料51hei提供下载:
程序文件.rar (1.94 KB, 下载次数: 159)




作者: gxlin    时间: 2017-12-6 17:09
请传电路图参考
作者: bbsbbc    时间: 2018-2-7 11:07
非常给力,顶顶顶
作者: 雪儿乌鸦    时间: 2018-4-17 16:16
谢谢分享,下来看看怎么样
作者: pjp69    时间: 2019-11-27 23:07
感谢分享,很不错!
作者: pjp69    时间: 2019-11-27 23:08
感谢分享,很不错




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1