您好,欢迎访问三七文档
当前位置:首页 > 高等教育 > 实验设计 > PCF8563时钟芯片程序
PCF8563时钟芯片程序---------------(对你有帮助就给个好评)#includereg51.h#includeintrins.hsbitSDA=P1^0;//将p1.0口模拟数据口sbitSCL=P1^1;//将p1.1口模拟时钟口#defineMIN0x02//秒寄存器#defineSEC0x03//分寄存器#defineHOUR0x04//时寄存器#defineDAY0x05//日寄存器#defineWEEK0x06//周寄存器#defineMONTH0x07//月寄存器#defineYEAR0x08//年寄存器#defineread_ADD0xA3//写器件地址#definewrite_ADD0xA2//读器件地址#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};unsignedcharg8563_Store[4];/*时间交换区,全局变量声明*/unsignedcharcodec8563_Store[4]={0x00,0x59,0x07,0x01};/*写入时间初值:星期一07:59:00*/bitbdataSystemError;//从机错误标志位//--------------------------------------------------------------------------------------------------//函数名称:iic_start()//函数功能:启动I2C总线子程序//--------------------------------------------------------------------------------------------------voidiic_start(void){EA=0;//时钟保持高,数据线从高到低一次跳变,I2C通信开始SDA=1;SCL=1;delayNOP();//延时5usSDA=0;delayNOP();SCL=0;}//--------------------------------------------------------------------------------------------------//函数名称:iic_stop()//函数功能:停止I2C总线数据传送子程序//--------------------------------------------------------------------------------------------------voidiic_stop(void){SDA=0;//时钟保持高,数据线从低到高一次跳变,I2C通信停止SCL=1;delayNOP();SDA=1;delayNOP();SCL=0;}//--------------------------------------------------------------------------------------------------//函数名称:slave_ACK//函数功能:从机发送应答位子程序//--------------------------------------------------------------------------------------------------voidslave_ACK(void){SDA=0;SCL=1;delayNOP();SDA=1;SCL=0;}//--------------------------------------------------------------------------------------------------//函数名称:slave_NOACK//函数功能:从机发送非应答位子程序,迫使数据传输过程结束//--------------------------------------------------------------------------------------------------voidslave_NOACK(void){SDA=1;SCL=1;delayNOP();SDA=0;SCL=0;}//--------------------------------------------------------------------------------------------------//函数名称:check_ACK//函数功能:主机应答位检查子程序,迫使数据传输过程结束//--------------------------------------------------------------------------------------------------voidcheck_ACK(void){SDA=1;//将p1.0设置成输入,必须先向端口写1SCL=1;F0=0;if(SDA==1)//若SDA=1表明非应答,置位非应答标志F0F0=1;SCL=0;}//--------------------------------------------------------------------------------------------------//函数名称:IICSendByte//入口参数:ch//函数功能:发送一个字节//--------------------------------------------------------------------------------------------------voidIICSendByte(unsignedcharch){unsignedcharidatan=8;//向SDA上发送一位数据字节,共八位while(n--){if((ch&0x80)==0x80)//若要发送的数据最高位为1则发送位1{SDA=1;//传送位1SCL=1;delayNOP();SDA=0;SCL=0;}else{SDA=0;//否则传送位0SCL=1;delayNOP();SCL=0;}ch=ch1;//数据左移一位}}//--------------------------------------------------------------------------------------------------//函数名称:IICreceiveByte//返回接收的数据//函数功能:接收一字节子程序//--------------------------------------------------------------------------------------------------unsignedcharIICreceiveByte(void){unsignedcharidatan=8;//从SDA线上读取一上数据字节,共八位unsignedchartdata;while(n--){SDA=1;SCL=1;tdata=tdata1;//左移一位,或_crol_(temp,1)if(SDA==1)tdata=tdata|0x01;//若接收到的位为1,则数据的最后一位置1elsetdata=tdata&0xfe;//否则数据的最后一位置0SCL=0;}return(tdata);}//--------------------------------------------------------------------------------------------------//用户调用子程序//函数名称:write_CFGbyte//入口参数:CFG_add寄存器地址,CFG_data要写入寄存器的数值//函数功能:发送n位数据子程序//--------------------------------------------------------------------------------------------------voidwrite_CFGbyte(unsignedcharCFG_add,unsignedcharCFG_data){//unsignedcharidatasend_da,i=0;iic_start();//启动I2CIICSendByte(write_ADD);//发送器件写地址check_ACK();//检查应答位if(F0==1){SystemError=1;return;//若非应答表明器件错误或已坏,置错误标志位SystemError}IICSendByte(CFG_add);//发送寄存器地址check_ACK();//检查应答位if(F0==1){SystemError=1;return;//若非应答表明器件错误或已坏,置错误标志位SystemError}IICSendByte(CFG_data);//发送寄存器数据check_ACK();//检查应答位if(F0==1){SystemError=1;return;//若非应答表明器件错误或已坏,置错误标志位SystemError}iic_stop();//全部发完则停止}//--------------------------------------------------------------------------------------------------//用户调用子程序//函数名称:receiveNbyte//入口参数:CFG_add寄存器地址地址//出口参数:receive_da//函数功能:接收某个寄存器数据子程序//--------------------------------------------------------------------------------------------------unsignedcharreceive_CFGbyte(unsignedcharidataCFG_add){unsignedcharidatareceive_da;iic_start();IICSendByte(write_ADD);//器件写地址check_ACK();if(F0==1){SystemError=1;return(0);}IICSendByte(CFG_add);//寄存器地址check_ACK();if(F0==1){SystemError=1;return(0);}iic_start();IICSendByte(read_ADD);//器件读地址if(F0==1){SystemError=1;return(0);}receive_da=IICreceiveByte();slave_NOACK();//收到最后一个字节后发送一个非应答位iic_stop();return(receive_da);}//--------------------------------------------------------------------------------------------------//用户调用函数//函数名称:receive_CFGNbyte//入口参数:CFG_add寄存器地址地址,n连续读数位,*buff存储区地址//函数功能:接收n个寄存器数据子程序//--------------------------------------------------------------------------------------------------voidreceive_CFGNbyte(unsignedcharCFG_add,unsignedcharn,unsignedchar*buff){unsignedcharreceive_da,i=0;iic_start();IICSendByte(write_ADD);//器件写地址check
本文标题:PCF8563时钟芯片程序
链接地址:https://www.777doc.com/doc-2225206 .html