📄 timer.c
字号:
#include "reg52.h"
#include "VIiC_C51.H" //包含VI2C软件包
#define uchar unsigned char
#define uint unsigned int
#define PCF8563 0xA2 //定义器件地址
#define WRADDR 0x00 //定义写单元首地址
#define RDADDR 0x02 //定义读单元首地址
sbit key_add=P3^7;
sbit key_move=P3^6;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P3_4=P3^4;
sbit P0_7=P0^7;
bit gettime_fg;
unsigned char disp_buf[8]={0,0,0,0,0,0,0,0};//显示缓存
unsigned int back_daycount;
unsigned char day_old;
unsigned char group0[8],group1[8],group2[8];
//unsigned char code Tab1[]={0xc0,0xed,0xb0,0xa8,0x8d,0x8a,0x82,0xec,0x80,0x88};
unsigned char code Tab1[10]={
0x81,/*0*/
0xED,/*1*/
0x43,/*2*/
0x49,/*3*/
0x2D,/*4*/
0x19,/*5*/
0x11,/*6*/
0xCD,/*7*/
0x01,/*8*/
0x09,/*9*/
};
unsigned char code Tab2[10]={
0x18,/*0*/
0x7B,/*1*/
0x2C,/*2*/
0x29,/*3*/
0x4B,/*4*/
0x89,/*5*/
0x88,/*6*/
0x3B,/*7*/
0x08,/*8*/
0x09,/*9*/
};
uchar RtcTime[7];
void systeminit(void)
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=-50000/256;
TL0=-50000%256;
TR0=1;
SCON=0x00;
}
void time0() interrupt 1 using 2 //定时器0中断处理程序
{
uchar t0int_count; //定时器0中断次数变量
TH0=-50000/256;
TL0=-50000%256;
t0int_count++;
if(t0int_count==10)
{
// P1_2=!P1_2;
P1_3=!P1_3;
t0int_count=0;
// gettime_fg=~gettime_fg;
}
}
void DelayMs(unsigned char no) //延时毫秒程序
{
unsigned char i,j;
for(i=0;i<no;i++)
{
for(j=0;j<164;j++);
for(j=0;j<164;j++);
}
}
void display(void) //数码管显示
{
uchar i,segsel;
segsel=0x7f;
for(i=0;i<8;i++)
{
P0=0xff;
if(i==0|i==2|i==4|i==6)
{
SBUF=Tab2[group2[i]];
while(TI==0) ;
TI=0;
TI=0;
SBUF=Tab2[group0[i]];
while(TI==0) ;
TI=0;
SBUF=Tab2[group1[i]];
while(TI==0) ;
TI=0;
}
else
{
SBUF=Tab1[group2[i]];
while(TI==0) ;
TI=0;
SBUF=Tab1[group0[i]];
while(TI==0) ;
TI=0;
SBUF=Tab1[group1[i]];
while(TI==0) ;
TI=0;
}
P0=segsel ;
DelayMs(1);
segsel=(segsel>>1)+0x80;
}
P0=0xff;
}
unsigned char displayall(unsigned char *sd) //显示时间
{
sd[0]=sd[0]&0x7f;//秒屏蔽保留位
sd[1]=sd[1]&0x7f;//分屏蔽保留位
sd[2]=sd[2]&0x3f;//时屏蔽保留位
sd[3]=sd[3]&0x3f;//日屏蔽保留位
sd[4]=sd[4]&0x07;//星期屏蔽保留位
sd[5]=sd[5]&0x1f;//月屏蔽保留位
sd[6]=sd[6]&0x7f;//年屏蔽保留位
group1[0]= (sd[3]%16); //日个位
group1[1] =(sd[3]/16); //日十位
group1[2]= (sd[5]%16); //月个位
group1[3] =(sd[5]/16); //月十位
group1[4]= (sd[6]%16); //年个位
group1[5] =(sd[6]/16); //年十位
group1[6]= 0x00; //年百位
group1[7] =0x02; //年千位
if(day_old!=sd[3])
{
if(back_daycount!=0x00)
back_daycount--;
day_old=sd[3];
}
group0[0]= 0xff;
// group0[1] =sd[4]; //星期
if(sd[4]==0x00)
group0[1]=0x08;
else
group0[1]=sd[4];
// group0[1] =sd[4]; //星期
group0[2]= (sd[0]%16);
group0[3] =(sd[0]/16);
group0[4]= (sd[1]%16);
group0[5] =(sd[1]/16);
group0[6]= (sd[2]%16);
group0[7] =(sd[2]/16);
group2[3]=back_daycount/100;
group2[2]=back_daycount%100/10;
group2[1]=back_daycount%10;
display();
display();
return 0;
}
unsigned char DelayNS(unsigned char no)
{
unsigned char i,j; //延时参数
for(; no>0; no--)
for(i=0; i<100; i++)
for(j=0; j<100; j++);
return 0;
}
void TimeBCDadd(uchar i) //时间BCD码加1
{
RtcTime[i] += 1;
if( (RtcTime[i] & 0x0f) == 0x0a )
RtcTime[i] += 6;
}
void timeadd( uchar i ) //时间加1
{
switch (i)
{
case 0: if(RtcTime[0] == 0x59) RtcTime[0] = 0;
else TimeBCDadd(0);
break;
case 1: if(RtcTime[1] ==0x59) RtcTime[1] = 0;
else TimeBCDadd(1);
break;
case 2: if(RtcTime[2] == 0x23) RtcTime[2] = 0;
else TimeBCDadd(2);
break;
case 3: if(RtcTime[3] == 0x31) RtcTime[3] = 0;
else TimeBCDadd(3);
break;
case 4: if(RtcTime[4] == 0x06) RtcTime[4] = 0;
else RtcTime[4]++;
break;
case 5: if(RtcTime[5] == 0x12) RtcTime[5] = 0;
else TimeBCDadd(5);
break;
case 6: if(RtcTime[6] == 0x99) RtcTime[6] = 0;
else TimeBCDadd(6);
break;
}
}
void main()
{
unsigned char td[9]={0x00,0x12,0x00,0x00,0x12,0x12,0x04,0x04,0x07}; //定义初始化字
// unsigned char rd[7],tc; //定义接收缓冲区
unsigned char code control_unit[2]={0x00,0x12};
uchar led_num,i;
bit settime_fg;
systeminit();
back_daycount=0x32;
day_old=0x00;
for(i=0;i<8;i++)
group2[i]=8-i;
led_num=0;
settime_fg=0;
P1_2=1;
ISendStr(PCF8563,WRADDR,td,0x5); //初始化PCF8563,如果需要的话可以不去掉
DelayNS(1);
ISendStr(PCF8563,WRADDR+5,&td[5],0x4);//初始化PCF8563,如果需要的话可以不去掉
IRcvStr(PCF8563,RDADDR,RtcTime,0x7); //读现在的时、分、秒
day_old=RtcTime[3]&0x3f;
while(1)
{
if(settime_fg==0)
IRcvStr(PCF8563,RDADDR,RtcTime,0x7); //读现在的时、分、秒
displayall(RtcTime); //调显示时间子程序
if(key_move==0)
{
settime_fg=1;
P1_2=0;
led_num++;
if(led_num==8)
{
led_num=0;
settime_fg=0;
P1_2=1;
ISendStr(PCF8563,WRADDR,control_unit,0x2);
DelayNS(1);
ISendStr(PCF8563,WRADDR+2,RtcTime,0x07);//初始化PCF8563,如果需要的话可以不去掉
}
while(key_move==0) //等待按键释放
{
displayall(RtcTime);
}
}
if(led_num)
{
if(key_add==0)
{
timeadd(led_num-1);
while(key_add==0) //等待按键释放
{
displayall(RtcTime); //调显示时间子程序
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -