小罗老师的好学生 2022-01-11 00:17 采纳率: 0%
浏览 32

单片机开发版写DS18B20程序数码管无法正常显示温度值,一直闪烁163.78,如何解决?(语言-c语言)

下面是main.c文件,求各位过目!




#include "reg52.h"
#include "Ds.h"

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 DisplayData[8];
u8 code smgduan[10]={0x3f,    0x06,    0x5b,    0x4f,    0x66,    0x6d,    0x7d,    0x07,    0x7f,    0x6f,};

void delay(u16 i)
{
    while(i--);
}

void datapros(u16 temp)
{
    float tp;
    if (temp<0)
    {
        DisplayData[0]=0x40;
        temp=temp-1;
        temp=~temp;
        tp=temp;
        temp=tp*0.0625*100+0.5;
    }
    else
    {
        DisplayData[0]=0x00;
        tp=temp;
        temp=tp*0.0625*100+0.5;
    }
    DisplayData[1]=smgduan[temp/10000];                        //百
    DisplayData[2]=smgduan[temp%10000/1000];            //十
    DisplayData[3]=smgduan[temp%1000/100]|0x80;        //个+小数点
    DisplayData[4]=smgduan[temp%100/10];                    //0.1
    DisplayData[5]=smgduan[temp%10];                            //0.01
}

void smgDisplay()
{
    u8 i;
    for(i=0;i<6;i++)
    {
        switch(i)     //位选,选择点亮的数码管,
        {
            case(0):
                LSA=0;LSB=0;LSC=0; break;//显示第0位
            case(1):
                LSA=1;LSB=0;LSC=0; break;//显示第1位
            case(2):
                LSA=0;LSB=1;LSC=0; break;//显示第2位
            case(3):
                LSA=1;LSB=1;LSC=0; break;//显示第3位
            case(4):
                LSA=0;LSB=0;LSC=1; break;//显示第4位
            case(5):
                LSA=1;LSB=0;LSC=1; break;//显示第5位    
        }
        P0=DisplayData[5-i];//发送数据
        delay(100); //间隔一段时间扫描    
        P0=0x00;//消隐
    }        
}

void main()
{
    while(1)
    {
    datapros(DsTempRead());
    smgDisplay();
    }
}

下面是Ds.c文件的程序,求各位过目这个DS18B20的程序是否有错!


#include "Ds.h"

void delay10us(u16 i)   //误差 0us
{
    unsigned char a,b;
    for(;i>0;i--)
    for(b=1;b>0;b--)
        for(a=2;a>0;a--);
}


//初始化函数//
u8 DsInit()
{
    DsPort=0;    //数据线拉低
    
    delay10us(65);    //延时600us
    
    DsPort=1;    //数据线拉高
                
    delay10us(8);    //延时80us
    
    while(DsPort)    //判断DsPort是否被拉低
    {
        u8 i;
        delay10us(100);    //延时1ms
        i++;
        if(i>5)
        {
            return 0;    //初始化失败,Ds不存在
        }
    }
    return 1;    //初始化成功,Ds存在
}

u8 DsReadByte()    //单片机读字节
{
    u8 byte,bi;    //定义字节,每次接收的值
    u8 i=0;
    for(i;i<8;i++)
    {
        DsPort=0;    //数据线拉低
        i=i;     //延时1us
        DsPort=1;    //数据线拉高
    
        delay10us(1);//延时10us
    
        bi=DsPort;    //读取接收值
        byte=(byte>>1)|(bi<<7);    //通过调整,使byte得到读取字节
                
        delay10us(5);    //读取完后延时50us读取下一个接收值
    }
    return byte;
}

void DsWriteByte(u8 dat)
{
    u8 i;
    for(i=0;i<8;i++)
    {
        DsPort=0;    //数据线拉低
        
        delay10us(1);    //延时15us
        
        DsPort=dat&0x01;    //传送数据
        
        delay10us(7);    //延时60us
        
        DsPort=1;    //释放总线
        
        dat>>=1;    //传输下一位
    }
}

void DsTempChange()
{
    DsInit();    //初始化
    
    delay10us(100);    //延时1ms
    
    DsWriteByte(0xCC);    //跳过ROM操作命令
    
    DsWriteByte(0x44);    //温度转换命令
}

void DsTempReadCom()
{
    DsInit();    //初始化
    
    delay10us(100);    //延时1ms
    
    DsWriteByte(0xCC);    //跳过ROM操作命令
    
    DsWriteByte(0xBE);    //温度转换命令
}

u16 DsTempRead()    //读取温度
{
    u16 temp;
    u8 tml,tmh;    //定义温度低八位,高八位
    DsTempChange();    //开始温度转换
    DsTempReadCom();    //开始温度读取
    tml=DsReadByte();    //读取低八位
    tmh=DsReadByte();    //读取高八位
    temp = tmh;
    temp <<= 8;
    temp |= tml;
    return temp;
}
  • 写回答

1条回答 默认 最新

  • 猫猫爱吃鱼 2022-01-11 02:54
    关注

    初始化延时时间是否按照dataseheet设定?我记得延时时间是480-650us,建议你参考datasheet

    评论

报告相同问题?

问题事件

  • 创建了问题 1月11日

悬赏问题

  • ¥15 用php隐藏类名和增加类名
  • ¥15 算法设计与分析课程的提问
  • ¥20 汇川小型plc控制小米微电机
  • ¥15 用MATLAB汇总拟合图
  • ¥15 智能除草机器人方案设计
  • ¥15 对接wps协作接口实现消息发送
  • ¥15 SQLite 出现“Database is locked” 如何解决?
  • ¥15 已经加了学校的隶属邮箱了,为什么还是进不去github education?😭
  • ¥15 求会做聚类,TCN的朋友有偿线上指导。以下是目前遇到的问题
  • ¥100 无网格伽辽金方法研究裂纹扩展的程序