|
![](static/image/common/ico_lz.png)
楼主 |
发表于 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;
}
上面是找到的程序 |
|