单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:3317|回复:0
打印上一主题下一主题

avr单片机DS18B20温度读取程序-母亲节的礼物

[复制链接]
跳转到指定楼层
楼主
ID:26188发表于 2015-6-23 15:02|只看该作者回帖奖励
今天是母亲节,祝福我的母亲健康长寿。



/*DS18B20读取温度字节程序   本函数花了我不少时间,主要问题是在51可以的情况下他却不行,知道今天才解决,原来是部分延时函数数值不对,造成的
   所以虽然做过也未见得好用,切不可粗心大意,AVR内部8M晶振,20110508   天津第四项目部宿舍   */
#include< iom16v.h>
#define uchar unsigned char
#define uint unsigned int
#define get_bit(a,b)   a&(1<<b)
#define set_bit(a,b)   a|=(1<<b)
#define clr_bit(a,b)   a&=~(1<<b)

void delay600us()
{
uint a;
for(a=1600;a;a--);

}
void delay60us()
{uchar a;
for(a=160;a;a--);
}
/*       复位18B20       */
/*     无参           */
/*     无返回           */
void rest_18b20()
{
set_bit(DDRA,4);//开启PA口得输出模式
   set_bit(PORTA,4);
;;
   clr_bit(PORTA,4);
delay600us();
set_bit(PORTA,4);
   delay60us();
clr_bit(DDRA,4);
while(get_bit(PINA,4));//判断有无器件在单总线上
delay600us();
set_bit(DDRA,4);
  
}

/*写DS18B20函数*/
/*传递参数为dat表示要向1820写入的数据字节*/
/*无返回值*/
        
void write_18b20(uchar dat)
{
   uchar i,j;
  
   set_bit(DDRA,4);
   for(j=0;j<8;j++)
{


   clr_bit(PORTA,4);
   for(i=26;i;i--);
   if(get_bit(dat,j))
   {set_bit(PORTA,4);}
   else
   clr_bit(PORTA,4);
   for(i=160;i;i--);
set_bit(PORTA,4);

}


  
}

/*读DS18B20函数*/
/*无参*/
/*返回读出的温度值*/
uchar read_18b20()
{
   uchar date,i,k;
  
   for(i=0;i<8;i++)
   {
   set_bit(DDRA,4);
clr_bit(PORTA,4);
for(k=10;k;k--);
   set_bit(PORTA,4);
for(k=18;k;k--);
   clr_bit(DDRA,4);
   if(get_bit(PINA,4))
   { set_bit(date,i);  }
   else
   clr_bit(date,i);
   for(k=160;k;k--);
   }
return (date);
}

void delay100ms()
{
   unsigned char a,b,c;
   for(c=95;c>0;c--)
       for(b=138;b>0;b--)
         for(a=29;a>0;a--);

}
void main()
{

DDRC=0xff;
DDRA=0xff;
PORTA=0xff;
while(1)
{
rest_18b20();


write_18b20(0xcc);
write_18b20(0x44);
delay100ms();     //主要是让1820有足够的时间去处理内部AD

   rest_18b20();

write_18b20(0xcc);
write_18b20(0xbe);
PORTC=read_18b20();//简单的显示   仅此而已
}
  
}

手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网