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

📄 ds1302.c

📁 ds1302源程序 (为辅试验箱调试通过)
💻 C
字号:

#include <reg51.h>
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int
sbit  ACC0 = ACC^0;
sbit  ACC7 = ACC^7;
sbit  CLK=P1^3;
sbit  IO =P1^4;
sbit  RST =P1^5;
sbit  K1=P1^0;
#define LEDLen 6

xdata unsigned char OUTBIT _at_ 0x8002;//位控制口
xdata unsigned char OUTSEG _at_ 0x8004;   // 段控制口


unsigned char LEDBuf[LEDLen];// 显示缓冲

//定义全局变量
  signed char h;
  signed char m;
  signed char s;
  signed char y;
  //signed char w;
  signed char month;
  signed char d;
  signed char a;
  signed char b;
  signed char c;
code unsigned char LEDMAP[] = {
  0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
  0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};// 八段管显示码


void RTInputByte(uchar d)  //DS1302 写指令
{
    uchar i;
    ACC = d;
    for(i=8; i>0; i--)
    {
        IO = ACC0;
        CLK = 1;
        _nop_();
        CLK = 0;
        ACC = ACC >> 1;
    }
}

uchar RTOutputByte(void) //DS1302读指令
{
    uchar i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;
        ACC7 = IO;
        CLK = 1;
          _nop_();
        CLK = 0;
    }
    return(ACC);
}

void W1302(uchar ucAddr, uchar ucDa)//向指定地址写数据
{
    RST = 0;
    CLK = 0;
      _nop_();
    RST = 1;
      _nop_();  _nop_();
    RTInputByte(ucAddr);
      _nop_();
    RTInputByte(ucDa);
    CLK = 1;
    RST = 0;
}

uchar R1302(uchar ucAddr)//读出指定地址的数据
{
    uchar ucData;
	W1302(0xBE,1);
    RST = 0;
    CLK = 0;
      _nop_();
    RST = 1;
      _nop_();
    RTInputByte(ucAddr);
    ucData = RTOutputByte();
    CLK = 1;
    RST = 0;
    return(ucData);
}

void Init_time(void)    // DS1302初始化
{


 W1302(0x8C,0x08);
 //W1302(0x8A,0x06);
 W1302(0x88,0x09);
 W1302(0x86,0x12);
 W1302(0x84,0x11);
 W1302(0x82,0x58);
 W1302(0x80,0x00);
}
void Dispaly(void)      //显示
{
                 y=R1302(0x8D);//读出年
		// w=R1302(0x8B);//读出星期
		 month=R1302(0x89);//读出月
		 d=R1302(0x87);  //读出日
		 h=R1302(0x85); //读出小时
		 m=R1302(0x83);//读出分钟
		 s=R1302(0x81);//读出秒
  
 }

void Delay(unsigned char CNT)
{
  unsigned char i;

  do{
    i = 100;
    do{
    }while(--i);
  }while (--CNT);
}


void DisplayLED()
{
  unsigned char i;
  unsigned char Pos;
  unsigned char LED;

               
  Pos = 0x20;  // 从左边开始显示
  
  for (i = 0; i < LEDLen; i++) {
    
    OUTBIT = 0;//关所有八段管
    
    LED = LEDBuf[i];
    OUTSEG = LED;
    
    OUTBIT = Pos;// 显示一位八段管
    
    Delay(2);
   
    Pos >>= 1;//显示下一位
  }
//  OUTBIT = 0;
}


void DisplayResult()//显示结果并进行十进制调整
{
       // signed char H ;
       // signed char M ;
       // signed char S ;


           // H= a ;
           // M= b  ;
            //S= c ;


        if(a>16){
		LEDBuf[0]=LEDMAP[a/16];
		} else LEDBuf[0]=0X3F;
		LEDBuf[1]=LEDMAP[a%16] |0x80  ;

        if(b>16){
		LEDBuf[2]=LEDMAP[b/16];
		} else LEDBuf[2]=0x3f;
		LEDBuf[3]=LEDMAP[b%16] |0x80  ;

        if(c>16){
		LEDBuf[4]=LEDMAP[c/16] ;
		} else LEDBuf[4]=0x3f;
		LEDBuf[5]=LEDMAP[c%16];

}





 void main()  
{



   Init_time();//DS1302初始化

   while(1)
   {

    if(K1==1)
    {
     a=h;
     b=m ;
     c=s;

    }
    else
    {
     a=y;
     b=month;
     c=d ;

    }


      DisplayResult();

      DisplayLED();
  // KeyProcess();
    Dispaly();
   }
}

⌨️ 快捷键说明

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