您的位置 首页 元件

ATmega128(DS18B20)

//ATmega28的温度传感器DS18B20控制程序,显示环境温度,编译优化等级-01//DS18b20的C语言驱动程序,三位数码管显示,读取当前环境温度,精…

//ATmega28的温度传感器DS18B20操控程序,显现环境温度,编译优化等级-01

//DS18b20的C言语驱动程序,三位数码管显现,读取当时环境温度,精度达0.1度,温度规模0-99度
//DS18B20 具体引脚功用描绘1、GND 地信号;2、DQ数据输入出引脚。开漏单总线接口引脚。当被用在寄生电源
//也能够向器材供给电源;3、VDD可选择的VDD 引脚。当作业于寄生电源时,此引脚有必要接地。
//DS18B20 的使用方法。DS18B20 选用的是1-Wire 总线协议方法
//即在一根数据线完成数据的双向传输
//编译环境 AVR Studio 4.17/AVR GCC
//体系时钟7.3728MHZ,设置熔丝位为外部高频石英晶体振荡,发动时刻4.1ms

//***********************************************************************
//包括文件
//***********************************************************************

#include
#include
#define F_CPU7372800/* 单片机主频为7.3728MHz,用于延时子程序 */
#include
#include <avr/io.h>
#include

//***********************************************************************
//界说变量区
//***********************************************************************

#define delay_us(x) _delay_us(x) //AVR GCC延时函数 x(us)
#define delay_ms(x) _delay_ms(x) //AVR GCC延时函数 x(ms)

#define uchar unsigned char
#define uint unsigned int

#define Data_IO PORTA //数码管数据口
#define Data_DDR DDRA //数码管数据口方向寄存器
#define D_LE0 PORTD &= ~(1 << PD4) //数码管段操控位为0,锁存端口数据
#define D_LE1 PORTD |= (1 << PD4) //数码管段操控位为1,锁存器输出与端口共同
#define W_LE0 PORTD &= ~(1 << PD5) //数码管位操控位为0
#define W_LE1 PORTD |= (1 << PD5) //数码管位操控位为1

#define DQ_IN DDRE &= ~(1 << PE4)//设置输入,DS18B20接单片机PE4口
#define DQ_OUT DDRE |= (1 << PE4)//设置输出
#define DQ_CLR PORTE &= ~(1 << PE4)//置低电平
#define DQ_SET PORTE |= (1 << PE4)//置高电平
#define DQ_R PINE & (1 << PE4)//读电平

uchar key;
uint temp_value;
uint temp,A1,A2,A3; //界说的变量,显现数据处理
uchar flag1;

//***********************************************************************
//共阴数码管显现的断码表0~F
//***********************************************************************

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//***********************************************************************
//IO端口初始化
//***********************************************************************

void system_init()
{
Data_IO=0xFF; //数据口为输出
Data_DDR=0xFF;

PORTD=0xFF; //74HC573的操控口,设置为输出
DDRD=0xFF;
}

//*************************************************************************
//74HC573操控数码管动态扫描显现函数,显现收集到的温度
//*************************************************************************

void Display_DS18B20(uint data_b,uint data_s,uint data_g)
{
uchar i,j;
system_init();
j=0x01; //此数据用来操控位选
for(i=0;i<5;i++) //用后3位数码管来显现
{
D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=0x00;
D_LE0;
delay_ms(1);
}
D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=table[A1];
D_LE0;
delay_ms(1);

D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=table[A2]|0x80; //显现小数点
D_LE0;
delay_ms(1);

D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=table[A3];
D_LE0;
delay_ms(1);

D_LE1;
W_LE1;
Data_IO=0xff;
W_LE0;

}

//*************************************************************************
//DS18B20初始化
//*************************************************************************

unsigned char DS18B20_Reset(void) //初始化和复位

{
unsigned char i;
DQ_OUT;
DQ_CLR;
delay_us(500);//延时500uS(480-960)
DQ_SET;
DQ_IN;
delay_us(80);//延时80uS
i = DQ_R;
delay_us(500);//延时500uS(坚持>480uS)

if (i)
{
return 0x00;

}
else
{
return 0x01;

}

}

//*************************************************************************
//DS18B20读一个字节函数
//*************************************************************************

unsigned char ds1820_read_byte(void)
{

unsigned char i;
unsigned char value = 0;
for (i = 8; i != 0; i–)
{
value >>= 1;
DQ_OUT;
DQ_CLR;
delay_us(4);//*延时4uS

DQ_SET;
DQ_IN;
delay_us(10);//*延时10uS

if (DQ_R)
{
value|=0x80;

}
delay_us(60); //*延时60uS

}

return(value);
}

//*************************************************************************
//向18B20写一个字节函数
//*************************************************************************

/*DS18B20字节写入函数*/
void ds1820_write_byte(unsigned char value)
{

unsigned char i;
for (i = 8; i != 0; i–)
{
DQ_OUT;
DQ_CLR;
delay_us(4);//延时4uS
if (value & 0x01)
{
DQ_SET;

}
delay_us(80);//延时80uS
DQ_SET; //位完毕
value >>= 1;

}

}
//*************************************************************************
//发送温度转化指令
//*************************************************************************

/*发动ds1820转化*/
void ds1820_start(void) {

DS18B20_Reset();
ds1820_write_byte(0xCC);//勿略地址
ds1820_write_byte(0x44);//发动转化
}

//*************************************************************************
//DS8B20读取温度信息
//*************************************************************************

unsigned int ds1820_read_temp(void)
{

unsigned int i;
unsigned char buf[9];

DS18B20_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];
temp_value=i;
temp_value=temp_value*0.625; //不是乘以0.0625的原因是为了把小数点后一位数据也转化为能够显现的数据
//比方温度本身为27.5度,为了在后续的数据处理程序中得到BCD码,咱们先扩大到275
//然后在显现的时分确认小数点的方位即可,就能显现出27.5度了
return i;
}

//*************************************************************************
//温度数据处理函数
//*************************************************************************
void data_do(uint temp_d)
{
uint A2t;
A1=temp_d/100; //分出百,十,和个位
A2t=temp_d%100;
A2=A2t/10;
A3=A2t%10;
}

//*************************************************************************
//主程序
//*************************************************************************

void main(void)
{
uint j;
DS18B20_Reset(); //复位D18B20
while (1)
{
ds1820_start(); //发动一次转化
ds1820_read_temp(); //读取温度数值
data_do(temp_value); //处理数据,得到要显现的值
for(j=0;j<200;j++)
{
Display_DS18B20(A1,A2,A3); //显现温度值
}

}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/yuanjian/276146.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部