#include //可读温度传感器ds1820的程序 //单片机使用的是PIC16F873A //晶振:12M static volatile bit DQ @ (unsigned)&PORTA*8+1; static volatile bank1 bit DQD @ (unsigned)&TRISA*8+1; typedef unsigned char byte; typedef unsigned int word; byte ds18b20h; byte ds18b20l; bit tmpbit; //复位 void owh(void) { DQD=1; } void owl(void) { DQ =0; DQD=0; } byte ow_reset(void) { byte presence=1; again: owh(); presence=DQ; if (presence==0) { //DS18B20没有或坏,可在此写处理程序 asm("clrwdt"); goto again; } delayA(100); owl(); delayA(100); owh(); delayA(8); //8-30 presence=DQ; if (presence==1) { //DS18B20没有或坏,可在此写处理程序 asm("clrwdt"); goto again; } delayA(200); return(presence); } //从 1-wire 总线上读取一个字节 byte read_byte(void) { byte i; byte value = 0; for (i=8;i>0;i--) { owl(); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); owh(); value>>=1; if(DQ)value|=0x80; delayA(10); //2-55 } return(value); } //向 1-WIRE 总线上写一个字节 void write_byte(byte val) { byte i; for (i=8; i>0; i--) { owl(); asm("nop"); asm("nop"); asm("nop"); asm("nop"); tmpbit=val&0x01; if (tmpbit==1) {owh();} if (tmpbit==0) {owl();} delayA(10); // 2-55 owh(); val=val/2; } } //读取温度 void Read_Temperature(void) { char tmpchar=1; owh(); tmpchar=ow_reset(); write_byte(0xCC); write_byte(0x44); tmpchar=ow_reset(); write_byte(0xCC); write_byte(0xBE); ds18b20l=read_byte(); ds18b20h=read_byte(); } void main() { Read_Temperature(); //温度处理程序 }