读ds2431全为FF为什么 时序我反复核对过 应该没问题 问题在哪呢 高手们帮我看看啊
#include<reg52.h>#include<stdio.h>
#include<intrins.h>
sbit DQ=P2^3; //定义DS2431端口
bit DS2431err; //DS2431的错误标志
ma[16]={48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70};
sbit lcd_rs= P1^0;
sbit lcd_rw= P1^1;
sbit lcd_e= P1^2;
void delay(unsigned int num) //延时程序
{
while( --num ) ;
}
void Delay() //1us延时
{
_nop_();
_nop_();
}
Init_DS2431() //初始化DS2431
{
bit Presece;
DQ=1;
//delay(5);
_nop_();
DQ=0; //将DQ信号线拉低
delay(120); //保持DQ低电平480us 测得483
DQ=1; //将DQ信号拉高、释放总线
delay(15); //保持DQ高电平70us 测得64
Presece = DQ; //保存当前总线状态
delay(140); //测得时间为563
DQ=1;
DQ=1;
return Presece; //返回是否有设备将总线拉低
}
read_bit() //从单总线上读取一个数据位
{
bit i;
DQ=1;
_nop_();
DQ=0; //启动读时序
Delay(); //1us
Delay(); //1us
Delay(); //1us
Delay(); //1us
DQ=1; //释放总线,等待从机返回数据位
Delay(); //1us
Delay(); //1us
i=DQ;
delay(15);
DQ=1;
return i; //返回总线状态
}
void write_bit(unsigned char bitvalue) //向单总线设备写入一个数据位
{ DQ=1;
_nop_();
DQ=0; //启动写时序
Delay(); //1us
Delay(); //1us
Delay(); //1us
Delay(); //1us
Delay(); //1us
if(bitvalue) DQ=1; //写1
delay(15);
DQ=1; //释放总线
delay(2); //等待写时序结束 10us
}
read_byte() //从单总线上读一个字节数据
{
int i,value=0;
for(i=0;i<8;i++)
{
if(read_bit()) value=value|(0x01<<i); //如果当前读取的数据位为1,将返回字节对应的位置1
}
delay(2); //等待释放总线
return value; //返回读取的数据
}
void write_byte(unsigned char bytevalue) //向单总线写一个字节
{
unsigned char i,temp;
for(i=0;i<8;i++)
{
temp = bytevalue>>i; //将要写的数据字节右移i位
temp = temp &0x01; //取出数据字节的第i位
write_bit(temp); //向总线写一个数据位
}
delay(2); //等待写时序结束
}
bit skip_matchRom(void) //发出跳过ROM匹配命令
{
bit tmp=1;
if(Init_DS2431()) return tmp; //如果没有DS2431,返回0
write_byte(0xcc); //发出跳过ROM匹配的命令
tmp = 0;
return tmp;
}
read_ds2431(unsigned int Readaddr)
{
int ch[8],i;
DS2431err=skip_matchRom(); //发出跳过ROM匹配命令
write_byte(0xF0); //发出读存储器命令
write_byte((unsigned char)Readaddr);
write_byte((unsigned char)(Readaddr>>=8));
for(i=0;i<8;i++)
{ ch[i]=read_byte();
printf("%d",ch[i]);}
return ch;
}
write_ds2431(unsigned int Writeaddr, unsigned char *Writedata)
{
unsigned char ch,es,i,hight,low;
unsigned int tem;
hight=(unsigned char)(Writeaddr>>=4);
low =(unsigned char)Writeaddr;
if(skip_matchRom()) //发出跳过ROM匹配命令
return 1;
write_byte(0x0F); //发送写暂存器命令
write_byte(low);
write_byte(hight);
for(i=0;i<8;i++)
{
ch=*Writedata;
Writedata++;
write_byte(ch);
}
delay(25);
DS2431err=skip_matchRom();//发出跳过ROM匹配命令
write_byte(0xAA); //复制暂存器数据到存储器中
tem=read_byte();
tem<<=8;
tem+=read_byte();
es=read_byte();
if(es!=0x07)
return 1;
DS2431err=skip_matchRom();//发出跳过ROM匹配命令
write_byte(0x55);//发出启动转换命令
write_byte((unsigned char)Writeaddr);
write_byte((unsigned char)(Writeaddr>>=4));
write_byte(es);
for(i=0;i<50;i++)
delay(250); //等待写时序结束 510us
if(read_byte()!=0xAA)
return 1;
return 0;
}
/***********************************************************
* 函数说明:毫秒级延时程序 *
* 输入: 需要延时t毫秒 *
* 输出: 无 *
* 调用函数:无 *
***********************************************************/
void _delay_ms(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<125;j++);
}
/***********************************************************
* 函数说明:写指令到LCD12864 *
* 输入: cmd,待输入的指令 *
* 输出: 无 *
* 调用函数:无 *
***********************************************************/
void LcdWriteCode(unsigned char cmd)
{
P0=cmd;
lcd_rs=0;
lcd_rw=0;
lcd_e=0;
_delay_ms(1);
lcd_e=1;
}
/***********************************************************
* 函数说明:写数据到LCD12864 *
* 输入: dat,待输入的数据 *
* 输出: 无 *
* 调用函数:无 *
***********************************************************/
void LcdWriteData(unsigned char dat)
{
P0=dat;
lcd_rs=1;
lcd_rw=0;
lcd_e=0;
_delay_ms(1);
lcd_e=1;
}
/***********************************************************
* 函数说明:LCD初始化 *
* 输入: 无 *
* 输出: 无 *
* 调用函数:无 *
***********************************************************/
void LcdInit(void)
{
LcdWriteCode(0x30); //基本指令集
_delay_ms(1);
LcdWriteCode(0x0c); //显示;关闭光标;关闭反白
_delay_ms(1);
LcdWriteCode(0x01); //清屏
_delay_ms(20);
LcdWriteCode(0x06); //显示光标位置
}
read_ds2431_str(unsigned int Readaddr)
{
unsigned char ch[8],i;
DS2431err=skip_matchRom();//发出跳过ROM匹配命令
write_byte(0xF0); //发出读存储器命令
write_byte((unsigned char)Readaddr);
write_byte((unsigned char)(Readaddr>>=8));
for(i=8;i>0;i--)
{
ch[8-i]=read_byte();
}
return ch;
}
main()
{
while(1)
{
{read_ds2431(0x60);
write_ds2431(0x60,0x01);
read_ds2431(0x60);
}
}
}