可以用了,有需要者进一步完善,感谢SIMENS MR Zheng近日在此上的热情帮助,中断方式需待继续完善,大家共同努力
#define W1_INPUT 1 #define W1_OUTPUT 0 #define P0 PRT0DR #define DQ PRT0DR&0x04
void DQ_LOW() { PRT0DM2&=~0x04; PRT0DM1|=0x04; PRT0DM0|=0x04; P0&=~0x04; }
void DQ_HIGH() { PRT0DM2&=~0x04; PRT0DM1|=0x04; PRT0DM0&=~0x04; }
void delay(unsigned int x) { unsigned int d; d=x; while(--d) {;} } BYTE reset(void)//初始化18B20 { static BYTE presence;//定义一个应答信号 DQ_LOW(); delay(70); //置总线为低电平并保持至少480us
DQ_HIGH(); //等电阻拉高总线并保持15-60us
delay(5); presence=DQ; //接受应答信号 delay(20); //延时60-240us
return(presence);//返回应答信号 }
//*************** 读一位函数******************//
BYTE read_bit(void) { static BYTE i;
DQ_LOW(); DQ_LOW(); DQ_HIGH(); asm("nop"); asm("nop"); asm("nop"); i=DQ;
delay(3); return(i); }
//*********************写一位函数****************//
void write_bit(unsigned char bitval) { DQ_LOW(); delay(1);
if (bitval==1) { DQ_HIGH(); } delay(3); DQ_HIGH(); }
//************** 从18B20中读一个字节**************//
unsigned char read_byte(void) { unsigned char i; unsigned char j; unsigned char value=0;
for (i=0;i<8;i++) { j=read_bit();//调读位函数 if (j)//如果是 1 置1 { value|=(0x01<<i); //先读低位,再读高位 asm("nop"); asm("nop"); asm("nop"); } } return(value); }
//*********************向18B20中 写一个字节**************//
void write_byte(unsigned char val) { unsigned char i; unsigned char temp;
for (i=0;i<8;i++) { temp=val>>i; temp&=0x01; write_bit(temp);//调写位函数 } asm("nop"); asm("nop"); asm("nop"); }
void main() { unsigned char teml,temh; INT T; INT Temperatur; BYTE outstr[17];
M8C_EnableGInt; // Enable Global interrupts
while(1) { do{ ; }while (reset()) ; //复位等待从机应答 write_byte(0XCC);//忽略ROM匹配 write_byte(0X44);//发送温度转化命令
delay(25000);//延时100-300us do { ; }while( reset());//再次复位,等待从机应答
write_byte(0XCC);//忽略ROM匹配 write_byte(0XBE);//发送读温度命令 teml =read_byte();//读出温度低8 temh=read_byte();//读出温度高8位 DQ_HIGH();//释放总线 } } |