求助:c8051f120与18B20通信,一直输出是0,火大。
可能原因:
1、时序(用示波器看的,应该没有问题)
2、18B20是坏的(也测试过没坏)
3、用的是C8051F120的P3^7,配置成开漏
(C8051F难道还有什么忘了配置?
因为用P3^7可以初始化,用P4 P5 P6 P7不能完成初始化)
把关键代码贴出来:
- void Init_DS18B20(void)
- {
- //shuchu
- DQ = 1;
- DQ = 0;
- timer_delay(15000); //精确延时大于480us
- DQ = 1;
- //shuru
- timer_delay(1250); //15~60us
- while(DQ);
- timer_delay(5000); //60~240us
- //shuchu
- DQ = 1;
- timer_delay(15000); //180~405us
- }
复制代码- unsigned char ReadOneChar(void)
- {
- unsigned char i=0;
- //unsigned char j=0;
- unsigned char dat = 0;
- for (i=0;i<8;i++)
- {
- DQ = 1;
- DQ = 0;
- Delay(40);//>1us
- //shuru
- //j=DQ; //<15us
- if(DQ)
- dat|=(1<<i);
- else
- dat&=~(1<<i);
- timer_delay(2500);
- DQ = 1;
- }
- DQ = 1;
- return(dat);
- }
复制代码- void WriteOneChar(unsigned char dat)
- {
- unsigned char i=0;
- for (i=0; i<8; i++)
- {
- DQ = 1;
- DQ = 0;
- timer_delay(800);
-
- if(dat&(1<<i))
- DQ = 1;
- else
- DQ = 0;
- timer_delay(2500);
- DQ = 1;
- }
- DQ = 1;
- }
复制代码- unsigned int ReadTemperature(void)
- {
- unsigned char a;
- unsigned char b;
- unsigned int t;
- //float T;
- Init_DS18B20();
- WriteOneChar(0xcc); // 跳过读序号列号的操作
- WriteOneChar(0x44); // 启动温度转换
- // Delay_ms(2);
- Init_DS18B20();
- WriteOneChar(0xcc); //跳过读序号列号的操作
- WriteOneChar(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
- a=ReadOneChar();//di
- b=ReadOneChar();//gao
- //a=0x12;b=0x23;
- t=b;
- t<<=8;
- t=t|a;
- //T=(float)t*0.0625;
- return(t);
- }
复制代码
一周热门 更多>