📄 ds18b20.c
字号:
#include <mega16.h>
#define PD6 6
#define DQ_IN DDRD &= ~(1 << PD6) /*设置输入*/
#define DQ_OUT DDRD |= (1 << PD6) /*设置输出*/
#define DQ_CLR PORTD &= ~(1 << PD6) /*置低电平*/
#define DQ_SET PORTD |= (1 << PD6) /*置高电平*/
#define DQ_R PIND & (1 << PD6) /*读了电平*/
unsigned char flag; /*中断标志缓存*/
/*
延时函数
延时时间:10um
CPU频率为:4MHz。
*/
void delay_2us(void)
{ #asm("NOP");
return;
}
void delay_10us(unsigned char i) {
unsigned char j;
while (i--) {
j=5;
while(j--);
}
}
/*DS18B20复位函数*/
unsigned char ds1820_reset(void) {
unsigned char i;
flag = SREG; /*中断保护*/
#asm("cli") /*关中断*/
DQ_OUT;
DQ_CLR;
delay_10us(50); /*延时500uS(480-960)*/
DQ_SET;
DQ_IN;
delay_10us(8); /*延时80uS*/
i = DQ_R;
delay_10us(50); /*延时500uS(保持>480uS)*/
if (flag & 0x80) { /*恢复中断状态*/
#asm("sei")
}
if (i) {
return 0x00;
}
else {
return 0x01;
}
}
/*DS18B20字节读取函数*/
unsigned char ds1820_read_byte(void) {
unsigned char i;
unsigned char value = 0;
flag = SREG; /*中断保护*/
#asm("cli") /*关中断*/
for (i = 8; i != 0; i--) {
value >>= 1;
DQ_OUT;
DQ_CLR;
delay_2us(); /*延时4uS*/
delay_2us();
DQ_SET;
DQ_IN;
delay_10us(1); /*延时10uS*/
if (DQ_R) {
value|=0x80;
}
delay_10us(6); /*延时60uS*/
}
if (flag & 0x80) { /*恢复中断状态*/
#asm("sei")
}
return(value);
}
/*DS18B20字节写入函数*/
void ds1820_write_byte(unsigned char value) {
unsigned char i;
flag = SREG; /*中断保护*/
#asm("cli") /*关中断*/
for (i = 8; i != 0; i--) {
DQ_OUT;
DQ_CLR;
delay_2us(); /*延时4uS*/
delay_2us();
if (value & 0x01) {
DQ_SET;
}
delay_10us(8); /*延时80uS*/
DQ_SET; /*位结束*/
value >>= 1;
}
if (flag & 0x80) { /*恢复中断状态*/
#asm("sei")
}
}
/*启动ds1820转换*/
void ds1820_start(void) {
ds1820_reset();
ds1820_write_byte(0xCC); /*勿略地址*/
ds1820_write_byte(0x44); /*启动转换*/
}
/*DS8B20读取温度信息*/
unsigned int ds1820_read_temp(void)
{
unsigned int i;
unsigned char buf[9];
ds1820_reset();
ds1820_write_byte(0xCC); /*勿略地址*/
ds1820_write_byte(0xBE); /*读取温度*/
for (i = 0; i < 9; i++) {
buf[i] = ds1820_read_byte();
}
i = buf[1];
i <<= 8;
i |= buf[0];
return i;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -