找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2142|回复: 3
打印 上一主题 下一主题
收起左侧

ds18b20数码管显示开机温度一直是-0.06,数码管不能实时显示温度,请大家帮忙看看是...

[复制链接]
跳转到指定楼层
楼主
ID:910047 发表于 2021-6-23 09:15 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
程序在这里
#include<reg51.h>
extern unsigned char code NumberData[12];
typedef  unsigned char uchar;
typedef  unsigned int uint;
sbit BUS=P2^6;//温度传感器接口
sbit LED_ONE = P2^0;//第一位数码管位选端口
sbit LED_TWO = P2^1;//第一位数码管位选端口
sbit LED_THREE = P2^2;//第一位数码管位选端口
sbit LED_FOUR = P2^3;//第一位数码管位选端口
volatile uchar GeWei,ShiWei,BaiWei,_Geiwei,_ShiWei;
volatile bit Convert_yes_not=0;
volatile char Negative=0;
/**********************************
数码管编码
**********************************/
code unsigned char NumberData[12] ={
      0x3f,//0
          0x06,//1
          0x5b,//2
          0x4f,//3
          0x66,//4
          0x6d,//5
          0x7d,//6
          0x07,//7
          0x7f,//8
          0x6f,//9         
          0x80,//DP
          0x40 //negative
};
//延时子函数
void Delay_4xN_US(uchar us)
{
    while(--us);
}
//初始化子函数
void Timer0_Init()
{
        TMOD = 0x01;//定时器0模式1-16位定时器-
        TCON = 0x00;//清零TCON
        ET0  = 1;   //允许定时器0中断
        TH0  = 0x3c;//定时100ms
        TL0  = 0xb0;
        TR0  = 1;   //启动定时器0
}
void DS18B20_Recover()
{
          BUS = 1;
          Delay_4xN_US(200);//4us
          BUS = 0;
          Delay_4xN_US(200);//800us
          BUS = 1;
          Delay_4xN_US(200);//800us
          BUS = 1;
}
void SendProc(uchar proc)
{
          bit T_bit;
          uchar i=0;
          for(;i<8;i++)
          {
                  T_bit = (proc>>i)&0x01;//单位数据
                  BUS = 1;
                  Delay_4xN_US(1);//4us
                  BUS = 0;
                  BUS = T_bit;//单位数据
                  Delay_4xN_US(15);//60us等待时间
                  BUS = 1;
          }
}
uchar ReadOneByte()
{
          uchar i;
          bit T_bit;
          uchar dat=0;
          for(i=0;i<8;i++)
          {
                   BUS = 1;
                   Delay_4xN_US(1);//4us
                   BUS = 0;
                   BUS = 1;
                   T_bit = BUS;
                   Delay_4xN_US(15);//60us
                   BUS = 1;
                   dat |= ((uchar)T_bit)<<i;
           }
           return dat;
}
void LED_DATE_Convert(uchar T_L,uchar T_H)
{
          uchar ZhengShu,MiddleShu;
        uint XiaoShu;
        if((T_H>>4)>0)//负数
        {
             Negative = 0xff;
                 MiddleShu =((~(T_L&0x0f))&0x0f)+1;
                 if(MiddleShu>>4>0)//有进位
                 {
                          ZhengShu = (~T_H)*16+((~T_L)>>4)+1;
                          XiaoShu =(MiddleShu&0x0f)*625;
                 }
                 else
                 {
                          ZhengShu = (~T_H)*16+((~T_L)>>4);
                          XiaoShu =(MiddleShu&0x0f)*625;
                 }
                 GeWei  = ZhengShu%10;
                 ShiWei = (ZhengShu/10)%10;
                 _Geiwei= XiaoShu/1000;
                 _ShiWei= (XiaoShu/100)%10;
        
        }
        else//正数
    {
                Negative = 0x00;
                ZhengShu = T_H*16+(T_L>>4);
                XiaoShu =(T_L&0x0f)*625;
                GeWei  = ZhengShu%10;
                ShiWei = (ZhengShu/10)%10;
                BaiWei = ZhengShu/100;
                _Geiwei= XiaoShu/1000;
                _ShiWei= (XiaoShu/100)%10;
        }        
}
void LED_Show()
{
        switch(Negative)
          {
                case 0x00:        //正数
                                    if(BaiWei!=0)
                                        {
                                                 P0 = NumberData[BaiWei];
                                                 LED_ONE = 0;
                                                 Delay_4xN_US(100);//400us
                                                 LED_ONE = 1;
                                                 P0 = NumberData[ShiWei];
                                                 LED_TWO = 0;
                                                 Delay_4xN_US(100);//400us
                                                 LED_TWO = 1;
                                                 P0 = NumberData[GeWei]|NumberData[10];
                                                 LED_THREE = 0;
                                                 Delay_4xN_US(100);//400us
                                                 LED_THREE = 1;
                                                 P0 = NumberData[_Geiwei];
                                                 LED_FOUR = 0;
                                                 Delay_4xN_US(100);//400us
                                                 LED_FOUR = 1;
                                        }
                                        else
                                        {
                                                P0 = NumberData[ShiWei];
                                                LED_ONE = 0;
                                                Delay_4xN_US(100);//400us
                                                LED_ONE = 1;
                                                P0 = NumberData[GeWei]|NumberData[10];
                                                LED_TWO = 0;
                                                Delay_4xN_US(100);//400us
                                                LED_TWO = 1;
                                                P0 = NumberData[_Geiwei];
                                                LED_THREE = 0;
                                                Delay_4xN_US(100);//400us
                                                LED_THREE = 1;
                                                P0 = NumberData[_ShiWei];
                                                LED_FOUR = 0;
                                                Delay_4xN_US(100);//400us
                                                LED_FOUR = 1;
                                        }
                                        break;
                case 0xff:        //负数
                                     if(ShiWei!=0)
                                        {
                                                 P0 = NumberData[11];
                                                LED_ONE = 0;
                                                Delay_4xN_US(100);//400us
                                                LED_ONE = 1;
                                                P0 = NumberData[ShiWei];
                                                LED_TWO = 0;
                                                Delay_4xN_US(100);//400us
                                                LED_TWO = 1;
                                                P0 = NumberData[GeWei]|NumberData[10];
                                                LED_THREE = 0;
                                                Delay_4xN_US(100);//400us
                                                LED_THREE = 1;
                                                P0 = NumberData[_Geiwei];
                                                LED_FOUR = 0;
                                                Delay_4xN_US(100);//400us
                                                LED_FOUR = 1;
                                        }
                                        else
                                        {
                                                P0 = NumberData[11];
                                                LED_ONE = 0;
                                                Delay_4xN_US(100);//400us
                                                LED_ONE = 1;
                                                P0 = NumberData[GeWei]|NumberData[10];
                                                LED_TWO = 0;
                                                Delay_4xN_US(100);//400us
                                                LED_TWO = 1;
                                                P0 = NumberData[_Geiwei];
                                                LED_THREE = 0;
                                                Delay_4xN_US(100);//400us
                                                LED_THREE = 1;
                                                P0 = NumberData[_ShiWei];
                                                LED_FOUR = 0;
                                                Delay_4xN_US(100);//400us
                                                LED_FOUR = 1;
                                        }
                                        break;
          }
}
void Timer_Interrupt() interrupt 1
{
    uchar T_dat_L,T_dat_H;
        P0=0x00;
        TH0  = 0x3c;//定时100ms
    TL0  = 0xb0;
        if(Convert_yes_not==0)
        {
                DS18B20_Recover();//复位
                SendProc(0xcc);//ROM跳过指令
                SendProc(0x44);//数据转换指令
                Convert_yes_not=1;
        }
        else
        {
                DS18B20_Recover();//复位
                SendProc(0xcc);//ROM跳过指令
                SendProc(0xbe);//数据读取指令
                T_dat_L = ReadOneByte();//读取数据
                T_dat_H = ReadOneByte();//读取数据
                LED_DATE_Convert(T_dat_L,T_dat_H);
                Convert_yes_not=0;
        }
}
//主函数
void main()
{
        P0=0x00;
        P2=0xff;
        DS18B20_Recover();//复位
        Timer0_Init();
        EA =1;//开放中断
        while(1)
        {
                   LED_Show();
          }
}

1624410902521.jpg (1.25 MB, 下载次数: 46)

1624410902521.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:739545 发表于 2021-6-23 10:35 | 只看该作者
18b20为啥接那么多电阻
回复

使用道具 举报

板凳
ID:123289 发表于 2021-6-23 16:29 | 只看该作者
先把R3改为100欧。
回复

使用道具 举报

地板
ID:213173 发表于 2021-6-23 22:56 | 只看该作者
主要是时序问题


  1. #include<reg51.h>
  2. extern unsigned char code NumberData[12];
  3. typedef  unsigned char uchar;
  4. typedef  unsigned int uint;
  5. sbit BUS=P2^6;//温度传感器接口
  6. sbit LED_ONE = P2^0;//第一位数码管位选端口
  7. sbit LED_TWO = P2^1;//第一位数码管位选端口
  8. sbit LED_THREE = P2^2;//第一位数码管位选端口
  9. sbit LED_FOUR = P2^3;//第一位数码管位选端口
  10. volatile uchar GeWei,ShiWei,BaiWei,_Geiwei,_ShiWei;
  11. volatile bit Convert_yes_not=0;
  12. volatile char Negative=0;
  13. /**********************************
  14. 数码管编码
  15. **********************************/
  16. code unsigned char NumberData[12] ={
  17.       0x3f,//0
  18.           0x06,//1
  19.           0x5b,//2
  20.           0x4f,//3
  21.           0x66,//4
  22.           0x6d,//5
  23.           0x7d,//6
  24.           0x07,//7
  25.           0x7f,//8
  26.           0x6f,//9         
  27.           0x80,//DP
  28.           0x40 //negative
  29. };
  30. //延时子函数
  31. void Delay_4xN_US(uchar us)
  32. {
  33.     while(--us);
  34. }
  35. //初始化子函数
  36. void Timer0_Init()
  37. {
  38.         TMOD = 0x01;//定时器0模式1-16位定时器-
  39.         TCON = 0x00;//清零TCON
  40.         ET0  = 1;   //允许定时器0中断
  41.         TH0  = 0x3c;//定时100ms
  42.         TL0  = 0xb0;
  43.         TR0  = 1;   //启动定时器0
  44. }
  45. void DS18B20_Recover()
  46. {
  47.         BUS = 1;
  48.         Delay_4xN_US(5);//4us
  49.         BUS = 0;
  50.         Delay_4xN_US(200);//800us
  51.         Delay_4xN_US(200);
  52.         BUS = 1;
  53.         Delay_4xN_US(50);
  54.         BUS = 1;
  55.         Delay_4xN_US(25);
  56. }
  57. void SendProc(uchar proc)
  58. {
  59.         uchar i=0;
  60.         for(i=8; i>0; i--)
  61.         {
  62.                 BUS = 0;
  63.                 BUS = proc&0x01;
  64.                 Delay_4xN_US(25);
  65.                 BUS = 1;
  66.                 proc>>=1;
  67.         }
  68.         Delay_4xN_US(25);
  69. }
  70. uchar ReadOneByte()
  71. {
  72.         uchar i;
  73.         uchar dat=0;
  74.         for (i=8;i>0;i--)
  75.         {
  76.                 BUS = 0;
  77.                 dat>>=1;
  78.                 BUS = 1;
  79.                 if(BUS)
  80.                         dat|=0x80;
  81.                 Delay_4xN_US(25);
  82.         }
  83.         return dat;
  84. }
  85. void LED_DATE_Convert(uchar T_L,uchar T_H)
  86. {
  87.         uchar ZhengShu,MiddleShu;
  88.         uint XiaoShu;
  89.         if((T_H>>4)>0)//负数
  90.         {
  91.         Negative = 0xff;
  92.         MiddleShu =((~(T_L&0x0f))&0x0f)+1;
  93.         if(MiddleShu>>4>0)//有进位
  94.         {
  95.         ZhengShu = (~T_H)*16+((~T_L)>>4)+1;
  96.         XiaoShu =(MiddleShu&0x0f)*625;
  97.         }
  98.         else
  99.         {
  100.         ZhengShu = (~T_H)*16+((~T_L)>>4);
  101.         XiaoShu =(MiddleShu&0x0f)*625;
  102.         }
  103.         GeWei  = ZhengShu%10;
  104.         ShiWei = (ZhengShu/10)%10;
  105.         _Geiwei= XiaoShu/1000;
  106.         _ShiWei= (XiaoShu/100)%10;
  107.        
  108.         }
  109.         else//正数
  110.         {
  111.         Negative = 0x00;
  112.         ZhengShu = T_H*16+(T_L>>4);
  113.         XiaoShu =(T_L&0x0f)*625;
  114.         GeWei  = ZhengShu%10;
  115.         ShiWei = (ZhengShu/10)%10;
  116.         BaiWei = ZhengShu/100;
  117.         _Geiwei= XiaoShu/1000;
  118.         _ShiWei= (XiaoShu/100)%10;
  119.         }        
  120. }
  121. void LED_Show()
  122. {
  123.         switch(Negative)
  124.         {
  125.         case 0x00:        //正数
  126.         if(BaiWei!=0)
  127.         {
  128.         P0 = NumberData[BaiWei];
  129.         LED_ONE = 0;
  130.         Delay_4xN_US(100);//400us
  131.         LED_ONE = 1;
  132.         P0 = NumberData[ShiWei];
  133.         LED_TWO = 0;
  134.         Delay_4xN_US(100);//400us
  135.         LED_TWO = 1;
  136.         P0 = NumberData[GeWei]|NumberData[10];
  137.         LED_THREE = 0;
  138.         Delay_4xN_US(100);//400us
  139.         LED_THREE = 1;
  140.         P0 = NumberData[_Geiwei];
  141.         LED_FOUR = 0;
  142.         Delay_4xN_US(100);//400us
  143.         LED_FOUR = 1;
  144.         }
  145.         else
  146.         {
  147.         P0 = NumberData[ShiWei];
  148.         LED_ONE = 0;
  149.         Delay_4xN_US(100);//400us
  150.         LED_ONE = 1;
  151.         P0 = NumberData[GeWei]|NumberData[10];
  152.         LED_TWO = 0;
  153.         Delay_4xN_US(100);//400us
  154.         LED_TWO = 1;
  155.         P0 = NumberData[_Geiwei];
  156.         LED_THREE = 0;
  157.         Delay_4xN_US(100);//400us
  158.         LED_THREE = 1;
  159.         P0 = NumberData[_ShiWei];
  160.         LED_FOUR = 0;
  161.         Delay_4xN_US(100);//400us
  162.         LED_FOUR = 1;
  163.         }
  164.         break;
  165.         case 0xff:        //负数
  166.         if(ShiWei!=0)
  167.         {
  168.         P0 = NumberData[11];
  169.         LED_ONE = 0;
  170.         Delay_4xN_US(100);//400us
  171.         LED_ONE = 1;
  172.         P0 = NumberData[ShiWei];
  173.         LED_TWO = 0;
  174.         Delay_4xN_US(100);//400us
  175.         LED_TWO = 1;
  176.         P0 = NumberData[GeWei]|NumberData[10];
  177.         LED_THREE = 0;
  178.         Delay_4xN_US(100);//400us
  179.         LED_THREE = 1;
  180.         P0 = NumberData[_Geiwei];
  181.         LED_FOUR = 0;
  182.         Delay_4xN_US(100);//400us
  183.         LED_FOUR = 1;
  184.         }
  185.         else
  186.         {
  187.         P0 = NumberData[11];
  188.         LED_ONE = 0;
  189.         Delay_4xN_US(100);//400us
  190.         LED_ONE = 1;
  191.         P0 = NumberData[GeWei]|NumberData[10];
  192.         LED_TWO = 0;
  193.         Delay_4xN_US(100);//400us
  194.         LED_TWO = 1;
  195.         P0 = NumberData[_Geiwei];
  196.         LED_THREE = 0;
  197.         Delay_4xN_US(100);//400us
  198.         LED_THREE = 1;
  199.         P0 = NumberData[_ShiWei];
  200.         LED_FOUR = 0;
  201.         Delay_4xN_US(100);//400us
  202.         LED_FOUR = 1;
  203.         }
  204.         break;
  205.         }
  206. }
  207. void Timer_Interrupt() interrupt 1
  208. {
  209.         uchar T_dat_L,T_dat_H;
  210.         P0=0x00;
  211.         TH0  = 0x3c;//定时100ms
  212.         TL0  = 0xb0;
  213.         if(Convert_yes_not==0)
  214.         {
  215.         DS18B20_Recover();//复位
  216.         SendProc(0xcc);//ROM跳过指令
  217.         SendProc(0x44);//数据转换指令
  218.         Convert_yes_not=1;
  219.         }
  220.         else
  221.         {
  222.         DS18B20_Recover();//复位
  223.         SendProc(0xcc);//ROM跳过指令
  224.         SendProc(0xbe);//数据读取指令
  225.         T_dat_L = ReadOneByte();//读取数据
  226.         T_dat_H = ReadOneByte();//读取数据
  227.         LED_DATE_Convert(T_dat_L,T_dat_H);
  228.         Convert_yes_not=0;
  229.         }
  230. }
  231. //主函数
  232. void main()
  233. {
  234.         P0=0x00;
  235.         P2=0xff;
  236.         DS18B20_Recover();//复位
  237.         Timer0_Init();
  238.         EA =1;//开放中断
  239.         while(1)
  240.         {
  241.                 LED_Show();
  242.         }
  243. }
复制代码



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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