⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.c

📁 基于msc单片机仿真机的仿真程序
💻 C
字号:
//*******************************************************************
//***此程序为调试通过的源程序
//***由南京赛博电子有限公司提供
//***文件名:sy0606.C***//
//***是51系例单片机的最小系统
//***有AT89S51/52的在线下载功能
//***IIC总线芯片为24C02,记存密码
//*******************************************************************
#include"reg52.h"
#include<intrins.h>
#define  uchar unsigned char 	
#define  uint  unsigned int
#define  nop  _nop_()       /* 定义空操作指令 */
sbit clk=P1^3;				/*时钟芯片DS1302时钟输入端*/
sbit DINOUT=P1^4;			/*DS1302时钟芯片数据输入输出端*/	
sbit RST=P1^5;				/*DS1302芯片复位起始端*/
sbit en =P1^7;				/*DTLED-6显示芯片使能端*/	
sbit dout=P1^6;				/*DTLED-6显示芯片数据读入端*/
sbit ts_clk=P1^3;
uchar dispbuf[9];			/*显示值存放阵列*/
uchar clocktmp[3];			/*显示值存放阵列*/
uchar clockbak;		
void tsled(void);			 /*串行发送到DTLED-6副程式*/	
void Rd1302st(void);		/*读时钟芯片DS1302*/
void Rd1302(void);			/*读时钟芯片DS1302*/
void Wr1302(void);					/*写时钟芯片DS1302*/
/***********************************************************************/
void delay (unsigned int value)		/*延时副程式*/
 {
      while (value!=0) value--;		/*10US延时*/
 }
/***********************************************************************/
void main(void)					/*主程式*/
{
	dispbuf[0]=0x03;	/*小数点位*/
	dispbuf[7]=0x01;	/*ID号码*/
    Wr1302();           /*写时钟芯片DS1302*/
    delay(10);
    Rd1302st();			/*启动时钟芯片振荡器*/
    delay(10);
    while(1)
    {
	   Rd1302();				/*读时钟芯片DS1302*/
	   if(dispbuf[1]!=clockbak)	/*秒加一*/	
	     {
		   clockbak=dispbuf[1];
		   tsled();		/*串行发送到DTLED-6副程式*/		
		  }
    }
}
/*********************************************************************/
//串行发送DTLED-6显示
void tsled(void)			/*串行发送DTLED-6显示副程式*/	
{   char ts0,i,j;
	ts_clk=0;
	en=0;
	delay(10);
	for(j=0;j<9;j++)
  	{	ts0=dispbuf[j];
		for(i=0;i<4;i++)		/*发小数点码8,4,2,1*/
		{
 		ts_clk=1;
		ts0=ts0<<1;	
		if(AC==1) 
		dout=1;
		else      dout=0;
		ts_clk=0;
		nop;
		delay(3);
		}
   } 	
	en=1;
}		/*返回主程式*/

//======================================================================

void Wr1302(void)					/*写时钟芯片DS1302*/
{char i,j,ts0,conb,conbyt;
	conb=0x80;
	ts0=conb;
//
for(j=0;j<3;j++)			/*写秒,分,时三次循环*/
	{clk=RST=0;					/*DS1302系统初始化*/
		nop;nop;
		RST=1;
	for(i=0;i<8;i++)			/*写控制字到DS1302*/
	  {clk=0;					/*清时钟*/
		if(conb&0x01) 
				DINOUT=1;
		else    DINOUT=0;
 		clk=1;					/*时钟上升沿,发送数据有效*/
		conb=conb>>1;	
		nop;
	  }
	 	clk=0;					/*清时钟*/
		conb=ts0+2+j*2;
	conbyt=clocktmp[j]&0x7f;
	for(i=0;i<8;i++)			/*写设定值到DS1302*/
	  {clk=0;					/*清时钟*/
	   if(conbyt&0x01) 
				DINOUT=1;
		else    DINOUT=0;
 		clk=1;					/*时钟上升沿,发送数据有效*/
		conbyt=conbyt>>1;	
		nop;
	  }
	delay(5);
	RST=0;
    nop;
}
	}
		/*返回主程式*/
/******************************************************/
void Rd1302st()				/*启动时钟芯片振荡器*/
{
char i,ts0,conb,conbyt;
	Rd1302();
	conbyt=clocktmp[0]&0x7f;
	conb=0x80;
	ts0=conb;
	clk=RST=0;					/*DS1302系统初始化*/
	nop;nop;
	RST=1;
	for(i=0;i<8;i++)			/*写控制字到DS1302*/
	  {	clk=0;					/*清时钟*/
		if(conb&0x01) 
				DINOUT=1;
		else    DINOUT=0;
 		clk=1;					/*时钟上升沿,发送数据有效*/
		conb=conb>>1;	
		nop;
	  }
	 	clk=0;					/*清时钟*/
	for(i=0;i<8;i++)			/*写控制字到DS1302*/
	  {	clk=0;					/*清时钟*/
		if(conbyt&0x01) 
				DINOUT=1;
		else    DINOUT=0;
 		clk=1;					/*时钟上升沿,发送数据有效*/
		conbyt=conbyt>>1;	
		nop;
	  }
	delay(5);
	RST=0;
nop;
}		/*返回主程式*/
/******************************************************/
void Rd1302()				/*读时钟芯片DS1302*/
{char i,j,ts0,conb;
	conb=0x81;
	clocktmp[0]=0;
	clocktmp[1]=0;
	clocktmp[2]=0;
	ts0=conb;
for(j=0;j<3;j++)
   {clk=RST=0;					/*DS1302系统初始化*/
	nop;nop;
	RST=1;
	for(i=0;i<8;i++)			/*写控制字到DS1302*/
	  {
 	 	clk=0;					/*清时钟*/
		if(conb&0x01) 
				DINOUT=1;
		else    DINOUT=0;
 		clk=1;					/*时钟上升沿,发送数据有效*/
		conb=conb>>1;	
		nop;
	  }
	conb=ts0=ts0+2;
	clk=0;
	for(i=0;i<7;i++)			/*读时钟芯片的时分秒单元*/
	{
	if(DINOUT==1) 
			clocktmp[j]=clocktmp[j]|0x80;
	else  	clocktmp[j]=clocktmp[j]&0x7f;
	clk=1;
	clocktmp[j]=clocktmp[j]>>1;	/*接收暂存单元*/	
	nop;
	clk=0;					/*时钟下降沿,接收数据有效*/
	}
	delay(5);
	RST=0;
	delay(10);
   }
	dispbuf[1]=clocktmp[0]&0x0f;	/*转换秒分时显示单元*/
	dispbuf[2]=clocktmp[0]>>4&0x07;
	dispbuf[3]=clocktmp[1]&0x0f;
	dispbuf[4]=clocktmp[1]>>4&0x07;
	dispbuf[5]=clocktmp[2]&0x0f;
	dispbuf[6]=clocktmp[2]>>4&0x03;
}		/*返回主程式*/
//**************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -