chenghaodx 发表于 2010-8-13 19:06:41

ok2440的18b20程序代码

ok2440提供的18b20的源代码不能测量温度,本人用MDK调试出了正确的代码,希望对大家有帮助。另外,强烈推荐大家使用MDK,我用j_link和ADS1.2调试时老是卡死,用MDK没有死机现象,MDK调试功能好像比ADS1.2强大的多

飞凌-fatfish 发表于 2010-8-14 08:24:15

lz调试的哪里有问题?测试代码中的温度测试怎会不能用?

chenghaodx 发表于 2010-8-14 19:58:57

硬件测试程序(就是12个一起测的那个)可以,但是单独做温度测试的程序就不对了,虽然我看了,里边的延时都一样,但是好像时钟频率不一样吧(个人猜测),出不来结果

powercast 发表于 2010-8-14 23:33:18

我用光盘wince里面的程序是可以的,以前拿个做过项目,实现一个简单的应用。18b20还是比较简单的

飞凌-fatfish 发表于 2010-8-15 16:17:54

总是卡死,可以试试更新一下jlink的驱动
下载一个新的版本试试。
18B20的测试程序并未发现异常,可能你的程序没有仿真起来。

chenghaodx 发表于 2010-8-20 13:52:08

仿真不知道是不是j_link的问题 j_link是我自己买的 不是从飞凌买的 但是我不仿真 把bin文件烧进去还是不行 结果显示是00'00C 测试不准确

chenghaodx 发表于 2010-8-20 14:09:29

看不到附件吗?代码改动后如下:
void dmsec (unsigned int t)       //精确延时函数100约为1.317us
{   
        unsigned int i;
    unsigned int j;
    j=1*t;
    for(i = 0; i < j; i++);
}
         
void tmreset (void)       //18b20初始化
{                              
    unsigned int i;
        GPGCON&=0xfffffffc;    //设置寄存器对18b20进行写操作
        GPGCON|=0x01;
    GPGDAT&=0xfffe;   
        dmsec(45600);
        GPGCON&=0xfffffffc;
        while((GPGDAT&0x01)==0x00);
        dmsec(3000);
        while((GPGDAT&0x01)==0x01);
        //GPFDAT=0xef;   
        while((GPGDAT&0x01)==0x00);
        //GPFDAT=0xdf;         
}            



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;
                  dmsec(400);
                  GPGDAT|=0X01;
          GPGCON&=0xfffffffc;   //设为输入口
          j=GPGDAT;
          if(j&0x01)u |= 0x80;
          dmsec(12731);
          GPGCON|=0x01;
          GPGDAT|=0x01;
          dmsec(200);
       }      
       return (u);      

}
         
void tmwbyte (unsigned char dat)   //写一个字节函数
{                     
       unsigned char j;      
       
       GPGCON&=0xfffffffc;
       GPGCON|=0x01;      
       for (j=1;j<=8;j++)      
       {
           GPGCON&=0xfffffffc;
           GPGCON|=0x01;
           GPGDAT&=0xfffe;   
           GPGDAT|= (dat & 0x01);
           dmsec(1000);
           dmsec(3714);
           dat = dat >> 1;
           dmsec(100);      
        }      
}


void tmstart (void)         //发送ds1820 开始转换
{                        
        tmreset();             //复位   
        dmsec(120);            //延时   
        tmwbyte(0xcc);         //跳过序列号命令   
        tmwbyte(0x44);         //发转换命令 44H,
}         




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; //小数两位
}
和飞凌提供的延时差别很大
页: [1]
查看完整版本: ok2440的18b20程序代码