中科因仑“3+1”工程特种兵精英论坛
标题:
基于ATmega16的温度传感器DS18B20程序-数码管显示
[打印本页]
作者:
lxe
时间:
2014-7-28 16:54
标题:
基于ATmega16的温度传感器DS18B20程序-数码管显示
/******************************************************
//文件名称:ATmega16--DS18B20--数码管显示
//作 者:LXE
//版 本:
//日 期:2014.7.28
//说 明:
//修改记录:
*******************************************************/
#include <iom161v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define CLK_H() PORTA |= BIT(1) //74HC595时钟线
#define CLK_L() PORTA &= ~BIT(1) //
#define RCK_H() PORTA |= BIT(2) //74HC595锁存线
#define RCK_L() PORTA &= ~BIT(2) //
#define DATA_H() PORTA |= BIT(3) //74HC595数据线
#define DATA_L() PORTA &= ~BIT(3) //
#define DQ_OUT() DDRA |= BIT(7) //设置PA7为输出
#define DQ_IN() DDRA &= ~BIT(7) //设置PA7为输入
#define DQ_H() PORTA |= BIT(7) //PA7输出高电平
#define DQ_L() PORTA &= ~BIT(7) //PA7输出低电平
#define DQ PINA & BIT(7) //PA7数据读取
uchar seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //断码表
uchar table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码表
uchar buf[]={0,0,0,0,0,0,0,0}; //数据缓存区
uint Temp = 20;
uchar Temp_Value[] = {0x00,0x00};
/*******************************************************
//函数名称:
//函数功能:
//输入参数:
//返回参数:
********************************************************/
void delay(void)
{
asm("nop");
}
/*******************************************************
//函数名称:
//函数功能:
//输入参数:
//返回参数:
********************************************************/
void delay_us(uint t)
{
while(t--)
delay();
}
/*******************************************************
//函数名称:
//函数功能:
//输入参数:
//返回参数:
********************************************************/
void DS18B20_Init(void)
{
DQ_OUT();
DQ_H();
DQ_L();
delay_us(500);
DQ_H();
DQ_IN();
delay_us(40);
DQ_IN();
while(DQ);
DQ_OUT();
DQ_H();
delay_us(140);
}
/*******************************************************
//函数名称:
//函数功能:
//输入参数:
//返回参数:
********************************************************/
uchar Read_Byte(void)
{
uchar i,dat = 0;
for(i = 0;i < 8;i++)
{
DQ_OUT(); DQ_L();
dat >>= 1;
DQ_H();
DQ_IN();
if(DQ) dat |= 0x80;
delay_us(50);
DQ_OUT();DQ_H();
}
return dat;
}
/*******************************************************
//函数名称:
//函数功能:
//输入参数:
//返回参数:
********************************************************/
void Write_Byte(uchar dat)
{
uchar i;
for(i = 0;i < 8;i++)
{
DQ_OUT(); DQ_L();
if((dat & 0x01) == 0x01)DQ_H();
if((dat & 0x01) == 0x00)DQ_L();
delay_us(40);
DQ_H();
dat >>= 1;
}
}
/*******************************************************
//函数名称:
//函数功能:
//输入参数:
//返回参数:
********************************************************/
void Read_Temperature(void)
{
DS18B20_Init(); //DS18B20初始化
Write_Byte(0xcc);
Write_Byte(0x44);
delay_us(600);
DS18B20_Init(); //DS18B20初始化
Write_Byte(0xcc);
Write_Byte(0xbe);
Temp_Value[0] = Read_Byte(); //第一次读取数据放入低位
Temp_Value[1] = Read_Byte(); //第二次读取数据放入高位
}
/*******************************************************
//函数名称:
//函数功能:
//输入参数:
//返回参数:
********************************************************/
void Sent_col_data(uchar dat)
{
uchar i;
for(i = 0;i < 8;i++)
{
CLK_L();
if((dat & 0x80) == 0x80) DATA_H();
if((dat & 0x80) == 0x00) DATA_L();
CLK_H();
dat <<= 1 ;
}
}
/*******************************************************
//函数名称:
//函数功能:
//输入参数:
//返回参数:
********************************************************/
void Sent_col(uchar dat1,uchar dat2)
{
Sent_col_data(dat1);
Sent_col_data(dat2);
RCK_L();
RCK_H();
}
/*******************************************************
//函数名称:
//函数功能:
//输入参数:
//返回参数:
********************************************************/
void display(void)
{
uchar i;
Read_Temperature(); //启动DS18B20
Temp = ((Temp_Value[1] << 8) | Temp_Value[0])*6.25; //两位小数
/* 分辨率 */
/* 数据转换16进制转换为10进制 *0.0625则为整数xx *0.625则有一位小数xx.x *6.25则有两位小数xx.xx */
//温度范围0~125
buf[6] = Temp / 10000;
buf[5] = Temp % 10000 / 1000;
buf[4] = Temp % 1000 / 100;
buf[3] = Temp % 100 / 10;
buf[2] = Temp % 10;
//数据发送显示
for(i = 0;i < 8;i++)
{
if(i == 0) Sent_col(~table[i],0x58); //数码管最后一个显示c
else if(i == 1||i ==7||(i == 6&& buf[6]==0))
Sent_col(~table[i],0x00); //无用位不显示
else if(i == 4) Sent_col(~table[i],seg[buf[i]]|0x80); //在温度的个位上加上点
else Sent_col(~table[i],seg[buf[i]]);
delay_us(400);
}
}
/*******************************************************
//函数名称:
//函数功能:
//输入参数:
//返回参数:
********************************************************/
int main(void)
{
DDRA = 0x0F; //设置PA口为输出方式
PORTA = 0xFF; //设置PA口为上拉模式
DS18B20_Init();
while(1)
{
display(); //数码管显示
}
return 0;
}
复制代码
。。。这个程序时序非常重要,,因为只有一根数据线。。既要作输出又要作输入,时序不对则无法读取数据。
作者:
lxe
时间:
2014-7-29 09:26
。。。编译软件ICCV8 for AVR CODEBLOCKS 烧写软件AVR_fighter。。。
作者:
张衍波
时间:
2014-7-29 11:51
这个帖子真棒!
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/)
Powered by Discuz! X3.4