我用DS1302时钟芯片 DIP用51单片机怎么时间越走越快应该怎样调整谢谢各位大神帮忙

电力改变了世界,也造福了我们的生产生活。电力安全大于……
近日尼吉康在北京召开了关于锂离子二次电池的新品发布会……
1930年首届世界杯没有预选赛,只有13支国家队报名参赛。……
秉承&创新&的设计理念,罗德与施瓦茨公司不……
作为业界最强大的电源技术供应商Vicor最近有点忙,自从谷……
演讲人:黄科涛时间: 10:00:00
演讲人:Tracy Ma时间: 10:00:00
演讲人:Jim时间: 10:00:00
预算:小于¥10000预算:¥50000
广东省江苏省
利用51单片机使用DS1302芯片制作电子钟
[导读]DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
本文引用地址:
是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31&8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据传送的方法。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc&2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有详细说明。SCLK为时钟输入端。
下图为DS1302的引脚功能图
本程序只显示时间,没有年份和月份
#include &my51.h&
#include &smg.h&
#include &ds1302.h&
void main() //ds1302显示时钟
ds1302_initSet();//初始化
//ds1302_stop(); 停掉1302,进入省电模式
ds1302_readRTC();_nop_(); //读取时钟数据
displaySMG(ds1302_processTimeData());//处理数据并送数码管显示
#ifndef _DS1302_H
#define _DS1302_H
#include &my51.h&
sbit rst=P3^4; //片选总线
sbit sda=P3^5; //数据总线
sbit scl=P3^6; //时钟线
extern u8 data smgWela[7]; //数码管显示参数
extern u8 data timeData[7]; //年,周,月,日,时,分,秒的初值
//void ds1302_setUnCharger() //充电控制,禁止充电
//void ds1302_stop() ; //暂停ds1302,进入超低功耗模式
u8* ds1302_processTimeData(); //处理时钟数据,送给数码管显示
void ds1302_readRTC(); //读取所有时钟数据的BCD码
void ds1302_initSet() ; //设置初始化数据
u8 ds1302_readData(u8 addr); //从ds1302读一个字节,读的时候会先写地址
void ds1302_writeByte(u8 dat); //写一个字节
void ds1302_writeData(u8 addr,u8 dat); //向指定地址寄存器写数据
#include &ds1302.h&
data u8 timeData[7]={10,6,4,17,11,20,55};
writeAddr[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//写年周月日时分秒寄存器地址指令
code u8 readAddr[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//读的指令地址
void ds1302_writeData(u8 addr,u8 dat) //向指定地址寄存器写数据
rst=0; _nop_();
scl=0; _nop_();
rst=1; _nop_();
ds1302_writeByte(addr); //先写入地址
ds1302_writeByte(dat);
rst=0;_nop_(); //关闭
sda=1; //释放
void ds1302_writeByte(u8 dat) //写一个字节
for(i=0;i&8;i++)
scl=0; //时钟线拉低
sda=dat&0x01; //数据从最低位开始赋值
scl=1;_nop_(); //上升沿写入一位
u8 ds1302_readData(u8 addr) //从ds1302读一个字节,读的时候会先写地址
u8 i,value=0;
rst=0;_nop_();
scl=0;_nop_();
sda=1;_nop_();
rst=1;_nop_();
ds1302_writeByte(addr); //先写入要读的地址
sda=1;_nop_();
for(i=0;i&8;i++)
value&&=1;
scl=0;_nop_(); //下降沿开始后提取有效数据
if(sda) //读数据
value|=0x80;//高电平手动置位保存数据,
} //低电平数据value最高位默认已经是0
scl=1; //为下一次读取数据做准备
void ds1302_initSet() //设置初始化数据
for(i=0;i&7;i++)//将初始化数据处理成BCD码
j = timeData[i] / 10;
timeData[i]=timeData[i]%10;
timeData[i]=timeData[i]+j*16;
ds1302_writeData(0x8e,0x00); //清除写保护
for(i=0;i&7;i++)
{ //将时钟日历数据经过转换后的BCD码写到7个时钟日历寄存器中
ds1302_writeData(writeAddr[i],timeData[i]);
ds1302_writeData(0x90,0x5c); //禁止充电,降低功耗,针对不可充电电池
//ds1302_writeData(0x90, 0xa6);//开启充电,用一个二极管,用4k电阻
ds1302_writeData(0x8e,0x80); //使能写保护
void ds1302_readRTC() //读取所有时钟数据的BCD码
for(i=0;i&7;i++)
{ //读取的时候会把时钟日历的7个寄存器中的数据全部读取,并保存到timeData[]
timeData[i]=ds1302_readData(readAddr[i]);
u8* ds1302_processTimeData() //显示时钟,暂时只显示时间
smgWela[5]
smgWela[5]=timeData[6] & 0x0f;//提取低4位
smgWela[4]=timeData[6] && 4;//提取高4位
smgWela[3]=timeData[5]& 0x0f;
smgWela[2]=timeData[5]&& 4;
smgWela[1]=timeData[4]& 0x0f;
smgWela[0]=timeData[4]&& 4;
smgWela[6]=0xf5; //0xf5是小数点的位置
return smgW
void ds1302_stop() //暂停ds1302
ds1302_writeData(0x8e,0x00); //清除写保护
ds1302_writeData(writeAddr[6],0x80); //暂停ds1302,进入超低功耗模式
ds1302_writeData(0x8e,0x80); //使能写保护
void ds1302_setUnCharger() //充电控制,禁止充电
ds1302_writeData(0x8e,0x00); //清除写保护
ds1302_writeData(0x90,0x5c); //禁止充电,降低功耗
ds1302_writeData(0x8e,0x80); //使能写保护
#ifndef _51SMG_H_
#define _51SMG_H_
#include &my51.h&
sbit dula =P2^6; //段选锁存器控制 控制笔段
sbit wela =P2^7; //位选锁存器控制 控制位置
extern u8 data smgWela[7]; //第一位到第六位,最后一个是小数点位置控制
#define dark 0x11//在段中,0x11是第17号元素,0x00是低电平,数码管不亮,即table[17]
#define dotDark 0xff//小数点全暗
void displaySMG(u8* pWela); //数码管显示函数,参数是数组指针
#include &smg.h&
#include &my51.h&
static u8 code table[]= { //0~F外加小数点和空输出的数码管编码
0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3
0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7
0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B
0x39 , 0x5e , 0x79 , 0x71 , // C D E F
0x80 , 0x00 ,0x40 // . 空 负号 空为第17号元素
/* 由于此表只能一次显示一个小数点,故已注释掉,仅供查询
例如想要第一个和第六个数码管小数点同时点亮,
则执行 pWela-&dot = 0xfe & 0xdf 即可
u8 code dotTable[]={ //小数点位置,某一位置0时,小数点亮
0xff , //全暗
0xfe , 0xfd , 0xfb , //1 2 3
0xf7 , 0xef , 0xdf //4 5 6
u8 data smgWela[7]={0,0,0,0,0,0,0}; //第一位到第六位,最后一个是小数点位置控制
//P0口的数码管位选控制锁存器只用了低6位,我们保留高2位的数据,留作它用
void displaySMG(u8* pWela)
//控制6位数码管显示函数,不显示的位用参数dark
u8 preState=P0|0x3f; //保存高2位状态,其中最高位是ADC0804的片选信号
wela=0;dula=0;_nop_();//先锁定数据,防止吴亮及位选锁存器高2位数据被改变
P0=0; //由于数码管是共阴极的,阳极送低电平,灯不亮
dula=1;_nop_();
dula=0; //段选数据清空并锁定
P0=preS //共阴极数码管是阴极置高不亮,低6位置1,高2位保留
wela=1;_nop_(); //注:wela和dula上电默认为1
wela=0; //位选锁定,初始保留高2位的数据,低6位置高不亮
for(i=0;i&6;i++) //显示6位数码管
P0=table[pWela[i]]|(((1&
dula=1;_nop_(); //送段数据,叠加小数点的显示,0x00点亮小数点
P0=preState&~(1&
wela=1; _nop_(); //送位选号
delayms(1); //稍作延时,让灯管亮起来
{ //消除叠影及误亮,阴极置1不亮,低6位置1,高2位保留并锁定
wela=1; _nop_();
FZ-MCU51单片机开发板集实验开发、编程、仿真和下载于一体,支持AT89S51、AT89S52、AT89S53的和STC系列单片机如STC89C53RC等全系列单片机的编程和实验,使用配套的仿真模......关键字:
NASA阿姆斯特朗飞行研究中心进行的LEAPTech项目实验演示,向我们预示了未来飞行器可能都将由电动机驱动。LEAPTech是“异步推进技术”的英文缩写,这一项目将测试“促进推进器和机身一体化使电力驱动派上用场将提高效率及性同时也有益于经......关键字:
伟哥这种“蓝色小药丸”有一个惊人的用途:作为一种抗癌药物。早期对老鼠的研究表明,小剂量的西地那非(伟哥中的成分)可以预防结直肠癌。......关键字:
我 要 评 论
热门关键词
深圳市中悦科技有限公司25K-35K | 广东省 深圳市
深圳市中悦科技有限公司10K-15K | 广东省 深圳市
深圳安科高技术股份有限公司南京分公司面议 | 江苏省 南京市
北京建工京精大房工程建设监理公司深圳市分公司6K-8K | 广东省 深圳市
深圳金鑫世纪实业有限公司8K-10K | 广东省 深圳市查看: 6238|回复: 1
驱动DS1302时钟芯片通过数码管显示时间,时间可调
/****************************************************************/
/******名字:DS1302**********************************************/
/******功能:驱动DS1302时钟芯片通过数码管显示时间,时间可调******/
/******作者:WPM*************************************************/
/******修改日期:日***********************************/
/****************************************************************/
/*这是本人在外编写的第一个程序,目的只有一个,就是方便以后直接调用,
我要彻底改变我以往编写程序的风格,为自己这份新工作做准备*/
#include &reg52.h&//头文件
#include &intrins.h&
#define uchar unsigned char//宏定义
#define uint&&unsigned int
sbit DS1302_SCL2=P1^3;&&//DS1302_SCL2定义为P1口的第3位脚,连接DS1302SCL和ADC0831SCL脚
sbit DS1302_SDA2=P1^4;&&//DS1302_SDA2定义为P1口的第4位脚,连接DS1302SCL和ADC0831SDA脚
sbit DS1302_RST = P1^5;& &// DS1302片选脚
sbit DS1302_SPK=P3^4; //定义蜂鸣器的引脚
uchar DS1302_tmpdate[8]={0x00,0x06,0x03,0x18,0x0c,0x07,0x06,0};//秒分时日月星期年
uchar DS1302_tmpdisplay[8]={0x40,0x40,0x40,0x40,0x40,0x40,0x40,0};&&//显示“-”
code uchar write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写秒分时日月星期年的地址
code uchar DS1302_Read_RTC_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //读取秒分时日月星期年的地址
code uchar DS1302_table[]=& & //共阴数码管 0-9&&'-' '熄灭‘表
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x40,0x00};
uchar code DS1302_key_tab[]=
{0xed,0x7e,0x7d,0x7b,
0xbe,0xbd,0xbb,0xde,
0xdd,0xdb,0x77,0xb7,
0xee,0xd7,0xeb,0xe7};
//========================此数组为键盘编码,
//本人采用类式类似电话按键的编码方式,方便以后设计
// 1 2 3 a& &0x01 0x02 0x03 0x0a
// 4 5 6 b 对应16进制码: 0x04 0x05 0x06 0x0b
// 7 8 9 e& &0x07 0x08 0x09 0x0e
// * 0 # f& &0x0c 0x00 0x0e 0x0f
//打个比方,如果你按下0键,P0口读到数据为0xed
//如果你按下2键,P0口读到数据为0x7d,按下9键为0xdb,
//我们将读到的P0口数据经过查表法就能得到相应的16进制码
//键盘的读取,我们采用分时扫描
void DS1302_delay();//延时子函数,5个空指令
void DS1302_display(uchar *lp,uchar lc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数
void Write_Ds1302_byte(uchar temp);
void Write_Ds1302( uchar address,uchar dat );
uchar Read_Ds1302 ( uchar address );
void DS1302_Read_RTC();//read RTC
void DS1302_Set_RTC();//set RTC
void Ds1302Play(uchar tmp);
void Ds1302Menu();
uchar DS1302_keyold,DS1302_key=0xff,DS1302_keytmp=0;
/***************************************************/
/******名字:main***********************************/
/******功能:通过调用其它子函数,达到对应的功能*****/
/******作者:WPM************************************/
/******修改日期:日**********************/
/***************************************************/
void main()& &&&//入口函数
{
    DS1302_RST=0;
    DS1302_Set_RTC();
    EA=1;& &//开启总中断
&&    EX0=1;& & //开启外部中断 0
&&    IT0=1;& && &&&// 设置成 下降沿触发方式
    while(1)
     {
         Ds1302Menu();
    }
}
/*************************************************/
/******名字:DS1302_display***********************/
/******功能:八个数码管显示的数值*****************/
/******作者:WPM**********************************/
/******修改日期:日********************/
/*************************************************/
void DS1302_display(uchar *lp,uchar lc)//显示
{
    &&//定义变量
    P2=0;& &//端口2为输出
    P1=P1&0xF8; //将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管
    for(i=0;i&i++) //循环显示
&&        P2=DS1302_table[lp[i]]; //查表法得到要显示数字的数码段
&&        DS1302_delay();&&//延时
&&        P2=0;& &//清0端口,准备显示下位
&&        if(i==7)& & //检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据
& &            
&&        P1++;&&//下一位数码管
    }
}
/*************************************************/
/******名字:DS1302_delay*************************/
/******功能:起到一个延时的作用,用于扫描数码管***/
/******作者:WPM**********************************/
/******修改日期:日********************/
/*************************************************/
void DS1302_delay()
{
    uchar i=10;
    while(i)
    & && && &&&i--;
}
/*************************************************/
/******名字:Write_DS1302_Byte********************/
/******功能:向DS1302芯片写入一个字节的数据********/
/******作者:WPM**********************************/
/******修改日期:日********************/
/************************************************/
void Write_Ds1302_Byte(uchar temp)
{
&&    
&&    for (i=0;i&8;i++)& && &//循环8次 写入数据
& &    {
        DS1302_SCL2=0;& && &//给一个上升沿脉冲,即可写入一个位
& && &      DS1302_SDA2=temp&0x01;& && &//每次传输低字节
& &&&       temp&&=1;& & //右移一位
& && &      DS1302_SCL2=1;
& &     }
}&&
/*********************************************/
/*********************************************/
/******名字:Write_DS1302*********************/
/******功能:向DS1302芯片写入数据**************/
/******作者:WPM******************************/
/******修改日期:日****************/
/*********************************************/
void Write_Ds1302( uchar address,uchar dat )& &
{
&&    DS1302_RST=0;
     _nop_();
&&    DS1302_SCL2=0;
     _nop_();
&&    DS1302_RST=1;
& &   & &_nop_();& &//启动
&&    Write_Ds1302_Byte(address); //发送地址
&&    Write_Ds1302_Byte(dat);&&//发送数据
&&    DS1302_RST=0;& & //恢复
}
/***********************************************/
/***********************************************/
/******名字:Read_DS1302************************/
/******功能:读取DS1302一个字节的数据************/
/******作者:WPM********************************/
/******修改日期:日******************/
/***********************************************/
uchar Read_Ds1302 ( uchar address )
{
&&    uchar i,temp=0x00;
&&    DS1302_RST=0;
    &&_nop_();
& &     DS1302_SCL2=0;
& && && && && &&&_nop_();
&&    DS1302_RST=1;
     _nop_();
&&   & & Write_Ds1302_Byte(address);
&&   & & for (i=0;i&8;i++)& &//循环8次 读取数据
&&   & &{
&&      &&DS1302_SCL2=1;
& && && && && && && && &&&_nop_();
& && && && && && && && &&&if(DS1302_SDA2)
& && && && && && && && && && && & temp|=0x80;& &//每次传输低字节
& && && && && && && && &&&DS1302_SCL2=0;
& && && && && && && && &&&temp&&=1;& &//右移一位
& && && && && & }
& && && && && & DS1302_RST=0;
& && && && && & _nop_();&&
& && && && && & DS1302_SCL2=1;
& && && && && & DS1302_SDA2=0;
& && && && && & return (temp);& &//返回
}
/*********************************************/
/*********************************************/
/******名字:Write_DS1302*********************/
/******功能:向DS1302芯片读取日历**************/
/******作者:WPM******************************/
/******修改日期:日****************/
/*********************************************/
void DS1302_Read_RTC()&&//读取 日历
{
&&   uchar i,*p;
& && && && & p=DS1302_Read_RTC_&&//地址传递
& && && && & for(i=0;i&7;i++)&&//分7次读取 年月日时分秒星期
& && && && & {
& && && && && && && && &DS1302_tmpdate[i]=Read_Ds1302(*p);
& && && && && && && && &p++;
& && && && & }
}
/**********************************************/
/**********************************************/
/******名字:Write_DS1302**********************/
/******功能: 设置DS1302芯片的日历值************/
/******作者:WPM*******************************/
/******修改日期:日*****************/
/**********************************************/
void DS1302_Set_RTC()&&//设定 日历
{
& && && && &uchar i,*p, //DS1302的数据是以十进制存储的,要转化为十六进制显示
& && && && &for(i=0;i&7;i++)
& && && && &{
& && && && && && &&&tmp=DS1302_tmpdate[i]/10;
& && && && && && &&&DS1302_tmpdate[i]=DS1302_tmpdate[i]%10;
& && && && && && &&&DS1302_tmpdate[i]=DS1302_tmpdate[i]+tmp*16;
& && && && &}
& && && &&&Write_DsE,0X00);//允许写入数据
& && && &&&p=write_rtc_ //传地址
& && && &&&for(i=0;i&7;i++)&&//7次写入 年月日时分秒星期
& && && &&&{
& && && && && && & Write_Ds1302(*p,DS1302_tmpdate[i]);
& && && && && && & p++;
& && && &&&}
& && && &&&Write_DsE,0x80);//禁止写入数据
}
/**********************************************/
/**********************************************/
/******名字:ReadKey***************************/
/******功能:键盘扫描子函数,读取按下的按键值***/
/******作者:WPM*******************************/
/******修改日期:日*****************/&&
/**********************************************/
void ReadKey() //键盘扫描函数,读取键盘值
{
    uchar i,j,
     j=0//赋初值
    key=0//判断按键是否按下的标志
    for (i=0;i&4;i++) //扫描键盘,判断是否有按键按下
    {
&&        P0=j; //把J的值赋给P0口,用于下面判断是否有按键按下
&&        if ((P0&0xf0)!=0xf0) //判断是否有按键按下
         {
& &            key=P0;&&//有按键按下,读取P0口的值,赋给KRY,保存该值
& &             //跳出,结束
         }
         j=_crol_(j,1); //左循环
& && && && && & }
     if (key==0xff) //没有按键,有抖动等
    {
&&        DS1302_keytmp=0
&&        P0=0xf0;
&&        EX0=1; //打开外部中断
&&        DS1302_SPK=1; //关闭蜂鸣器
&&         //返回
    DS1302_SPK=0; //驱动蜂鸣器
    if(DS1302_keytmp==key) //按键按下了,但没有松手
    {
&&        TH0=0X2E;//给定时器赋初值& &
&&        TL0=0;
&&        TR0=1;//启动定时器&&
& &&&       &&//返回
    TH0=0X2E;//给定时器赋初值& &
    TL0=0;
    TR0=1;//启动定时器& &&&
    DS1302_keytmp=//把读取的值赋给l-keytmp
    for(i=0;i&17;i++)
    {
&&        if (key==DS1302_key_tab[i]) //通过对比代码,判断是那个按键按下
&&        {
& &            DS1302_key=i;//保存对比好的值,用于显示??
& &             //跳出,结束
         }
     }& &
}
/*****************************************************************/
/***************************************************** ***********/
/******名字:Key_Scan*********************************************/
/******功能:外部中断0,用于有按键按下时,扫描键盘,读取键盘值*****/
/******作者:WPM**************************************************/
/******修改日期:日************************************/
/*****************************************************************/
void Key_Scan()& &interrupt 0& & //外部中断 0&&的优先级最高& && &&&
{
    TMOD&=0XF1;//定时器工作在方式1,既TMOD=0x01
    TH0=0X00;//定时时间为:()/晶振频率/12
    TL0=0X00;
    ET0=1;&&//开分控
    TR0=1; //启动定时器
}
/*****************************************************************/
/***************************************************** ***********/
/******名字:Timer0_isr*******************************************/
/******功能:定时器0,用于每隔一段时间扫描键盘*********************/
/******作者:WPM**************************************************/
/******修改日期:日************************************/
/*****************************************************************/
void Timer0_isr() interrupt 1&&//定时器0中断
{
    TR0=0;& & //关闭定时器
    ReadKey();&&//读取键盘扫描值
/**************************************************/
/**************************************************/
/******名字:DS1302Menu****************************/
/******功能:修改时钟的时间*************************/
/******作者:WPM***********************************/
/******修改日期:日*********************/
/**************************************************/
void Ds1302Menu()//时钟读取,可修改,按A、B键更改显示时间还是日
& && &//期,再按#键可对其做修改
{
  uchar i,tmp,temp,oldtimer=0;
  tmp=0;
 & &while (1)
  {
&&   DS1302_Read_RTC();
    if(tmp==0) //用于区别是否按下了B键
&&   {
& &    DS1302_tmpdisplay[0]=DS1302_tmpdate[2]/16; //十六进制转化为十进制显示,显示时
& &    DS1302_tmpdisplay[1]=DS1302_tmpdate[2]&0x0f; //显示个位
& &    DS1302_tmpdisplay[2]=10; //显示‘-’
& &    DS1302_tmpdisplay[3]=DS1302_tmpdate[1]/16; //显示分的十位
& &    DS1302_tmpdisplay[4]=DS1302_tmpdate[1]&0x0f;//显示分的个位
& &    DS1302_tmpdisplay[5]=10;&&//显示‘-’
& &    DS1302_tmpdisplay[6]=DS1302_tmpdate[0]/16; //显示秒的十位
& &    DS1302_tmpdisplay[7]=DS1302_tmpdate[0]&0x0f;//显示秒的个位
& && && && & }
&&   if((tmp==0)&&(oldtimer!=DS1302_tmpdate[0])) //tmp作为标志位,与秒作比较,
& && && &&&//判断数据是否修改,修改时分秒
&&   {
& &     oldtimer=DS1302_tmpdate[0]; //暂存该值,用于比较
& &     DS1302_tmpdisplay[0]=DS1302_tmpdate[2]/16; //十六进制转化为十进制显示,显示时
& &     DS1302_tmpdisplay[1]=DS1302_tmpdate[2]&0x0f; //显示个位
& &     DS1302_tmpdisplay[2]=10; //显示‘-’
& &     DS1302_tmpdisplay[3]=DS1302_tmpdate[1]/16; //显示分的十位
& &     DS1302_tmpdisplay[4]=DS1302_tmpdate[1]&0x0f;//显示分的个位
& &     DS1302_tmpdisplay[5]=10;&&//显示‘-’
& &     DS1302_tmpdisplay[6]=DS1302_tmpdate[0]/16; //显示秒的十位
& &     DS1302_tmpdisplay[7]=DS1302_tmpdate[0]&0x0f;//显示秒的个位
&&   }& && && && &
    if((tmp==1)&&(oldtimer!=DS1302_tmpdate[3]))//tmp作为标志位,与日作比较
& && && &&&//判断数据是否修改,修改年月日
&&   {
& &    oldtimer=DS1302_tmpdate[3];//暂存该值,用于比较
& &    DS1302_tmpdisplay[0]=DS1302_tmpdate[6]/16; //改为十进制显示,显示年的十位
& &    DS1302_tmpdisplay[1]=DS1302_tmpdate[6]&0x0f;//显示年的个位,
& &    DS1302_tmpdisplay[2]=10; //显示‘-’
& &    DS1302_tmpdisplay[3]=DS1302_tmpdate[4]/16;//显示月的十位
& &   & & DS1302_tmpdisplay[4]=DS1302_tmpdate[4]&0x0f;//显示月的个位
& &    DS1302_tmpdisplay[5]=10; //显示‘-’
& &    DS1302_tmpdisplay[6]=DS1302_tmpdate[3]/16;&&//显示日的十位
& &    DS1302_tmpdisplay[7]=DS1302_tmpdate[3]&0x0f; //显示日的个位
    }
&&   DS1302_display(DS1302_tmpdisplay,8);//显示时分秒,年月日
&&   DS1302_display(DS1302_tmpdisplay,8); //增加亮度
&&   DS1302_display(DS1302_tmpdisplay,8);
&&   DS1302_display(DS1302_tmpdisplay,8);
&&  &&ReadKey(); //读取按下的按键值
&&   if(DS1302_key==0x0c)
&&   {
& &   & && &DS1302_key=0//退出键按下了,结果退出
& &   & && &
&&  &&}
  & &if(DS1302_key==0x0e)&&//确定键按下了
 & && & {
&&   & & DS1302_key=0& &
& &  & && & for(i=0;i&7;i++) //保存当前的时间,用于作比较,判断是否修改了时间
& &  & && & {
& &     & && &temp=DS1302_tmpdate[i]/16;&&//数据处理,在前程序讲过,时钟I
& && & //C它是以十进制对数据存储,所以要将它转为十进制
& &     & &&&DS1302_tmpdate[i]=DS1302_tmpdate[i]%16;
& &    & && &DS1302_tmpdate[i]=temp*10+DS1302_tmpdate[i];
&&  & && &}
& &  & && &while(1)
& &  & && &{&&
& &    & && &if(DS1302_key==0x0c)
& &    & && &&&{
& &&&     & && && &&&DS1302_key=0
& &&&        
& &    & &&&}
& &     & &if(DS1302_key==0x0e)
& &    & & {& &//按#键对修改的数据进行写入时钟IC1302
& &&&     & && && &DS1302_key=0
& &&&     & && && &DS1302_Set_RTC();
& &&&     & && && &
& &    & &&&}
& &     & & switch(DS1302_key)
& &     & & {
& &&&     & && & case 0x01:& & //按1键对小时,或年的加1
& && &    & && && && && && && && &DS1302_key=0
& &&&     & && && && && && && &if(tmp==0)
& &&&     & && && && && && && &{
& && &       & && && && && && && && &if(DS1302_tmpdate[2]&23)
& && && && && && && && && && && && && && && && && && && && && && &DS1302_tmpdate[2]++;
& && && && && && && && && && && && && && && &}
& && && && && && && && && && && && && && && &else
& && && && && && && && && && && && && && && &{
& && && && && && && && && && && && && && && && && &&&if(DS1302_tmpdate[6]&99)
& && && && && && && && && && && && && && && && && && && && && &&&DS1302_tmpdate[6]++;
& && && && && && && && && && && && && && && &}
& && && && && && && && && && && && && && && &
& && && && && && && && && && & case 0x02:& &&&//按2键对分钟,或月的加1
& && && && && && && && && && && && && && &&&DS1302_key=0
& && && && && && && && && && && && && && &&&if(tmp==0)
& && && && && && && && && && && && && && &&&{
& && && && && && && && && && && && && && && && && & if(DS1302_tmpdate[1]&59) //对分进行修改,判断分是否小于59
& && && && && && && && && && && && && && && && && && && && &DS1302_tmpdate[1]++; //是,则加1
& && && && && && && && && && && && && && &&&}
& && && && && && && && && && && && && && &&&else& & //其他情况对月进行修改
& && && && && && && && && && && && && && &&&{
& && && && && && && && && && && && && && && && & if(DS1302_tmpdate[4]&12)
& && && && && && && && && && && && && && && && && && && & DS1302_tmpdate[4]++;
& && && && && && && && && && && && && && &&&}
& && && && && && && && && && && && && && &&&
& && && && && && && && && && & case 0x03:& &&&//按3键对秒,或日的加1
& && && && && && && && && && && && && && &&&DS1302_key=0
& && && && && && && && && && && && && && &&&if(tmp==0)
& && && && && && && && && && && && && && &&&{
& && && && && && && && && && && && && && && && && && &if(DS1302_tmpdate[0]&59)
& && && && && && && && && && && && && && && && && && && && && & DS1302_tmpdate[0]++;
& && && && && && && && && && && && && && &&&}
& && && && && && && && && && && && && && & else
& && && && && && && && && && && && && && & {
& && && && && && && && && && && && && && && && && &&&if(DS1302_tmpdate[3]&31)
& && && && && && && && && && && && && && && && && && && && &&&DS1302_tmpdate[3]++;
& && && && && && && && && && && && && && &&&}
& && && && && && && && && && && && && && &&&
& && && && && && && && && && &&&case 0x04:& &&&//按4键对小时,或年的减1
& && && && && && && && && && && && && && &&&DS1302_key=0
& && && && && && && && && && && && && && &&&if(tmp==0)
& && && && && && && && && && && && && && &&&{
& && && && && && && && && && && && && && && && && &if(DS1302_tmpdate[2]&0)
& && && && && && && && && && && && && && && && && && && && && &DS1302_tmpdate[2]--;
& && && && && && && && && && && && && && &&&}
& && && && && && && && && && && && && && &&&else
& && && && && && && && && && && && && && &&&{
& && && && && && && && && && && && && && && && && &if(DS1302_tmpdate[6]&0)
& && && && && && && && && && && && && && && && && && && && && & DS1302_tmpdate[6]--;
& && && && && && && && && && && && && && &&&}
& && && && && && && && && && && && && && &&&
& && && && && && && && && && &&&case 0x05:& & //按5键对分钟,或月的减1
& && && && && && && && && && && && && && &&&DS1302_key=0
& && && && && && && && && && && && && && &&&if(tmp==0)
& && && && && && && && && && && && && && &&&{
& && && && && && && && && && && && && && && && && &if(DS1302_tmpdate[1]&0)
& && && && && && && && && && && && && && && && && && && & DS1302_tmpdate[1]--;
& && && && && && && && && && && && && && &&&}
& && && && && && && && && && && && && && &&&else
& && && && && && && && && && && && && && &&&{
& && && && && && && && && && && && && && && && && &if(DS1302_tmpdate[4]&0)
& && && && && && && && && && && && && && && && && && && && &DS1302_tmpdate[4]--;
& && && && && && && && && && && && && && &&&}
& && && && && && && && && && && && && && &&&
& && && && && && && && && && &&&case 0x06:& &&&//按6键对秒,或日的减1
& && && && && && && && && && && && && && && &DS1302_key=0
& && && && && && && && && && && && && && && &if(tmp==0)
& && && && && && && && && && && && && && &&&{
& && && && && && && && && && && && && && && && && & if(DS1302_tmpdate[0]&0)
& && && && && && && && && && && && && && && && && && && && && &DS1302_tmpdate[0]--;
& && && && && && && && && && && && && && &&&}
& && && && && && && && && && && && && && &&&else
& && && && && && && && && && && && && && &&&{
& && && && && && && && && && && && && && && && && &if(DS1302_tmpdate[3]&0)
& && && && && && && && && && && && && && && && && && && &&&DS1302_tmpdate[3]--;
& && && && && && && && && && && && && && & }
& && && && && && && && && && && && && && &
& && && && && && && && && && &&&}
& && && && && && && && && && &Ds1302Play(tmp);
& && && && && && && &}
& && && &&&}
& && && & if(DS1302_key==0x0a)&&//判断是否按键A按下
& && && & {
& && && && && && &DS1302_key=0
& && && && && && &tmp=0; //置标志位
& && && & }
& && && & if(DS1302_key==0x0b)
& && && & {
& && && && && &&&DS1302_key=0
& && && && && &&&tmp=1;
& && && & }
& & }
}
/**************************************************/
/**************************************************/
/******名字:DS1302Play****************************/
/******功能:用于判断显示时分秒还是年月日***********/
/******作者:WPM***********************************/
/******修改日期:日*********************/
/**************************************************/
void Ds1302Play(uchar tmp)
{
     if(tmp==0) //用于显示时分秒
     {
&&         DS1302_tmpdisplay[0]=DS1302_tmpdate[2]/10;
& &        DS1302_tmpdisplay[1]=DS1302_tmpdate[2]%10;
& &        DS1302_tmpdisplay[2]=10;
& &        DS1302_tmpdisplay[3]=DS1302_tmpdate[1]/10;
& &        DS1302_tmpdisplay[4]=DS1302_tmpdate[1]%10;
& &        DS1302_tmpdisplay[5]=10;
& &        DS1302_tmpdisplay[6]=DS1302_tmpdate[0]/10;
& &        DS1302_tmpdisplay[7]=DS1302_tmpdate[0]%10;
    else&&//其他情况显示日月年
    {
&&        DS1302_tmpdisplay[0]=DS1302_tmpdate[6]/10;
&&        DS1302_tmpdisplay[1]=DS1302_tmpdate[6]%10;
         DS1302_tmpdisplay[2]=10;
&&        DS1302_tmpdisplay[3]=DS1302_tmpdate[4]/10;
&&        DS1302_tmpdisplay[4]=DS1302_tmpdate[4]%10;
&&        DS1302_tmpdisplay[5]=10;
&&        DS1302_tmpdisplay[6]=DS1302_tmpdate[3]/10;
&&        DS1302_tmpdisplay[7]=DS1302_tmpdate[3]%10;
    DS1302_display(DS1302_tmpdisplay,8);
}复制代码
楼主有电路图提供?
Powered by}

我要回帖

更多关于 时钟芯片的作用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信