|
求教請(qǐng)教,寫得程序在單片機(jī)的板子上可以運(yùn)行,但是在proteus上仿真就有問題了。那個(gè)LCD一直顯示溫度是-0.006,蜂鳴器還一直響。請(qǐng)問大佬怎么回事呀。我在網(wǎng)上查了查說是DS18B20的關(guān)于延時(shí)的地方錯(cuò)誤了。我把這一段程序粘貼在下面,如果不是那里的錯(cuò),我也把這一整個(gè)的程序代碼寫在附件了。
#include <REGX52.H>
//引腳定義
sbit OneWire_DQ=P3^7;
/**
* @brief 單總線初始化
* @param 無
* @retval 從機(jī)響應(yīng)位,0為響應(yīng),1為未響應(yīng)
*/
unsigned char OneWire_Init(void)
{
unsigned char i;
unsigned char AckBit;
EA=0;
OneWire_DQ=1;
OneWire_DQ=0;
i = 247;while (--i); //Delay 500us
OneWire_DQ=1;
i = 32;while (--i); //Delay 70us
AckBit=OneWire_DQ;
i = 247;while (--i); //Delay 500us
EA=1;
return AckBit;
}
/**
* @brief 單總線發(fā)送一位
* @param Bit 要發(fā)送的位
* @retval 無
*/
void OneWire_SendBit(unsigned char Bit)
{
unsigned char i;
EA=0;
OneWire_DQ=0;
i = 4;while (--i); //Delay 10us
OneWire_DQ=Bit;
i = 24;while (--i); //Delay 50us
OneWire_DQ=1;
EA=1;
}
/**
* @brief 單總線接收一位
* @param 無
* @retval 讀取的位
*/
unsigned char OneWire_ReceiveBit(void)
{
unsigned char i;
unsigned char Bit;
EA=0;
OneWire_DQ=0;
i = 2;while (--i); //Delay 5us
OneWire_DQ=1;
i = 2;while (--i); //Delay 5us
Bit=OneWire_DQ;
i = 24;while (--i); //Delay 50us
EA=1;
return Bit;
}
/**
* @brief 單總線發(fā)送一個(gè)字節(jié)
* @param Byte 要發(fā)送的字節(jié)
* @retval 無
*/
void OneWire_SendByte(unsigned char Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
OneWire_SendBit(Byte&(0x01<<i));
}
}
/**
* @brief 單總線接收一個(gè)字節(jié)
* @param 無
* @retval 接收的一個(gè)字節(jié)
*/
unsigned char OneWire_ReceiveByte(void)
{
unsigned char i;
unsigned char Byte=0x00;
for(i=0;i<8;i++)
{
if(OneWire_ReceiveBit()){Byte|=(0x01<<i);}
}
return Byte;
}
|
|