本帖最后由 老鱼探戈 于 2011-7-27 14:52 编辑
C语言中最好不要用ACC做局部变量用,因为你不知道编译器会怎么做,不要控制。如果是汇编的话是比较好控制的 。
你的时序也不对。。。。
//========================================
//函数名称:void singlebyte_write(uchar date)
//输入参数:uchar date
//输出参数:无
//函数功能:8位数据传送
//========================================
void singlebyte_write(uchar date)
{
uchar i;
T_RST=1; //启动数据传送
for(i=0;i<8;i++) //循环8次写入数据
{
T_SCLK=0;
if(date&0x01) //从低位开始写
T_IO=1;
else
T_IO=0;
T_SCLK=1; //在时钟线的上升沿写入一位数据
date=date>>1; //将高1位数据移至ACC^0
// delayns();
}
}
//========================================
//函数名称:uchar singlebyte_read(void)
//输入参数:无
//输出参数:uchar ACC
//函数功能:从DS1302读取1Byte数据
//========================================
uchar singlebyte_read(void) //从DS1302读取1Byte数据
{
uchar i,temp; //启动数据传送
for(i=0; i<8; i++) //读出8位数据
{
T_SCLK = 0;
temp = temp>>1;
if(T_IO==1)
temp+=0x80;
T_IO=1; //P1口输入前置1
T_SCLK = 1; //时钟线上升沿读出1位数据
// delayns();
}
return(temp);
}
//========================================
//函数名称: void write_ds1302(uchar add,uchar date)
//输入参数:uchar add,uchar date
//输出参数:无
//函数功能:往DS1302写入数据
//========================================
void write_ds1302(uchar add,uchar date) //往DS1302写入数据
{
// T_RST = 0;
T_RST = 1;
// delayns();
singlebyte_write(add); //地址,命令
singlebyte_write(date); //写1Byte数据
T_SCLK = 1;
T_RST =0;
}
//========================================
//函数名称:uchar read_ds1302(uchar add)
//输入参数:uchar add
//输出参数:uchar date
//函数功能:从DS1302读取数据
//========================================
uchar read_ds1302(uchar add) //从DS1302读取数据
{
uchar date;
T_SCLK=0;
T_RST=1;
singlebyte_write(add);
date=singlebyte_read();
T_SCLK=1;
T_RST=0;
return(date);
}
|