📄 ds18b20.c
字号:
#include "AVR/io.h"
#include "avr/iom8.h"
#include "avr/interrupt.h"
#include "1602.h"
#include <util/delay.h>
//定义18b20硬件相关
#define DS18B20_OUT PORTD
#define DS18B20_IN PIND
#define DS18B20_DDR DDRD
#define DS18B20_BIT 0
#define DQ_1 sbi(DS18B20_OUT,DS18B20_BIT)
#define DQ_0 cbi(DS18B20_OUT,DS18B20_BIT)
#define DQ_IN cbi(DS18B20_DDR,DS18B20_BIT)
#define DQ_OUT sbi(DS18B20_DDR,DS18B20_BIT)
#define DQ_NUM DS18B20_IN&(1<<DS18B20_BIT)
/********************************************************
函数名称:DS18B20_INIT(void)
函数功能:DS18B20复位
注意事项:主机发送复位脉冲最少480US,DS18B20等待15~60US
提示说明:无
输 入:
返 回:1:失败 0:成功
********************************************************/
uchar DS18B20_INIT(void)
{
uchar temp;
DQ_OUT;
DQ_1;
asm("nop");
DQ_0;
_delay_us(500);//延时 480us-960us之间
DQ_1;
DQ_IN;
_delay_us(60);
temp=DQ_NUM;
_delay_us(240);
return temp;
}
/********************************************************
函数名称:uchar DS18B20_R(void)
函数功能:DS18B20读取1个字节
注意事项:
提示说明:
输 入:
返 回:unsigned char
********************************************************/
uchar DS18B20_R(void)
{
uchar i;
uchar temp=0;
for(i=8;i>0;i--)
{
temp>>=1;
DQ_OUT;
DQ_0;
DQ_1;
DQ_IN;
if(DQ_NUM)
temp|=0x80;
_delay_us(60);
}
return(temp);
}
/********************************************************
函数名称:void DS18B20_W(uchar dat)
函数功能:DS18B20写入1个字节
注意事项:
提示说明:
输 入: unsigned char dat
返 回:无
********************************************************/
void DS18B20_W(uchar dat)
{
uchar i;
DQ_OUT;
for(i=8;i>0;i--)
{
DQ_0;_delay_us(4);
if(dat&0x01)DQ_1;
_delay_us(80);
DQ_1;
dat>>=1;
}
_delay_us(100);
}
void char_to_ASCII(unsigned char i,unsigned char *p) //整数到ASCII
{
p[0]=i/100+48;
p[1]=(i/10)%10+48;
p[2]=i%10+48;
p[3]=0;
}
int main(void)
{
uchar a,b,c;uchar disbuf[4];
lcd_init();
while(1)
{
if(DS18B20_INIT())
lcd_string(0,0,"no");
else
lcd_string(0,0,"yes");
_delay_us(10);
DS18B20_W(0xcc);
DS18B20_W(0x44);
_delay_ms(750);
DS18B20_INIT();
_delay_us(10);
DS18B20_W(0xcc);
DS18B20_W(0xbe);
a=DS18B20_R();
b=DS18B20_R();
c=(b<<4)+(a>>4);
char_to_ASCII(a,disbuf);
lcd_string(4,0,disbuf);
char_to_ASCII(b,disbuf);
lcd_string(7,0,disbuf);
char_to_ASCII(c,disbuf);
lcd_string(0,1,disbuf);
}
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -