麻烦大家帮我看下, 我的DS18B20初始化失败。 我用protues仿真,用一盏小灯做指示, 程序读不出数据,逐步检测发现程序卡在DS18B20初始化的初始化部分。
可是我去查看了datasheet也没能查出原因来··。 麻烦大家要是可以就抽点空帮我看看是哪里出了差错··。 先拜谢了··。
代码附下
#include<pic.h>
__CONFIG(0X3B31);
#define uint unsigned int
#define uchar unsigned char
#define DQ RD5
#define DQ_DIR TRISD5
#define DQ_HIGH() DQ_DIR=1
#define DQ_LOW() DQ=0;DQ_DIR=0
uchar Num[]={0x3F,0x06,0x5B,0x4F,
0x66,0x6D,0x7D,0x07,0x7F,0x6F};//不带小数点
uchar Num0[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
uint StopWatch_Num,ge,shi,shifen,baifen;
void display();
void delayus(char x,char y) //慧净提供的us级的延时
{
char z; //定义Z
do { //先执行一次do
z=y; //把Y的值给Z
do{;}while(--z); //do空语句,等待--z,直到z=0结束,do--while语句,延时在这产生
}
while (--x); //同理x在--,再产生延时
}
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
{
for(b=110;b>0;b--);
}
}
void Io_Init()
{
TRISC=0;
TRISD=0;
}
void dsinit()
{
char sta=1;
while(sta)
{
DQ_LOW();
delayus(2,81);
DQ_HIGH();
delayus(2,8);
if(DQ==1)
{
sta=1;
RD6=1;
delay(10);
RD6=0;
}
else sta=0;
delayus(2,81);
}
}
uchar read_byte()
{
uchar i,val=0;
for(i=0;i<8;i++)
{
val=val>>1;
DQ_LOW();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
DQ_HIGH();
NOP();
NOP();
NOP();
NOP();
val=val|0x80;
delayus(1,6);
}
return(val);
}
void write_byte(uchar val)
{
uchar i,temp;
for(i=0;i<8;i++)
{
temp=val&0x01;
DQ_LOW();
delayus(1,1);
if(temp==1) DQ_HIGH();
delayus(3,3);
DQ_HIGH();
NOP();
NOP();
val=val>>1;
}
}
void get_temp()
{
uchar TLV,HLV,num;
float tem_valf;
int tem_vali;
dsinit();
write_byte(0xcc);
write_byte(0x44);
TLV=read_byte();
HLV=read_byte();
DQ_HIGH();
tem_valf=((HLV*256)+TLV)*0.0625;
tem_vali=tem_valf*1000;
shi=tem_vali/1000;
ge=tem_vali%1000/100;
shifen=tem_vali%100/10;
baifen=tem_vali%10;
}
void display()
{
PORTD=0XFE;
PORTC=Num[shi];//Num[StopWatch_Num%10];
delay(1);
PORTD=0XFD;
PORTC=Num0[ge];//Num[StopWatch_Num/10];
delay(1);
PORTD=0XFB;
PORTC=Num[shifen];//Num[StopWatch_Num/10];
delay(1);
PORTD=0XF7;
PORTC=Num[baifen];//Num[StopWatch_Num/10];
delay(1);
}
void main()
{
Io_Init();
while(1)
{
get_temp();
display();
}
}
此帖出自
小平头技术问答
一周热门 更多>