大侠:您好! 帮帮忙吧,我现在要把DS1820的数据从S3C4510E板的一个IO口入(其它的IO口已经被我用光了),经过我的那板处理后,从网页输出并显示温度! 不过现在碰到一个问题就是那S3C4510B的IO口是不可以位寻址的吧,但是那DS18B20是一位一位的输入给那个GPIO口的,还有DS18D20是采用1-WIRE总线的,对时钟的要求也比较高,我以前只用过8位的单片机跟DS1B82通信,用数码管来显示温度,单片机是采用一级流水线的,时钟比较好搞!而现在是32位的采用3级流水线,那要求的几百微秒,或者几十微秒之类的延时不知跟8位的有何不同,我现在很多疑问!下面是在89C52时的程序: file://DS1820 C51 子程序 file://这里以11.0592M晶体为例, file://sbit DQ =P2^1;//根据实际情况定义端口
typedef unsigned char byte; typedef unsigned int word;
高手,这句的延时用32位的,50M,是3级流水线的,不知实现是否一样呢?/ void delay(word useconds) { for(;useconds>0;useconds--); }
file://复位 byte ow_reset(void) { byte presence; DQ = 0; ://pull DQ line low delay(29); // leave it low for 480us DQ = 1; // allow line to return high delay(3); // wait for presence presence = DQ; // get presence signal delay(25); // wait for end of timeslot return(presence); // presence signal returned } // 0=presence, 1 = no part
从 1-wire 总线上读取一个字节 byte read_byte(void) { byte i; byte value = 0; for (i=8;i>0;i--) { value>>=1; DQ = 0; // pull DQ low to start timeslot DQ = 1; // then return high delay(1); //for (i=0; i<3; i++); if(DQ)value|=0x80; delay(6); // wait for rest of timeslot } return(value); }
向 1-WIRE 总线上写一个字节 void write_byte(char val) { byte i; for (i=8; i>0; i--) // writes byte, one bit at a time { DQ = 0; // pull DQ low to start timeslot DQ = val&0x01; 看这句,把那一个位的值给那一个IO口,不知如何实现,又要不影响其它IO口// delay(5); // hold value for remainder of timeslot DQ = 1; val=val/2; } delay(5); }
读取温度 char Read_Temperature(void) { union{ byte c[2]; int x; }temp;
ow_reset(); write_byte(0xCC); // Skip ROM write_byte(0xBE); // Read Scratch Pad temp.c[1]=read_byte(); temp.c[0]=read_byte(); ow_reset(); write_byte(0xCC); //Skip ROM write_byte(0x44); // Start Conversion return temp.x/2; }
谢谢您们的指点!