您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 时钟芯片SD2068使用说明及AVR-C语言时钟写程序
SD2068低功耗、两线接口、数字时钟调整功能、多种中断/报警系统、12字节用户RAM,并具备多种抗干扰措施下为SD2068AVR单片机时钟C程序:#includeiom64v.h#includemacros.h#defineucharunsignedchar#defineuintunsignedint#defineulongunsignedlong//数据sda的位设置#definesda_inDDRC&=~(1PC1)//数据设置输入#definesda_outDDRC|=(1PC1)//数据设置输出#definesda_setbPORTC|=(1PC1)//数据拉高#definesda_clrPORTC&=~(1PC1)//数据拉低#definesda_rPINC&(1PC1)//数据读取//时钟scl的位设置#definescl_inDDRC&=~(1PC0)//时钟设置输入#definescl_outDDRC|=(1PC0)//时钟设置输出#definescl_setbPORTC|=(1PC0)//时钟拉高#definescl_clrPORTC&=~(1PC0)//时钟拉低#definescl_rPINC&(1PC0)//时钟读取//===============#definetrue1#definefalse0//===============uchardate[7];//日期数组/*date[6]=year,date[5]=month,date[4]=day,date[3]=week,date[2]=hour,date[1]=minute,date[0]=second*/ucharbat1,bat2,temp;//电池电量和温度uintbat;//电池电量值uchardata1[8];//EEPROM数据//====================================================================/*延时子程序*/voiddelay_ms(uinttime)//11.0592M,time=1表示延时1ms{uinti;for(;time0;time--)for(i=0;i1571;i++);asm(nop);asm(nop);asm(nop);}voiddelay_1us(void)//11.0592M,1us延时函数{asm(nop);}voiddelay_us(uinttime)//11.0592M,Nus延时函数{uinti;for(i=0;itime;i++)asm(nop);}//=====================================================================/********开启SD30系列的I2C总线********/ucharI2CStart(void){sda_out;scl_out;delay_1us();sda_setb;scl_setb;delay_us(5);sda_in;delay_us(5);if(!sda_r)returnfalse;//SDA线为低电平则总线忙,退出sda_out;delay_1us();sda_clr;delay_us(10);sda_in;delay_us(10);while(sda_r)returnfalse;//SDA线为高电平则总线出错,退出scl_clr;delay_us(5);returntrue;}//********关闭SD30系列的I2C总线****//voidI2CStop(void){scl_out;sda_out;delay_1us();sda_clr;delay_1us();scl_clr;delay_us(5);scl_setb;delay_us(2);sda_setb;}//*********发送ACK****//voidI2CAck(void){scl_out;sda_out;delay_1us();sda_clr;delay_1us();scl_clr;delay_us(5);scl_setb;delay_us(5);scl_clr;}/*********发送NOACK*********/voidI2CNoAck(void){scl_out;sda_out;delay_1us();sda_setb;delay_1us();scl_clr;delay_us(5);scl_setb;delay_us(5);scl_clr;}//*********读取ACK信号*********ucharI2CWaitAck(void)//返回为:1=有ACK,0=无ACK{ucharerrtime=255;scl_out;sda_in;delay_1us();scl_clr;delay_us(5);scl_setb;delay_1us();sda_in;delay_1us();while(sda_r){errtime--;delay_1us();if(!errtime){delay_us(10);scl_clr;returnfalse;}}scl_clr;returntrue;}/************MCU向SD30系列发送一个字节*************/voidI2CSendByte(uchardemand)//数据从高位到低位{ucharbd=8;sda_out;scl_out;while(bd--){scl_clr;delay_1us;if(demand&0x80){sda_setb;}else{sda_clr;}demand=1;delay_us(3);scl_setb;delay_us(3);}scl_clr;}/*********MCU从SD30系列读入一字节*********/ucharI2CReceiveByte(void)//数据从高位到低位//{ucharbl=8;ucharddata=0;scl_out;delay_1us();delay_1us();sda_in;//端口切换为输入状态!!sda_setb;//有的单片机需要加这句,如果不需要可以删掉delay_1us();while(bl--){ddata=1;//数据从高位开始读取delay_1us();scl_clr;delay_us(5);//从高位开始ddata|=SDA;ddata=1scl_setb;delay_us(5);if(sda_r){ddata|=0x01;}}scl_clr;returnddata;}/******读SD30系列实时数据寄存器******/charI2CReadDate(void){ucharn;if(!I2CStart())returnfalse;I2CSendByte(0x65);if(!I2CWaitAck()){I2CStop();returnfalse;}for(n=0;n7;n++){date[n]=I2CReceiveByte();if(n!=6)//最后一个数据不应答{I2CAck();}}I2CNoAck();I2CStop();}/******写SD30系列实时数据寄存器******/charI2CWriteDate(void)//设置时间:2013年2月2日07:59:55星期一。写时间操作要求一次对实时时间寄存器(00H~06H)依次写入,{//不可以单独对7个时间数据中的某一位进行写操作,否则可能会引起时间数据的错误进位.//所以要修改其中某一个数据,应一次性写入全部7个实时时钟数据.WriteTimeOn();//使能,开锁if(!I2CStart())returnfalse;I2CSendByte(0x64);if(!I2CWaitAck()){I2CStop();returnfalse;}I2CSendByte(0x00);//设置写起始地址I2CWaitAck();I2CSendByte(0x55);//secondI2CWaitAck();I2CSendByte(0x59);//minuteI2CWaitAck();I2CSendByte(0x07|0x80);//hour,二十四小时制I2CWaitAck();I2CSendByte(0x01);//weekI2CWaitAck();I2CSendByte(0x02);//dayI2CWaitAck();I2CSendByte(0x02);//monthI2CWaitAck();I2CSendByte(0x13);//yearI2CWaitAck();I2CStop();WriteTimeOff();//使能,关锁}/******写SD30系列单字节程序******/voidWriteOneByte(ucharadd,uchardate){WriteTimeOn();I2CStart();I2CSendByte(0x64);I2CWaitAck();I2CSendByte(add);//设置写地址I2CWaitAck();I2CSendByte(date);//写数据I2CWaitAck();I2CStop();WriteTimeOff();}/******读SD30系列单字节程序******/ucharReadOneByte(ucharadd){ucharbuf;I2CStart();I2CSendByte(0x64);I2CWaitAck();I2CSendByte(add);//设置要读的地址I2CWaitAck();I2CStart();I2CSendByte(0x65);//写数据I2CWaitAck();buf=I2CReceiveByte();//读数据I2CNoAck();I2CStop();returnbuf;}/******设置SD30系列报警中断演示程序******/voidWriteALARM(void)//设置报警时间:2012年2月14日8:00{WriteOneByte(0x09,0x08);//8时WriteOneByte(0x0b,0x14);//14日WriteOneByte(0x0c,0x14);//02月WriteOneByte(0x0d,0x14);//12年WriteOneByte(0x0e,0x74);//设置报警允许(使能年、月、日、小时报警)WriteOneByte(0x10,0x92);//设置INT中断选通(INTS1,INTS0),及报警中断总允许位(INTAE)}/******关闭SD30XX报警中断程序******/voidClrALARM(void)//关闭报警中断{WriteOneByte(0x10,0x90);}/******设置SD30XX倒计时中断******/voidSetDjs(void)//设置倒计时中断{WriteOneByte(0x10,0x0f);//先清倒计时中断总允许位(INTDE)WriteOneByte(0x10,0xf4);//设置周期性中断(IM=1)INT中断选通(INTS1,INTS0),配置倒计时中断总允许位(INTDE)WriteOneByte(0x11,0x30);//选择定时器频率源(TDS1、TDS0)为1/60HZWriteOneByte(0x13,5);//倒计时初值寄存器,设置24位倒计时计数初值(5min)WriteOneByte(0x14,0);//倒计时初值寄存器,设置24位倒计时计数初值(5min)WriteOneByte(0x15,0);//倒计时初值寄存器,设置24位倒计时计数初值(5min)}/******关闭SD30XX倒计时中断程序******/voidClrDjs(void){WriteOneByte(0x10,0xf0);}/******设置SD30XX频率中断******/voidSetFrq(void){WriteO
本文标题:时钟芯片SD2068使用说明及AVR-C语言时钟写程序
链接地址:https://www.777doc.com/doc-7179059 .html