//函数参数说明:

//Address:DS1722寄存器地址

//Data:写入的数据

voidDSWrite_Byte(ucharAddress,ucharData)

{ucharclear;

PORTB=PORTB|0x10;//使能SPI器件

SPDR=Address;

while(!(SPSR&0x80)){;}

clear=SPSR;

clear=SPDR;

SPDR=Data;

while(!(SPSR&0x80)){;}

clear=SPSR;

clear=SPDR;

PORTB=PORTB&0xef;

}

//***************************通过SPI接口读数据函数*****************//

//函数参数说明:

//Address:DS1722寄存器地址

//返回值:读取的温度数据

ucharDSRead_Byte(ucharAddress)

{ucharclear;

ucharData;

PORTB=PORTB|0x10;

SPDR=Address;

while(!(SPSR&0x80)){;}

clear=SPSR;

clear=SPDR;

SPDR=Address;//发空数据

while(!(SPSR&0x80)){;}

clear=SPSR;

Data=SPDR;

PORTB=PORTB&0xef;

return(Data);

}

voidmain(void)

{uchari;

uchartime[16]={2,0,0,4,1,2,2,7,1,1,7,3,0,0,0,0};

ucharSet_Time[7]={0x50,0x30,0x20,0x03,0x05,0x01,0x05};

//初始化时间2005-01-05Wed20-30-50

ucharSD,DS;

ucharSD2303_Controller1=0x00;//禁止中断

ucharSD2303_Controller2=0x20;//时间格式:24小时制

DDRA=0xff;//A口输出

DDRC=0xff;//C口输出

DDRD=0x80;//D口最高位输出,其他带上拉输入

PORTD=0x7F;

DDRB=0xF3;//B口带第2、3位带上拉输入,其他输出

PORTB=0xF3;

Write_1byte(SD2303,0x0e,SD2303_Controller1);//写控制字

Write_1byte(SD2303,0x0f,SD2303_Controller2);//写控制字

Write_Nbyte(SD2303,0x00,Set_Time,7);//初始化时间

SPCR=0b01011100;

DSWrite_Byte(0x80,0xf0);//DS17228位分辨率自由转换模式

while(1)

{Key_Process();//按键处理

Read_Nbyte(SD2303,0x00,Set_Time,7);//读取时间

time[2]=Set_Time[6]》》4;//年高位;

time[3]=Set_Time[6]&0x0f;//年低位;

time[4]=Set_Time[5]》》4;//月高位;

time[5]=Set_Time[5]&0x0f;//月低位;

time[6]=Set_Time[4]》》4;//日高位;

time[7]=Set_Time[4]&0x0f;//日低位;

time[8]=Set_Time[3];//星期;

time[9]=Set_Time[2]》》4;//时高位;

time[10]=Set_Time[2]&0x0f;//时低位;

time[11]=Set_Time[1]》》4;//分高位;

time[12]=Set_Time[1]&0x0f;//分低位;

time[13]=Set_Time[0]》》4;//秒高位;

time[14]=Set_Time[0]&0x0f;//秒低位;

Read_Nbyte(SD2303,0x0f,&SD,1);//读取中断标志位

if(SD&0x02)PORTD=PORTD|0x80;//响铃1分钟

elsePORTD=PORTD&0x7F;//关闭闹铃

DS=DSRead_Byte(0x02);//读取温度值