return 1;
}
/**********************************
要将测到的数值乘于0.0625即可得到实际温度;如果温度小于
0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为
0191H,-25.0625℃的数字输出为FF6FH,
-55℃的数字输出为FC90H。
***********************************/
void GetTemp_ds18b20(void){
static unsigned int flag=0;
signed int t;
signed long tt;
现在初级入门者很多,都不想细说了。给一个代码。
#define SECK (800/TK) //1秒中的主程序的系数
#define NOP_1uS() NOP()
//**************************************
#define SkipK 0xcc //跳过命令
#define ConvertK 0x44 //转化命令
#define RdDs18b20K 0xbe //读温度命令
//***********************************
#define DQ GPIO0
//-----------------------------------
//功能:写18B20
//***********************************
void Delay10uS(unsigned char i){
while(i--){
NOP_1uS(); NOP_1uS(); NOP_1uS();
NOP_1uS(); //NOP_1uS(); NOP_1uS();
// NOP_1uS();
}
}
//-----------------------------------
void Write_18B20(unsigned char n){
unsigned char i;
for(i=0;i<8;i++){
DQ=0;
Delay10uS(1);//延时13us 左右
DQ=n & 0x01;
n=n>>1;
Delay10uS(12);//延时50us 以上
DQ=1;
}
}
//------------------------------------
//功能:读取18B20
//------------------------------------
unsigned char Read_18B20(void){
unsigned char i;
unsigned char temp=0;
for(i=0;i<8;i++){
temp >>=1;
DQ=0;
NOP_1uS();
DQ=1;
TRISIO0=1;
NOP_1uS();NOP_1uS();NOP_1uS();
NOP_1uS();NOP_1uS();//NOP_1uS();//延时5us
if(DQ) temp |=0x80;
TRISIO0=0;
Delay10uS(84);//5延时40us
DQ=1;
}
return temp;
}
//-----------------------------------
//返回=0 失败!
char DS18b20_Init (void){
DQ=0;
Delay10uS(60);//延时500us
DQ=1;
TRISIO0=1;
Delay10uS(10);//延时90us(4.9*n+13.56uS)
if(DQ){ //0001 1111b=1f
TRISIO0=0;
return 0; //失败0
}
TRISIO0=0;
Delay10uS(40);//400uS
DQ=1;
return 1;
}
/**********************************
要将测到的数值乘于0.0625即可得到实际温度;如果温度小于
0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为
0191H,-25.0625℃的数字输出为FF6FH,
-55℃的数字输出为FC90H。
***********************************/
void GetTemp_ds18b20(void){
static unsigned int flag=0;
signed int t;
signed long tt;
if(flag==0){
if(DS18b20_Init()==0) return;
Write_18B20(SkipK);
Write_18B20(ConvertK);
flag++;
}else{
//-- 等待 时间1秒 ---
if(flag++>=SECK){
flag=0;
if(DS18b20_Init()){
Write_18B20(SkipK);
Write_18B20(RdDs18b20K);
t=Read_18B20(); //读低位
t=Read_18B20()<<8 | t; //读低高位
//--------------------------------------
// --- 乘以0.0625 --- 采用整数运算 放大10000=》625
tt =(signed long)t*625;
tt /=1000; //温度数据是小数点后一位!
Temp=tt; //数据返回!
}
}
}
}
单总线的器件,时序太重要了。必须关闭中断。
怎么改?莫非是也写到中断里……
一周热门 更多>