📄 dsi8b20._c
字号:
/******************************************/
/* 北京MCU学习之家 */
/* ADC通信演示程序 */
/* 作者:白如冰 */
/* 2005年10月1日 */
/* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
/******************************************/
// 1、使用WIN9X/WIN2000/XP的超级终端,进行通信调试。
// 2、通信波特率为9600(8位数据,无校验,1位停止位,无数据流控制)。
#include <iom8v.h>
#include <macros.h>
extern void delay_us(unsigned int n);
extern void delay_ms(unsigned int n);
extern void uart_init(void);
extern void putchar(unsigned char c);
extern void puts(char *s);
extern void puts_hh(char *s);
#define ds1820_data_s PORTD|=BIT(PORTD6)
#define ds1820_data_c PORTD&=~BIT(PORTD6)
unsigned char reset_ov(void) //18b20 复位函数
{
char c=0;
ds1820_data_s;
delay_us(1);//6
ds1820_data_c;
delay_us(660);//500
ds1820_data_s;
delay_us(73);//60us
c=(PIND&=0x40);//dq_in;
if(c==0x40)
return (0);
else
{
delay_us(326);//250
return (1);
}
}
void write_data(unsigned char data) //DS18B20写函数
{
unsigned char i,temp;
temp=data;
for (i=0; i<8; i++)
{
if((temp&0x01)&&0x01)
{
ds1820_data_c;
delay_us(6);//10
ds1820_data_s;
delay_us(73);//60
}
else
{
ds1820_data_c;
delay_us(80);//70
ds1820_data_s;
delay_us(1);//6
}
data>>=1;
temp=data;
}
}
unsigned char read_data(void) //DS18B20 读函数
{
unsigned char i;
char value = 0;
for (i=0;i<8;i++)
{
value>>=1;
ds1820_data_c;
delay_us(1);//6
ds1820_data_s;
delay_us(1); //6
if((PIND&=0x40)==0x40)
value|=0x80;
delay_us(73);//60
}
return(value);
}
void init_ds1820(void)
{
unsigned char i;
for(i=0;i<40;i++)
{if(reset_ov())
break;
}
write_data(0xcc); //跳过ROM
write_data(0x4e); //写配置寄存器指令
write_data(0x00);
write_data(0x00);
write_data(0x7f); //配置转换位数为12位,转换时间为750ms
for(i=0;i<40;i++)
{if(reset_ov())
break;
}
write_data(0xcc);
write_data(0x44); //转换命令 开始第一次转换
}
//读温度值
unsigned int read_temper(void)
{
unsigned int x;
unsigned char templ,temph,i;
for(i=0;i<40;i++)
{if(reset_ov())
break;
}
write_data(0xcc); //跳过ROM
write_data(0xbe); //读温度命令
templ=read_data();
temph=read_data();
for(i=0;i<40;i++)
{if(reset_ov())
break;
}
write_data(0xcc);
write_data(0x44); //转换命令
x=temph;
x<<=8;
x+=templ;
return x;
}
void main(void)
{
unsigned char temp[5];
unsigned int temper_data;
DDRD=0XFF;
PORTD=0Xff;
uart_init();
init_ds1820();
while(1)
{
delay_ms(1000);
temper_data=read_temper();
temper_data*=0.625;
temp[0]=temper_data%10+0x30;
temp[1]=(temper_data/10)%10+0x30;
temp[2]=(temper_data/100)%10+0x30;
puts("当前温度是:");
putchar(temp[2]);
putchar(temp[1]);
putchar('.');
putchar(temp[0]);
putchar('`');
putchar('C');
puts_hh(" ");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -