查看: 1393|回复: 6
打印 上一主题 下一主题

基于ATmega16的DHT11温湿度检测-数码管显示

[复制链接]
跳转到指定楼层
沙发
发表于 2014-7-31 11:14:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lxe 于 2014-7-31 11:18 编辑

程序调试了好久,昨天终于发现了一个关键点。。多了一个分号。   细节决定成败!      大家懂的。。。结果虽然出来了,,但个人感觉偏差有点大,而且温度范围是0~55,但用一杯开水测试的时候超出了。。。怎么破?望大虾们指导指导。。
  1. /******************************************************
  2. //文件名称:
  3. //作    者:LXE
  4. //版    本:
  5. //日    期:2017-7-31
  6. //说    明:
  7. //修改记录:
  8. //时钟频率:8M
  9. *******************************************************/
  10. #include <iom161v.h>
  11. #include <macros.h>

  12. #define CLK_H()       PORTA |= BIT(1)       //595时钟线拉高PA1
  13. #define CLK_L()       PORTA &= ~BIT(1)      //595时钟线拉低PA1
  14. #define RCK_H()       PORTA |= BIT(2)       //595锁存线拉高PA2
  15. #define RCK_L()       PORTA &= ~BIT(2)      //595锁存线拉低PA2
  16. #define DATA_H()      PORTA |= BIT(3)       //595时钟线拉高PA3
  17. #define DATA_L()      PORTA &= ~BIT(3)      //595数据线拉低PA3

  18. #define DHT_OUT()     DDRA |= BIT(7)        //DHT11数据线输出设置PA7
  19. #define DHT_IN()      DDRA &= ~BIT(7)       //DHT11数据线输入设置PA7
  20. #define DHT_H()       PORTA |= BIT(7)       //DHT11数据线拉高PA7
  21. #define DHT_L()       PORTA &= ~BIT(7)      //DHT11数据线拉低PA7
  22. #define DHT           PINA &= BIT(7)        //DHT11寄存器数据读取PA7

  23. #define uchar unsigned char
  24. #define uint unsigned int

  25. uchar RH=0,RL=0,TH=0,TL=0;
  26. uchar seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};    //断码表
  27. uchar table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};            //位码表
  28. uchar buf[]={0,0,0,0,0,0,0,0};                                      //数据缓存区

  29. /*******************************************************
  30. //函数名称:
  31. //函数功能:1ms延时子程序
  32. //输入参数:
  33. //返回参数:
  34. ********************************************************/
  35. void delay_ms(uint ms)
  36. {
  37.          uint i ;
  38.          while(ms--)
  39.          {
  40.                   for(i = 0;i<990;i++) ;
  41.          }
  42. }
  43. /*******************************************************
  44. //函数名称:
  45. //函数功能:10us延时子程序
  46. //输入参数:
  47. //返回参数:
  48. ********************************************************/
  49. void delay_us(uchar us)//10us延时子程序
  50. {
  51.     uchar i;
  52.     while(us--)
  53.     {
  54.         for(i = 0;i < 11;i++);
  55.     }
  56. }
  57. /*******************************************************
  58. //函数名称:
  59. //函数功能:
  60. //输入参数:
  61. //返回参数:
  62. ********************************************************/
  63. void Sent_col_data(uchar dat)
  64. {
  65.     uchar i;
  66.     for(i = 0;i < 8;i++)
  67.     {
  68.         CLK_L();
  69.         if((dat & 0x80) == 0x80) DATA_H();
  70.         if((dat & 0x80) == 0x00) DATA_L();
  71.         CLK_H();
  72.         dat <<= 1 ;
  73.     }
  74. }
  75. /*******************************************************
  76. //函数名称:
  77. //函数功能:
  78. //输入参数:
  79. //返回参数:
  80. ********************************************************/
  81. void Sent_col(uchar dat1,uchar dat2)
  82. {
  83.     Sent_col_data(dat1);
  84.     Sent_col_data(dat2);
  85.     RCK_L();
  86.     RCK_H();
  87. }
  88. /*******************************************************
  89. //函数名称:
  90. //函数功能:
  91. //输入参数:
  92. //返回参数:
  93. ********************************************************/
  94. uchar receive_byte(void)                //接收一个字节
  95. {
  96.     uchar i,data=0;
  97.     uchar flag = 0;                     //超时标志
  98.         for(i = 0;i < 8;i++)
  99.         {
  100.                 data <<= 1;                     //将数据左移
  101.                 flag = 2;
  102.                 while((!(DHT))&&(flag++));      //等待低电平结束
  103.                 if(flag == 1) {break;}          //超时跳出
  104.                 delay_us(3);                    //延时30us
  105.                 if(DHT) {data |= 0x01;}         //判断高低数据
  106.                 flag = 2;
  107.                 while((DHT)&&(flag++));         //等待高电平结束
  108.                 //if(flag == 1) {break;}        //超时跳出
  109.         }
  110.         return data;
  111. }
  112. /*******************************************************
  113. //函数名称:
  114. //函数功能:
  115. //输入参数:
  116. //返回参数:
  117. ********************************************************/
  118. void receive(void)//接收数据
  119. {
  120.         uchar T_H,T_L,R_H,R_L,R_T;
  121.         uchar i;
  122.         uchar flag = 0;
  123.         /*************起始信号************/
  124.     DHT_OUT();DHT_L();               //
  125.         delay_ms(20);                    //>18ms
  126.         DHT_OUT();DHT_H();               //
  127.         delay_us(2);                     //延时20us
  128.         /*************读取数据************/
  129.         DHT_IN();
  130.         if(!(DHT))                       //读取DHT11响应信号
  131.         {
  132.         flag = 2;
  133.         while((!(DHT))&&(flag++));   //等待DHT11低电平结束
  134.         flag = 2;
  135.         while((DHT)&&(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.         DHT_OUT();                     //拉高释放总线
  142.         DHT_H();

  143.         if((R_H+T_H) == R_T)
  144.         {
  145.             RH = R_H;
  146.             TH = T_H;
  147.         }
  148.         }
  149.         /*******数据转换***********/
  150.         buf[7] = RH / 10;
  151.         buf[6] = RH % 10;
  152.         buf[3] = TH / 10;
  153.         buf[2] = TH % 10;
  154. }
  155. /*******************************************************
  156. //函数名称:
  157. //函数功能:
  158. //输入参数:
  159. //返回参数:
  160. ********************************************************/
  161. void timer0_Init(void)
  162. {
  163.     TCNT0 = 0x4E;     //赋初值2ms定时
  164.     TCCR0 = 0x03;     //设置TC0为CLK/256分频,启动TC0
  165.     TIMSK = 0x01;     //设置定时计数器的屏蔽寄存器
  166.     SEI();            //使能全局中断
  167. }
  168. /*******************************************************
  169. //函数名称:
  170. //函数功能:
  171. //输入参数:
  172. //返回参数:
  173. ********************************************************/
  174. #pragma interrupt_handler timer0_ovf_isr:10      //定时器0溢出2ms中断
  175. void timer0_ovf_isr(void)                        //数码管显示
  176. {
  177.     static uchar i = 0;
  178.     if(i == 0) {Sent_col(~table[i],0x58);}       //显示c
  179.     else if(i == 4) {Sent_col(~table[i],0x50);}  //显示r
  180.     else if(i==1||i ==5){Sent_col(0x00,0x00);}   //消去无用位
  181.     else {Sent_col(~table[i],seg[buf[i]]);}      //显示数据
  182.     if(++i > 8)i = 0;
  183. }
  184. /*******************************************************
  185. //函数名称:
  186. //函数功能:
  187. //输入参数:
  188. //返回参数:
  189. ********************************************************/
  190. int main(void)
  191. {
  192.     DDRA  = 0x0F;               //PA口初始化
  193.     PORTA = 0xFF;               //PA口上拉
  194.     receive();                  //接收数据
  195.     timer0_Init();              //定时器初始化
  196.     while(1)
  197.     {
  198.         receive();              //接收数据
  199.         //delay_ms(500);        //延时500ms再采集数据
  200.     }
  201.     return 0;
  202. }

复制代码


回复

使用道具 举报

板凳
发表于 2014-7-31 11:18:50 | 只看该作者
楼主高深莫测,在下佩服!
回复 支持 反对

使用道具 举报

地板
发表于 2014-7-31 12:20:35 | 只看该作者
为什么注释行里函数名称,参数都是空滴呢
回复 支持 反对

使用道具 举报

4#
 楼主| 发表于 2014-7-31 13:51:14 | 只看该作者
还你一世界 发表于 2014-7-31 12:20
为什么注释行里函数名称,参数都是空滴呢

。。这个我没写。。
回复 支持 反对

使用道具 举报

5#
发表于 2014-7-31 14:43:03 | 只看该作者
大腿啊,快来抱啊,我抱~~~
回复 支持 反对

使用道具 举报

6#
发表于 2014-7-31 15:14:43 | 只看该作者
高手领教了
回复 支持 反对

使用道具 举报

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

本版积分规则

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