Leefree 发表于 2013-10-3 17:38:22

DS18B20 的温度问题

FL2440的板子 ,读取ds18b20的温度完全不正常,全部为0,自带的光盘资料里面的ADS实验代码下载进去,读出来的温度也是乱码,但是Test的二进制文件下载进去是可以读出来的,有人遇见这种情况吗?怎么解决的

飞凌-路飞 发表于 2013-10-9 13:58:15

不会吧楼主,您可以吧源码贴出来吗?

Leefree 发表于 2013-10-9 16:03:48

/**********************实验*********************************/
// 公司名称 :保定飞凌嵌入式技术有限公司
// 描    述 :温度传感器试验,由串口打印采集数据
// 版    权 :保定飞凌嵌入式技术有限公司
// 网    址 :www.witech.com.cn
/***************************************************************/

/*-------------------------地址声明----------------------------*/
#define GPGCON (*(volatile unsigned *)0x56000060)   //18b20寄存器设置
#define GPGDAT (*(volatile unsigned *)0x56000064)
#define GPGUP (*(volatile unsigned *)0x56000068)

#define UFCON0   (*(volatile unsigned *)0x50000008)   //串口寄存器设置
#define UMCON0   (*(volatile unsigned *)0x5000000c)
#define ULCON0   (*(volatile unsigned *)0x50000000)       
#define UCON0      (*(volatile unsigned *)0x50000004)
#define UBRDIV0    (*(volatile unsigned *)0x50000028)
#define UTRSTAT0   (*(volatile unsigned *)0x50000010)
#define UTXH0                 (*(volatile unsigned*)0x50000020)
#define URXH0                 (*(volatile unsigned*)0x50000024)
   
/*-------------------------变量定义----------------------------*/
unsigned char wd;
unsigned int sdata;                //测量到的温度的整数部分
unsigned char xiaoshu1;        //小数第一位
unsigned char xiaoshu2;        //小数第二位
unsigned char xiaoshu;        //两位小数

/*-------------------------函数声明----------------------------*/
void zh(void);
void Delay(unsigned int x) ;
void uart(void);
void DS18B20PRO(void);
void dmsec (unsigned int t);
void tmreset (void);
unsigned char tmrbit (void);
unsigned char tmrbyte (void) ;
void tmwbyte (unsigned char dat);
void tmstart (void) ;
void tmrtemp (void) ;

/*-------------------------------------------------------------/
函数名称:        Main
功能描述:        入口函数
                        不停循环检测温度值,并转换为asc||码,通过串口传出来
传    参:        无
返 回 值:        int
--------------------------------------------------------------*/
int Main(void)                     
{
    while(1)
    {
                   DS18B20PRO();      
                zh();
                uart();
                Delay(30);                     
        }
   
        return(0);
}

/*-------------------------------------------------------------/
函数名称:        dmsec
功能描述:        精确延时函数
传    参:        unsigned int t
返 回 值:        无
--------------------------------------------------------------*/
void dmsec(unsigned int t)       //精确延时函数
{   
        unsigned int i;
    unsigned int j;
    j = 1 * t;
    for(i=0; i<j; i++);
}

/*-------------------------------------------------------------/
函数名称:        tmreset
功能描述:        18b20初始化
传    参:        无
返 回 值:        无
--------------------------------------------------------------*/         
void tmreset(void)
{   
        unsigned int i;                           
   
        GPGCON &= 0xfffffffc;    //设置寄存器对18b20进行写操作
        GPGCON |= 0x01;
       
        GPGDAT |= 0x01;
    dmsec(100);

        GPGDAT &= 0xfffe;   
        dmsec(600);

              
        GPGDAT |= 0x01;
       
        dmsec(100);
        GPGCON &= 0xfffffffc;   //设置寄存器对18b20进行读操作
        i = GPGDAT;
       
}            

/*-------------------------------------------------------------/
函数名称:        Delay
功能描述:        延时函数
传    参:        int x
返 回 值:        无
--------------------------------------------------------------*/
unsigned char tmrbyte (void)      //读一个字节函数
{   
       unsigned int j;            
       unsigned char i, u=0;      
             
       for (i=1; i<=8; i++)      
       {
                  GPGCON &= 0xfffffffc;
               GPGCON |= 0x01;            //GPG0设为输出
                
                  GPGDAT &= 0xfffe;
               u >>= 1;
          
                  GPGCON &= 0xfffffffc;   //设为输入口
                  j = GPGDAT;
                if (j & 0x01)
                          u |= 0x80;
          
                dmsec(46);
                GPGDAT |= 0x01;
       }      
       return (u);      

}

/*-------------------------------------------------------------/
函数名称:        tmwbyte
功能描述:        写一个字节函数
传    参:        unsigned char dat
返 回 值:        无
--------------------------------------------------------------*/         
void tmwbyte (unsigned char dat)   //写一个字节函数
{                     
       unsigned char j;      
       
       GPGCON &= 0xfffffffc;
       GPGCON |= 0x01;      
       for (j=1; j<=8; j++)      
       {
               GPGDAT &= 0xfffe;
          dmsec(1);      
          GPGDAT |= (dat & 0x01);
          dmsec(47);
          GPGDAT |= 0x01;   
          dat = dat >> 1;      
        }      
}

/*-------------------------------------------------------------/
函数名称:        tmstart
功能描述:        发送ds1820 开始转换
传    参:        无
返 回 值:        无
--------------------------------------------------------------*/
void tmstart (void)   
{                        
        tmreset();             //复位   
        dmsec(120);            //延时   
        tmwbyte(0xcc);         //跳过序列号命令   
        tmwbyte(0x44);         //发转换命令 44H,
}         

/*-------------------------------------------------------------/
函数名称:        tmrtemp
功能描述:        读取温度
传    参:        无
返 回 值:        无
--------------------------------------------------------------*/
void tmrtemp (void)
{                        
        unsigned char a,b;
        tmreset();                      //复位   
        dmsec(2000);                   //延时   
        tmwbyte(0xcc);                //跳过序列号命令   
        tmwbyte(0xbe);                //发送读取命令   
        a = tmrbyte();                //读取低位温度   
        b = tmrbyte();                //读取高位温度         
       
        sdata = a / 16 + b * 16;      //整数部分
       
        xiaoshu1 = (a&0x0f) * 10 / 16;    //小数第一位
        xiaoshu2 = (a&0x0f) * 100 / 16 %10;//小数第二位
        xiaoshu = xiaoshu1*10 + xiaoshu2; //小数两位
}

/*-------------------------------------------------------------/
函数名称:        zh
功能描述:       
传    参:        无
返 回 值:        无
--------------------------------------------------------------*/
void zh(void)
{
        unsigned int wdata;
        wdata = sdata;
        wd = wdata / 10 + 0x30;
        wd = wdata % 10 + 0x30;
        wd = xiaoshu / 10 + 0x30;
        wd = xiaoshu % 10 + 0x30;
}

/*-------------------------------------------------------------/
函数名称:        DS18B20PRO
功能描述:       
传    参:        无
返 回 值:        无
--------------------------------------------------------------*/
void DS18B20PRO(void)         
{   
tmstart();        //uart(10);   
dmsec(5);         //如果是不断地读取的话可以不延时
tmrtemp();         //读取温度,执行完毕温度将存于TMP
}                                                                          

/*-------------------------------------------------------------/
函数名称:        uart
功能描述:        串口函数用于发送温度值
传    参:        无
返 回 值:        无
--------------------------------------------------------------*/      
void uart(void)
{       
       
    UFCON0 = 0x0;
    UMCON0 = 0x0;
    ULCON0 = 0x3;
    UCON0= 0x245;
    UBRDIV0=( (int)(50000000/16/115200+0.5) -1 );
       
            while(!(UTRSTAT0 & 0x2));
                UTXH0='\n';
                while(!(UTRSTAT0 & 0x2));
                UTXH0='\r';
                while(!(UTRSTAT0 & 0x2));            
                UTXH0=wd;
                while(!(UTRSTAT0 & 0x2));
                UTXH0=wd;
                while(!(UTRSTAT0 & 0x2));
                UTXH0=46;
                while(!(UTRSTAT0 & 0x2));
                UTXH0=wd;
                while(!(UTRSTAT0 & 0x2));
                UTXH0=wd;
                while(!(UTRSTAT0 & 0x2));
                UTXH0=39;
                while(!(UTRSTAT0 & 0x2));
                UTXH0=67;
}

/*-------------------------------------------------------------/
函数名称:        Delay
功能描述:        延时函数
传    参:        int x
返 回 值:        无
--------------------------------------------------------------*/
void Delay(unsigned int x)      
{
unsigned int i, j, k;
for(i=0; i<=x; i++)
    for(j=0; j<0xff; j++)
      for(k=0; k<0xff; k++);
}

Leefree 发表于 2013-10-9 16:05:46

飞凌-路飞 发表于 2013-10-9 13:58 static/image/common/back.gif
不会吧楼主,您可以吧源码贴出来吗?

源码已贴;详细情况是这样的,Test.bin下载到分区运行,温度完全正常,而将实验源码中的温度程序编译成bin文件下载分区运行,就出现问题了,温度显示全部为0,好像18b20通讯不上
页: [1]
查看完整版本: DS18B20 的温度问题