一.描述
DS1302时钟芯片是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。DS1302芯片包含一个用于存储实时时钟/日历的 31 字节的静态 RAM,可通过简单的串行接口与微处理器通讯,将当前的是时钟存于RAM。DS1302芯片对于少于 31 天的月份月末会自动调整,并会自动对闰年进行校正。由于有一个 AM/PM 指示器,时钟可以工作在 12 小时制或者 24小时制。

二.芯片参数
1.芯片特点
实时时钟计算年、月、日、时、分、秒、星 期,直到 2100 年,并有闰年调节功能
31 x 8 位 通用暂存 RAM
串行输入输出,使管脚数最少
2.0V 至 5.5V 宽电压范围操作
在 2.0V 时工作电流小于 300nA
读写时钟或 RAM 数据时有单字节或多字节(脉冲串模式)数据传送方式
8 管脚 DIP 封装或可选的 8 管脚表面安装 SO 封装
简单的 3 线接口
与 TTL 兼容 (VCC = 5V)
可选的工业温度范围:-40°C to +85°C



写保护
控制寄存器的第7位是写保护位。前7位(从0到6位)被迫为0,在读时总是读0。
在对时钟或RAM进行任何写操作之前,第7位必须是0。当值高时,写保护位阻止对任何其他寄存器的写操作也即初始上电状态。因此,WP位应该在试图写入设备之前被清除。
电路上电的初始态WP是1,这时是不能改写上面任何一个时间寄存器的,只有首先将WP改写为0,才能进行其它寄存器的写操作。


比赛提供的底层驱动函数文件里面的对应函数有:

#ifndef __DS1302_H
#define __DS1302_Hvoid Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
#endif

只有基础的代码,没有对应读写寄存器的东西,说明要考的是学生能够查阅芯片手册的能力,如果不能读懂,那么就要背诵下了。

目的;
开机上电,设置DS1302的初始化时间是2023年2月22日8时10分25秒;
显示在屏幕上;

按键S7,按下,设置小时=12时,
按键S6,按下,设置分=25分;
按键S5,按下,设置秒=36秒;
按键S4,按下,时间重新是开机的时间;

基础理论:
认识BCD码,以及BCD码和十进制的相互转化;

认识DS1302的寄存器配置,以及读写的步骤。
关闭写保护,可以写数据;

步骤:
1、建立框架;包括LED,蜂鸣器,数码管,继电器,以及数码管显示部分;
这些是固定的框架,需要背下来,大概花时间15分钟手打;借助stcISP软件;

2、添加读写DS1302的代码。
参考STC——ISP的分离BCD的方法。范例代码里面有。
三个函数;
第一个是初始化时间;
第二个是写入时间;主要是写入时分秒。
第三个是读出时间,主要是读出时分秒;

按键S7,按一下,选择时,再按一下,选择分,再按一下,选择秒;
按键S6,根据选择的参数,进行加法
按键S5,根据选择的参数,进行减法;
按键S4,确定写入;

第一个是初始化时间;函数如下2022年,2月22日,8时,10分,25秒。
unsigned char timebuf[3]={0x02,0x05,0x15};//时分秒
unsigned char shi,fen,miao;//注意在ds1302.c中定义,在ds1302.h中,用extern修饰一下
void ds1302init(void)
{
Write_Ds1302_Byte(0x8E,0x00);//关闭写保护
Write_Ds1302_Byte(0x8C,0x23);//年,23代表是20xx的2023年;
Write_Ds1302_Byte(0x8A,0x5);//星期几,这个没看日历,不管了。随便写一个;
Write_Ds1302_Byte(0x88,0x02);//月份
Write_Ds1302_Byte(0x86,0x22);//日,0x22代表是22号;
Write_Ds1302_Byte(0x84,0x08);//时
Write_Ds1302_Byte(0x82,0x10);//分
Write_Ds1302_Byte(0x80,0x25);//秒
Write_Ds1302_Byte(0x8E,0x80);//打开写保护
}

主函数

#include <stc15.h>
#include <intrins.h>
#include <ds1302.h>//接口
sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;
//宏定义
#define     LED       4   //定义主时钟
#define     ULN       5   //定义主时钟
#define     COM       6   //定义主时钟
#define     ABC       7   //定义主时钟
typedef     unsigned char   u8;
typedef     unsigned int    u16;
typedef     unsigned long   u32;
//-----------------------------------------------#define FOSC 11059200L#define T1MS (65536-FOSC/1000)      //1T模式
//#define T1MS (65536-FOSC/12/1000) //12T模式//全局变量
u8 LEDbuf=0xFF;
u8 ULNbuf=0x00;
u8 SMGbuf[20];
u8 SMGdat[8];//8个数码管,所以8个元素u32 tim1ms=0;//u32类型,几十天才溢出
/*************  本地常量声明   ,这是共阴的 **************/
u8 code table[]={                       //标准字库
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};      //位码
//函数声明
void delayms(u16 tms);
void Delay1ms();        //@11.0592MHz
void sel(u8 x); //选择四个分支哪一个?
void sysinit();//系统初始化,关闭所有的外部设备
void disp();
//主函数
void main()
{//main局部变量//外设初始化sysinit();//系统定时器初始化AUXR |= 0x40;                   //定时器1为1T模式TMOD = 0x00;                    //设置定时器为模式0(16位自动重装载)TL1 = T1MS;                     //初始化计时值TH1 = T1MS >> 8;TR1 = 1;                        //定时器1开始计时ET1 = 1;                        //使能定时器0中断EA = 1;//大循环Init1302();//这里,可以加一点测试代码,测试是不是每个外设都成功;while(1){if(S7==0){delayms(10);if(S7==0){Init1302(); //按下S7,初始化时间}while(S7==0);}else  if(S6==0){delayms(10);if(S6==0){shi=12;fen=20;miao=45;Write1302();  //刷新数据,写入到1302,设置时间}while(S6==0);}if(S5==0){delayms(10);if(S5==0){shi=1;fen=10;miao=20;Write1302(); //刷新数据,写入到1302,设置时间}while(S5==0);//松开按键}else    if(S4==0){delayms(10);if(S4==0){}while(S4==0);//松开按键} if(tim1ms%50==0)  //500ms读取一次数据,刷新数据{Read1302();SMGdat[0]= table[shi/10];SMGdat[1]= table[shi%10];SMGdat[2]=0x00;SMGdat[3]= table[fen/10];SMGdat[4]= table[fen%10];SMGdat[5]= 0x00;SMGdat[6]= table[miao/10];SMGdat[7]= table[miao%10];}}}//函数定义
//-----------------------------------------------/* Timer1 interrupt routine */
void tm1_isr() interrupt 3 using 1
{tim1ms++;disp();//1ms显示一次数码管
}
void Delay1ms()     //@11.0592MHz
{unsigned char i, j;_nop_();_nop_();_nop_();i = 11;j = 190;do{while (--j);} while (--i);
}void delayms(u16 tms)
{u16 i=0;for(i=0;i<tms;i++){Delay1ms();}
}void sel(u8 x)  //选择四个分支哪一个?
{//背下来了吗?switch(x){case 0:P2=P2&0x1F;break;case LED:P2=P2&0x1F|0x80;break;case ULN:P2=P2&0x1F|0xA0;break;case COM:P2=P2&0x1F|0xC0;break;case ABC:P2=P2&0x1F|0xE0;break;}
}
void sysinit()//系统初始化,关闭所有的外部设备
{sel(LED);LEDbuf=0xFF;P0=LEDbuf;sel(0);sel(ULN);ULNbuf=0x00;P0=ULNbuf;sel(0);sel(COM);P0=0x00;sel(0);sel(ABC);P0=0xFF;sel(0);
}void disp()
{//背下来static u8 i=0;//消隐sel(COM);P0=0x00;sel(0);sel(ABC);P0=0xFF;sel(0);
//显示sel(COM);P0=T_COM[i];sel(0);sel(ABC);P0=~SMGdat[i];sel(0);i++;if(i>=8)i=0;
}

DS1302.h

#ifndef __DS1302_H
#define __DS1302_Hvoid Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );//变量的extern声明,
extern unsigned char shi,fen,miao;//函数声明
//设置初始时间
void Init1302();
//写入时分秒
void Write1302();
//读出时分秒
void Read1302();
#endif

DS1302.c

/*程序说明: DS1302驱动程序软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台 8051,12MHz日    期: 2011-8-9
*/#include <stc15.h>
#include <intrins.h>
#include <ds1302.h>sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3;   // DS1302复位                                             //变量。时分秒
unsigned char shi,fen,miao;//设置初始时间
void Init1302()
{Write_Ds1302_Byte(0x8E,0x00);//关闭写保护Write_Ds1302_Byte(0x8C,0x23); //年Write_Ds1302_Byte(0x8A,0x05); //星期几Write_Ds1302_Byte(0x88,0x02); //月Write_Ds1302_Byte(0x86,0x22); //日Write_Ds1302_Byte(0x84,0x08); //时,Write_Ds1302_Byte(0x82,0x10); //分Write_Ds1302_Byte(0x80,0x25);//秒Write_Ds1302_Byte(0x8E,0x80);//打开写保护}
//写入时分秒
void Write1302()
{unsigned  char  tmp[3];tmp[0] = ((miao / 10) << 4) + (miao % 10);tmp[1] = ((fen / 10) << 4) + (fen % 10);tmp[2] = ((shi / 10) << 4) + (shi % 10);Write_Ds1302_Byte(0x8E,0x00);//关闭写保护Write_Ds1302_Byte(0x84,  tmp[2] ); //时,Write_Ds1302_Byte(0x82,  tmp[1] ); //分Write_Ds1302_Byte(0x80,  tmp[0] );//秒Write_Ds1302_Byte(0x8E,0x80);//打开写保护
}
//读出时分秒
void Read1302()
{unsigned  char  tmp[3];tmp[0]=Read_Ds1302_Byte(0x85);tmp[1]=Read_Ds1302_Byte(0x83);tmp[2]=Read_Ds1302_Byte(0x81);shi = ((tmp[0] >> 4) & 0x07) * 10 + (tmp[0] & 0x0f);fen = ((tmp[1] >> 4) & 0x07) * 10 + (tmp[1] & 0x0f);miao   = ((tmp[2] >> 4) & 0x03) * 10 + (tmp[2] & 0x0f);
}void Write_Ds1302(unsigned  char temp)
{unsigned char i;for (i=0;i<8;i++)        { SCK=0;SDA=temp&0x01;temp>>=1; SCK=1;}
}   void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{RST=0;    _nop_();SCK=0; _nop_();RST=1;     _nop_();  Write_Ds1302(address);    Write_Ds1302(dat);      RST=0;
}unsigned char Read_Ds1302_Byte ( unsigned char address )
{unsigned char i,temp=0x00;RST=0; _nop_();SCK=0; _nop_();RST=1; _nop_();Write_Ds1302(address);for (i=0;i<8;i++)   {       SCK=0;temp>>=1; if(SDA)temp|=0x80; SCK=1;} RST=0;    _nop_();SCK=0; _nop_();SCK=1; _nop_();SDA=0; _nop_();SDA=1; _nop_();return (temp);
}

LQB手打代码,DS1302基础代码01相关推荐

  1. python基础代码-python基础代码

    随机种子来自系统时钟,确切的说,是来自计算机主板上的定时.计数器在内存中的技术. 随机数是由随机种子根据一定的计算方法计算出来的数值,这样说计算机的随机数是伪随机. random.seed( 10 ) ...

  2. java金字塔数字代码_Java基础代码实例 :在控制台中输出金字塔,这个金字塔是由左右对称的数字组成的。 | 学步园...

    package test; public class testt { public static void main(String[] args) { int row1 = 13; // 声明行数 f ...

  3. openFOAM代码阅读——基础代码中的wchar

    路径src/OpenFOAM/primitives/chars中还有另外一个文件夹wchar,我们这里来看看这里面有什么. 头文件wchar.H的内容如下: #include <cwchar&g ...

  4. python代码_零基础小白必看篇:Python代码注释规范代码实例解析操作(收藏)

    本文内容主要介绍了Python代码注释规范代码实例解析,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下!!! 一.代码注释介绍 注释就是对代码的解释和说明 ...

  5. python必备基础代码-新手上路必学的Python函数基础知识,全在这里了(多段代码举例)...

    原标题:新手上路必学的Python函数基础知识,全在这里了(多段代码举例) 导读:函数是Python中最重要.最基础的代码组织和代码复用方式.根据经验,如果你需要多次重复相同或类似的代码,就非常值得写 ...

  6. python一般的基础代码-Python中的变量,一切代码的基础,你掌握了吗

    学习编程,首先要学习的,肯定就是变量了,因为变量是一切代码的基础,变量里面会介绍到python的很多知识点,都是python的基础知识,对于刚入门的同学非常重要. 一.什么是变量 变量存储在内存中的值 ...

  7. 机器学习算法 09-02 TensorFlow核心概念 TensorFlow基础代码、TensorFlow线性回归解析解和BGD求法

    目录 1 核心概念 2 代码流程 3 基础代码: 3.1 tf的版本 定义常量 理解tensor 了解session 3. 2   指定设备.  Variable 初始化 .  with块创建sess ...

  8. Matlab基础代码教程

    Matlab基础代码教程 第1部分:变量定义和基本运算: % 生成矩阵% 直接法a = [1,2,3;4,5,6;7,8,9];% 冒号一维矩阵 a = 开始:步长:结束,步长为1可省略b = 1:1 ...

  9. 浅谈代码规范基础调试几道面试题

    废话篇:本文由CSUST的FINAL实验室的LX创作,用途是给予CSUST的小鲜肉们一些关于C语言代码规范的一些基本知识,若本文有什么错误或是表述不清之处,欢迎留言讨论指正. 代码规范: 在讲代码规范 ...

最新文章

  1. 一切皆文件的编程思想
  2. python怎么读文件后删去空格以行为单位进行排序-文件操作
  3. 2k 幻14_ROG幻14肝游戏有何体验?携RTX系列献上终极光追画面福利
  4. linux动态链接库软件,Linux 动态链接库
  5. ERROR: Start Page at 'www/index.html' was not found
  6. Python面向对象的基本实现
  7. scala学习--难点
  8. 关于值传递和指针传递
  9. 南昌大学计算机网络通信用什么书,南昌大学_计算机网络教材.doc
  10. 山东省特种设备作业考试系统_2019防爆电气作业在线免费模拟考试系统及模拟题库5...
  11. Word制作学生点名册表格模板
  12. 数据分析-信用卡反欺诈模型
  13. MCS-51单片机的内部结构
  14. MATLAB解二元二次方程+画图 = 画隐式方程的图像
  15. C语言报错:「error」Id returned 1 exit status
  16. pancakeswap 开盘抢跑机器人 (附代码)
  17. Flash CS4网页中Flash背景透明
  18. 8.3 案例实现(加载数据库sakila中的数据至数据仓库sakila_dw)
  19. AutoJs学习-自动抢单学习
  20. 练习-Java输入输出之字节数据输入输出之综合练习

热门文章

  1. VIVO开发者平台上架APP
  2. C#在Win 7/8/10 OS下删除HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB子项
  3. kali安装所有工具
  4. [渝粤教育] 泉州师范学院 闽南与海丝文化 参考 资料
  5. Delphi/Lazarus/Pascal基于Castle Engine的IOS人体活动识别
  6. 类似“今天是2008年1月3日 农历丁亥年十一月廿五 星期四”日期的JS
  7. bing的简单英文字典工具
  8. PA0-PA开发环境配置
  9. 北京视觉ui设计培训内容介绍
  10. angularJS第三讲