📄 iwire.bak
字号:
/*************************************************************
****************1wire总线操作函数*****************************
*************************************************************/
#define IB_RDROM 0X33 //读1820的rom命令
#define IB_SKIP 0xcc //1820调过命令
#define IB_CNVT 0X44 //转换温度命令
#define IB_COPY 0X48 //COPY SCRATCHPAD
#define IB_RDPAD 0XBE //READ SCRATCHPAD
#define IB_WRPAD 0X4E //WRITE SCRATCHPAD
#define IB_RECALL 0XB8 //RECALL EEPROM
#define IB_RDPOW 0XB4 //READ POWER SUPLY COMMAND
int8 ibus_reset(){
int8 i;
output_low(iwire);
delay_us(500);
output_float(iwire);
delay_us(60);
if(!input(iwire))
{
i=0;
}
else{
i=0xff;
}
delay_us(400);
return(i);
}
//-------------------------------
//-------------------------------
int8 read_byte(){
int8 value ,i;
value=0;
for(i=0;i<8;i++){
output_low(iwire);
delay_us(3);
output_float(iwire);
delay_us(6);
if(input(iwire)){
bit_set(value,i);
}
delay_us(60); //读时隙至少需要60us
}
return(value);
}
//---------------------------------
//---------------------------------
void write_byte(int bt){
short b;
int8 i;
for(i=0;i<8;i++){
if(bit_test(bt,i)){
b=1;
}
else{
b=0;
}
output_low(iwire);
//output_high(iwire);
if(b)
{
output_float(iwire);
}
delay_us(60);
output_float(iwire); //trec>=1us.一位写入结束。
}
// delay_us(60);
}
//----------------------------------
void read_rom(){
int8 i;
write_byte(IB_RDROM);
for(i=0;i<8;i++){
buffer[i]=read_byte();
}
}
//----------------------------------
void skip(){
write_byte(IB_SKIP);
}
//----------------------------------
void write_scratchpad(){
int8 i;
write_byte(IB_WRPAD);
for(i=0;i<3;i++){
write_byte(buffer[i+2]);
}
}
//----------------------------------
void read_scratchpad(){
int8 i;
write_byte(IB_RDPAD);
for(i=0;i<5;i++){
buffer[i]=read_byte();
}
}
//----------------------------------
void read_temperature(){ //读转换温度,同读scratchpad命令一样,只是读pad的前2个字节
int8 i;
write_byte(IB_RDPAD);
for(i=0;i<2;i++){
buffer[i]=read_byte();
}
}
//----------------------------------
void copy_scratchpad(){
write_byte(IB_COPY);
delay_ms(10);
}
//----------------------------------
void convert_t(){
//long x=0;
write_byte(IB_CNVT);
/*
while(++x<2000)
{
if(read_byte()==0xff)
{
break;
}
}
*/
delay_ms(400);
}
//----------------------------------
void recall_eeprom(){
write_byte(IB_RECALL);
while(read_byte()!=0xff); //1820在操作完成以后,数据线上全部为1,反之为0。
}
/****************************************************************/
/*******************************/
void Test_1820()
{
int8 var1,var2,t;
while(TRUE)
{
ibus_reset();
read_rom();
while(buffer[0]!=0x28){
puts("There is not a DS1820. Please check the circurt\n");
return;
}//判断有没有ds1820
//--------------------
ibus_reset();
skip();
read_scratchpad();
buffer[4]&=0x60;
if(buffer[4]!=0x40){
buffer[4]=0x5f; //11bit convert
ibus_reset();
skip();
write_scratchpad();
copy_scratchpad();
}
ibus_reset();
skip();
convert_t();
ibus_reset();
skip();
read_temperature();
var1=(buffer[1]&0x0f)<<4;
var2=buffer[0]>>4;
t=var1|var2; //t是当前测量的温度,没有小数部分。
putc(t);
putc(\n);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -