找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3621|回复: 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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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