项 目: DS18B20_TEST
编 译 器: AVR Studio_4.12sp4+winAVR412
目 标 芯 片: ATmega16
时 钟: 外部 8000000hz
#define DS18b20_PORT PORTB
#define DS18b20_DDR DDRB
#define DS18b20_PIN PINB
#define DS18b20 PB4
#define SETBIT(x,y) (x|=(1<<y))
#define CLRBIT(x,y) (x&=(~(1<<y)))
#define CHKBIT(x,y) (x&(1<<y))
#define BIT_INV(x,y) x^=(1<<y)
/********************************************************************************
DS18B20操作定义
********************************************************************************/
#define CLR_DS18B20 CLRBIT(DS18b20_PORT,DS18b20) //数据线强制拉低
#define SET_DS18B20 SETBIT(DS18b20_PORT,DS18b20) //数据线强制拉高,上拉
#define HLD_DS18B20 SETBIT(DS18b20_DDR,DS18b20) //Mega16控制总线
#define RLS_DS18B20 CLRBIT(DS18b20_DDR,DS18b20) //释放总线
#define STU_DS18B20 CHKBIT(DS18b20_PIN,DS18b20) //数据线的状态
/*********************************************************************************************
延时函数
**********************************************************************************************/
void delay_1us(void) //1us延时函数
{
asm("nop");
}
void delay_nus(unsigned int n) //N us延时函数
{
unsigned int i="0";
for (i=0;i<n;i++)
delay_1us();
}
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<400;i++);
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i="0";
for (i=0;i<n;i++)
delay_1ms();
}
void init_1820(void)
{
HLD_DS18B20; //设置PC2 为输出
SET_DS18B20;
CLR_DS18B20;
delay_nus(180); //480us以上
SET_DS18B20;
RLS_DS18B20;
delay_nus(10); //15~60us
while(STU_DS18B20);
HLD_DS18B20;
SET_DS18B20;
delay_nus(40); //60~240us
}
void write_1820(unsigned char x)
{
unsigned char m;
for(m=0;m<8;m++)
{
CLR_DS18B20;
if(x&(1<<m)) //写数据了,先写低位的!
SET_DS18B20;
else
{CLR_DS18B20;}
delay_nus(10); //15~60us
SET_DS18B20;
}
SET_DS18B20;
}
unsigned char read_1820(void)
{
unsigned char temp,k,n;
temp="0";
for(n=0;n<8;n++)
{
CLR_DS18B20;
SET_DS18B20;
RLS_DS18B20;
k=(STU_DS18B20); //读数据,从低位开始
if(k)
temp|=(1<<n);
else
temp&=~(1<<n);
delay_nus(30); //60~120us
HLD_DS18B20;
}
return (temp);
}
void gettemp(unsigned char k[]) //读取温度值
{
unsigned char temh,teml,wm0,wm2;
init_1820(); //复位18b20
write_1820(0xcc); // 发出转换命令
write_1820(0x44);
delay_nms(20);
init_1820();
write_1820(0xcc); //发出读命令
write_1820(0xbe);
teml="read"_1820(); //读数据
temh="read"_1820();
wm0=teml;
wm0&=0x0F;
teml="teml">>4;
temh="temh"<<4;
wm2=teml|temh;
k[0]=(wm2/10)+48;
k[1]=(wm2%10)+48;
k[3]=(wm0*6)/10+48;
}
int main()
{
unsigned char p[]={" . 'C"};
while(1)
{
gettemp(p);
//处理
delay_nms(10);
}
}
用户1276322 2007-3-14 13:34
谢谢你的建议,你的网站我也经常去看的,很不错的,不过我在上面发的资料是少了点。平时喜欢把自己的东西拿出来放在自己的小窝里,闲来无事自己看看,同时也和广大的爱好者共享。
用户80446 2007-3-13 15:19
资料还蛮多的,希望能发一些到我的网站上,www.iccavr.com AVR开发网,谢谢。