///////////////////////////////////////
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省略
188610329 发表于 2021-9-14 20:31
你初始化的判断, 有点问题……
DQ_IN;//输入
delay_us(68);
wzl570 发表于 2021-9-15 08:02
我读了啊
if(PINA&0x80)//68us后还是高电平的话没有初始成功返回0
flag = 0;
188610329 发表于 2021-9-15 23:43
不是啊,你仔细看看你的代码:
DQ_ON;//1
4-2.png (222.46 KB, 下载次数: 107)
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |