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

📄 ds1302+led-c51.c

📁 这是一个基于51单片机的DS1302_实时时钟驱动程序
💻 C
字号:
/******************************************************************
/*                                                                *
/* AOKE210E单片机开发系统演示程序 							      *
/*                                                                *
/* 版本: V2.0 (2007/11/20)                                       *
/* 作者: 高山流水 (Email: aoke999@sohu.com)                      *
/* 网站: www.aokemcu.cn(奥科电子)                                *
/*                                                                *
/*                                                                *
/******************************************************************/
#include<reg51.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit  K1 = P3^4;
sbit  K2 = P3^5;
sbit  K3 = P3^6;
sbit  K4 = P3^7;

sbit reset = P1^2;
sbit sclk  = P1^0;
sbit io    = P1^1;

sbit  BEEP = P1^6;

sbit dula=P2^2;
sbit wela=P2^3;

bit flag=1,hour=0,min=0,sec=0;
bit year=0,month=0,day=0,week=0;
bit alarm_flag=0;
uchar  timecount=0,count=0; 

uchar str1[]="  -  -   Week:  ";
uchar str2[]="Time:           ";
uchar str3[]="Alarm:          ";

uchar init [] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00};  //
uchar init1[] ={0x00,0x00};
uchar init2[] ={0x00,0x00,0x00,0x26,0x11,0x01,0x07}; //
               //秒, 分, 时, 日, 月,星期,年
uchar bj_time[] ={0x00,0x00,0x00}; 
                 //秒, 分, 时
uchar code  mytab[8] = {0x01,0x1b,0x1d,0x19,0x1d,0x1b,0x01,0x00};//小喇叭

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,				//数码管编码
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

/******************************************************************/

/******************************************************************/
void delay1(int ms)
{
 unsigned char y;
  while(ms--)
 {
  for(y = 0; y<250; y++)
  {
   _nop_();
   _nop_();
   _nop_();
   _nop_();
  }
 }
}


/*********************************************************/
// 
/*********************************************************/
void delay()
{
   uchar j;
   for(j=250;j>0;j--);
}


/**********************************************************/
//
/**********************************************************/
void write_byte(uchar inbyte)
{
   uchar i;
   for(i=0;i<8;i++)
   {
    sclk=0;             //写的时候低电平改变数据
    if(inbyte&0x01)
    io=1;
    else
    io=0; 
    sclk=1;            //写的时候高电平,把数据写入ds1302
    _nop_();
    inbyte=inbyte>>1;
   }
}

/**********************************************************/

/**********************************************************/
uchar read_byte()    //sclk的下跳沿读数据
{
   uchar i,temp=0; 
   io=1;                //设置为输入口
   for(i=0;i<7;i++)
   {
    sclk=0;
    if(io==1)
    temp=temp|0x80;
    else
    temp=temp&0x7f;
    sclk=1;             //产生下跳沿
    
    temp=temp>>1;
   }
   return (temp);
}

/**********************************************************/
// 往ds1302的某个地址写入数据 
/**********************************************************/
void write_ds1302(uchar cmd,uchar indata)
{
   sclk=0;
   reset=1;
   write_byte(cmd);        
   write_byte(indata);
   
   sclk=0;
   reset=0;
}

/**********************************************************/
// 读ds1302某地址的的数据 
/**********************************************************/
uchar read_ds1302(uchar addr)
{
   uchar backdata;
   sclk=0;
   reset=1;

   write_byte(addr);      //先写地址
   backdata=read_byte();  //然后读数据
  
   sclk=0;
   reset=0;
   return (backdata);
}

/**********************************************************/
// 设置初始时间
/**********************************************************/
void set_ds1302(uchar addr,uchar *p,uchar n) //写入n个数据
{
   write_ds1302(0x8e,0x00);          //写控制字,允许写操作
   for(;n>0;n--)
   {
   write_ds1302(addr,*p);
   p++;
   addr=addr+2;
   }
   write_ds1302(0x8e,0x80);          //写保护,不允许写
}

/**********************************************************/
// 读取当前时间 
/**********************************************************/
void read_nowtime(uchar addr,uchar *p,uchar n)
{
  for(;n>0;n--)
  {
    *p=read_ds1302(addr);
    p++;
    addr=addr+2;
  } 
}

/**********************************************************/
// 初始化DS1302
/**********************************************************/
void init_ds1302()
{
   reset=0;
   sclk=0;
   write_ds1302(0x80,0x00); 
   write_ds1302(0x90,0xa6); //一个二极管+4K电阻充电
   write_ds1302(0x8e,0x80); //写保护控制字,禁止写
}

/**********************************************************/
/*                                                        */
/* 蜂鸣器响一声                                           */
/*                                                        */
/**********************************************************/
void beep()
  {
    unsigned char y;
    for (y=0;y<100;y++)
    {
      delay();
      BEEP=!BEEP;                //BEEP取反
    } 
    BEEP=1;                      //关闭蜂鸣器
	delay1(50);
  }



/**********************************************************/
// Time0中断函数
/**********************************************************/
void Time0(void) interrupt 1 using 0
{
  TH0=0x4c; //50ms定时
  TL0=0x00;
  timecount++;
  if(timecount>9)
   {
    timecount=0;    
    flag=~flag;             
   }  
}

/**********************************************************/
// 设定值写入DS1302
/**********************************************************/
void  Set_W1302(uchar addr)
{
   uchar  temp;
   write_ds1302(0x8e,0x00);
   temp=(init1[0]<<4)+init1[1];
   write_ds1302(addr,temp); 
   write_ds1302(0x8e,0x80);
   beep();
}


/**********************************************************/
// 显示当前时间
/**********************************************************/

void  Play_nowtime()
{
   read_nowtime(0x81,init,7);   //读出当前时间,读出7个字节

	if(!K4)
	{
	   //显示年
	   dula=0;
	   P0=table[init[6]>>4];		
	   dula=1;
	   dula=0;

	   wela=0;
	   P0=0xfe;
	   wela=1;
	   wela=0;
	   delay();

	   dula=0;
	   P0=table[init[6]&0x0f];		
	   dula=1;
	   dula=0;

	   wela=0;
	   P0=0xfd;
	   wela=1;
	   wela=0;
	   delay();

	   //显示月
	   dula=0;
	   P0=table[init[4]>>4];		
	   dula=1;
	   dula=0;

	   wela=0;
	   P0=0xfb;
	   wela=1;
	   wela=0;
	   delay();

	   dula=0;
	   P0=table[init[4]&0x0f];		
	   dula=1;
	   dula=0;

	   wela=0;
	   P0=0xf7;
	   wela=1;
	   wela=0;
	   delay();
	   //显示日
	   dula=0;
	   P0=table[init[3]>>4];		
	   dula=1;
	   dula=0;

	   wela=0;
	   P0=0xef;
	   wela=1;
	   wela=0;
	   delay();

	   dula=0;
	   P0=table[init[3]&0x0f];		
	   dula=1;
	   dula=0;

	   wela=0;
	   P0=0xdf;
	   wela=1;
	   wela=0;
	   delay();
	   //显示周
	   dula=0;
	   P0=table[init[5]>>4];		
	   dula=1;
	   dula=0;

	   wela=0;
	   P0=0xbf;
	   wela=1;
	   wela=0;
	   delay();

	   dula=0;
	   P0=table[init[5]&0x0f];		
	   dula=1;
	   dula=0;

	   wela=0;
	   P0=0x7f;
	   wela=1;
	   wela=0;
	   delay();
	}
	else
	{
	   //显示时
	   dula=0;
	   P0=table[init[2]>>4];		
	   dula=1;
	   dula=0;
	
	   wela=0;
	   P0=0xfb;
	   wela=1;
	   wela=0;
	   delay();
	
	   dula=0;
	   P0=table[init[2]&0x0f];		
	   dula=1;
	   dula=0;

	   wela=0;
	   P0=0xf7;
	   wela=1;
	   wela=0;
	   delay();

	   //显示分
	   dula=0;
	   P0=table[init[1]>>4];		
	   dula=1;
	   dula=0;

	   wela=0;
	   P0=0xef;
	   wela=1;
	   wela=0;
	   delay();

	   dula=0;
	   P0=table[init[1]&0x0f];		
	   dula=1;
	   dula=0;

	   wela=0;
	   P0=0xdf;
	   wela=1;
	   wela=0;
	   delay();

	   //显示秒
	   dula=0;
	   P0=table[init[0]>>4];		
	   dula=1;
	   dula=0;

	   wela=0;
	   P0=0xbf;
	   wela=1;
	   wela=0;
	   delay();

	   dula=0;
	   P0=table[init[0]&0x0f];		
	   dula=1;
	   dula=0;

	   wela=0;
	   P0=0x7f;
	   wela=1;
	   wela=0;
	   delay();
	}
}
/**********************************************************/
// 主函数
/**********************************************************/
void main()
{
  
   P1=0xff;
   TMOD=0x01;
   TH0=0x4c;          //50ms定时
   TL0=0x00;
   EA=1;
   ET0=1;  
   TR0=1;

   init_ds1302();              //初始化ds1302


   
   while(1)
   {
//---------------------------------------------------------
   if(!K1 ||!K2 ||!K3)
      {
	      set_ds1302(0x80,init2,7);  //设置初始时间,日期,年月
		  beep();
      }

	Play_nowtime();
//	Time_compare();
   }
}

⌨️ 快捷键说明

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