找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1989|回复: 0
收起左侧

DS18B20驱动程序

[复制链接]
ID:177272 发表于 2017-3-21 16:53 | 显示全部楼层 |阅读模式
微信截图.png

  1. #include<reg52.h>
  2. code unsigned char seg7code[11]={0x3f,0x06,0x5b,0x4f,0x66,
  3.                                  0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //显示段码
  4. void Delay(unsigned int tc)     //显示延时程序
  5. {while( tc != 0 )
  6. {unsigned int i;
  7.   for(i=0; i<100; i++);
  8.   tc--;}
  9. }
  10. sbit TMDAT =P3^1; //DS18B20的数据输入/输出脚DQ,根据情况设定
  11. unsigned int sdata;//测量到的温度的整数部分
  12. unsigned char xiaoshu1;//小数第一位
  13. unsigned char xiaoshu2;//小数第二位
  14. unsigned char xiaoshu;//两位小数
  15. bit  fg=1;        //温度正负标志
  16. void dmsec (unsigned int count)       //延时部分
  17. {   
  18. unsigned char i;
  19. while(count--)
  20. {for(i=0;i<115;i++);}
  21. }         
  22. void tmreset (void)       //发送复位
  23. {                              
  24. unsigned char i;
  25. TMDAT=0;   for(i=0;i<103;i++);   
  26. TMDAT = 1; for(i=0;i<4;i++);      
  27. }         
  28. bit tmrbit (void)       //读一位//
  29. {                           
  30.   unsigned int i;      
  31.   bit dat;      
  32.   TMDAT = 0;
  33.   i++;      
  34.   TMDAT = 1;
  35.   i++; i++;  //微量延时   //
  36.   dat = TMDAT;     
  37. for(i=0;i<8;i++);
  38.   return (dat);      
  39. }         
  40. unsigned char tmrbyte (void)        //读一个字节
  41.   {                 
  42.   unsigned char i,j,dat;      
  43.   dat = 0;      
  44.   for (i=1;i<=8;i++)      
  45.   { j = tmrbit();  dat = (j << 7) | (dat >> 1); }         
  46.    return (dat);   
  47. }         
  48. void tmwbyte (unsigned char dat)     //写一个字节
  49. {                       
  50.   unsigned char j,i;      
  51.   bit testb;      
  52.   for (j=1;j<=8;j++)      
  53.   { testb = dat & 0x01;     
  54.    dat = dat >> 1;      
  55.    if (testb)     
  56.    {   TMDAT = 0;         //写0  
  57.      i++; i++;                              
  58.     TMDAT = 1;   
  59.     for(i=0;i<8;i++); }

  60.    else      
  61.   {  TMDAT = 0;         //写0
  62.      for(i=0;i<8;i++);
  63.   TMDAT = 1;     
  64.      i++; i++;}                              
  65. }        
  66. }  
  67. void tmstart (void)       //发送ds1820 开始转换
  68.   {  tmreset();  //复位     
  69.   dmsec(1);  //延时   
  70.   tmwbyte(0xcc);  //跳过序列号命令   
  71.   tmwbyte(0x44);  //发转换命令 44H,
  72.   }         
  73. void tmrtemp (void)       //读取温度
  74.     {                          
  75.   unsigned char a,b;
  76.   tmreset ();  //复位     
  77.   dmsec (1);  //延时     
  78.   tmwbyte (0xcc);  //跳过序列号命令   
  79.   tmwbyte (0xbe);  //发送读取命令     
  80.   a = tmrbyte ();  //读取低位温度   
  81.   b = tmrbyte ();   //读取高位温度           
  82.   if(b>0x7f)      //最高位为1时温度是负
  83.   {a=~a;   b=~b+1;       //补码转换,取反加一
  84.    fg=0;      //读取温度为负时fg=0
  85.        }
  86.   sdata = a/16+b*16;      //整数部分
  87.   xiaoshu1 = (a&0x0f)*10/16; //小数第一位
  88.   xiaoshu2 = (a&0x0f)*100/16%10;//小数第二位
  89.   xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位
  90. }  
  91. void DS18B20PRO(void)         
  92. {  tmstart();      
  93.   //dmsec(5);  //如果是不断地读取的话可以不延时 //
  94.   tmrtemp();  //读取温度,执行完毕温度将存于TMP中 //
  95. }           
  96. void Led()
  97. {
  98.    if(fg==1)   //温度为正时显示的数据
  99.    {   P2=P2&0xef;
  100.     P0=seg7code[sdata/10];           //输出十位数
  101.     Delay(8); P2=P2|0xf0; P2=P2&0xdf;  
  102.     P0=seg7code[sdata%10]|0x80; //输出个位和小数点
  103.     Delay(8); P2=P2|0xf0; P2=P2&0xbf;
  104.     P0=seg7code[xiaoshu1];   //输出小数点后第一位
  105.     Delay(8); P2=P2|0xf0; P2=P2&0x7f;
  106.     P0=seg7code[xiaoshu2];       //输出小数点后第二位
  107.     Delay(4); P2=P2|0xf0;
  108.    }
  109.    if(fg==0)  //温度为负时显示的数据
  110.    {   P2=P2&0xef;
  111.     P0=seg7code[11];           //负号
  112.     Delay(8); P2=P2|0xf0; P2=P2&0xdf;  
  113.     P0=seg7code[sdata/10]|0x80; //输出十位数
  114.     Delay(8); P2=P2|0xf0; P2=P2&0xbf;
  115.     P0=seg7code[sdata%10];   //输出个位和小数点
  116.     Delay(8); P2=P2|0xf0; P2=P2&0x7f;
  117.     P0=seg7code[xiaoshu1];       //输出小数点后第一位
  118.     Delay(4); P2=P2|0xf0;
  119.    }
  120. }
  121. main()
  122. {fg=1;
  123. while(1)
  124. {
  125.   DS18B20PRO();
  126.   Led();
  127. }
  128. }

复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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