📄 18b20._h
字号:
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define DQ_IN DDRC &= ~(1 << PA3) /*设置输入*/
#define DQ_OUT DDRC |= (1 << PA3) /*设置输出*/
#define DQ_CLR PORTC &= ~(1 << PA3) /*置低电平*/
#define DQ_SET PORTC |= (1 << PA3) /*置高电平*/
#define DQ_R PINC & (1 << PA3) /*读了电平*/
uchar flag;/*中断标志缓存*/
#define delay4us {NOP();NOP();NOP();NOP();}
#define delay10us {NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();}
void delay_10us(unsigned char i) {
if (i == 0) {
return ;
}
while (i--) {
delay4us;
}
}
/*DS18B20复位函数*/
unsigned char ds1820_reset(void) {
unsigned char i;
flag = SREG; /*中断保护*/
CLI(); /*关中断*/
DQ_OUT;
DQ_CLR;
delay_10us(49); /*延时500uS(480-960)*/
DQ_SET;
DQ_IN;
delay_10us(7); /*延时80uS*/
i = DQ_R;
delay_10us(49); /*延时500uS(保持>480uS)*/
if (flag & 0x80) { /*恢复中断状态*/
SEI();
}
if (i) {
return 0x00;
}
else {
return 0x01;
}
}
/*DS18B20字节读取函数*/
unsigned char ds1820_read_byte(void) {
unsigned char i;
unsigned char value = 0;
flag = SREG; /*中断保护*/
CLI(); /*关中断*/
for (i = 8; i != 0; i--) {
value >>= 1;
DQ_OUT;
DQ_CLR;
delay4us; /*延时4uS*/
DQ_SET;
DQ_IN;
delay10us; /*延时10uS*/
if (DQ_R) {
value|=0x80;
}
delay_10us(5); /*延时60uS*/
}
if (flag & 0x80) { /*恢复中断状态*/
SEI();
}
return(value);
}
/*DS18B20字节写入函数*/
void ds1820_write_byte(unsigned char value) {
unsigned char i;
flag = SREG; /*中断保护*/
CLI(); /*关中断*/
for (i = 8; i != 0; i--) {
DQ_OUT;
DQ_CLR;
delay4us; /*延时4uS*/
if (value & 0x01) {DQ_SET;}
//每次都只写最低位,如果最低位是1的话输出高电平作为写1信号,否则无动作即为0
delay_10us(7); /*延时80uS*/
DQ_SET; /*位结束*/
value >>= 1;
}
if (flag & 0x80) { /*恢复中断状态*/
SEI();
}
}
/*DS8B20读取温度信息*/
ds1820_read_temp(void)
{
unsigned int a = 0, b = 0, c = 0, t = 0;
float tt = 0;
ds1820_reset();
ds1820_write_byte(0xCC); /*勿略地址*/
ds1820_write_byte(0x44); /*启动转换*/
ds1820_reset();
ds1820_write_byte(0xCC); /*勿略地址*/
ds1820_write_byte(0xBE); /*读取温度*/
a = ds1820_read_byte(); //读取温度寄存器
b = ds1820_read_byte();
t = b;
t <<= 8;
t = t | a;
tt = t * 0.0625;
t = tt * 10 + 0.5; //放大10倍输出并四舍五入
a = t / 100; //十位
b = t / 10 - a * 10; //个位
c = t - a * 100 - b * 10; //小数位
locate(4,4);
write_shuju(1,a+0x30);
write_shuju(1,b+0x30);
write_hz(".");
write_shuju(1,c+0x30);
delay(100);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -