//函数参数说明:
//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);//读取温度值