附上關于DS18B20操作的部分源碼讀到temp是錯誤的!!!
然后我單獨檢驗讀到的MSB和LSB的值,結果竟然是一樣的!!!!
搞了好久還沒有解決,只能請教大佬們了///////////////////////////////////////
AVR16
8M
//////////////////////////////////////
#include<iom16v.h>
#include"lcd1602.h"
#define DQ_OUT DDRA|=0X80
#define DQ_IN DDRA&=~0X80
#define DQ_ON PORTA|=0X80
#define DQ_OFF PORTA&=~0X80
void IO_init(void);
char DS18_init(void);
void Write_cmd(uchar cmd);
uchar Read_data(void);
const uchar num[]={"0123456789"};
void delay_us(uint us)//微妙延時
{
do{
us--;
}while(us>1);
}
void delay_ms(uint ms)//毫秒延時
{
while(ms != 0)
{
delay_us(999);
ms--;
}
}
void IO_init(void)//初始化lcd1602與avr的接口
{
DDRC = 0XFF;
PORTC = 0XFF;
DDRD |= (1<<7)|(1<<6)|(1<<5);
PORTD |= (1<<7)|(1<<6)|(1<<5);
}
char DS18_init(void)
{
char flag;
DQ_OUT;//輸出
DQ_ON;//1
DQ_OFF;//0
delay_us(550);//>480us
DQ_ON;//1
DQ_IN;//輸入
delay_us(68);
if(PINA & 0X80) flag = 0;
else flag = 1;//初始化成功
delay_us(420);
return flag;
}
void Write_cmd(uchar cmd)//寫一個字節
{
char i,flag=0;
DQ_OUT;
DQ_ON;
for(i=0;i<8;i++)
{
flag = cmd & 0X01;
if(flag)
{
DQ_OFF;
delay_us(10);
DQ_ON;
delay_us(50);
}
else
{
DQ_OFF;
delay_us(60);
}
DQ_ON;
cmd>>=1;
}
}
uchar Read_data(void)//讀一個字節
{
uchar i,flag=0,data=0;
DQ_OUT;
DQ_ON;
for(i=0;i<8;i++)
{
data>>=1;
DQ_OFF;
delay_us(5);
DQ_IN;
DQ_ON;
delay_us(5);
flag = PINA & 0X80;
delay_us(50);
if(flag) data |= 0X80;
DQ_OUT;
DQ_ON;
}
return data;
}
void Changtemp(void)//溫度轉換
{
DS18_init();
Write_cmd(0xcc);
Write_cmd(0x44);
delay_ms(800);
}
void Readtemp(void)//讀取溫度
{
DS18_init();
Write_cmd(0xcc);
Write_cmd(0xbe);
}
uchar ReadDS18temp(void)
{
uchar tmh = 0, tml = 0;
int temp = 0;
Changtemp();
Readtemp();
tml = Read_data();//先接收低位
tmh = Read_data();//再接收高位
//這里讀到的高位和低位是一樣的
temp = tmh;
temp <<= 8;
temp |= tml;
return temp;
}
//main省略
|