lisun0410 发表于 2013-1-31 17:16:24

[求解]PROTEUS中仿真18B20+mega16+1602正确,移植到mega128上出错

仿真时出现00.00摄氏度,烧写到板子上出现 I5.87℃

有高手碰到过类似问题么?

在线等

lisun0410 发表于 2013-1-31 17:21:28

仿真的时候都没有加晶振 这个有关系么在PROTEUS里不加晶振 默认多少M啊?

yklstudent 发表于 2013-1-31 18:12:11

默认内部RC 1MHz。。。。。

lisun0410 发表于 2013-1-31 19:13:21

yklstudent 发表于 2013-1-31 18:12 static/image/common/back.gif
默认内部RC 1MHz。。。。。



这样设置对么?

bangbangji 发表于 2013-1-31 19:39:53


。。。实际的温度和仿真的一样?你怎么知道错了?

再说了,你就不会改变下温度试试输出变不变?

yklstudent 发表于 2013-1-31 19:51:43

lisun0410 发表于 2013-1-31 19:13 static/image/common/back.gif
这样设置对么?

外部XT-16MHz

lisun0410 发表于 2013-1-31 19:52:24

bangbangji 发表于 2013-1-31 19:39 static/image/common/back.gif
。。。实际的温度和仿真的一样?你怎么知道错了?

再说了,你就不会改变下温度试试输出变不变? ...

我是网上找的18B20的程序 直接调用的

刚改了一下 烧写到mega128的小系统上 现在输出55度

搜了一下说 还是时序问题...

#include <avr_18b20.h>

void init_1820()
{
      SET_DIR_1WIRE;         
      SET_OP_1WIRE;
      CLR_OP_1WIRE;
      delay_us(500);    //480us以上
      SET_OP_1WIRE;
      CLR_DIR_1WIRE;
      delay_us(20);    //15~60us
      while(CHECK_IP_1WIRE);
      SET_DIR_1WIRE;
      SET_OP_1WIRE;
      delay_us(140);//60~240us
}
void write_1820(unsigned char x)
{   
      unsigned char m;
      for(m=0;m<8;m++)
      {
            CLR_OP_1WIRE;
            if(x&(1<<m))    //写数据了,先写低位的!
                SET_OP_1WIRE;
            else
                CLR_OP_1WIRE;
            delay_us(40);//15~60us
            SET_OP_1WIRE;
      }
      SET_OP_1WIRE;
}
unsigned char read_1820()
{      
      unsigned char temp,k,n;
      temp=0;
      for(n=0;n<8;n++)
      {
            CLR_OP_1WIRE;
            SET_OP_1WIRE;
            CLR_DIR_1WIRE;
            k=(CHECK_IP_1WIRE);    //读数据,从低位开始
            if(k)
                temp|=(1<<n);
            else
                temp&=~(1<<n);
            delay_us(80); //60~120us      
            SET_DIR_1WIRE;
      }
      return (temp);
}

float gettemp()                  //读取温度值
{
      unsigned char temh,teml,wm0,wm1,wm2,wm3,wmh,wml,temp;   
      float result;
      init_1820();      //复位18b20
      write_1820(0xcc);// 发出转换命令
      write_1820(0x44);
      delay_ms(200);    //不延时也好使,不知道怎么回事!
      delay_ms(200);
      delay_ms(200);
      delay_ms(200);
      init_1820();
      write_1820(0xcc);//发出读命令
      write_1820(0xbe);
      teml=read_1820();//读数据
      temh=read_1820();
      
      //result = (temh & 0x0f) * 16 + (teml >> 4) + ((teml >> 3) & 0x01) * 0.5;
      //result = (temh & 0x0f) * 16 + (teml >> 4) + ((teml >> 1) & 0x07) * 0.125;
      //return result;
      wm0=teml>>4;       //只要高8位的低四位和低8位的高四位,温度范围0~99
      wm1=temh<<4;
       
      wm2=wm1+wm0;      //16进制转10进制
      wm3=wm2/100;
      wmh=(wm2%100)/10;   //wmh是显示的高位,wml是显示的低位
      wml=(wm2%100)%10;
          temp=wmh*10+wml;
          // temp=15;
          return temp;      
}


上面是找到的程序

tony90 发表于 2013-2-1 01:28:40

很强大,貌似用18b20从来未试过温度不对滴情况,只试过有温度或者是没有温度(即0.0C),是不是读数滴时候读反了?

lisun0410 发表于 2013-2-1 01:49:32

tony90 发表于 2013-2-1 01:28 static/image/common/back.gif
很强大,貌似用18b20从来未试过温度不对滴情况,只试过有温度或者是没有温度(即0.0C),是不是读数滴时候 ...

我用的是16Mhz外部晶振 这些程序应该是8Mhz晶振下的延时 现在改的方向还是改延时但是没人指导 具体怎么改不清楚啊...

shuipaopao 发表于 2013-2-1 10:00:14

改延时函数我一般用示波器。具体方法就是另编一个小程序,使延时函数产生波形,看波形周期,调节延时函数

tony90 发表于 2013-2-1 17:56:33

改延时滴话,直接将nop的个数加倍,不就可以实现从8M改到16M,或者程序原来不是用nop滴话就看看编译出来有多少次自加或自减,再改延时函数的循环次数,不过由于优化滴问题,第二种情况会比较难改,实在改不鸟滴话用定时器,如果连定时器都用完了,就只能换成GCC,用GCC自带滴延时函数鸟

lisun0410 发表于 2013-2-1 22:31:40

tony90 发表于 2013-2-1 17:56 static/image/common/back.gif
改延时滴话,直接将nop的个数加倍,不就可以实现从8M改到16M,或者程序原来不是用nop滴话就看看编译出来有 ...

尝试了一下 我把所有延时都翻倍了 就读出数据了! 感谢您!
页: [1]
查看完整版本: [求解]PROTEUS中仿真18B20+mega16+1602正确,移植到mega128上出错