查看: 1979|回复: 2
打印 上一主题 下一主题

为什么会没用...战友帮忙找问题啊..是温湿度的程序

[复制链接]
跳转到指定楼层
沙发
发表于 2014-8-11 14:24:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <reg51.h>
  2. #include <intrins.h>

  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;

  5. #define disdata P0                //数码管段输入口
  6. #define discan  P2                //数码管位输入口

  7. sfr AUXR        = 0x8E;                //特殊寄存器的地址

  8. sfr P0M1        = 0x93;
  9. sfr P0M0        = 0x94;                //P0端口推挽输出设置地址

  10. sbit DQ                = P1^7;                //DHT11的输入输出端口

  11. /***********温湿度的整数位*******************/
  12. uchar code dis_7[]=
  13. {       
  14.            0x3f,                  //"0"的字形表,0B00111111
  15.     0x06,                  //"1"的字形表,0B00000110
  16.     0x5B,                  //"2"的字形表,0B01011011
  17.     0x4f,                  //"3"的字形表,0B01001111
  18.     0x66,                  //"4"的字形表,0B01100110
  19.     0x6D,                  //"5"的字形表,0B01101101
  20.     0x7D,                  //"6"的字形表,0B01111101
  21.     0x07,                  //"7"的字形表,0B00000111
  22.     0x7F,                  //"8"的字形表,0B01111111
  23.     0x6F,                  //"9"的字形表,0B01101111
  24.     0x00,                   // 全灭消隐
  25.     0x40,                  //"-"的字形表,0B01000000
  26. };
  27. uchar code scan_con[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};    //列扫描控制字
  28. uchar data display[]={0x00,0x00,0x0A,0x0A,0x00,0x00,0x0A,0x0A};                //存取缓存区

  29. uchar RH,TH;                //温湿度的整数存取
  30. /***********************************************************************
  31. //函数名称:delay(uint t)
  32. //函数功能:延时程序 1*t us 系统时钟工作在12MHZ下,机器周期为1/12 us
  33.                         _nop_()运行所需要时间为1个机器周期。do while函数占1个机器周期
  34.                         t--占1个机器周期,10个_nop_()占10机器周期,共占12个机器周期
  35. //入口参数:所要延时的时间 t  t=n 就延时n us
  36. //返回参数:无
  37. ***********************************************************************/
  38. void delay(uint t)
  39. {
  40.         do{
  41.             _nop_();_nop_();_nop_();_nop_();
  42.             _nop_();_nop_();_nop_();_nop_();
  43.             _nop_();_nop_();
  44.         }while(t--);
  45. }
  46. /*********************************************************************
  47. //函数名称:delay20ms()
  48. //函数功能:软件延时20ms
  49. //入口参数:无
  50. //返回参数:无
  51. *********************************************************************/
  52.   void delay20ms()                //@12.000MHz
  53. {
  54.         int j,k;
  55.     for(j=400;j>0;j--)
  56.             for(k=600;k>0;k--);          
  57. }               
  58. /*********************************************************************
  59. //函数名称:display_data()
  60. //函数功能:数码管显示温湿度
  61. //入口参数:无
  62. //返回参数:无
  63. *********************************************************************/
  64. void display_data(void)
  65. {
  66.         uchar k;
  67.         disdata=dis_7[display[k]];                //输入段选               
  68.         discan=scan_con[k];                                //位扫描
  69.         if(++k>=8)
  70.                 k=0;
  71. }
  72. /*********************************************************************
  73. //函数名称:tm0_init()
  74. //函数功能:定时器0的初始设置
  75. //入口参数:无
  76. //返回参数:无
  77. *********************************************************************/
  78. void tm0_init(void)                        //2毫秒@12.000MHz
  79. {
  80.         AUXR        &= 0x7F;        //定时器时钟12T模式
  81.         TMOD        &= 0xF0;                //设置定时器模式
  82.         TL0 = 0x30;                //设置定时初值
  83.         TH0 = 0xF8;                //设置定时初值
  84.         ET0        = 1;
  85.         EA         = 1;
  86.         TF0 = 0;                //清除TF0标志
  87.         TR0 = 1;                //定时器0开始计时
  88. }
  89. /*********************************************************************
  90. //函数名称:receive_byte()
  91. //函数功能:接受DHT11的8位数据
  92. //入口参数:无
  93. //返回参数:value
  94. *********************************************************************/
  95. uchar receive_byte(void)
  96. {
  97.         uchar i,value=0;
  98.         uchar flag;                //超时标志
  99.         for(i=0;i<8;i++)
  100.         {
  101.                 value<<=1;
  102.                 flag = 2;
  103.                 while(!(DQ) && (flag++)) ;                //等待低电平结束
  104.                 if(flag==1){break;}
  105.                 delay(20);                                                 //延时20us
  106.                 if(DQ){value |=0x01;}                        //还处于高电平,输出为1
  107.                 flag = 2;
  108.                 while((DQ) && (flag++)) ;                //等待高电平结束
  109.         }
  110.         return value;
  111. }
  112. /*********************************************************************
  113. //函数名称:receive_data()
  114. //函数功能:接受40位数据,并校验和处理
  115. //入口参数:无
  116. //返回参数:无
  117. *********************************************************************/
  118. void receive_data(void)
  119. {
  120.         uchar R_H,R_L,T_H,T_L,R_T;
  121.         uchar flag=0;

  122.         /*********起始信号********/
  123.         DQ = 0;
  124.         delay20ms();                 //>18ms
  125.         DQ = 1;
  126.         delay(20);                        //延时20us
  127.         /********读取数据***********/
  128.         if(!(DQ))
  129.         {
  130.                 flag = 2;
  131.                 while(!(DQ) && (flag++)) ;                //等待低电平结束
  132.                 flag = 2;
  133.                 while((DQ) &&  (flag++)) ;                 //等待高电平结束

  134.                 R_H = receive_byte();
  135.                 R_L = receive_byte();
  136.                 T_H = receive_byte();
  137.                 T_L = receive_byte();
  138.                 R_T = receive_byte();

  139.                 DQ = 1;                                                //拉高释放总线

  140.                 if((R_H+R_L)==R_T)
  141.                 {
  142.                         RH=R_H;
  143.                         TH=T_H;
  144.                         display[0]=RH/10;                //读取湿度的十位
  145.                         display[1]=RH%10;                //读取湿度的个位
  146.                         display[4]=TH/10;                //读取温度的十位
  147.                         display[5]=TH%10;                //读取温度的个位
  148.                 }
  149.         }
  150. }
  151. /*********************************************************************
  152. //函数名称:tm0_isr()
  153. //函数功能:数码管的扫描显示
  154. //入口参数:无
  155. //返回参数:无
  156. *********************************************************************/
  157. void tm0_isr() interrupt 1
  158. {
  159.         display_data();
  160. }
  161. /***********主函数**********/
  162. void main()
  163. {
  164.         P0M1 = 0x00;
  165.         P0M0 = 0xFF;                 //P0的推挽输出
  166.        
  167.         tm0_init();                        //定时器0初始化
  168.         receive_data();
  169.         while(1)
  170.         {
  171.                 receive_data();                //接受数据
  172.         }
  173. }       
复制代码

回复

使用道具 举报

板凳
 楼主| 发表于 2014-8-11 16:29:13 | 只看该作者
  1. #include <reg51.h>
  2. #include <intrins.h>

  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;

  5. #define disdata P0                //数码管段输入口
  6. #define discan  P2                //数码管位输入口

  7. sfr AUXR        = 0x8E;                //特殊寄存器的地址

  8. sfr P0M1        = 0x93;
  9. sfr P0M0        = 0x94;                //P0端口推挽输出设置地址

  10. sbit DQ                = P1^7;                //DHT11的输入输出端口

  11. /***********温湿度的整数位*******************/
  12. uchar code dis_7[]=
  13. {       
  14.            0x3f,                  //"0"的字形表,0B00111111
  15.     0x06,                  //"1"的字形表,0B00000110
  16.     0x5B,                  //"2"的字形表,0B01011011
  17.     0x4f,                  //"3"的字形表,0B01001111
  18.     0x66,                  //"4"的字形表,0B01100110
  19.     0x6D,                  //"5"的字形表,0B01101101
  20.     0x7D,                  //"6"的字形表,0B01111101
  21.     0x07,                  //"7"的字形表,0B00000111
  22.     0x7F,                  //"8"的字形表,0B01111111
  23.     0x6F,                  //"9"的字形表,0B01101111
  24.     0x00,                   // 全灭消隐
  25.     0x40,                  //"-"的字形表,0B01000000
  26. };
  27. uchar code scan_con[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};    //列扫描控制字
  28. uchar data display[]={0x00,0x00,0x0A,0x0A,0x00,0x00,0x0A,0x0A};                //存取缓存区

  29. uchar RH=5,TH=5;                //温湿度的整数存取
  30. /***********************************************************************
  31. //函数名称:delay(uint t)
  32. //函数功能:延时程序 1*t us 系统时钟工作在12MHZ下,机器周期为1/12 us
  33.                         _nop_()运行所需要时间为1个机器周期。do while函数占1个机器周期
  34.                         t--占1个机器周期,10个_nop_()占10机器周期,共占12个机器周期
  35. //入口参数:所要延时的时间 t  t=n 就延时n us
  36. //返回参数:无
  37. ***********************************************************************/
  38. void delay(uint t)
  39. {
  40.         do{
  41.             _nop_();_nop_();_nop_();_nop_();
  42.             _nop_();_nop_();_nop_();_nop_();
  43.             _nop_();_nop_();
  44.         }while(t--);
  45. }
  46. /*********************************************************************
  47. //函数名称:delay20ms()
  48. //函数功能:软件延时20ms
  49. //入口参数:无
  50. //返回参数:无
  51. *********************************************************************/
  52.   void delay20ms()                //@12.000MHz
  53. {
  54.         int j,k;
  55.     for(j=400;j>0;j--)
  56.            for(k=600;k>0;k--);          
  57. }               
  58. /*********************************************************************
  59. //函数名称:display_data()
  60. //函数功能:数码管显示温湿度
  61. //入口参数:无
  62. //返回参数:无
  63. *********************************************************************/
  64. void display_data(void)
  65. {
  66.         static char k;
  67.         disdata=dis_7[display[k]];                //输入段选               
  68.         discan=scan_con[k];                                //位扫描
  69.         if(++k>=8)
  70.                 k=0;
  71. }
  72. /*********************************************************************
  73. //函数名称:tm0_init()
  74. //函数功能:定时器0的初始设置
  75. //入口参数:无
  76. //返回参数:无
  77. *********************************************************************/
  78. void tm0_init(void)                        //2毫秒@12.000MHz
  79. {
  80.         AUXR        &= 0x7F;        //定时器时钟12T模式
  81.         TMOD        &= 0xF0;                //设置定时器模式
  82.         TL0 = 0x30;                //设置定时初值
  83.         TH0 = 0xF8;                //设置定时初值
  84.         ET0        = 1;
  85.         EA         = 1;
  86.         TF0 = 0;                //清除TF0标志
  87.         TR0 = 1;                //定时器0开始计时
  88. }
  89. /*********************************************************************
  90. //函数名称:receive_byte()
  91. //函数功能:接受DHT11的8位数据
  92. //入口参数:无
  93. //返回参数:value
  94. *********************************************************************/
  95. uchar receive_byte(void)                //接收一个字节
  96. {
  97.     uchar i,value=0;
  98.         uchar flag;                         //超时标志
  99.     for(i = 0;i<8;i++)
  100.     {
  101.                  value<<=1;
  102.                  flag=2;
  103.                  while(!(DQ)&&(flag++))        ;        //等待低电平结束
  104.                  if(flag==1){break;}                //超时跳出
  105.                  delay(20);
  106.                  if(DQ){value|=0x01;}                //等待高电平结束
  107.                  flag=2;
  108.                  while((DQ)&&(flag++)) ;
  109.     }
  110.         return value;
  111. }
  112. /*********************************************************************
  113. //函数名称:receive_data()
  114. //函数功能:接受40位数据,并校验和处理
  115. //入口参数:无
  116. //返回参数:无
  117. *********************************************************************/
  118. void receive_data(void)//接收数据
  119. {                  
  120.     uchar T_H,T_L,R_H,R_L,R_T;
  121.         uchar flag=0;
  122.        
  123. /*************起始信号************/
  124.         DQ=0;
  125.         delay20ms();            //>18ms
  126.         DQ=1;  
  127.         delay(20);      
  128. /*************读取数据************/
  129.       
  130.         if(!(DQ))                       //读取DHT11响应信号
  131.     {        
  132.                 flag=2;
  133.                 while(!(DQ)&&(flag++))        ;  //等待DHT11低电平结束
  134.         flag=2;
  135.                 while((DQ)&&(flag++)) ;    //等待DHT11高电平结束
  136.         R_H = receive_byte();
  137.         R_L = receive_byte();
  138.         T_H = receive_byte();
  139.         T_L = receive_byte();
  140.         R_T = receive_byte();

  141.         DQ=1;                  //拉高释放总线
  142.         
  143.         if((R_H+T_H) == R_T)
  144.         {
  145.                 RH = R_H;
  146.             TH = T_H;
  147.                         display[0]=RH/10 ;
  148.                         display[1]=RH%10;
  149.                         display[4]=TH/10;
  150.                         display[5]=TH%10;
  151.         }
  152.         }
  153. }
  154. /*********************************************************************
  155. //函数名称:tm0_isr()
  156. //函数功能:数码管的扫描显示
  157. //入口参数:无
  158. //返回参数:无
  159. *********************************************************************/
  160. void tm0_isr() interrupt 1
  161. {
  162.         display_data();
  163. }
  164. /***********主函数**********/
  165. void main()
  166. {
  167.         P0M1 = 0x00;
  168.         P0M0 = 0xFF;                 //P0的推挽输出
  169.        
  170.         tm0_init();                        //定时器0初始化
  171.         receive_data();
  172.         while(1)
  173.         {
  174.                 receive_data();                //接受数据
  175.         }
  176. }       
复制代码
回复 支持 反对

使用道具 举报

地板
 楼主| 发表于 2014-8-11 16:30:37 | 只看该作者
战友们。。。找茬呢。。。帮我找找回复帖和楼主贴的区别。。。为什么回复帖行。。楼主贴不行
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

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