搜索
bottom↓
回复: 11

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

[复制链接]

出0入0汤圆

发表于 2013-1-31 17:16:24 | 显示全部楼层 |阅读模式
仿真时出现00.00摄氏度,烧写到板子上出现 I5.87℃

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

在线等

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-1-31 17:21:28 | 显示全部楼层
仿真的时候都没有加晶振 这个有关系么  在PROTEUS里不加晶振 默认多少M啊?

出0入0汤圆

发表于 2013-1-31 18:12:11 | 显示全部楼层
默认内部RC 1MHz。。。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-1-31 19:13:21 | 显示全部楼层
yklstudent 发表于 2013-1-31 18:12
默认内部RC 1MHz。。。。。



这样设置对么?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-1-31 19:39:53 | 显示全部楼层

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

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

出0入0汤圆

发表于 2013-1-31 19:51:43 | 显示全部楼层
lisun0410 发表于 2013-1-31 19:13
这样设置对么?

外部XT-16MHz

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-1-31 19:52:24 | 显示全部楼层
bangbangji 发表于 2013-1-31 19:39
。。。实际的温度和仿真的一样?你怎么知道错了?

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

我是网上找的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;        
}


上面是找到的程序

出0入0汤圆

发表于 2013-2-1 01:28:40 | 显示全部楼层
很强大,貌似用18b20从来未试过温度不对滴情况,只试过有温度或者是没有温度(即0.0C),是不是读数滴时候读反了?

出0入0汤圆

 楼主| 发表于 2013-2-1 01:49:32 | 显示全部楼层
tony90 发表于 2013-2-1 01:28
很强大,貌似用18b20从来未试过温度不对滴情况,只试过有温度或者是没有温度(即0.0C),是不是读数滴时候 ...

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

出0入4汤圆

发表于 2013-2-1 10:00:14 | 显示全部楼层
改延时函数我一般用示波器。具体方法就是另编一个小程序,使延时函数产生波形,看波形周期,调节延时函数

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2013-2-1 22:31:40 | 显示全部楼层
tony90 发表于 2013-2-1 17:56
改延时滴话,直接将nop的个数加倍,不就可以实现从8M改到16M,或者程序原来不是用nop滴话就看看编译出来有 ...

尝试了一下 我把所有延时都翻倍了 就读出数据了! 感谢您!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 08:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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