📄 ds18b20.c
字号:
/*********************************************************************
目 的: 建立DS18B20操作库
目标系统: 基于avr单片机
应用软件: AVRGCC
版 本: Version 1.2
圆版时间: 2007-09-25
开发人员: heshw99
*********************************************************************/
#include <stdint.h>
#include <avr/io.h>
#include "stdio.h"
#include <util/delay.h>
#include "stdlib.h"
#include "delay.h"
//#include <avr/signal.h>
#include <avr/interrupt.h>
//变量类型标识的宏定义
#define uchar unsigned char
#define uint unsigned int
#ifndef FREQ
#define FREQ (20)
#endif
#define DQ_IN DDRC &= ~(1 << PC6); /*设置输入*/
#define DQ_OUT DDRC |= (1 << PC6); /*设置输出*/
#define DQ_CLR PORTC &= ~(1 << PC6); /*置低电平*/
#define DQ_SET PORTC |= (1 << PC6); /*置高电平*/
#define DQ_R PINC & (1 << PC6); /*读了电平*/
#define NOP() asm("nop")
unsigned char flag; /*中断标志缓存*/
#define delay_10us(x) _delay_loop_2((uint)((x)*10*FREQ/4))
/*--------------------------------------------------------------------
函数名称:DS18B20复位
函数功能:
注意事项:主机发送复位脉冲最少480US,DS18B20等待15~60US
提示说明:无
输 入:
返 回:无
--------------------------------------------------------------------*/
unsigned char ds1820_reset(void) {
unsigned char i;
flag = SREG; /*中断保护*/
cli(); /*关中断*/
DQ_OUT;
asm("nop");
DQ_CLR;
delay_10us(49); /*延时500uS(480-960)*/
DQ_SET;
asm("nop");
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;
asm("nop");
DQ_CLR;
asm("nop");
DQ_SET;
asm("nop");
DQ_IN;
asm("nop");
if (PINC & (1 << PC0))
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;
NOP(); /*延时4uS*/
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
if (value & 0x01)
{
DQ_SET;
}
delay_10us(7); /*延时80uS*/
DQ_SET; /*位结束*/
value >>= 1;
}
if (flag & 0x80) { /*恢复中断状态*/
sei();
}
}
/*--------------------------------------------------------------------
函数名称:DS18B20(1个)开始转换
函数功能:
注意事项:无
提示说明:无
输 入:
返 回:无
--------------------------------------------------------------------*/
void ds1820_start(void) {
ds1820_reset();
ds1820_write_byte(0xCC); /*勿略地址*/
ds1820_write_byte(0x44); /*启动转换*/
}
/*--------------------------------------------------------------------
函数名称:DS18B20(1个)读温度
函数功能:
注意事项:无
提示说明:无
输 入:
返 回:温度
--------------------------------------------------------------------*/
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];
i=i*0.0625;
return i;
}
// UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = URSEL|0x06;
//UBRRL = 0x33; //set baud rate lo
UBRRL = 0x81; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x98;
}
int main(void)
{
unsigned int nTemp;
uart0_init();
ds1820_reset();
while(1)
{
ds1820_start();
delay_10us(20);
nTemp=ds1820_read_temp();
//nTemp=0x1234;
while ( !( UCSRA & (1<<UDRE)) );
UDR=nTemp>>8;
while ( !( UCSRA & (1<<UDRE)) );
UDR=nTemp;
while ( !( UCSRA & (1<<UDRE)) );
UDR=13;
while ( !( UCSRA & (1<<UDRE)) );
UDR=10;
delay_nms(600);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -