| 
 
| 麻烦大家帮我看下,  我的DS18B20初始化失败。   我用protues仿真,用一盏小灯做指示, 程序读不出数据,逐步检测发现程序卡在DS18B20初始化的初始化部分。 
 可是我去查看了datasheet也没能查出原因来··。   麻烦大家要是可以就抽点空帮我看看是哪里出了差错··。   先拜谢了··。
 
 代码附下
 #include
 __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();
 }
 }
 程序, PIC
 | 
 |