[求解]PROTEUS中仿真18B20+mega16+1602正确,移植到mega128上出错
仿真时出现00.00摄氏度,烧写到板子上出现 I5.87℃有高手碰到过类似问题么?
在线等 仿真的时候都没有加晶振 这个有关系么在PROTEUS里不加晶振 默认多少M啊? 默认内部RC 1MHz。。。。。 yklstudent 发表于 2013-1-31 18:12 static/image/common/back.gif
默认内部RC 1MHz。。。。。
这样设置对么?
。。。实际的温度和仿真的一样?你怎么知道错了?
再说了,你就不会改变下温度试试输出变不变? lisun0410 发表于 2013-1-31 19:13 static/image/common/back.gif
这样设置对么?
外部XT-16MHz
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;
}
上面是找到的程序 很强大,貌似用18b20从来未试过温度不对滴情况,只试过有温度或者是没有温度(即0.0C),是不是读数滴时候读反了? tony90 发表于 2013-2-1 01:28 static/image/common/back.gif
很强大,貌似用18b20从来未试过温度不对滴情况,只试过有温度或者是没有温度(即0.0C),是不是读数滴时候 ...
我用的是16Mhz外部晶振 这些程序应该是8Mhz晶振下的延时 现在改的方向还是改延时但是没人指导 具体怎么改不清楚啊... 改延时函数我一般用示波器。具体方法就是另编一个小程序,使延时函数产生波形,看波形周期,调节延时函数 改延时滴话,直接将nop的个数加倍,不就可以实现从8M改到16M,或者程序原来不是用nop滴话就看看编译出来有多少次自加或自减,再改延时函数的循环次数,不过由于优化滴问题,第二种情况会比较难改,实在改不鸟滴话用定时器,如果连定时器都用完了,就只能换成GCC,用GCC自带滴延时函数鸟 tony90 发表于 2013-2-1 17:56 static/image/common/back.gif
改延时滴话,直接将nop的个数加倍,不就可以实现从8M改到16M,或者程序原来不是用nop滴话就看看编译出来有 ...
尝试了一下 我把所有延时都翻倍了 就读出数据了! 感谢您!
页:
[1]