共4条
1/1 1 跳转至页
AVR,DS18B20,ICC 抛块砖头:AVR连DS18B20的C源程序(ICC),有一点小问题,请指教!

问
我用ATmega8的PC5对DS18B20操作,运行时命令和数据可以写入,但是读出的所有数据的第4
位一直是1(0x04),不论我如何调整时间间隔,该位始终都是1,我已经没办法了(希望不是
产品质量,试了3个都一样(同批)),请各位DX指点
void delay(char cycle)
{
while(cycle)
{
cycle--;
asm("nop");
}
}
//
char ds_brd(void)
{
char bit_rd;
DDRC|=0x20;
PORTC|=0x20;
PORTC&=0xdf;
delay(6);
DDRC&=0xdf;
PORTC|=0x20;
delay(10);
bit_rd=(PINC&0x20);
delay(40);
return(bit_rd);
}
//
void ds_bwr(char bit_wr)
{
DDRC|=0x20;
PORTC|=0x20;
PORTC&=0xdf;
delay(8);
if(bit_wr)
{
//DDRC&=0xdf;
PORTC|=0x20;
}
delay(60);
delay(60);
delay(60);
DDRC&=0xdf;
PORTC|=0x20;
delay(20);
}
//
char ds_reset(void)
{
char presence;
DDRC|=0x20;
PORTC|=0x20;
PORTC&=0xdf;
delay(238);
delay(238);
delay(238);
delay(238);
PORTC|=0x20;
DDRC&=0xdf;
delay(90);
presence=(PINC&0x20);
delay(238);
delay(238);
return presence;
}
//
char read_byte(void)
{
char i,value;
for (i=0;i<8;i++)
{
if(ds_brd()) value|=(0x01<<i);
delay(220);
}
delay(30);
return(value);
}
//
void write_byte(char value)
{
char i,temp;
for(i=0;i<8;i++)
{
temp=value>>i;
temp&=0x01;
ds_bwr(temp);
//delay(20);
}
delay(200);
}
答 1: 还是看看CVAVR 吧......你会大吃一惊的。 答 2: 帮你顶,帮不上什么忙不过我知道没人回答的滋味
建议高手没还是伸出友谊之手吧
答 3: 我自己也写了一个,还没用,你看看吧//-----PD5---DQ---//
#include <iom8v.h>
#define BitSet(var,bitno) ((var) |= 1 << (bitno))
#define BitClr(var,bitno) ((var) &= ~(1 << (bitno)))
extern union tempVal;
void delay(unsigned int time)
{
unsigned int i;
for(i=time;i>0;i--);
}
unsigned char ow_reset(void)
{
unsigned char flag;
BitSet(PORTD,5);//DQ(1)
delay(10);
BitClr(PORTD,5);//DQ(0);
delay(500);
BitSet(PORTD,5);//DQ(1)
delay(50);
flag=PORTD&0x40;
delay(100);
return(flag);
}
unsigned char read_byte(void)
{
unsigned int i;
unsigned char value=0;
for(i=8;i>0;i--)
{
value>>=1;
BitClr(PORTD,5);//DQ(0);
BitSet(PORTD,5);//DQ(1)
delay(2);
if(PORTD&0X40) value|=0x80;
delay(12);
}
return (value);
}
void write_byte(char val)
{
unsigned int i;
for(i=8;i>0;i--)
{
BitClr(PORTD,5);//DQ(0);
if(val&0x01) BitSet(PORTD,5);
else BitClr(PORTD,5);//DQ(0);
delay(10);
BitSet(PORTD,5);//DQ(1);
val=val/2;
}
delay(10);
}
char read_temperature()
{
unsigned char flag,temVal;
union{
unsigned char c[2];
unsigned int x;
}temp;
flag=ow_reset();
write_byte(0xCC);
write_byte(0x44);
delay(10);
ow_reset();
write_byte(0xCC);
write_byte(0xBE);
temp.c[1]=read_byte();
temp.c[2]=read_byte();
/*if(temp.c[2]&0xf8>0)
{
temp.c[1]^=0xff;
temp.c[2]^=0x07;
if(temp.c[1]&0x0f==0x0f) temVal=temp.c[2]<<4+temp.c[1]>>4+1;
else temVal=temp.c[2]<<4+temp.c[1]>>4;
}
else
{*/
temVal=temp.c[2]<<4+temp.c[1]>>4;
//}
return (temVal);
}
答 4: CV AVR 可以直接读出1820温度,由于精度的原因读18b20时,需要修改一个参数。
一条语句就搞定了!
自己编写函数,有必要吗?
C 的一个好处就是:代码重用 方便! 答 5: 楼上能否具体说明CV AVR什么意思
哪有直接读18b20的函数 答 6: 是codevision你看
位一直是1(0x04),不论我如何调整时间间隔,该位始终都是1,我已经没办法了(希望不是
产品质量,试了3个都一样(同批)),请各位DX指点
void delay(char cycle)
{
while(cycle)
{
cycle--;
asm("nop");
}
}
//
char ds_brd(void)
{
char bit_rd;
DDRC|=0x20;
PORTC|=0x20;
PORTC&=0xdf;
delay(6);
DDRC&=0xdf;
PORTC|=0x20;
delay(10);
bit_rd=(PINC&0x20);
delay(40);
return(bit_rd);
}
//
void ds_bwr(char bit_wr)
{
DDRC|=0x20;
PORTC|=0x20;
PORTC&=0xdf;
delay(8);
if(bit_wr)
{
//DDRC&=0xdf;
PORTC|=0x20;
}
delay(60);
delay(60);
delay(60);
DDRC&=0xdf;
PORTC|=0x20;
delay(20);
}
//
char ds_reset(void)
{
char presence;
DDRC|=0x20;
PORTC|=0x20;
PORTC&=0xdf;
delay(238);
delay(238);
delay(238);
delay(238);
PORTC|=0x20;
DDRC&=0xdf;
delay(90);
presence=(PINC&0x20);
delay(238);
delay(238);
return presence;
}
//
char read_byte(void)
{
char i,value;
for (i=0;i<8;i++)
{
if(ds_brd()) value|=(0x01<<i);
delay(220);
}
delay(30);
return(value);
}
//
void write_byte(char value)
{
char i,temp;
for(i=0;i<8;i++)
{
temp=value>>i;
temp&=0x01;
ds_bwr(temp);
//delay(20);
}
delay(200);
}
答 1: 还是看看CVAVR 吧......你会大吃一惊的。 答 2: 帮你顶,帮不上什么忙不过我知道没人回答的滋味
建议高手没还是伸出友谊之手吧
答 3: 我自己也写了一个,还没用,你看看吧//-----PD5---DQ---//
#include <iom8v.h>
#define BitSet(var,bitno) ((var) |= 1 << (bitno))
#define BitClr(var,bitno) ((var) &= ~(1 << (bitno)))
extern union tempVal;
void delay(unsigned int time)
{
unsigned int i;
for(i=time;i>0;i--);
}
unsigned char ow_reset(void)
{
unsigned char flag;
BitSet(PORTD,5);//DQ(1)
delay(10);
BitClr(PORTD,5);//DQ(0);
delay(500);
BitSet(PORTD,5);//DQ(1)
delay(50);
flag=PORTD&0x40;
delay(100);
return(flag);
}
unsigned char read_byte(void)
{
unsigned int i;
unsigned char value=0;
for(i=8;i>0;i--)
{
value>>=1;
BitClr(PORTD,5);//DQ(0);
BitSet(PORTD,5);//DQ(1)
delay(2);
if(PORTD&0X40) value|=0x80;
delay(12);
}
return (value);
}
void write_byte(char val)
{
unsigned int i;
for(i=8;i>0;i--)
{
BitClr(PORTD,5);//DQ(0);
if(val&0x01) BitSet(PORTD,5);
else BitClr(PORTD,5);//DQ(0);
delay(10);
BitSet(PORTD,5);//DQ(1);
val=val/2;
}
delay(10);
}
char read_temperature()
{
unsigned char flag,temVal;
union{
unsigned char c[2];
unsigned int x;
}temp;
flag=ow_reset();
write_byte(0xCC);
write_byte(0x44);
delay(10);
ow_reset();
write_byte(0xCC);
write_byte(0xBE);
temp.c[1]=read_byte();
temp.c[2]=read_byte();
/*if(temp.c[2]&0xf8>0)
{
temp.c[1]^=0xff;
temp.c[2]^=0x07;
if(temp.c[1]&0x0f==0x0f) temVal=temp.c[2]<<4+temp.c[1]>>4+1;
else temVal=temp.c[2]<<4+temp.c[1]>>4;
}
else
{*/
temVal=temp.c[2]<<4+temp.c[1]>>4;
//}
return (temVal);
}
答 4: CV AVR 可以直接读出1820温度,由于精度的原因读18b20时,需要修改一个参数。
一条语句就搞定了!
自己编写函数,有必要吗?
C 的一个好处就是:代码重用 方便! 答 5: 楼上能否具体说明CV AVR什么意思
哪有直接读18b20的函数 答 6: 是codevision你看
共4条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 |