××大学××学院××系××课程设计报告
/**********************向DS1302写入数据************************/ void Write_ds1302(uchar address,uchar indata) {
SCLK = 0; RST = 1;
Write_byte(address); //写入地址 Write_byte(indata);
//写入数据
SCLK = 0; RST = 0; }
/**********************从DS1302读取数据*****************************/ uchar Read_ds1302(uchar addr) {
uchar backdata; SCLK = 0; RST = 1;
Write_byte(addr);
//先写地址
backdata=Read_byte(); //然后读数据
SCLK = 0; RST = 0; return (backdata); }
/************************按键扫描及操作******************************/ void Key_Process(void)
//通过按键调整时间
{
uchar min16,hour16;
//定义16进制的分钟和小时变量 Write_ds1302(0x8e,0x00);
//DS1302写保护控制字,允许写 Write_ds1302(0x80,0x80); //时钟停止运行 if(K2 == 0) //K2键用来对小时进行加1调整
{
Delay(5);
//延时去抖
17
××大学××学院××系××课程设计报告
if(K2 == 0) {
while( !K2);
//等待K2键释放
time_buf[2] ++; //小时加1 if(time_buf[2] == 24) { }
time_buf[2] = 0;//当变成24时初始化为0
hour16 = time_buf[2]/10*16 + time_buf[2];
}
Write_ds1302(0x84,hour16); //将调整后的小时数据写入DS1302
//将所得的小时数据转变成16进制数据
}
if(K3 == 0) {
Delay(5);
// K3键用来对分钟进行加1调整
//延时去抖
if(K3 == 0)
{
while( !K3);
//等待K3键释放
time_buf[1] ++; //分钟加1 { }
time_buf[1] = 0;//当分钟加到60时初始化为0 if(time_buf[1] == 60)
min16 = time_buf[1]/10*16 + time_buf[1];
}
18
//将所得的分钟数据转变成16进制数据
Write_ds1302(0x82,min16); //将调整后的分钟数据写入DS1302
}
××大学××学院××系××课程设计报告
if(K1 == 0)
//K4键是确认键
{ Delay(5);
//延时去抖
if(K1 == 0) { while( !K1);
//等待K1键释放
Write_ds1302(0x80,0x00); //调整完毕后,启动时钟运行 Write_ds1302(0x8e,0x80);
//写保护控制字,禁止写
K1_FLAG = 0;
//将K1键按下标志位清0
}
} }
/*---------------------------------------------------------------------------*/ void Key_Clock(void)
//按键设置闹钟时间
{
Write_ds1302(0x8e,0x00); //DS1302写保护控制字,允许写
// Write_ds1302(0x80,0x80); //时钟停止运行 if(K2 == 0)
//K2键用来对小时进行加1调整
{ Delay(5);
//延时去抖
if(K2 == 0) { while( !K2);
//等待K2键释放
temp[0] = time_buf[2]; temp[0]++;
//小时加1
if(temp[0] == 24) { temp[0] = 0;//当变成24时初始化为0
} //
time_hour[] = time_buf[2];
//将所得的小时数据转变成16进制数据
19
××大学××学院××系××课程设计报告
Write_ds1302(0x84,hour16); //将调整后的小时数据写入
//
DS1302
}
if(K3 == 0) {
Delay(5);
//延时去抖
// K3键用来对分钟进行加1调整
}
if(K3 == 0) {
Write_ds1302(0x82,min16); //将调整后的分钟数据写入
while( !K3);
//等待K3键释放
temp[1] = time_buf[1]; temp[1]++;
//分钟加1
if(temp[1] == 60) { }
time_min[] = time_buf[1];
//将所得的分钟数据转变成16进制数据 temp[1] = 0;//当分钟加到60时初始化为0
//
//
DS1302 }
/*************获取秒、分钟、小时、日、月、年的值******************************/ void get_time(void) {
uchar sec,min,hour,date,mouth,year;
//定义秒、分和小时变量
}
}
Write_ds1302(0x8e,0x00); //控制命令,WP=0,允许写操作
20
Write_ds1302(0x90,0xab); //涓流充电控制
××大学××学院××系××课程设计报告
sec = Read_ds1302(0x81); //读取秒 min = Read_ds1302(0x83); //读取分 hour = Read_ds1302(0x85); //读取时
time_buf[0] = sec/16*10 + sec; //将读取到秒的16进制数转化为10进制
time_buf[1] = min/16*10 + min; //将读取到分的16进制数转化为10进制
time_buf[2] = hour/16*10 + hour; //将读取到时的16进制数转化为10进制
time_buf[3] = date/16*10 + date;
//将读取到日的16进制数转化为
date = Read_ds1302(0x86);
//读取日 //读取月 //读取年
mouth= Read_ds1302(0x88); year = Read_ds1302(0x8c);
10进制
time_buf[4] = mouth/16*10 + mouth;
//将读取到月的16进制数转化为
10进制
time_buf[5] = year/16*10 + year;
//将读取到年的16进制数转化为
10进制 }
/********************数码管显示时间程序**********************************/ void Time_Display(void) {
wela(); P0 = 0xfd;
21
//秒-分-时显示
wela(); P0 = 0xfe; dula();
P0 = table[time_buf[0]/10]; //显示秒十位 Delay(5);