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

基于ATmega16的温度传感器DS18B20程序-数码管显示

[复制链接]
跳转到指定楼层
沙发
发表于 2014-7-28 16:54:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /******************************************************
  2. //文件名称:ATmega16--DS18B20--数码管显示
  3. //作    者:LXE
  4. //版    本:
  5. //日    期:2014.7.28
  6. //说    明:
  7. //修改记录:
  8. *******************************************************/

  9. #include <iom161v.h>

  10. #include <macros.h>

  11. #define uchar unsigned char
  12. #define uint unsigned int

  13. #define CLK_H()     PORTA |= BIT(1)         //74HC595时钟线
  14. #define CLK_L()     PORTA &= ~BIT(1)        //
  15. #define RCK_H()     PORTA |= BIT(2)         //74HC595锁存线
  16. #define RCK_L()     PORTA &= ~BIT(2)        //
  17. #define DATA_H()    PORTA |= BIT(3)         //74HC595数据线
  18. #define DATA_L()    PORTA &= ~BIT(3)        //

  19. #define DQ_OUT()    DDRA |= BIT(7)          //设置PA7为输出
  20. #define DQ_IN()     DDRA &= ~BIT(7)         //设置PA7为输入
  21. #define DQ_H()      PORTA |= BIT(7)         //PA7输出高电平
  22. #define DQ_L()      PORTA &= ~BIT(7)        //PA7输出低电平
  23. #define DQ          PINA & BIT(7)           //PA7数据读取


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

  29. /*******************************************************
  30. //函数名称:
  31. //函数功能:
  32. //输入参数:
  33. //返回参数:
  34. ********************************************************/
  35. void delay(void)
  36. {
  37.     asm("nop");
  38. }
  39. /*******************************************************
  40. //函数名称:
  41. //函数功能:
  42. //输入参数:
  43. //返回参数:
  44. ********************************************************/
  45. void delay_us(uint t)
  46. {
  47.     while(t--)
  48.         delay();
  49. }
  50. /*******************************************************
  51. //函数名称:
  52. //函数功能:
  53. //输入参数:
  54. //返回参数:
  55. ********************************************************/
  56. void DS18B20_Init(void)
  57. {
  58.     DQ_OUT();
  59.     DQ_H();
  60.     DQ_L();
  61.     delay_us(500);
  62.     DQ_H();
  63.     DQ_IN();
  64.     delay_us(40);
  65.     DQ_IN();
  66.     while(DQ);
  67.     DQ_OUT();
  68.     DQ_H();
  69.     delay_us(140);

  70. }
  71. /*******************************************************
  72. //函数名称:
  73. //函数功能:
  74. //输入参数:
  75. //返回参数:
  76. ********************************************************/

  77. uchar Read_Byte(void)
  78. {
  79.     uchar i,dat = 0;
  80.     for(i = 0;i < 8;i++)
  81.     {
  82.         DQ_OUT(); DQ_L();
  83.         dat >>= 1;
  84.         DQ_H();
  85.         DQ_IN();
  86.         if(DQ) dat |= 0x80;
  87.         delay_us(50);
  88.         DQ_OUT();DQ_H();
  89.     }
  90.     return dat;
  91. }
  92. /*******************************************************
  93. //函数名称:
  94. //函数功能:
  95. //输入参数:
  96. //返回参数:
  97. ********************************************************/
  98. void Write_Byte(uchar dat)
  99. {
  100.     uchar i;
  101.     for(i = 0;i < 8;i++)
  102.     {
  103.         DQ_OUT(); DQ_L();
  104.         if((dat & 0x01) == 0x01)DQ_H();
  105.         if((dat & 0x01) == 0x00)DQ_L();
  106.         delay_us(40);
  107.         DQ_H();
  108.         dat >>= 1;
  109.     }
  110. }
  111. /*******************************************************
  112. //函数名称:
  113. //函数功能:
  114. //输入参数:
  115. //返回参数:
  116. ********************************************************/
  117. void Read_Temperature(void)
  118. {
  119.     DS18B20_Init();                 //DS18B20初始化
  120.     Write_Byte(0xcc);
  121.     Write_Byte(0x44);
  122.     delay_us(600);
  123.     DS18B20_Init();                 //DS18B20初始化
  124.     Write_Byte(0xcc);
  125.     Write_Byte(0xbe);
  126.     Temp_Value[0] = Read_Byte();    //第一次读取数据放入低位
  127.     Temp_Value[1] = Read_Byte();    //第二次读取数据放入高位

  128. }

  129. /*******************************************************
  130. //函数名称:
  131. //函数功能:
  132. //输入参数:
  133. //返回参数:
  134. ********************************************************/
  135. void Sent_col_data(uchar dat)
  136. {
  137.     uchar i;
  138.     for(i = 0;i < 8;i++)
  139.     {
  140.         CLK_L();
  141.         if((dat & 0x80) == 0x80) DATA_H();
  142.         if((dat & 0x80) == 0x00) DATA_L();
  143.         CLK_H();
  144.         dat <<= 1 ;
  145.     }

  146. }
  147. /*******************************************************
  148. //函数名称:
  149. //函数功能:
  150. //输入参数:
  151. //返回参数:
  152. ********************************************************/
  153. void Sent_col(uchar dat1,uchar dat2)
  154. {
  155.     Sent_col_data(dat1);
  156.     Sent_col_data(dat2);
  157.     RCK_L();
  158.     RCK_H();
  159. }
  160. /*******************************************************
  161. //函数名称:
  162. //函数功能:
  163. //输入参数:
  164. //返回参数:
  165. ********************************************************/
  166. void display(void)
  167. {
  168.     uchar i;
  169.     Read_Temperature();                                 //启动DS18B20
  170.     Temp = ((Temp_Value[1] << 8) | Temp_Value[0])*6.25; //两位小数
  171.                                             /* 分辨率 */
  172.     /* 数据转换16进制转换为10进制  *0.0625则为整数xx  *0.625则有一位小数xx.x  *6.25则有两位小数xx.xx */

  173.     //温度范围0~125
  174.     buf[6] = Temp / 10000;
  175.     buf[5] = Temp % 10000 / 1000;
  176.     buf[4] = Temp % 1000 / 100;
  177.     buf[3] = Temp % 100 / 10;
  178.     buf[2] = Temp % 10;
  179.     //数据发送显示
  180.     for(i = 0;i < 8;i++)
  181.     {
  182.         if(i == 0) Sent_col(~table[i],0x58);                        //数码管最后一个显示c
  183.         else if(i == 1||i ==7||(i == 6&& buf[6]==0))
  184.             Sent_col(~table[i],0x00);    //无用位不显示
  185.         else if(i == 4) Sent_col(~table[i],seg[buf[i]]|0x80);       //在温度的个位上加上点
  186.         else Sent_col(~table[i],seg[buf[i]]);
  187.         delay_us(400);
  188.     }

  189. }
  190. /*******************************************************
  191. //函数名称:
  192. //函数功能:
  193. //输入参数:
  194. //返回参数:
  195. ********************************************************/
  196. int main(void)
  197. {
  198.     DDRA  = 0x0F;               //设置PA口为输出方式
  199.     PORTA = 0xFF;               //设置PA口为上拉模式
  200.     DS18B20_Init();
  201.     while(1)
  202.     {
  203.         display();              //数码管显示
  204.     }
  205.     return 0;
  206. }
复制代码
。。。这个程序时序非常重要,,因为只有一根数据线。。既要作输出又要作输入,时序不对则无法读取数据。
回复

使用道具 举报

推荐
 楼主| 发表于 2014-7-29 09:26:54 | 只看该作者
。。。编译软件ICCV8 for AVR CODEBLOCKS  烧写软件AVR_fighter。。。
回复 支持 1 反对 0

使用道具 举报

地板
发表于 2014-7-29 11:51:07 | 只看该作者
这个帖子真棒!
回复 支持 反对

使用道具 举报

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

本版积分规则

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