📄 main.c
字号:
#include <avr/io.h>
#include <avr/sfr_defs.h>
#include <util/delay.h>
/****************************************Copyright (c)**************************************************
** 描 述: 宏定义
**********************************************************************************************************/
/********************************************************************************
数据类型的定义
********************************************************************************/
#define uchar unsigned char
#define uint unsigned int
/********************************************************************************
位变量操作宏定义
********************************************************************************/
#define BIT_SET(a,b) a|=_BV(b)
#define BIT_CLR(a,b) a&=~_BV(b)
#define BIT_INV(a,b) a^=_BV(b)
#define BIT_STATUS(a,b) a&_BV(b)
/********************************************************************************
DS18B20操作定义
********************************************************************************/
#define CLR_DS18B20 BIT_CLR(PORTD,PD0) //数据线强制拉低
#define SET_DS18B20 BIT_SET(PORTD,PD0) //数据线强制拉高,上拉
#define HLD_DS18B20 BIT_SET(DDRD,PD0) //Mega16控制总线
#define RLS_DS18B20 BIT_CLR(DDRD,PD0) //释放总线
#define STU_DS18B20 BIT_STATUS(PIND,PD0) //数据线的状态
/****************************************Copyright (c)**************************************************
** 描 述: 函数声明
**********************************************************************************************************/
void display(void);
uchar resetDS18B20(void);
uchar readByteDS18B20(void);
void writeByteDS18B20(uchar wb);
uint readTempDS18B20(void);
//---------------------------------------------------------------------------
uchar dis_buf[3]={0,1,2}; /*显示缓冲区*/
const uchar table[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
0x40,0x00};
//---------------------------------------------------------------------------
void display()
{ uchar esgcode,bitcode,i;
bitcode=0xfe;
DDRB=0xff;
DDRA=0xff;
for(i=0;i<3;i++)
{ esgcode=dis_buf[i];
PORTB=table[esgcode];
PORTA=bitcode;
_delay_ms(1);
bitcode=bitcode<<1;
bitcode=bitcode|0x01;
}
}
/****************************************Copyright (c)**************************************************
** 描 述: DS18B20函数
**********************************************************************************************************/
/**********************************************************************
functionName: uchar resetDS18B20(void)
description :DS18B20初始化
**********************************************************************/
uchar resetDS18B20()
{ uchar flag;
RLS_DS18B20; //释放总线
HLD_DS18B20; //Maga16控制总线
CLR_DS18B20; //强制拉低
_delay_us(500); //延时500us,大于480us
RLS_DS18B20; //释放总线,总线自动上拉
_delay_us(85); //等待85us,读取总线状态
flag=STU_DS18B20; //读取总线
while(!STU_DS18B20);//等待复位成功
_delay_us(180);
return(flag);
}
/**********************************************************************
functionName: uchar readByteDS18B20(void)
description :读DS18B20一个字节
**********************************************************************/
uchar readByteDS18B20()
{
uchar i;
uchar retVal=0;
RLS_DS18B20; //释放总线
for(i=8;i>0;i--)
{
retVal>>=1;
HLD_DS18B20; //Maga16控制总线
CLR_DS18B20; //强制拉低
_delay_us(2); //延时2us,大于1us
RLS_DS18B20; //释放总线
_delay_us(10); //10us后读取总线状态,
if(STU_DS18B20)
{retVal|=0x80;
}
_delay_us(50); //延时30us
RLS_DS18B20; //释放总线
RLS_DS18B20; //释放总线
_delay_us(3); //3us
}
return(retVal);
}
/**********************************************************************
functionName: uchar readByteDS18B20(void)
description :写DS18B20一个字节
**********************************************************************/
void writeByteDS18B20(uchar wb)
{
uchar j=8;
for(j=8;j>0;j--)
{
HLD_DS18B20; //Maga16控制总线
CLR_DS18B20; //强制拉低
_delay_us(3); //保持3us
if((wb&0x01)==0x01)
{SET_DS18B20;}
else CLR_DS18B20;
_delay_us(65);
RLS_DS18B20; //释放总线
wb>>=1;
_delay_us(8);
}
}
/**********************************************************************
functionName: unsigned int readTempDS18B20(void)
description :读DS18B20温度
**********************************************************************/
uint readTempDS18B20()
{
uchar tempL,tempH;
uint x;
resetDS18B20();
writeByteDS18B20(0xcc); //跳过ROM
writeByteDS18B20(0x44); //启动温度转换
for(x=13;x>0;x--)display();
resetDS18B20();
writeByteDS18B20(0xcc); //跳过ROM
writeByteDS18B20(0xbe); //读数据
tempL=readByteDS18B20();
tempH=readByteDS18B20();
x=(tempH<<4)|(tempL>>4);
display();
return(x);
}
int main(void)
{
DDRD = 0x01;//初始化总线
PORTD = 0x01;
uint i;
while(1)
{
i=resetDS18B20();
i=readTempDS18B20();
dis_buf[2]=0;
dis_buf[1]=i/10;
dis_buf[0]=i%10;
display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -