资源描述
HC
#include<reg51.h>//头文件
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DATA=P1^1; //位定义1302芯片的接口,数据输出端定义在P1.1引脚
sbit RST=P1^2; //位定义1302芯片的接口,复位端口定义在P1.1引脚
sbit SCLK=P1^0; //位定义1302芯片的接口,时钟输出端口定义在P1.1引脚
sbit K1=P3^0;
sbit K2=P3^1;
sbit K6=P3^2;
sbit K4=P3^5;
sbit K5=P3^6;
sbit K7=P3^3;
sbit K3=P3^4;
sbit K8=P3^7;
sbit ALARM_BEEP = P1^3;
uchar kedaoru=0,qw1=0;
uchar second2,minute2,hour2,second3,minute3,hour3,second4,minute4,hour4,second5,minute5,hour5,second6,minute6,hour6,
second7,minute7,hour7;
uchar hour1=100;
uchar e=1 ;
uchar tmp=0;
uchar qw=0;
uchar g,f,p,q,h,m,second1,minute1,year1=1,month1,day1,jilu;
uchar disbuffer[12];disbuffer1[6];
uchar displaytable[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar chocode[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar second,minute,hour,year,month,day,flag,flag1,naozhong,miaobiao=0;
void delaynus(uchar n)
{
uchar i;
for(i=0;i<n;i++) ;
}
void delayms(uchar n)
{
uchar i;
while(n--)
for(i=0;i<120;i++);
}
void delay(uint e)
{uint m;
for(m=0;m<e;m++){}
}
void write1302(uchar dat)
{
uchar i;
SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备
delaynus(2); //稍微等待,使硬件做好准备
for(i=0;i<8;i++) //连续写8个二进制位数据
{
DATA=dat&0x01; //取出dat的第0位数据写入1302
delaynus(2); //稍微等待,使硬件做好准备
SCLK=1; //上升沿写入数据
delaynus(2); //稍微等待,使硬件做好准备
SCLK=0; //重新拉低SCLK,形成脉冲
dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位
}
}
void writeset1302(uchar Cmd,uchar dat)
{
RST=0; //禁止数据传递
SCLK=0; //确保写数居前SCLK被拉低
RST=1; //启动数据传输
delaynus(2); //稍微等待,使硬件做好准备
write1302(Cmd); //写入命令字
write1302(dat); //写数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
}
unsigned char read1302(void)
{
uchar i,dat;
delaynus(2); //稍微等待,使硬件做好准备
for(i=0;i<8;i++) //连续读8个二进制位数据
{
dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位
if(DATA==1) //如果读出的数据是1
dat|=0x80; //将1取出,写在dat的最高位
SCLK=1; //将SCLK置于高电平,为下降沿读出
delaynus(2); //稍微等待
SCLK=0; //拉低SCLK,形成脉冲下降沿
delaynus(2); //稍微等待
}
return dat; //将读出的数据返回
}
uchar readset1302(uchar Cmd)
{
unsigned char dat;
RST=0; //拉低RST 178 / 192
SCLK=0; //确保写数居前SCLK被拉低
RST=1; //启动数据传输
write1302(Cmd); //写入命令字
dat=read1302(); //读出数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
return dat; //将读出的数据返回
}
void setprotect(bit flag)//设置保护
{
if(flag==1)
writeset1302(0x8e,0x80);//写入保护指令
else
writeset1302(0x8e,0x00);//写入不保护指令
}
void stoptime(bit flag) // 是否将时钟停止
{
uchar dat;
dat=readset1302(0x81);
setprotect(0);
if(flag)
writeset1302(0x80, dat|0x80);
else
writeset1302(0x80, dat&0x7f);
}
void init_ds1302(void)
{
setprotect(0); //根据写状态寄存器命令字,写入不保护指令
writeset1302(0x80,((45/10)<<4|(45%10))); //根据写秒寄存器命令字,写入秒的初始值
writeset1302(0x82,((59/10)<<4|(59%10))); //根据写分寄存器命令字,写入分的初始值
writeset1302(0x84,((8/10)<<4|(8%10))); //根据写小时寄存器命令字,写入小时的初始值
writeset1302(0x86,((5/10)<<4|(5%10))); // ri
writeset1302(0x88,((12/10)<<4|(12%10))); // yue
writeset1302(0x8c,((13/10)<<4|(13%10))); // nian
}
void display1(void)//调时
{
if(miaobiao==0)
{if(K2==0)
{
delay(10);
if(K2==0)
{f++;delay(10);if(f==7){f=1;}
while(!K2)
delay(10);
switch(f)
{
case 1:flag=1; e=1;kedaoru=1; miaobiao=0;
break;
case 2: kedaoru=1 ;
break;
case 3: kedaoru=1 ;
break;
case 4: e=2; kedaoru=1;
break;
case 5: kedaoru=1;
break;
case 6: kedaoru=1 ;
break;
default:break;
}
}
}
}
if(kedaoru==1)
{
if(K6==0)
{delay(10);
if(K6==0)
{delay(10);
while(!K6)
delay(10);
switch(f)
{
case 1: second++;if(second==60)second=0;
break;
case 2: minute++;if(minute==60)minute=0;
break;
case 3: hour++;if(hour==24)hour=0;
break;
case 4: day++;if(day==32)day=1;
break;
case 5: month++;if(month==13)month=1;
break;
case 6: year++;if(year==100)year=0;
break;
default:break;
}
}
}
}
if(kedaoru==1)
{
if(K7==0)
{delay(10);
if(K7==0)
{delay(10);
while(!K7)
delay(10);
switch(f)
{
case 1: second--;if(second==-1)second=59;
break;
case 2: minute--;if(minute==-1)minute=59;
break;
case 3: hour--;if(hour==-1)hour=23;
break;
case 4: day--;if(day==0)day=31;
break;
case 5: month--;if(month==0)month=12;
break;
case 6: year--;if(year==-1)year=99;
break;
default:break;
}
}
}
}
if((K3==0)&&(kedaoru==1))//保存闹钟
{
second1=second;minute1=minute;hour1=hour;year1=year;month1=month;day1=day;delay(10);
flag=0;f=0;naozhong=0;kedaoru=0;return;
}
if((K4==0)&&(kedaoru==1))//保存时间
{
delay(10);
setprotect(0); //根据写状态寄存器命令字,写入不保护指令
writeset1302(0x80,((second/10)<<4|(second%10))); //根据写秒寄存器命令字,写入秒的值
writeset1302(0x82,((minute/10)<<4|(minute%10))); //根据写分寄存器命令字,写入分的值
writeset1302(0x84,((hour/10)<<4|(hour%10))); //根据写小时寄存器命令字,写入小时的值
writeset1302(0x86,((day/10)<<4|(day%10))); // ri
writeset1302(0x88,((month/10)<<4|(month%10))); // yue
writeset1302(0x8c,((year/10)<<4|(year%10)));
flag=0;f=0;kedaoru=0;return;
}
if(kedaoru==0)
{
if(K8==0)
{delay(10);
if(K8==0)
{q++;delay(10);if(q==5){q=1;}
while(!K8)
delay(10);
}
}
}
switch(q)
{
case 1: flag=1;e=1; second=0;minute=0;hour=0;EA=1; miaobiao=1; kedaoru=0; jilu=0;
break;
case 2: e=1; TR0=1;kedaoru=0;miaobiao=1; //启动
break;
case 3: e=1; TR0=0; kedaoru=0;miaobiao=1; //暂停
break;
case 4: e=1; q=2; kedaoru=0;miaobiao=1;
break;
default:break;
}
if((miaobiao==1)&&(K3==0))
{
second=0;minute=0;hour=0;
EA=0;q=1;
}
if((miaobiao==1)&&(jilu==0))
{
if(K6==0)
{delay(10);
if(K6==0);
{h++;delay(10);if(h==6){h=1;}
while(!K6)
switch(h)
{
case 1: second2=second;minute2=minute;hour2=hour;
break;
case 2: second3=second;minute3=minute;hour3=hour;
break;
case 3: second4=second;minute4=minute;hour4=hour;
break;
case 4: second5=second;minute5=minute;hour5=hour;
break;
case 5: q=3; jilu=1; q=1;
break;
default:break;
}
}
}
}
if(miaobiao==1){
if(K7==0)
{delay(10);
if(K7==0);
{m++;delay(10);if(m==5){m=1;}
while(!K7)
switch(m)
{
case 1:flag=1; e=1;second=second2;minute=minute2;hour=hour2; q=3;
break;
case 2:second=second3;minute=minute3;hour=hour3;
break;
case 3:second=second4;minute=minute4;hour=hour4;
break;
case 4:second=second5;minute=minute5;hour=hour5;
break;
default:break;
}
}
} }
if(K5==0)
{delay(10);
if(K5==0)
{delay(10);
while(!K5)
delay(10);{h=0;m=0;
naozhong=1;EA=0;q=0;kedaoru=0;miaobiao=0;e=1;
flag=0;f=0;return;}
}
}
}
void display(void)
{
if(K1==0)
{delay(10);
if(K1==0)
{e++;delay(10);if(e==3){e=1;}
while(!K1)
delay(10);
}
}
switch(e)
{
case 1:
for (g=0;g<6;g++)
{
P2=chocode[g];
p=disbuffer[g+6];
P0=displaytable[p];
delay(80) ;
P2=0xff;
delay(1);}break;
case 2:
for (g=0;g<6;g++)
{
P2=chocode[g];
p=disbuffer[g];
P0=displaytable[p];
delay(80) ;
P2=0xff;
delay(1);} break;
default:break;
}
}
void time_init(void)
{ TMOD=0x01; //定时器设置
TH0=(65536-10000)/256; //定时器0赋初值
TL0=(65536-10000)%256;
EA=1; //开总中断
ET0=1;
TR0=0; //关定时器0中断
}
void int0() interrupt 1 //秒表中断
{ TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
while(++qw==100)
{ qw=0;
second++;
if(second>=60)
{ second=0;
minute++;
if(minute>=60)
{ minute=0;
hour++;
if(hour>=24)
{hour=0;
}
}
}
}
}
void main()
{
uchar ReadValue; //缓冲数据用的
init_ds1302(); //ds1302初始化
time_init();
while(1)
{
if(flag==0)
{
ReadValue = readset1302(0x81); //从秒寄存器读数据
second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//将读出数据转化
ReadValue = readset1302(0x83); //从分寄存器读
minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
ReadValue = readset1302(0x85); //从分寄存器读
hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
ReadValue = readset1302(0x87); //从ri寄存器读数据
day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//将读出数据转化
ReadValue = readset1302(0x89); //从yue寄存器读
month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
ReadValue = readset1302(0x8d); //从nian寄存器读
year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
}
if(minute==59 )
{
if(second>=49)
{
if((second==50)||(second==52)||(second==54)||(second==56)||(second==58)){ALARM_BEEP=1;}
if((second==51)||(second==53)||(second==55)||(second==57)){ALARM_BEEP=0;delay(50);ALARM_BEEP=1;delay(1);}
if(second==59){ALARM_BEEP=0;delaynus(500);}
}
}
if(second==0){ALARM_BEEP=1;}
if((naozhong==0)&&(second1==second)&&(minute1==minute)&&(hour1==hour))
{ALARM_BEEP=0;delay(100);ALARM_BEEP=1;delay(100);ALARM_BEEP=0;delay(100);}
if((second1==second)&&(minute1!=minute)) {ALARM_BEEP=1;}
if((naozhong==1))
{ALARM_BEEP=1;}
display1();
disbuffer[0]=year/10;
disbuffer[1]=year%10;
disbuffer[2]=month/10;
disbuffer[3]=month%10;
disbuffer[4]=day/10;
disbuffer[5]=day%10;
disbuffer[6]=hour/10;
disbuffer[7]=hour%10;
disbuffer[8]=minute/10;
disbuffer[9]=minute%10;
disbuffer[10]=second/10;
disbuffer[11]=second%10;
display();
}
}
展开阅读全文