把程序贴出来给大家看看吧,希望大家能帮助下!!
硬件没有问题。用的是PIC16F690单片机。
//地址、数据发送子程序
void Write1302(unsigned char addr,unsigned char dat)
{
unsigned char i,temp,temp_1;
temp=dat/10;
temp_1=dat%10;
dat=temp*16+temp_1; //将十进制转换成ds1302的BCD内码,储存
TRISB4=0;
RB5=0;
delay1302(2); //CE引脚为低,数据传送
RB6=0;
delay1302(2); //清空时钟总线
RB5=1;
delay1302(2); //CE引脚为高,逻辑控制有效
//发送地址
for(i=8;i>0;i--)
{
RB6=0;
delay1302(2);
RB4=(bit)(addr&0x01);
addr>>=1;
delay1302(2);
RB6=1;
delay1302(2);
}
//发送数据
for(i=8;i>0;i--)
{
RB6=0;
delay1302(2);
RB4=(bit)(dat&0x01);
dat>>=1;
delay1302(2);
RB6=1;
delay1302(2);
}
RB5=0;
delay1302(2);
}
//数据读取子程序
unsigned char Read1302(unsigned char addr)
{
unsigned char i,temp,dat1,dat2;
RB5=0;
RB6=0;
RB5=1;
relay.allrel=0;
TRISB4=0; // 设置数据口方向为输出
//发送地址
for(i=8;i>0;i--)
{
RB6=0;
temp=addr;
RB4=(bit)(temp&0x01);
addr>>=1;
RB6=1;
}
TRISB4=1; // 设置数据口方向为输入
//读取数据
for(i=8;i>0;i--)
{
relay.state.relay_7=RB4;
RB6=1;
relay.allrel>>=1;
RB6=0;
}
TRISB4=0; // 设置数据口方向为输出
RB5=0;
dat2=relay.allrel&0x0f;
dat1=((relay.allrel>>4)&0x0f); //数据转换,BCD码转换成十进制数据显示
dat1=dat1*10+dat2;
return(dat1);
}
|