📄 ds1820++.c
字号:
/*
DS18B20操作模块
1、DS18B20的电源脚接到VCC及GND上面,数据线接到PA7口。
2、晶振频率为内部1MHz。
3、DS18B20由PA7口实现单总线访问,实现读取温度。
4、此文件可以直接嵌入到项目中使用。
AVR mega16学习板
AVR_AFA
www.iccavr.com
11:48 2007-6-30
*/
#include <iom16v.h>
#include <macros.h>
#define DQ_IN DDRA &= ~(1 << PA7) /*设置输入*/
#define DQ_OUT DDRA |= (1 << PA7) /*设置输出*/
#define DQ_CLR PORTA &= ~(1 << PA7) /*置低电平*/
#define DQ_SET PORTA |= (1 << PA7) /*置高电平*/
#define DQ_R PINA & (1 << PA7) /*读了电平*/
unsigned char flag; /*中断标志缓存*/
/*
延时函数
频率为1MHz,延时:i X 10 + 16uS*/
void delay_10us(unsigned char i) {
if (i == 0) {
return ;
}
while (i--) {
NOP();
NOP();
NOP();
NOP();
}
}
/*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;
}
}
/*===================================================================
// 函数功能: 从 1-wire 总线上读取一个字节
// 形参: void
// 返回: unsigned char 读到的值
// 编写: 2004/8/25
===================================================================*/
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;
NOP(); /*延时4uS*/
NOP();
NOP();
NOP();
DQ_SET;
DQ_IN;
NOP(); /*延时10uS*/
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
if (DQ_R) {
value|=0x80;
}
delay_10us(5); /*延时60uS*/
}
if (flag & 0x80) { /*恢复中断状态*/
SEI();
}
return(value);
}
/*===================================================================
// 函数功能: 向 1-WIRE 总线上写一个字节
// 形参: value 写到总线上的值
// 返回: void
// 编写: 2004/8/25
===================================================================*/
void ds1820_write_byte(unsigned char value) {
unsigned char i;
flag = SREG; /*中断保护*/
CLI(); /*关中断*/
for (i = 8; i != 0; i--) {
DQ_OUT;
DQ_CLR;
NOP(); /*延时4uS*/
NOP();
NOP();
NOP();
if (value & 0x01) {
DQ_SET;
}
delay_10us(7); /*延时80uS*/
DQ_SET; /*位结束*/
value >>= 1;
}
if (flag & 0x80) { /*恢复中断状态*/
SEI();
}
}
/*启动ds1820转换*/
void ds1820_start(void) {
ds1820_reset();
ds1820_write_byte(0xCC); /*勿略地址*/
ds1820_write_byte(0x44); /*启动转换*/
}
/*===================================================================
// 函数功能: 读取温度
// 形参: *temperature 温度存储空间
// 返回: unsigned char true为有效
// 编写: 2004/8/25
===================================================================*/
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;
}
/*===================================================================
// 函数功能: 读取Rom Code
// 形参: *temp DS18B20的Rom Code存储空间
// 返回: unsigned char true为有效
// 编写: 2004/8/25
===================================================================*/
/*unsigned char ds1820_read_rom(unsigned char *temp)
{
ds1820_ack();
write_byte(0x33);
temp[0] = read_byte();
temp[1] = read_byte();
temp[2] = read_byte();
temp[3] = read_byte();
temp[4] = read_byte();
temp[5] = read_byte();
temp[6] = read_byte();
temp[7] = read_byte();
if(crccheck(temp,8))
return false;
else
return true;
}*/
/*===================================================================
// 函数功能: 匹配DS18B20
// 形参: *p DS18B20的Rom Code
// 返回: void
// 编写: 2004/8/25
===================================================================*/
/*void ds1820_match(unsigned char *p)
{
unsigned char i;
ds1820_ack();
write_byte(0x55);
for(i=0;i<8;i++)
write_byte(p[i]);
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -