📄 ds18b20.c
字号:
/***************************************************************************
DS18B20自动搜索算法测试程序
Author: 仔仔
Email:soulmate_gigi@163.com
****************************************************************************/
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/eeprom.h>
#include <avr/delay.h>
#include "string.h"
#include "stdio.h"
#define NOP asm volatile("nop\n"::)
#define _NOP() NOP
#define BAUDRATE 9600 //波特率
#define TraMode PORTC|=(1<<2) //发送模式
#define RecMode PORTC&=~(1<<2) //接收模式
#define BIT0 (0x0001)
#define BIT1 (0x0002)
#define BIT2 (0x0004)
#define BIT3 (0x0008)
#define BIT4 (0x0010)
#define BIT5 (0x0020)
#define BIT6 (0x0040)
#define BIT7 (0x0080)
#define BIT8 (0x0100)
#define BIT9 (0x0200)
#define BITA (0x0400)
#define BITB (0x0800)
#define BITC (0x1000)
#define BITD (0x2000)
#define BITE (0x4000)
#define BITF (0x8000)
static unsigned char dscrc_table[] = {
0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53};
/********************************************************************************
位变量操作宏定义
********************************************************************************/
#define BIT_SET(a,b) a|=(1<<b)
#define BIT_CLR(a,b) a&=~(1<<b)
#define BIT_INV(a,b) a^=(1<<b)
#define BIT_STATUS(a,b) a&(1<<b)
/********************************************************************************
DS18B20操作定义
********************************************************************************/
#define CLR_DS18B20 BIT_CLR(PORTB,PB1) //数据线强制拉低
#define SET_DS18B20 BIT_SET(PORTB,PB1) //数据线强制拉高,上拉
#define HLD_DS18B20 BIT_SET(DDRB,PB1) //Mega16控制总线
#define RLS_DS18B20 BIT_CLR(DDRB,PB1) //释放总线
#define STU_DS18B20 BIT_STATUS(PINB,PB1) //数据线的状态
unsigned char ROM_NO[8];
unsigned char LastDiscrepancy;
unsigned char LastFamilyDiscrepancy;
unsigned char LastDeviceFlag;
unsigned char crc8;
volatile unsigned char PC_COMMAND; //PC发出的当前命令
volatile unsigned char RX_BUFFER[16]; //存放接收数据的数组
volatile unsigned char RX_index; //存放接收数据的个数
volatile unsigned char TX_BUFFER[16]; //存放发送数据的数组
unsigned char result[9];
unsigned char lpmain;
unsigned char R_Delay=0;
unsigned int R_Status=0;
double temp;
void delayUs(unsigned int temp);
unsigned char OWReset(void);
unsigned char OWReadBit(void);
unsigned char OWReadbyte(void);
void OWWriteBit(unsigned char temp);
void OWWriteByte(unsigned char wb);
void delayms(void);
unsigned char OWSearch(void);
unsigned char docrc8(unsigned char value);
int OWFirst(void);
int OWNext(void);
void init_port(void);
void init_timer1(void);
void init_USART(void);
void put_c(unsigned char c);
void put_s(unsigned char *s,unsigned char Len);
int main(void)
{
unsigned int i;
cli();
MCUSR=0;
wdt_disable();
init_port();
init_timer1();
init_USART();
for(i=0;i<20;i++)
_delay_ms(20);
sei();
if (OWFirst())
{
put_s(ROM_NO,sizeof(ROM_NO));
while(OWNext())
{
put_s(ROM_NO,sizeof(ROM_NO));
}
}
while(1)
{
/* if (R_Status&BIT0)
{
R_Status&=~BIT0;
OWReset();
OWWriteByte(0x55);
ROM_NO[0]=0x28;
ROM_NO[1]=0xb7;
ROM_NO[2]=0x19;
ROM_NO[3]=0x7b;
ROM_NO[4]=0x00;
ROM_NO[5]=0x00;
ROM_NO[6]=0x00;
ROM_NO[7]=0x2f;
for(i=0;i<8;i++)
OWWriteByte(ROM_NO[i]);
OWWriteByte(0x44);
for(i=0;i<50;i++);
_delay_ms(10);
OWReset();
OWWriteByte(0x55);
ROM_NO[0]=0x28;
ROM_NO[1]=0xb7;
ROM_NO[2]=0x19;
ROM_NO[3]=0x7b;
ROM_NO[4]=0x00;
ROM_NO[5]=0x00;
ROM_NO[6]=0x00;
ROM_NO[7]=0x2f;
for(i=0;i<8;i++)
OWWriteByte(ROM_NO[i]);
OWWriteByte(0xbe);
for(lpmain=0;lpmain<9;lpmain++)
{
result[lpmain] = OWReadbyte();
}
OWReset();
put_s(result,sizeof(result));
} */
/* if (R_Status&BIT0)
{
R_Status&=~BIT0;
memset((void *)result,0,sizeof(result));
OWReset();
OWWriteByte(0xcc); //跳过ROM
OWWriteByte(0x44); //启动温度转换
delayms();
OWReset();
OWWriteByte(0xcc); //跳过ROM
OWWriteByte(0xbe); //读数据
for(lpmain=0;lpmain<9;lpmain++)
{
result[lpmain] = OWReadbyte();
}
}*/
}
}
void delayUs(unsigned int temp)
{
while(temp--);
}
/**********************************************************************
functionName: BYTE resetDS18B20(void)
description :DS18B20初始化
**********************************************************************/
unsigned char OWReset(void)
{
unsigned char errTime=0;
RLS_DS18B20; //释放总线
_NOP();
HLD_DS18B20; //Maga16控制总线
CLR_DS18B20; //强制拉低
delayUs(150); //209.42us
delayUs(150); //209.42us 480us
RLS_DS18B20; //释放总线,总线自动上拉
_NOP();
while(STU_DS18B20)
{
delayUs(2); //5.15us
errTime++;
if(errTime>14)
return(0x00); //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
}
errTime=0;
while(!(STU_DS18B20))
{
delayUs(2); //5.15us
errTime++;
if(errTime>50)
return(0x00); //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
}
delayUs(120);
delayUs(125);
return(0xff);
}
////////////////////////////////////////////////
unsigned char OWReadBit(void)
{
unsigned char t;
HLD_DS18B20; //Maga16控制总线
CLR_DS18B20; //强制拉低
_NOP();
_NOP();
RLS_DS18B20; //释放总线,DS18B20会将总线强制拉低
delayUs(3);
if(STU_DS18B20)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -