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

📄 164.txt

📁 用ds1302和89c51设计的时钟
💻 TXT
字号:
#include <stdio.h>
#include <reg52.h>
#include <absacc.h>
#define  uchar  unsigned char
#define  unint   unsigned int
/************************************/
sbit T_CLK=P2^4;  /* 实时时钟的时钟线引脚*/
sbit T_IO=P3^1;   /* 实时时钟的数据线*/
sbit T_RST=P3^0;  /* 实时时钟的复位线引脚*/
sbit add_gw_sw=P3^2;   /*总控制开关*/
sbit dec_gw_sw=P3^3;   /*位选控制*/
sbit add_bw_qw=P3^4;   /*数字加1*/
sbit dec_bw_qw=P3^5;   /*数字减1*/ 
sbit xsdat=P1^1;    //定义驱动74164的数据脚为p1.4
sbit xsclk=P1^0;    //74164的时钟
sbit choose=P3^6;   
sbit gw=P2^3;   //个位
sbit sw=P2^2;   //十位
sbit bw=P2^1;   //百位
sbit qw=P2^0;   //千位
unint  b[4];//={0,0,0,0};   /*位段的数字*/
unint  a[4]={0,0,0,0}; 
uchar code ledk[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
uchar code ledk1[11]={0xbF,0x86,0xdB,0xcF,0xe6,0xeD,0xfD,0x87,0xfF,0xeF,0x00}; //加了小数点后
unint  ucCurtime[7]={58,05,20,31,07,02,06}; // 秒 分 时 日 月 星期 年 
unint temp;
uchar data BUFFER[1]={0};
void delay()                                        /*延时*/
{
 uchar m,n;
 for(m=10;m>0;m--)
 for(n=100;n>0;n--);
 }

void v_RTInputByte(uchar ucDa)
{
 uchar i;
 ACC=ucDa;
 for(i=8;i>0;i--)
 {
   if((ACC&0x01)==1)  
  //T_IO=ACC0;  /* 相当于汇编中的RRC */
  T_IO=1;
  else T_IO=0;//if((ACC&0x01)==0)
  T_CLK=1;
  T_CLK=0;
  ACC=ACC>>1;
  }
 }

uchar uc_RTOutputByte(void)
{
 uchar i,ACC;
 ACC=0;
 for(i=0;i<8;i++)
 {
  ACC=ACC>>1;   /*相当于汇编中的RRC*/
  if(T_IO==1)
  ACC=ACC|0x80;
  T_CLK=1;
  T_CLK=0;
 }
return(ACC);
}

void v_W1302(uchar ucAddr,uchar ucDa)
{
 T_RST=0;
 T_CLK=0;
 T_RST=1;
 v_RTInputByte(ucAddr);  /*地址,命令*/
 v_RTInputByte(ucDa);    /*写1Byte数据*/
 T_CLK=1;
 T_RST=0;

}

uchar uc_R1302(uchar ucAddr)
{
 unsigned char ucDa,k;
 k=0x00;
 T_RST=0;
 T_CLK=0;
 T_RST=1;
 v_RTInputByte(ucAddr);  /*地址,命令*/
 ucDa=uc_RTOutputByte(); /*读取1Byte数据*/
 T_CLK=1;
 T_RST=0;
 k=ucDa/16;
 ucDa=ucDa%16;
 ucDa=ucDa+k*10;
 return(ucDa);
}

void v_Set1302()//uchar *pSecDa) 
{
uchar i,j;
uchar ucAddr=0x80; 
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i=0;i<7;i++)
{
j=ucCurtime[i]; 
v_W1302(ucAddr,j); /* 秒 分 时 日 月 星期 年 */
ucAddr +=2;
}
v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}

void v_Get1302() 
{
uchar i;
uchar ucAddr=0x81;

for (i=0;i<7;i++)
{
ucCurtime[i]=uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
ucAddr +=2;
}
}

void allout(uchar out)
   {
    uchar  i;
    for (i=8;i>=1;i--)
   {  
    xsdat=out&0x80;
    xsclk=0;                 //送数据到数据口
    xsclk=1;                 //送一时钟
    out<<=1;                //左移
   }      
	 }

void  t2_10()
{
 unint k;
  b[3]=temp/1000;
  k=temp%1000;
  b[2]=k/100;
  k=k%100;
  b[1]=k/10;
  b[0]=k%10;
 }
/*显示*/
void display1()
 {
  uchar c;
  t2_10();
  c=b[0];
 allout(ledk[c]);

  
 /* c=b[0]; 
  P1=ledk[c];*/
  gw=0;
  delay();
  gw=1;
  
  c=b[1];
allout(ledk[c]);
 // P1=ledk[c];
  sw=0;
  delay();
  sw=1;
  
  c=b[2];
allout(ledk1[c]);
  //P1=ledk1[c];
  bw=0;
  delay();
  bw=1;

  c=b[3];
allout(ledk[c]);
  //P1=ledk[c];
  qw=0;
  delay();
  qw=1;
 }
void display2()
  {
   uchar c;
  t2_10();
  c=b[0]; 
allout(ledk[c]);
  //P1=ledk[c];
  gw=0;
  delay();
  gw=1;
  
  c=b[1];
allout(ledk[c]);
  //P1=ledk[c];
  sw=0;
  delay();
  sw=1;
  
  c=b[2];
allout(ledk[c]);
  //P1=ledk[c];
  bw=0;
  delay();
  bw=1;

  c=b[3];
allout(ledk[c]);
  //P1=ledk[c];
  qw=0;
  delay();
  qw=1;
 }
void main1(void) 
{ v_Get1302();
	temp=ucCurtime[2]*100+ucCurtime[1];
	display1();
}

void main2(void) 
{ v_Get1302();
	temp=ucCurtime[2]*100+ucCurtime[1];
	display2();
}

void chooseplay(void) 
{ v_Get1302();
	temp=ucCurtime[4]*100+ucCurtime[3];
	display1();
}

void main3(void)
{
 BUFFER[0]=BUFFER[0]+1;
  	 if(BUFFER[0]==101)
     {	
	   main1();
      BUFFER[0]=0;
	  }
	   else main2();
}
void main4(void)
{
 unint i,k; 
 for(i=0;i<7;i++)
	{
     k=ucCurtime[i]/10;
     ucCurtime[i]=ucCurtime[i]%10;
     ucCurtime[i]=ucCurtime[i]+16*k;
   }
   v_Set1302();
}
void main()
{ //unint i,j;
   main4(); 
   while(1)
   {
	 main3();
   if(add_gw_sw==0)
   {
    delay();
    if(add_gw_sw==0)
    {
	 ucCurtime[1]=ucCurtime[1]+1;
	 ucCurtime[0]=0;
	 if(ucCurtime[1]>59)ucCurtime[1]=ucCurtime[1]-60;
   main4();
	main3();
	while(add_gw_sw==0)
	 main3();
	 }
   }
    if(dec_gw_sw==0)
   {
    delay();
    
	 if(dec_gw_sw==0)
    {
	  ucCurtime[1]=ucCurtime[1]-1;
	   ucCurtime[0]=0;
		{if(ucCurtime[1]>59)ucCurtime[1]=ucCurtime[1]-36;
		  ucCurtime[0]=0;}
   main4();
	main3();
	while(dec_gw_sw==0)
	 main3();
	 }
   }
	
	if(add_bw_qw==0)
   {
     delay();
     if(add_bw_qw==0)
     {
      ucCurtime[2]=ucCurtime[2]+1;
	   ucCurtime[0]=0;
	   if(ucCurtime[2]>23)
		ucCurtime[2]=ucCurtime[2]-24;
       ucCurtime[0]=0;
    main4();
	 main3();
	  while(add_bw_qw==0)
	  main3();
     }
    }

	if(dec_bw_qw==0)
   {
     delay();
     if(dec_bw_qw==0)
     {
      ucCurtime[2]=ucCurtime[2]-1;
	   ucCurtime[0]=0;
	   if(ucCurtime[2]>23)
		ucCurtime[2]=ucCurtime[2]-72;
       ucCurtime[0]=0;
    main4();
	 main3();
	  while(dec_bw_qw==0)
	  main3();
     }
    }

if(choose==0)
{
    delay();
    if(choose==0)
    {
	  main4();
     v_Get1302(); 
	  while(1)  
	   chooseplay();
		  
			 }
	
		 
		  
	 }
	// while(choose==0)chooseplay();
}
  }

⌨️ 快捷键说明

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