今天是母亲节,祝福我的母亲健康长寿。
/*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();//简单的显示 仅此而已
}
}
|