atmega128(ds18b20)-皇冠最新app版本

×
嵌入式 > 嵌入式开发 > 详情

atmega128(ds18b20)

发布时间:2026-08-04 发布时间:
|
//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_d0;
a2=a2t/10;
a3=a2t;
}

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

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); //显示温度值
}


}
}



『本文转载自网络,皇冠最新app版本的版权归原作者所有,如有侵权请联系删除』

热门文章 更多
verilog hdl基础之:与c语言的区别与联系(独家)
网站地图