📄 year1.c
字号:
#include<reg52.h>
#include<math.h>
#include<absacc.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
//--------------------------------------------//DS12C887寄存器地址定义
#define DS12C887_M XBYTE [0x7f00]//秒
#define DS12C887_MA XBYTE [0x7f01]//秒报警
#define DS12C887_F XBYTE [0x7f02]//分
#define DS12C887_FA XBYTE [0x7f03]//分报警
#define DS12C887_S XBYTE [0x7f04]//时
#define DS12C887_SA XBYTE [0x7f05]//时报警
#define DS12C887_X XBYTE [0x7f06]//星期
#define DS12C887_R XBYTE [0x7f07]//日
#define DS12C887_Y XBYTE [0x7f08]//月
#define DS12C887_N XBYTE [0x7f09]//年
#define DS12C887_CE XBYTE [0x7f32]//纪
#define DS12C887_A XBYTE [0x7f0a]//寄存器A,A.7—只读判断忙闲
#define DS12C887_B XBYTE [0x7f0b]//寄存器B,B.7—控制工作状态:0正常、1停止
// B.2—BCD码或二进制选择:0 二进制
// B.1—24/12小时模式选择:1 24小时进制
#define DS12C887_C XBYTE [0x7f0c]//寄存器C
#define DS12C887_D XBYTE [0x7f0d]//寄存器D 只读,读取该寄存器可使设置的时间和工作模式生效
//--------------------------------------------//DS12C887相关变量定义
uchar year;
uchar month;
uchar day;
uchar hour;
uchar minute;
uchar second;
uchar century;
uchar week;
//uint str[2]={0x0000,0x0000};
uint a[2]={0,0},b[2],c[2],d[2];
uint table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
sbit data1=P1^6;
sbit clock=P1^7;
unsigned char n,second_flag,minute_flag,hi;
void LED(unsigned int *str);
//--------------------------------------------//时钟判断忙闲
void clock_judge_busy(void)
{ while( DS12C887_A & 0x80 );//忙则循环等待
}
//--------------------------------------------//时钟读数据
void clock_read_data(void)
{
clock_judge_busy();
century= DS12C887_CE;
clock_judge_busy();
year = DS12C887_N; //
clock_judge_busy();
month = DS12C887_Y; //
clock_judge_busy();
day = DS12C887_R; //
clock_judge_busy();
week=DS12C887_X;
clock_judge_busy();
hour = DS12C887_S; //
clock_judge_busy();
minute = DS12C887_F; //
clock_judge_busy();
second = DS12C887_M; //
}
//--------------------------------------------//时钟写数据
void clock_write_data(void)
{ uchar i;
DS12C887_B = 0x80; //
DS12C887_CE= century;
DS12C887_N = year; //
DS12C887_Y = month; //
DS12C887_R = day; //
DS12C887_S = hour;
DS12C887_X=week; //
DS12C887_F = minute; //
DS12C887_M = second; //
DS12C887_A = 0x20; //
i= DS12C887_C; //
i= DS12C887_D; //
DS12C887_B = 0x00; //
}
void delay(unsigned int t) //1ms的延时子程序
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}
//--------------------------------------------//主程序
void main()
{
TMOD=0X01;
TH0=0XD8;
TL0=0XF0;
TR0=1;
IE=0X82;
/* week=0x04;
year = 0x07; //写入时间:2007年09月18日12时00分00秒(要设定的时间)
month = 0x09;
day = 0x20;
hour = 0x07;
minute = 0x02;
second = 0x00;
century= 0x20;
clock_write_data() ; */
while(1) {
if(second_flag){
clock_judge_busy();
second = DS12C887_M;
clock_judge_busy();
minute = DS12C887_F;
d[1]=(second&0x0f)|((second<<4)&0x0f00);
d[0]=(minute&0x0f)|((minute<<4)&0x0f00);
LED(d);
second_flag=0; }
if(minute_flag){
EA=0;
clock_judge_busy();
century=DS12C887_CE;
clock_judge_busy();
year=DS12C887_N;
a[0]=(century&0x0f)|((century<<4)&0x0f00);
a[1]=(year&0x0f)|((year<<4)&0x0f00);
LED(a);
delay(1000);
clock_judge_busy();
month=DS12C887_Y;
clock_judge_busy();
day=DS12C887_R;
c[0]=(month&0x0f)|((month<<4)&0x0f00);
c[1]=(day&0x0f)|((day<<4)&0x0f00);
LED(c);
delay(1000);
clock_judge_busy();
hour = DS12C887_S;
clock_judge_busy();
week = DS12C887_X;
b[0]=(week&0x0f)|((week<<4)&0x0f00);
b[1]=(hour&0x0f)|((hour<<4)&0x0f00);
LED(b);
minute_flag=0;
delay(1000);
EA=1;}
}
}
//*********************************************中断服务程序
void time0()interrupt 1 using 0
{
TH0=0xD8;
TL0=0xF0;
n++;
if (n==100)
{
n = 0;
second_flag =1;
hi++;
}
if(hi==120){
hi=0;
minute_flag=1;
}
}
//*****************************************************显示时间
void LED(unsigned int *str)
{ unsigned char seg, i,j;
for(i=0;i<2;i++){
seg=table[str[i]>>8];
for(j=1;j<=8;j++){
clock=0;
if(0x01&(seg>>(8-j))) data1=1;
else data1=0 ;
clock=1;}
seg=table[str[i]&0x000f];
for(j=1;j<=8;j++){
clock=0;
if(0x01&(seg>>(8-j))) data1=1;
else data1=0 ;
clock=1;}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -