找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机ds18b20仿真数值显示不正常?

[复制链接]
跳转到指定楼层
楼主
我设置的温度超过60度LED等就会亮,温度没超过60度时,数码管显示温度值正常,但是还是有一堆的看不懂的提醒定位是ds18b20好像有问题;然后温度超过60度后,LED灯亮,但是数码管不显示温度值,调节温度传感器也没有反应,而且仍然有一堆的提醒ds18b20好像有问题,求解答谢谢!!!



单片机源程序:

#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int
sbit du26=P2^6;//数码管段选
sbit we27=P2^7;//数码管位选
sbit DS=P2^2;//温度传感器
sbit led1=P3^7;//led
uchar code smgdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9数码管段表
uchar code smgwei[]={0xfe,0xfd,0xfb};       //1~3数码管位表
uint sum,wendu;
uint tt,y;

void delay(uchar z)
{
        uchar x,y;
        for(x=0;x<z;x++)
                for(y=0;y<110;y++);
}
void we(uchar z) //位选
{
        we27=0;
        P0=z;
        we27=1;
        we27=0;        
}

void du(uchar z)   //段选
{
        du26=0;         
        P0=z;
        du26=1;
        du26=0;        
}
void display() //三个数码管显示
{
        static uchar wei;
        switch(wei)
        {
                case 0:we(smgwei[wei]);du(smgdu[wendu/100]);break;
                case 1:we(smgwei[wei]);du(smgdu[wendu%100/10]|0x80);break;
                case 2:we(smgwei[wei]);du(smgdu[wendu%10]);break;
        }
        wei++;
        if(wei==3)
                wei=0;
}

void timer0int() interrupt 1 //定时器,定时5ms
{
        static uchar num;
        TH0=(65535-5000)/256;
        TL0=(65535-5000)%256;
        num++;
        display();
        if(num>=200)        //延时1s显示温度数值
        {
                num=0;
                 y=1;
        }        
}
void delay_us(uchar us)        //延时函数
{
         while(us--);
}

//单总线初始化时序         
bit ds_init()
{
        bit i;
        DS=1;
        _nop_();
        DS=0;
        delay_us(75);//拉低总线499.45us,总线上的温度传感器将会被全部复位

        DS=1;//释放总线
        delay_us(4);//延时37.95us,等待温度传感器发回存在信号

        i=DS;
        delay_us(25);//延时141.95us,读取温度传感器存在的时间
        DS=1;
        _nop_();
        return (i);
}
//写一个字节
void write_byte(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)
        {
                DS=0;
                _nop_(); //产生写时序
                DS=dat&0x01;
                delay_us(12);//延时76.95us
                DS=1;//释放总线准备下一次数据的写入
                _nop_();
                dat>>=1;
        }
}
//读一个字节
uchar read_byte()
{
        uchar i,j,dat;
        for(i=0;i<8;i++)
        {
                DS=0;
                _nop_();//产生读时序
                DS=1;
                _nop_();//释放总线
                j=DS;
                delay_us(12);//76.95us
                DS=1;
                _nop_();
                dat=(j<<7)|(dat>>1);
        }
        return (dat);
}  
void main()
{        
        uint i;
        uchar L,M;
        EA=1;
        ET0=1;
        TR0=1;
        TMOD=0X01;
        TH0=(65535-5000)/256;
        TL0=(65535-5000)%256;        
        while(1)           
        {
                ds_init();//初始化温度传感器
                write_byte(0xcc);//发送跳跃ROM指令
                write_byte(0x44);//发送温度转换指令
                delay(50);
                ds_init();//初始化温度传感器
                write_byte(0xcc);//发送跳跃ROM指令
                write_byte(0xbe);//读取温度传感器暂存器的值
                L=read_byte();
                M=read_byte();
                i=M;
                i<<=8;
                i|=L;
                i=i*0.0625*10+0.5;//将读出来的数据合并存到i中
                if(y==1)         
                {
                        y=0;
                          wendu=i;
                }
                if(wendu>=600)          //温度超过60度,LED灯亮
                        led1=0;
                else
                         led1=1;
        }
}

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

使用道具 举报

沙发
ID:213173 发表于 2019-3-24 10:35 | 只看该作者
你的程序没有大毛病。可能是时序有点问题,另外把读温度程序放在时标 if(y==1)内为佳。修改后功能正常。

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit du26=P2^6;//数码管段选
  6. sbit we27=P2^7;//数码管位选
  7. sbit DS=P2^2;//温度传感器
  8. sbit led1=P3^7;//led
  9. uchar code smgdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9数码管段表
  10. uchar code smgwei[]={0xfe,0xfd,0xfb,0xf7};       //1~4数码管位表
  11. uchar TempData[4];//显示值缓存
  12. //uint sum,wendu;
  13. //uint tt;
  14. bit y;

  15. void delay_us(uchar us)//约2us延时函数
  16. {
  17.         while(--us);
  18. }
  19. void delay(uchar z)//约1ms延时函数
  20. {
  21.         while(z--)
  22.         {
  23.                 delay_us(245);
  24.                 delay_us(245);
  25.         }
  26. }
  27. void we(uchar z) //位选
  28. {
  29. //        we27=0;
  30.         P0=z;
  31.         we27=1;
  32.         we27=0;        
  33. }
  34. void du(uchar z)   //段选
  35. {
  36. //        du26=0;
  37.         P0=z;
  38.         du26=1;
  39.         du26=0;
  40. }
  41. void display() //4个数码管显示
  42. {
  43.         static uchar wei;
  44.         du(0x00);                        //消隐
  45.         we(smgwei[wei]);        //送位码
  46.         du(TempData[wei]);//送段码
  47.         wei++;
  48.         wei%=4;
  49. }
  50. //读一个字节
  51. uchar read_byte()
  52. {
  53.         uchar i,dat;
  54.         for(i=0;i<8;i++)
  55.         {
  56.                 DS=0;
  57.                 dat>>=1;
  58.                 DS=1;
  59.                 if(DS)
  60.                         dat|=0x80;
  61.                 delay_us(25);
  62.         }
  63.         return (dat);
  64. }  
  65. //写一个字节
  66. void write_byte(uchar dat)
  67. {
  68.         uchar i;
  69.         for(i=0;i<8;i++)
  70.         {
  71.                 DS=0;
  72.                 DS=dat&0x01;
  73.                 delay_us(25);//延时
  74.                 DS=1;//释放总线准备下一次数据的写入
  75.                 dat>>=1;
  76.         }
  77. }
  78. //单总线初始化时序         
  79. bit ds_init()
  80. {
  81.         bit i;
  82.         DS=1;
  83.         delay_us(5);
  84.         DS=0;
  85.         delay_us(200);//拉低总线499.45us,总线上的温度传感器将会被全部复位
  86.         delay_us(200);
  87.         DS=1;//释放总线
  88.         delay_us(50);//延时37.95us,等待温度传感器发回存在信号       
  89.         i=DS;
  90.         delay_us(25);//延时141.95us,读取温度传感器存在的时间
  91.         return (i);
  92. }
  93. uint ReadTemperature()
  94. {
  95.         uint H,i;
  96.         uchar L;
  97.         ds_init();//初始化温度传感器
  98.         write_byte(0xcc);//发送跳跃ROM指令
  99.         write_byte(0x44);//发送温度转换指令
  100.         delay(10);
  101.         ds_init();//初始化温度传感器
  102.         write_byte(0xcc);//发送跳跃ROM指令
  103.         write_byte(0xbe);//读取温度传感器暂存器的值
  104.         L=read_byte();
  105.         H=read_byte();
  106.         H<<=8;
  107.         i=L+H;
  108.         return(i);
  109. }
  110. void Timer0Init()                //2毫秒@12.000MHz
  111. {
  112.         TMOD= 0x01;                //设置定时器模式
  113.         TL0 = 0x30;                //设置定时初值
  114.         TH0 = 0xF8;                //设置定时初值
  115.         TR0 = 1;                //定时器0开始计时
  116.         EA=1;
  117.         ET0=1;
  118. }
  119. void main()
  120. {        
  121.         uint  temp;
  122.         uchar TempH,TempL;
  123.         bit   negative;//负数标志

  124.         Timer0Init();      
  125.         while(1)           
  126.         {
  127.                 if(y==1)         
  128.                 {
  129.                         y=0;
  130.                         temp=ReadTemperature();//读取温度
  131.                         if(temp&0x8000)
  132.                         {
  133.                                 negative=1;                //负号标志
  134.                                 temp=~temp;                //取反加1
  135.                                 temp +=1;
  136.                         }
  137.                         else negative=0;        //正数

  138.                         TempH=temp>>4;                //分解为整数
  139.                         TempL=temp&0x0F;        //分解为小数
  140.                         TempL=TempL*6/10;        //保留一位小数

  141.                         if(negative==1)
  142.                                 TempData[0]=0x40;//显示负号
  143.                         else if(TempH/100==0)//小于100
  144.                                 TempData[0]=0;                                                //百位消隐
  145.                         else
  146.                                 TempData[0]=smgdu[TempH/100]; //显示百位温度
  147.        
  148.                         if((TempH/100==0)&&((TempH%100)/10==0))
  149.                                 TempData[1]=0;                                                //十位消隐
  150.                         else
  151.                                 TempData[1]=smgdu[(TempH%100)/10];        //显示十位温度
  152.                         TempData[2]=smgdu[(TempH%100)%10]|0x80;//显示个位温度,带小数点
  153.                         TempData[3]=smgdu[TempL];                                        //显示小数温度1位       
  154.                 }
  155.                 if(TempH>=60)          //温度超过60度,LED灯亮
  156.                         led1=0;
  157.                 else        led1=1;       
  158.         }
  159. }
  160. void timer0int() interrupt 1 //定时器,定时2ms
  161. {
  162.         static uchar num;
  163.         TL0 = 0x30;                //设置定时初值
  164.         TH0 = 0xF8;                //设置定时初值
  165.         display();
  166.         num++;
  167.         if(num>=250)   //延时500ms显示温度数值
  168.         {
  169.                 num=0;
  170.                 y=1;
  171.         }        
  172. }
复制代码



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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