📄 set_time.c
字号:
#include<reg52.h>
#define uchar unsigned char
/**************************************************************/
/*MAX7219*********************************************************/
/******************************************************************/
sbit CLK=P1^0;
sbit DIN=P1^1;
sbit LOAD=P1^2;
/**************************************************************/
void send(unsigned char add,unsigned char dat);
void Initial_7219(void);
/**************************************************************/
/***********************************************************/
void set_minite();
void set_hour();
uchar add_hour(uchar hour);
uchar add_minite(uchar minite);
uchar minus_hour(uchar hour);
uchar minus_minite(uchar minite);
void delay1(uchar time);
void set_time();
sbit s1=P3^4;
sbit s2=P3^5;
sbit s3=P3^6;
sbit s4=P3^7;
#define keycode P3 & 0x0f0
/************************************************************/
/*****************************************************************/
void Initial_7219(void)
{
send(0x0c,0x01);//Shut down
send(0x0b,0x07);//Scan Limit
send(0x0a,0x0fa);//Intensity
send(0x09,0x0ff);//Decode Mode
}
/**************************************************************/
void send(unsigned char add,unsigned char dat)//Send 16Bytes
{
unsigned char Databuf,i,j;
LOAD=0;
i=0;
while(i<16)
{
if(i<8)
{
Databuf=add;
}
else
{
Databuf=dat;
}
for(j=8;j>=1;j--)
{
DIN=Databuf&0x80;
Databuf=Databuf<<1;
CLK=1;
CLK=0;
}
i=i+8;
}
LOAD=1;
}
/*************************************************************/
/***********************MAX7219*********************************/
/***************************************************************/
/***************************************************************/
//实时时钟芯片DS1302 C51源程序
/****************************************************************
公司名称:
模块名称:DS1302.c
功 能:实时时钟模块 时钟芯片型号:DS1302
说 明:
程序设计:zhaojunjie
设计时间:2002.03.02
版 本 号: 20020302
*********************************************************************/
sbit SCL = P3^0;// DS1302 Serial-Clock Input pin 7
sbit SDA = P3^1;// DS1302 Serial-Data Input pin 6
sbit RST = P3^2;// DS1302 Chip-Seclet Input pin 5
code uchar time_data[60]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,
0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,
0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,
0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,
0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x50,
0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59};
#define DS1302_WP 0x8E
#define DS1302_RESET RST=0;SCL=0;RST=1
#define DS1302_WP_ENABLE Write_Ds1302(DS1302_WP,0X00)
#define DS1302_WP_DISENABLE Write_Ds1302(DS1302_WP,0x80)
unsigned char set_rtc_code[3]={0x00,0x00,0x00};
code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsigned char read_rtc_code[3];
void Write_Ds1302_byte(unsigned char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );
void Read_RTC(void);
void Set_RTC(void);
/****************************************************************************/
/****************************************************************************/
void Write_Ds1302_Byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCL=0;
SDA=temp&0x01;
temp>>=1;
SCL=1;
}
}
/****************************************************************************/
void Write_Ds1302( unsigned char address,unsigned char dat )
{
DS1302_RESET;
Write_Ds1302_Byte(address);
Write_Ds1302_Byte(dat);
RST=0;
}
/****************************************************************************/
unsigned char Read_Ds1302 ( unsigned char address )
{
unsigned char i,temp=0x00,temp_temp;
DS1302_RESET;
Write_Ds1302_Byte(address);
for (i=0;i<8;i++)
{
if(SDA)
temp|=0x80;
SCL=0;
temp>>=1;
SCL=1;
}
RST=0;
temp_temp=temp/16;
temp=temp%16;
temp=temp+temp_temp*10;
return (temp);
}
/****************************************************************************/
/****************************************************************************/
void Read_RTC(void)
{
unsigned char i,*p;
p=read_rtc_address;
for(i=0;i<3;i++)
{
read_rtc_code[i]=Read_Ds1302(*p);
p++;
}
}
/***********************************************************************/
/***********************************************************************/
void Set_RTC(void)
{
unsigned char i,*p;
p=write_rtc_address;
for(i=0;i<3;i++)
{
Write_Ds1302(*p,set_rtc_code[i]);
p++;
}
}
/****************************************************************************/
/****************************************************************************/
/****************************************************************************/
/****************************************************************************/
/*****************************************************************/
/* 时间设置set_time******************************************************/
void set_minite()
{uchar hour,minite;
uchar hour_h,hour_l,minite_h,minite_l;
while(s4==1)
{send(0x08,0x0f);//5---8灭
send(0x07,0x0f);
send(0x06,0x0f);
send(0x05,0x0f);
Read_RTC();
hour=read_rtc_code[2];//读DS1302
minite=read_rtc_code[1];
hour_h=hour/10;
hour_l=hour%10;
send(0x01,hour_h);//显示小时
send(0x02,hour_l);
minite_h=minite/10;
minite_l=minite%10;
send(0x03,minite_h);//显示分钟
send(0x04,minite_l);
delay1(450);
send(0x03,0x0f);//显示分钟灭
send(0x04,0x0f);
delay1(450);
if(s3==0)//3键
{
set_hour();
break;
}
else
if(s1==0)
{
minite=add_minite(minite);//时间加一
set_rtc_code[1]=minite; //
Set_RTC();
}
else
if(s2==0)
{
minite=minus_minite(minite);//时间减一
set_rtc_code[1]=minite; //
Set_RTC();
}
}
}
void set_hour()
{uchar hour,minite;
uchar hour_h,hour_l,minite_h,minite_l;
while(s4==1)
{send(0x08,0x0f);//5---8灭
send(0x07,0x0f);
send(0x06,0x0f);
send(0x05,0x0f);
Read_RTC();
hour=read_rtc_code[2];//读DS1302
minite=read_rtc_code[1];
hour_h=hour/10;
hour_l=hour%10;
send(0x01,hour_h);//显示小时
send(0x02,hour_l);
minite_h=minite/10;
minite_l=minite%10;
send(0x03,minite_h);//显示分钟
send(0x04,minite_l);
delay1(450);
send(0x01,0x0f);//显示小时灭
send(0x02,0x0f);
delay1(450);
if(s3==0)
{set_minite();
break;
}
else
if(s1==0)
{
hour=add_hour(hour);//时间加一
set_rtc_code[2]=hour; //
Set_RTC();
}
else
if(s2==0)
{
hour=minus_hour(hour);//时间减一
set_rtc_code[2]=hour;
Set_RTC();
}
}
}
uchar add_hour(uchar hour)
{hour++;
if(hour>23)
hour=0;
hour=time_data[hour];
return (hour);
}
uchar add_minite(uchar minite)
{ minite++;
if(minite>59)
minite=0;
minite=time_data[minite];
return (minite);
}
uchar minus_hour(uchar hour)
{if(hour==0)
hour=23;
else
hour--;
hour=time_data[hour];
return(hour);
}
uchar minus_minite(uchar minite)
{
if(minite==0)
minite=59;
else
minite--;
minite=time_data[minite];
return(minite);
}
/**************************************************/
/********************************
//延时//
********************************/
void delay1(uchar time)
{uchar i,j;
for(i=0;i<time; i++)
for(j=0;j<time;j++)
;
}
void set_time()
{
bit a;
P3=0x0ff;
DS1302_WP_ENABLE;
Set_RTC();
if(s3==0)
{a=~a;
if(a==0)
set_hour();
else
set_minite();
}
}
/**************************************************/
/**************************************************/
/***************时间设置完*************************/
void main()
{ Initial_7219();//初始化
while(1)
{
set_time();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -