//温度加串口程序//
//初始化定义
#include<avr/io.h>
#include<util/delay.h>
#define F_CPU 8000000
#define fosc 8000000 //晶振 8MHZ
#define baud 9600 //波特率
#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) //读电平
unsigned int temp_value,temp_h,temp_l;
unsigned int temp,A1,A2,A3;A4;
// 延时程序 10倍
void delay_us(unsigned int i)
{
unsigned int j;
for(;i!=0;i--)
{_delay_us(10);
}
}
//*************************************************************************
// DS18B20初始化
//*************************************************************************
unsigned char DS18B20_Reset(void) //初始化和复位
{
unsigned char i;
DQ_OUT;
DQ_CLR;
delay_us(50); //延时500uS(480-960)
DQ_SET;
DQ_IN;
delay_us(8); //延时80uS
i = DQ_R;
delay_us(50); //延时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(1); //*延时4uS
DQ_SET;
DQ_IN;
delay_us(1); //*延时10uS
if (DQ_R)
{
value|=0x80;
}
delay_us(6); //*延时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(1); //延时4uS
if (value & 0x01)
{
DQ_SET;
}
delay_us(8); //延时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_h=buf[1];
temp_l=buf[0];
temp_value=i;
temp_value=temp_value*0.625; //不是乘以0.0625的原因是为了把小数点后一位数据也转化为可以显示的数据
//比如温度本身为27.5度,为了在后续的数据处理程序中得到BCD码,我们先放大到275
//然后在显示的时候确定小数点的位置即可,就能显示出27.5度了
return i;
}
//*************************************************************************
// 温度数据处理函数
//*************************************************************************
void data_do(unsigned int temp_d)
{
unsigned int A2t,A3t;
A1=temp_d/1000;
A2t=temp_d%1000;
A2=A2t/100;
A3t=A2t%100;
A3=A3t/10;
A4=A3t%10;
}
/***********************************************************************
*****
函数功能:uart1 初始化程序
入口参数:
出口参数:
************************************************************************
****/
void uart1_init(void) //USART1 初始化
{
UCSR1B = 0x00; //关闭 USART1
UCSR1A = 0x00; //不适使用倍速发送
UCSR1C = (1<<UCSZ11)|(1<<UCSZ10);//数据位为八位
UBRR1L=(fosc/16/(baud+1))%256;//异步正常模式下,UBRR 的计算公式
UBRR1H=(fosc/16/(baud+1))/256;
UCSR1B =(1<<RXEN1)|(1<<TXEN1); //接收使能,传送使能
}
/***********************************************************************
函数功能:uart1 发送单字节数据
入口参数:c
出口参数:
************************************************************************
****/
void putchar1(unsigned int c)//串口 1 发送字符
{
while (!(UCSR1A&(1<<UDRE1)));//表明发送器一准备就绪
UDR1=c;
}
/***********************************************************************
*****
函数功能:主程序
入口参数:
出口参数:
************************************************************************
****/
void main(void)
{
unsigned char i;
unsigned int j;
DS18B20_Reset();
uart1_init();
while(1)
{ ds1820_start(); //启动一次转换
ds1820_read_temp(); //读取温度数值
data_do(temp_value);
int a;
for(a=100;a!=0;a--)
{
_delay_ms(10);
}
putchar1(A1);
putchar1(A2);
putchar1(A3);
putchar1(A4);
}
}