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

📄 12887.c

📁 5151程序集5151程序集51programme12887.rar51programme12887.rar
💻 C
字号:
#include <reg52.h>
#include <absacc.h>
/* DS12C887 内部专用寄存器宏定义 */
#define SECOND XBYTE[0x0800]
#define MIN XBYTE[0x0802]
#define HOUR XBYTE[0x0804]
#define DAYOFWEEK XBYTE[0x0806]
#define DAYOFMONTH XBYTE[0x0807]
#define MONTH XBYTE[0x0808]
#define YEAR XBYTE[0x0809]
#define REG_A XBYTE[0x080a]
#define REG_B XBYTE[0x080b]
#define REG_C XBYTE[0x080c]
#define REG_D XBYTE[0x080d]
//****** HD7279A 指令 ******
#define CMD_RESET 0xa4
#define CMD_TEST 0xbf
#define DECODE0 0x80
#define SEGON 0xe0
#define CMD_READ 0x15
#define uint unsigned int
#define uchar unsigned char
sbit cs=P2^0 ;
sbit clk=P2^1 ;
sbit dat=P2^2 ;
sbit key=P3^2 ;
uchar buffer[8]={0,0,0,0,0,0,0,0};
uchar keynum,second,min,hour,dayofweek,dayofmonth,month,year;
void init_7279(void);
void init_12887(void);
void long_delay(void);
void short_delay(void);
uchar read7279(uchar command);
void write(uchar, uchar);   // 写入到HD7279
uchar receive_byte(void);
void send_byte(uchar);
void settime();
void gettime();
void display();
void main(void)
{       init_12887();
        settime();
        gettime();
        init_7279();
 while(1)
  { if(!key)
     {keynum=read7279(CMD_READ);}
   switch(keynum)
   {
      case 00:
          {buffer[0]=(second%10);
           buffer[1]=(second/10);
           buffer[2]=min%10;
           buffer[3]=min/10;
           buffer[4]=hour%10;
           buffer[5]=hour/10;
           buffer[6]= 0x0f;
           buffer[7]=dayofweek;
           }break;
      case 01:
           {
            buffer[0]=dayofmonth%10;
            buffer[1]=dayofmonth/10;
            buffer[2]=month%10;
            buffer[3]=month/10;
            buffer[4]=year%10;
            buffer[5]=year/10;
            buffer[6]=0;
            buffer[7]=2;
            }break;
       default:
            { }
   }
     display();
     gettime();
  }
}
void init_12887()
{/* 设置DV2、DV1、DV0为010,打开芯片DS12C877内部晶振 */
	REG_A = REG_A&0xaf;			// DV2=DV0=0
	REG_A = REG_A|0x20;			// DV1=0

	REG_B = REG_B&0x7b;			// SET=0,时间数据正常更新;DM=1,10进制数据模式
	REG_B = REG_B|0x06;			// 寄存器B的24/12位置1,24小时时间模
}
void init_7279()
{ uint i;
  for(i=0;i<0x2000;i++)
  send_byte(CMD_RESET);
}
void write(uchar cmd,uchar dta)
{
   send_byte (cmd);
   send_byte (dta);
}
uchar read7279(uchar command)
{send_byte (command);
 return(receive_byte());
}
void send_byte(uchar out_byte)
{
   uchar i;
   cs=0;
   long_delay();
   for (i=0;i<8;i++)
   {
      if (out_byte&0x80)
      {
         dat=1;
      }
      else
      {
         dat=0;
      }
      clk=1;
      short_delay();
      clk=0;
      short_delay();
      out_byte=out_byte*2;
   }
   dat=0;
}
uchar receive_byte(void)
{uchar i,in_byte;
 dat=1;
 long_delay();
 for (i=0;i<8;i++)
 {clk=1;
  short_delay();
  in_byte=in_byte*2;
  if(dat)
  {in_byte=in_byte|0x01;
  }
  clk=0;
  short_delay();
 }
 dat=0;
 return(in_byte);
}
void long_delay(void)
{
   uchar i;
   for (i=0;i<0x30;i++);
}

void short_delay(void)
{
   uchar i;
   for(i=0;i<8;i++);
}
/* 从串行口获取数据函数,数据包括:year1,month1,dayofweek1,
dayofmonth1,hour1,min1。如果获取到正确数据则返回1,否则返回0 */

/* 设置日历和时钟函数 */
void settime()
{
	REG_B = REG_B|0x80;			// SET=1,芯片DS12C887处于设置状态
        SECOND=12;
	MIN = 38;
	HOUR = 15;
	DAYOFWEEK = 2;
	DAYOFMONTH = 10;
	MONTH = 8;
	YEAR = 6;

	REG_B = REG_B&0x7f;		    // SET=0,芯片DS12C887恢复正常数据更新状态
}


/* 获取日历时钟函数 */
void gettime()
{
	while ((REG_A&0x80)!=0x00)	// 直到UIP=0时,才能读取日历时钟信息	{
	{
                second=SECOND;
                buffer[0]=second%10;
                buffer[1]=second/10;
                min = MIN ;
                buffer[2]=min%10;
                buffer[3]=min/10;
                hour = HOUR;
                buffer[4]=hour%10;
                buffer[5]=hour/10;
		dayofweek= DAYOFWEEK;
                buffer[6]=0x0f;
                buffer[7]=dayofweek%10;
		dayofmonth = DAYOFMONTH;
                month= MONTH;
                year = YEAR;
          }


}
void display()
{  write(DECODE0,buffer[0]);
   write(DECODE0+1,buffer[1]);
   write(DECODE0+2,buffer[2]);
   write(DECODE0+3,buffer[3]);
   write(DECODE0+4,buffer[4]);
   write(DECODE0+5,buffer[5]);
   write(DECODE0+6,buffer[6]);
   write(DECODE0+7,buffer[7]);
   write(SEGON ,0x17);
   write(SEGON,0x27);
   write(SEGON,0x37);
}


⌨️ 快捷键说明

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