我按照 你的程序用meg128写的 测不出来!
#include <avr/io.h>
#include<avr/interrupt.h>
#include <util/delay.h>
#include "LCD.h"
#define uchar unsigned char
#define uint unsigned int
uchar OK_Flag;
//××××××××××××引脚宏定义×××××××××××××
//18B20定义
#define SET_DQ (PORTA) |= (1 << (PA2)) // 18b20 高电平
#define CLR_DQ (PORTA) &=~(1 << (PA2)) // 18b20 低电平
#define DQ_IN (PINA) & (1<<(PA2)) // 18b20信号输入
#define SET_OUT (DDRA)|= (1<<(PA2)) //PA2定义成输出
#define SET_IN (DDRA)&=~(1<<(PA2)) //PA2定义成输入
uchar table[3]={0,0,0};
/**************************************/
void data_pro(uint temp)
{
uint a;
table[2] = temp/100;
a = temp%100;
table[1] = a/10;
table[0] = a%10;
}
//DS18B20初始化
unsigned char DS18B20_Init()
{
SET_OUT; //PA2设置为输出口(相当于拉低数据线上的电平)
CLR_DQ;
_delay_us(490); //延时大于480us
SET_IN; //输入 释放数据线(相当于拉高数据线上的电平)
SET_DQ;
_delay_us(68); //延时大于60US,
//while(DQ_IN); //可以用两个while()死循环来判断复位是否成功,当数据线被拉低,说明
//while(!(DQ_IN)); //18b20开始复位应答,当数据线变高,说明应答完毕
if(DQ_IN) //判断DS18B20是否拉低数据线
{
OK_Flag = 0; // 数据线是高?复位失败
}
else
{
OK_Flag = 1; // 数据线是低?复位成功
}
_delay_us(422); //有复位应答信号后,应当再延时一段时间(480-68),以等待应答完毕
return OK_Flag; //返回复位标志
}
//从DS18B20读取一个字节数据
unsigned char Read_18b20()
{
unsigned char i;
unsigned char dat = 0; // dat用于存储读到的数据,先清零
for(i = 0;i < 8;i++) //共读8位数据,构成一个字节
{
SET_OUT; //定义为输出(拉低数据线)
CLR_DQ;
_delay_us(2); //拉低2微秒
SET_IN; //定义成输入,读入数据(同时也相当于拉高数据线)
SET_DQ;
_delay_us(4); //延时
dat = dat >> 1; //数据右移,读顺序:先低后高
if(DQ_IN) //读数据,
{
dat |= 0x80; //如果是高,置1,右移数据
}
_delay_us(62); //延时大于60us
}
return dat; //返回读到的1字节数据
}
//向DS18B20写1字节数据
void Write_18b20(unsigned char dat)
{
unsigned char i;
for(i = 0;i < 8;i++) //写8次,一次写1位,先写低字节
{
SET_OUT; //拉低数据线2us,开始写数据
CLR_DQ;
_delay_us(2); //
if(dat & 0x01) //写数据
{
SET_IN; //写1
SET_DQ;
}
else
{
SET_OUT; //写0
CLR_DQ;
}
dat >>= 1; //数据右移1位,先写低位
_delay_us(62); //延时大于60us
SET_IN; //拉高数据线
SET_DQ;
_delay_us(2); //写两位数据的时间间隔
}
}
/****************************************/
void main(void)
{
uchar k;
uchar i,j;
uint temp;
system_init(); //系统初始化,设
_delay_ms(100); //延时100ms
LCD_init(); //液晶参数初始化
LCD_clear();
while(1)
{
DS18B20_Init;
Write_18b20(0xcc);
Write_18b20(0x44);
_delay_us(1000);
DS18B20_Init;
Write_18b20(0xcc);
Write_18b20(0xbe);
i = Read_18b20();//lsb
j = Read_18b20();//msb
temp = j*256 + i; //26.8
temp = temp*0.625;//268
data_pro(temp);
for(k=0; k<20; k++)
{
LCD_write_com(0xc6);
LCD_write_data(table[2]+0x30);
LCD_write_data(table[1]+0x30);
LCD_write_data(table[0]+0x30);
}
}
}
|