DS1302时钟 秒表
DS1302时钟芯片功能简介(版权归DALLas公司)
1 DS1302 简介:DS1302是美国DALLAS 公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI 三线接口与CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM 数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。
DS1302的外部引脚分配如图1所示及内部结构如图2所示。
DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。
图1 DS1302的外部引脚分配图2 DS1302的内部结构各引脚的功能为:V cc1:主电源;Vcc2:备份电源。
当Vcc2>Vcc1+0.2V 时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。
SCLK:串行时钟,输入,控制数据的输入与输出;I/O:三线接口时的双向数据线;CE:输入信号,在读、写数据期间,必须为高。
该引脚有两个功能:第一,CE 开始控制字访问移位寄存器的控制逻辑;其次,CE 提供结束单字节或多字节数据传输的方法。
DS1302有下列几组寄存器:①DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h~8Dh,写时80h~8Ch),存放的数据格式为BCD 码形式,如图3所示。
图3DS1302有关日历、时间的寄存器小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。
当为高时,选择12小时模式。
在12小时模式时,位5是,当为1时,表示PM。
在24小时模式时,位5是第二个10小时位。
秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。
当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。
51单片机ds1302时钟
sbit runing1=runing^1;//菜单
sbit runing2=runing^2;
sbit runing3=runing^3;
sbit runing4=runing^4;
sbit runing5=runing^5;//help
sbit runing6=runing^6;//闹铃
18b20初始化
------------------------------------------------*/
bit Init_DS18B20(void)
{
bit dat=0;
DQ = 1; //DQ复位
DelayUs2x(5); //稍做延时
DQ = 0; //单片机将DQ拉低
DelayUs2x(200); //精确延时大于480us小于960us
b=ReadOneChar(); //高位
b<<=8;
t=a+b;
return(t);
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
void WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
DelayUs2x(25);
DQ = 1;
dat>>=1;
}
DelayUs2x(25);
ds1302时钟数码管显示时分秒
ds1302时钟数码管显示时分秒单片机原理课程设计课题名称:基于DS1302的数码管显示数字钟专业班级:电子信息工程学生学号:0414070126学生姓名:张向阳指导教师:张云马崇霄设计时间:2010年6月21日--2010年6月25日目录摘要 ...................................................................................1 设计任务和要求 ...........................................................2 方案论证 .......................................................................3 系统硬件设计 ...............................................................3.1................................................................. 系统总原理图3.2元器件清单...................................................................................... ................................................3.3 PCB板图...................................................................................... .................................................3.4................................................................ P roteus仿真图3.5.......................................................... 分电路图及原理说明3.5.1 主控部分(单片机MCS-51)..............................................................................3.5.2 计时部分(实时时钟芯片DS1302)..................................................................3.5.3 显示部分(共阳极数码管)................................................................................3.5.4 调时部分(按键)................................................................................................4系统软件设计 ...............................................................4.1................................................................... 程序流程图4.2........................................................... 程序源代码5心得体会 ....................................................................... 6参考文献 ....................................................................... 7结束语 ...........................................................................基于DS1302的数码管显示数字钟设计摘要本次课程设计的是使用专门的时钟芯片DS1302在数码管上显示的数字电子钟,并能通过按键对其进行调时和校准。
51单片机实战指南-使用DS1302设计数字时钟
YEAR
WP
0
0
0 0000
本章内容:
1
DS1302芯片介绍
22 封装的编程思想和结构体类型
3 2
DS1302读写操作的编程实现
4
DS1302读写实战
12.2.1 封装的编程思想
➢ 封装是面向对象编程三大特性(封装、继承、多态)之一 ➢ 核心思想就是尽可能地隐藏内部的细节,只保留一些对外接
口使之与外部发生联系 ➢ 就C语言而言,封装的体现就是函数的编写(小封装)和模
} DS1302_CE = 0;
//传送数据结束
return dat;
}
12.3.2 读写函数的封装-DS1302WriteByte
/* 发送一个字节到DS1302通信总线上 */
void DS1302WriteByte(unsigned char dat)
{
unsigned char i;
for (i=0; i<8; i++)
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
1
RAM/CK A4
A3
A2
A1
A0
R/W
寄存器名
秒寄存器 分钟寄存器 小时寄存器 日期寄存器 月份寄存器 星期寄存器 年份寄存器 控制寄存器
命令字
写操作 读操作
80H
81H
82H
83H
84H
85H
86H
87H
88H
89H
8AH 8BH
8CH 8DH
12.4 DS1302读写实战-ds1302.c
void mai时间后会刷新显示
DS1302时钟 秒表
;******************************************************************; 1 2 3 A ;修改时间时,A键为当前修改时间加一,B键为减一,C不保存退出,D保存并退出; 4 5 6 B INT0 ;INT0键,进入和退出秒表; 7 8 9 C INT1 ;显示时间时,INT1键,进入修改时间程序;秒表时,INT1键为计数清零; E 0 F D T0 ;显示时间时,T0键为切换日历和时钟,秒表时,T0为开始结束计时;*******************************************************************;修改时间时E键左移F键右移;******************************************************************* LED EQU P0 ;显示接口KEY EQU P1 ;键盘接口DUAN EQU P2 ;LED段控制ZCLK BIT P1.6 ;时钟线引脚ZIO BIT P3.5 ;数据线引脚ZRST BIT P1.7 ;复位线引脚ZINT0 BIT P3.2 ;外部中断0引脚ZINT1 BIT P3.3 ;外部中断1引脚ZT0 BIT P3.4 ;T0引脚ZT1 BIT P3.5 ;T1引脚XSW EQU 7FH ;显示首地址SECOND EQU 30H ;秒地址XGDDZ EQU 7EH ;修改段地址XGSJDZ EQU 7DH ;修改时间地址SMBZ EQU 70H ;键盘扫描标志位XGWBZ EQU 71H ;修改位标志MBBZ EQU 72H ;秒表标志SS EQU 70H ;闪烁缓存地址T0JC EQU 74H ;T0计数次数XSW1 EQU 75H ;显示辅助;********************************ORG 00H ;程序入口LJMP STARTORG 03H ;外部中断0程序入口LJMP AINT0ORG 0BH ;定时器T0程序入口LJMP AT0ORG 13H ;外部中断1程序入口LJMP AINT1ORG 1BH ;定时器T1程序入口LJMP AT1;********************************ORG 30HSTART:CLR SMBZ ;清扫描标志,为0表示当前不进行键盘扫描,为1表示扫描。
ds1302实时时钟程序说明
DS1302实时时钟在数码管上进行实时显示的程序
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit rst=P2^4;
sbit io=P2^0;
}
write_ds1302(0x8e,0x80); //进行写保护
}
void read_rtc()
{
uchar i;
for(i=0;i<7;i++)
{
time_data[i]=read_ds1302(read_add[i]);
}
}
void time_pros()
{
disp[0]=time_data[6]%16;//将BCD码(这里与十六进制没有区别)进行十位个位的分离
{
j=time_data[i]/10;//十位5
time_data[i]%=10;//各位8
time_data[i]=time_data[i]+j*16;
}
write_ds1302(0x8e,0x00);//去除写保护
for(i=0;i<7;i++)
{
write_ds1302(write_add[i],time_data[i]);
disp[1]=time_data[6]/16;
disp[2]=17;
disp[3]=time_data[5]%16;
disp[4]=time_data[5]/16;
disp[5]=17;
DS1302实时时钟---液晶显示
{
for(i = 0;i
//向DS1302写入一字节,根据时序图写函数
//上升沿锁存数据,先发送最低位
void Write_A_Byte_TO_DS1302(uchar x)
{
uchar i;
for(i = 0;i >= 1;
}
}
//从DS1302读取一字节,看时序图写函数
//下降沿锁存数据,先发送最低位
DelayMS(1);
Write_LCD_Command(0x06);
///DS1302中的数据是BCD码存放的,所以将寄存器中的数据转换成十六
进制返回
uchar Get_A_Byte_FROM_DS1302()
{
uchar i,b = 0x00;
for(i = 0;i
//从指定地址读取一个数据
uchar Read_Data(uchar addr)
{
uchar dat;
{
LCD_Busy_Wait();
RS = 0;RW = 0;EN = 0;datport = cmd;EN = 1;DelayMS(1);EN = 0;
}
//初始
Write_LCD_Command(0x38);
DelayMS(1);
Write_LCD_Command(0x01);
EN = 0;DelayMS(1);
return state; //返回状态值
}
*/
//LCD忙检测
void LCD_Busy_Wait()
{
// // while((Read_LCD_State()&0x80) == 0x80); //忙,则等待
基于单片机简易秒表(DS1302)课程设计报告
简易电子时钟的设计作者指导教师摘要: 随着科技的发展,单片机的应用正在不断深入,涉及到日常生活的方方面面。
本设计是基于单片机AT89S51为控制核心,以液晶为显示的数字时钟。
本数字时钟设计的原理相对简单,所以硬件电路也相对简单,难点和重点主要放在C语言的编程上,使用到定时器的子程序、延时程序、时分秒的控制程序、液晶模块和单片机模块的初始化程序、液晶显示的程序等,各个函数交叉调用,配合主程序的运行。
关键词: 单片机;C语言;电子时钟引言电子钟的设计方法有多种,例如,可用中小规模集成电路组成电子钟:也可以利用专用的电子钟芯片配以显示电路及其所需要的外围电路组成电子钟:还可以利用单片机来实现电子钟等等。
这些方法都各有特点,其中,利用单片机实现的电子钟具有编程灵活,便于电子钟功能的扩充,即可用该电子钟发出各种控制信号等特点。
本题目要求采用单片机设计一电子时钟。
1 系统方案1.1 功能要求1.1.1基本要求(1)制作完成简易的电子时钟,时间可调整。
(2)有闹钟功能。
(3)所用到的电路板必须有作者的名字和学号(制作PCB板时候放置,不能用笔写)。
(4)设计在2016年6月6日前完成,6月11日、12日验收。
1.1.2.扩展部分(选作)(1)显示年月日;(2)声音播报时间;(3)有温度显示;(4)其它。
1.2 方案论证DS1302具有自身计时的功能,但是自身却没法显示并且调整时间,这时就不可避免地要使用到单片机STC89C52,它可以作为一个桥梁,架接液晶显示器和DS1302,并且利用单片机的输入/输出端口可以实现调整时间的功能。
利用单片机STC89C52实现数据的显示和调整。
2 硬件设计2.1 单片机最小系统2.1.1单片机MCS-52单片机是标准的40引脚双列直插式集成电路芯片,其各引脚功能如下:VCC:+5V电源。
VSS:接地。
RST:复位信号。
当输入的复位信号延续两个机器周期以上的高电平时即为有效,用完成单片机的复位初始化操作。
利用单片机及DS1302制作电子时钟
单片机原理及应用——基于Proteus和Keil C实习报告课程名:利用单片机及DS1302制作电子时钟指导教师:专业:年级:组员:设计时间:XXX大学 XXX学院摘要为了进一步熟悉51单片机地编程以及学习电子时钟地相关设计方法,在老师地指导下我们进行了本次电子时钟地设计.我们在实习期间基于51单片机——A T89C51和时钟芯片DS1302设计并实现了电子时钟显示.在PCB 板制作完成并且调试成功之际,为了进一步提高自己地动手能力和编程能力,对这次电子时钟地设计和制作地过程中遇到地问题及设计思路做一次总结.本电子时钟是一种利用时钟芯片DS1302及51单片机来显示时、分、秒和年、月地装置.默认显示为时间,由四个按键分别控制定时设置、时间调整、分钟调整、日期显示;设计电路工作电源为5V;由4位LED数码管显示时间,格式为时时分分,中间点每隔1S亮暗;有备用电池,掉电后再上电能正常显示时间.电子时钟大体可以分为三大模块,数码管地显示模块、DS1302时钟芯片与单片机地时钟模块和按键与单片机地模块.单片机在5V电压下,各个模块正常工作.单片机从DS1302芯片中读出一组时间日期数据,同时单片机通过按键设置当前要求显示地信息给单片机.单片机接收到各个数据时,把各个数据显示出来.目录一、总体设计 (4)1.1 设计目地 (4)1.2 硬件功能描述 (4)1.3 设计方案选择 (4)1.4 设计任务及要求 (4)二、电子时钟软件和硬件设计 (5)2.1 硬件电路设计 (5)2.1.1 工作原理 (5)2.1.2 单元模块电路 (5)2.1.3 元器件清单 (6)2.2 软件设计 (7)2.2.1 程序设计流程 (7)三、电路调试 (7)四、心得体会 (8)五、参考文献 (10)附录Ⅰ: (12)附录Ⅱ:程序清单 (13)附录Ⅲ: (21)一、总体设计此电子时钟利用A T89C51单片机和时钟芯片DS1302 设计完成.1.1 设计目地1、通过对电子时钟地设计,进一步熟练掌握单片机编程方法及思想.2、通过对电子时钟地设计,掌握实时时钟芯片DS1302地使用方法.3、通过对电子时钟地设计,进一步掌握独立式键盘地编程控制并认识独立式键盘在实际中地运用.4、通过对电子时钟地设计,增强对单片机地兴趣及动手能力.并在此过程中学会对程序地逐步调试.1.2 硬件功能描述数字钟能够完成24 小时制计时,计时初始化值为00:00:00,用户可以通过按键调整时钟地初值实现校时功能,并且可以通过按键设定一个24 小时以内任意时刻地闹铃,用户可以手动选择闹铃地开或者关两种状态.1.3 设计方案选择计时方案:方案1:采用实时时钟芯片现在市场上有许多实时时钟集成电路,如:DS1287、DS2887、ds1302等.这些实时时钟芯片具备年、月、日、时、分、秒计时功能和多点定时功能,计时数据地更新每秒自动进行一次,不需要程序干预.因此,在工业实时测控系统中多采用这这一类专用芯片来实现实时时钟功能.方案2:是用单片机内地可编程定时器.利用单片机内部地定时计数器进行中断定时,配合软件延时实现时分秒地计时.该方案节省硬件成本,但程序设计较复杂.显示方案:一个良好地显示模块对一个系统非常重要,所有操作结果和计时结果,都要通过显示模块来显示出来.同时显示模块提供了良好地人机交互平台.常用地显示模式有LED 7段数码管显示、点阵显示和液晶显示.液晶显示屏(LCD)具有轻薄短小、低耗电量、无辐射危险,平面直角显示以及影象稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强等特点.但由于液晶其成本偏高.在使用时,不能有静电干扰,否则易烧坏液晶地显示芯片.鉴于LED 7段数码管成本低,也比较容易实现地特点,最终确定使用共阳极数码管来显示.1.4 设计任务及要求任务:设计一个可调时及日期显示地电子时钟要求:1、用DS1302来实现对时间地计算2、用7段LED来显示时间3、加独立式键盘来进行调时二、电子时钟软件和硬件设计2.1 硬件电路设计2.1.1 工作原理此电子时钟可显示地时间范围为:2000年1月1日0点至2100年12月31日23时59分.此时钟在正常计时模式下具有自动调整每月地天数地变化,并用内接电池对时间保持.时间为24小时至.接通电源对时间进行调整,按定时设置键确定被修改位地值.用时钟芯片记忆当前时间并保持,待下次接通电源无须调整能正确显示当前时间.定时设置:菜单按键,松开按键时有效此按键实现闹铃功能,设定一个时间,此时四位数码管第四位地小数点亮起,表示有闹铃设置;当闹铃是可按此键结束闹铃.时、分调整: 加一键,松开按键有效当定时设置键选中要修改地位时,如分(分闪烁时),按此键可以使分地值从当前值开始加一,加至60时变为00(59过后即显示00,不显示60);而时则在加至24时变为00(23过后即显示0,不显示24);日在加至32时变为00(即31过后即显示0,不显示32)。
DS1302实时时钟模块
DS1302实时时钟模块DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM ,通过简单的串行接口与单片机进行通信。
实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。
时钟操作可通过AM/PM 指示决定采用24 或12 小时格式。
DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:(1)RST 复位(2)I/O 数据线(3)SCLK串行时钟。
时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信。
DS1302 工作时功耗很低保持数据和时钟信息时功率小于1mWDS1302主要性能指标:★实时时钟具有能计算2100 年之前的秒、分、时、日、星期、月、年的能力,还有闰年调整的能力★ 31 8 位暂存数据存储RAM★串行 I/O 口方式使得管脚数量最少★宽范围工作电压2.0 5.5V★工作电流 2.0V 时,小于300nA★读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式★ 8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配★简单 3 线接口★与 TTL 兼容Vcc=5V★可选工业级温度范围-40 +85★双电源管用于主电源和备份电源供应DS1302实时时钟模块参数如下:1.PCB为单面板,尺寸:44mm*23mm*1.6mm2.带4个定位孔,直径3.1mm3.备用电池为正品天球CR2032,电压3V,电流260mAh,非可充电电池。
理论数据保持时间大于10年!4.晶振32.768KHz,日本原装进口晶振,匹配电容为6pF,尺寸2*6mm5.DS1302为8脚直插国产大芯片,芯片下面有IC座,方便更换及插拔芯片6.模块工作电压兼容3.3V/5V,可与5V及3.3V单片机连接7.工作温度:0°---70°接线方法(以提供的程序为例,可以接任意IO口,在程序中修改端口定义即可):VCC→+5V/3.3VGND→GNDCLK→P02DAT→P01RST→P00注意事项:1.VCC与GND千万不要接反,以免烧坏芯片2.51单片机P0口需要接上拉电阻,如果您的单片机没有接上拉电阻,可以将数据线接到其它端口发货清单:1.DS1302实时时钟模块1个(带DS1302芯片及备用电池,发货前已测试好功能)2.塑料固定柱4个3.DS1302中文数据手册1份、英文数据手册1份、模块原理图1份、51单片机驱动程序1份(购买后发到您的邮箱)防静电包装。
DS1302时钟程序详解
DS1302 时钟程序详解ds1302 时钟程序详解:DS1302 的控制字如图2 所示。
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302 中,位6 如果为0,则表示存取日历时钟数据,为1 表示存取RAM 数据;位5 至位1 指示操作单元的地址;最低有效位(位0)如为0 表示要进行写操作,为1 表示进行读操作,控制字节总是从最低位开始输出。
2.3 数据输入输出(I/O)在控制指令字输入后的下一个SCLK 时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0 开始。
同样,在紧跟8 位的控制指令字后的下一个SCLK 脉冲的下降沿读出DS1302 的数据,读出数据时从低位0 位到高位7。
2.4 DS1302 的寄存器DS1302 有12 个寄存器,其中有7 个寄存器与日历、时钟相关,存放的数据位为BCD 码形式,其日历、时间寄存器及其控制字见表1。
此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM 相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS1302 与RAM 相关的寄存器分为两类:一类是单个RAM 单元,共31 个,每个单元组态为一个8 位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM 寄存器,此方式下可一次性读写所有的RAM 的31 个字节,命令控制字为FEH(写)、FFH(读)。
ds1302 程序流程图3.2 DS1302 实时时间流程图4 示出DS1302 的实时时间流程。
根据此流程框图,不难采集实时时间。
下面结合流程图对DS1302 的基本操作进行编程:根据本人在调试中遇到的问题,特作如下说明:DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM 数据;D5~D1 指定输入或输出的特定寄存器; 最低位LSB(D0)为逻辑0,指定写操作(输入),D0=1,指定读操作(输出)。
将DS1302时钟走时更准确的方法
将DS1302时钟走时更准确的方法将DS1302时钟走时更准确的方法用DS1302制作电子时钟,由于32678K的晶振误差原因造成时钟走时不准确,大家使用的晶振精度都不高,每天误差都差6到10秒,如果购买高精度的晶振价格又非常高,不如用单片机的计时器编程走时更准确,可以进行误差调整,本人作了几个用DS1302时钟,由于32678K晶振的原因,每天都快6-9秒之间,原来用的方法是每天自动校一次,由于每天的误差不是整数,比如每天快7.6秒,这样每天就得自动校8秒,又造成每天慢0.4秒,每月误差又是12秒,走时还是不准确,本人改成了每差1秒校正一次的方法,原理是:比如每天快7.6秒,24*60/7.6=189,也就是189分钟快1秒,每189分钟就自动校一次时钟,这样校时理论上每年的误差最大不到6秒,本人的时钟4个月误差不到1秒,属于相当准确喽,现在提供给大家分享。
设计原理是:由于程序的大小和原理不同,每分钟读取DS1302的次数也不同,这样先设置二个变量,一个是分钟比较变量,用于判断分钟不等相等时计数器变量加1,另一个是校时计数变量,用于校时时间计数,当计数器变量等于189时,DS1302自动修正一次,程序如下:变量设置BJBL DATA 20H ;分钟比较变量,用于判断分钟不等相等时计数器加1JSBL DATA 21H ;校时计数变量,用于校时时间计数MOV BJBL,#00HMOV JSBL,#00H自动校时子程序AUTOXS:MOV A,MINCJNE A,BJBL,AS1JMP AS2AS1: MOV BJBL,AMOV A,JSBLINC AMOV JSBL,AAS2: MOV A,JSBLCJNE A,#0D3H,AS5MOV A,SECCJNE A,#01H,AS5 ;秒等于1时校回到0秒MOV R1,#8EH ;写保护寄存器MOV R0,#00H ;允许写入LCALL WRITE ;调用写DS1302程序MOV R1,#80H ;写秒寄存器MOV R0,#00H ;启动振荡器工作 LCALL WRITE ;调用写DS1302程序MOV R1,#8EH ;写保护寄存器 MOV R0,#80H ;禁止写入LCALL WRITE ;调用写DS1302程序MOV JSBL,#00HAS5: RET将此子程序在每次读取DS1302时调用。
DS1302时钟基础使用(含代码)
DS1302时钟基础使⽤(含代码)了解其管脚X1 X2 32.768KHz 晶振管脚GND 地RST 复位脚I/O 数据输⼊/输出引脚,具有三态SCLK 串⾏时钟Vcc1,Vcc2(备⽤电源供电)电源供电管脚DS1302 的寄存器及⽚内RAM控制寄存器⽤于存放DS1302的控制命令字,DS1302的RST引脚回到⾼电平后写⼊的第⼀个字就为控制命令。
它⽤于对DS1302读写过程进⾏控制,它的格式如下:D7:固定为1D6:RAM/CK位,=1⽚内RAM,=0⽇历、时钟寄存器选择位。
D5~D1:地址位,⽤于选择进⾏读写的⽇历、时钟寄存器或⽚内RAM。
对⽇历、时钟寄存器或⽚内RAM的选择见表。
D0:读写选择,=0写,=1读⽇历时钟寄存器写保护寄存器⽤于初始化时钟void Ds1302Init(){uchar n;Ds1302Write(0x8E,0X00); //禁⽌写保护,就是关闭写保护功能for (n=0; n<7; n++)//写⼊7个字节的时钟信号:分秒时⽇⽉周年{Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);}Ds1302Write(0x8E,0x80); //打开写保护功能}寄存器说明数据输出输⼊在控制指令字输⼊后的下⼀个SCLK时钟的上升沿时,数据被写⼊DS1302,数据输⼊从低位即位0开始。
同样,在紧跟8位的控制指令字后的下⼀个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到⾼位7。
单字节读和写DS1302是通过SPI串⾏总线跟单⽚机通信的,当进⾏⼀次读写操作时最少得读写两个字节,第⼀个字节是控制字节,就是⼀个命令,告诉DS1302是读还是写操作,是对RAM还是对CLOK寄存器操作。
第⼆个字节就是要读或写的数据了。
单字节读写:只有在SCLK为低电平时,才能将CE置为⾼电平。
所以在进⾏操作之前先将SCLK置低电平,然后将CE置为⾼电平,接着开始在IO上⾯放⼊要传送的电平信号,然后跳变SCLK。
用ds1302制作一个精密的电子时钟
用ds1302制作一个精密的电子时钟感想:我看视频的时候讲的是DS12CR887这块芯片,两块毕竟是不一样的,所以,我只是看了他讲怎样看时序,之后的就没再看了。
我就拿着自己下载打印的DS1302数据手册,研习,研习,再研习。
还查了书上的,网上的,源程序。
但是,你别指望着谁会把所有的东西都给你写上去。
只能作为参考。
后来,我终于写出了一个程序,可是一编译,就漏洞百出。
最主要的有两点:for循环和BCD码。
不过还好,都得到了很好的解决。
解决方案:#include#include#define uchar unsigned char#define uint unsigned intuchar data table[]="2009-01-01 Mon.";uchar data table1[]=" 00:00:00";uchar code xingqi[]="Mon. Tue. Wed. Thu. Fri. Sat. Sun.";uchar num;uchar hour,min,sec,week,day,month,year;sbit ds1302_sclk=P1^4;sbit ds1302_io=P1^5;sbit ds1302_ce=P2^2;sbit acc0=ACC^0;sbit acc7=ACC^7;sbit lcdrs=P1^7; //端口定义sbit lcdrw=P1^6;sbit lcde=P2^4;sbit le=P3^ 6;sbit led en=P2^5;sbit dkle=P3^7;void delay(uint a);void write_byte(uchar dat) //写入一个字节{uchar i;ACC=dat;for(i=8;i>0;i--){ds1302_io=acc0;ds1302_sclk=1;ds1302_sclk=0;ACC=ACC>>1;}}uchar read_byte() //读出一个字节{uchar i;for(i=8;i>0;i--){ACC=ACC>>1;acc7=ds1302_io;ds1302_sclk=1;ds1302_sclk=0;}return(ACC);}void s_write(uchar add,uchar dat)//单字节写入子函数{ds1302_ce=0;ds1302_sclk=0;ds1302_ce=1;write_byte(add);write_byte(dat);ds1302_sclk=1;ds1302_ce=0;}uchar s_read(uchar add) //单字节读出子函数{uchar temp;ds1302_ce=0;ds1302_sclk=0;ds1302_ce=1;write_byte(add);temp=read_byte();ds1302_sclk=1;ds1302_ce=0;temp=(temp/0x0a)*10+temp%0x0a;return(temp);}void set_ds1302(uchar *pClock) //设置ds1302的时间{uchar i;uchar add=0x80;EA=0;s_write(0x8e,0x00);for(i=7;i>0;i--){s_write(add,*pClock);pClock++;add+=2;}s_write(0x8e,0x80);EA=1;}void read_ds1302(uchar Curtime[]) //读取ds1302的时间{uchar i;uchar add=0x81;EA=0;for(i=7;i>0;i--){Curtime[i]=s_read(add);add+=2;}EA=1;}void write_com(uchar com) //写命令子函数{lcde=0;lcdrw=0;lcdrs=0;delay(1);lcde=1;delay(1);P0=com;delay(1);lcde=0;}void write_data(uchar dat) //写数据子函数{lcde=0;lcdrw=0;lcdrs=1;delay(1);lcde=1;delay(1);P0=dat;delay(1);lcde=0;}void init(){month=1;day=1;year=9;lcde=0; //LCD1602初始化le=0;leden=0;write_com(0x38);delay(100);write_com(0x38);delay(50);write_com(0x38);delay(10);write_com(0x08);write_com(0x01);write_com(0x0c);write_com(0x80);for(num=0;num<15;num++) //在第一行显示“ 2000-00-00 Mon.”{write_data(table[num]);}write_com(0x80+0x40);for(num=0;num<10;num++) //在第二行末尾显示“00:00:00”{write_data(table1[num]);}}void write_time(uchar add,uchar dat) //写入时间子函数{uchar shi,ge;shi=dat/16;ge=dat%16;write_com(0x80+0x40+add);write_data(0x30+shi);write_data(0x30+ge);}void write_riqi(uchar add,uchar dat) //写入日期子函数{uchar shi,ge;shi=dat/16;ge=dat%16;write_com(0x80+add);write_data(0x30+shi);write_data(0x30+ge);}void write_xingqi(uchar dat) //写入星期子函数{write_com(0x80+0x0b);switch(dat){case 1: for(num=0;num<4;num++){write_data(xingqi[num]);};break;case 2: for(num=5;num<9;num++){write_data(xingqi[num]);};break;case 3: for(num=10;num<14;num++){write_data(xingqi[num]);};break;case 4: for(num=15;num<19;num++){write_data(xingqi[num]);};break;case 5: for(num=20;num<24;num++){write_data(xingqi[num]);};break;case 6: for(num=25;num<29;num++){write_data(xingqi[num]);};break;case 7: for(num=30;num<34;num++){write_data(xingqi[num]);};break;}}void main(){init();delay(5);s_write(0x8e,0x00); //控制写入WP=0 s_write(0x90,0xa5);s_write(0x80,0x00); //秒s_write(0x82,0x20); //分s_write(0x84,0x09); //时24时制s_write(0x86,0x27); //日s_write(0x88,0x08); //月s_write(0x8a,0x04); //星期s_write(0x8c,0x09); //年 */s_write(0x8e,0x80);//控制写入WP=1;P0=0xff;while(1){sec=s_read(0x81);write_time(8,sec);write_com(0x80+0x40+9);min=s_read(0x83);write_time(5,min);write_com(0x80+0x40+6);hour=s_read(0x85);write_time(2,hour);write_com(0x80+0x40+3); week=s_read(0x8b);write_xingqi(week);write_com(0x80+0x0d);day=s_read(0x87);write_riqi(8,day);write_com(0x80+9);month=s_read(0x89);write_riqi(5,month);write_com(0x80+6);year=s_read(0x8d);write_riqi(2,year);write_com(0x80+3);}}void delay(uint a) { //延时子函数uint i,j;for(j=a;j>0;j--)for(i=250;i>0;i--) ;}。
基于51单片机的实时时钟DS1302
基于51单片机的DS1302实时时钟本讲内容:介绍DS1302实时时钟芯片基本知识,演示DS1302例程。
DS1302实时时钟:DS1302能提供包括秒、分、时、日期、月份和年份信息。
闰年可自行调整,可选择12小时制和24小时制,可以设置AM、PM。
只通过三根线进行数据的控制和传递:/RST、I/O、SCLK。
通过备用电源可以让芯片在小于1mw的功率下运作。
DS1302是总线驱动方式,它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。
要想与DS1302通信,首先要先了解DS1302的控制字。
DS1302的控制字如图:位7:必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。
位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM 数据。
位5至位1(A4~A0):指示操作单元的地址。
位0:为1表示进行读操作,为0表示要进行写操作,控制字后SCLK下降沿读数据,SCLK上升沿写数据。
数据是低位在前,高位在后。
读数据:读数据时在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据是从最低位到最高位。
写数据:写数据时在紧跟8位的控制字指令后的下一个SCLK脉冲的上升沿,数据被写入DS1302,数据输入也是从最低位(0位)开始。
DS1302的数据读写是通过I/O串行进行的。
当进行一次读写操作时最少要读写两个字节。
第一个字节是控制字节,就是一个命令,告诉DS1302是读还是写操作,是对RAM还是对CLOCK寄存器操作,以及操作的地址。
第二个字节就是要读或写的数据了。
单字节写:在进行操作之前先将CE(也可说是RST)置高电平,然后单片机将控制字的位0放到I/O上,当I/O的数据稳定后,将SCLK置高电平,DS1302检测到SCLK的上升沿后就将I/O上的数据读取,然后单片机将SCLK置为低电平,再将控制字的位1放到I/O上,如此反复,将一个字节控制字的8个位传给DS1302。
用ds1302制作一个精密的电子时钟
uchar add=0x80; EA=0; s_write(0x8e,0x00); for(i=7;i>பைடு நூலகம்;i--) { s_write(add,*pClock); pClock++; add+=2; } s_write(0x8e,0x80); EA=1; }
sbit sf=P1;
sbit sup=P1;
void delay(uint a);
void keyscan();
void main() //main 函数
{ s_write(0x8e,0x80); init(); P0=0xff; while(1) { keyscan(); if(flag==0){ rw_ds1302(); } } }
void rw_ds1302() //读写 ds1302 { EA=0; sec=s_read(0x81); write_time(8,sec); write_com(0x80+0x40+9); min=s_read(0x83); write_time(5,min); write_com(0x80+0x40+6); hour=s_read(0x85); write_time(2,hour); write_com(0x80+0x40+3); week=s_read(0x8b);
ds1302_ce=0; ds1302_sclk=0; ds1302_ce=1; write_byte(add); temp=read_byte(); ds1302_sclk=1; ds1302_ce=0; temp=BCD2DEC(temp); return(temp); } void set_ds1302(uchar *pClock) //设置 ds1302 的时间 { uchar i;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;******************************************************************; 1 2 3 A ;修改时间时,A键为当前修改时间加一,B键为减一,C不保存退出,D保存并退出; 4 5 6 B INT0 ;INT0键,进入和退出秒表; 7 8 9 C INT1 ;显示时间时,INT1键,进入修改时间程序;秒表时,INT1键为计数清零; E 0 F D T0 ;显示时间时,T0键为切换日历和时钟,秒表时,T0为开始结束计时;*******************************************************************;修改时间时E键左移F键右移;******************************************************************* LED EQU P0 ;显示接口KEY EQU P1 ;键盘接口DUAN EQU P2 ;LED段控制ZCLK BIT P1.6 ;时钟线引脚ZIO BIT P3.5 ;数据线引脚ZRST BIT P1.7 ;复位线引脚ZINT0 BIT P3.2 ;外部中断0引脚ZINT1 BIT P3.3 ;外部中断1引脚ZT0 BIT P3.4 ;T0引脚ZT1 BIT P3.5 ;T1引脚XSW EQU 7FH ;显示首地址SECOND EQU 30H ;秒地址XGDDZ EQU 7EH ;修改段地址XGSJDZ EQU 7DH ;修改时间地址SMBZ EQU 70H ;键盘扫描标志位XGWBZ EQU 71H ;修改位标志MBBZ EQU 72H ;秒表标志SS EQU 70H ;闪烁缓存地址T0JC EQU 74H ;T0计数次数XSW1 EQU 75H ;显示辅助;********************************ORG 00H ;程序入口LJMP STARTORG 03H ;外部中断0程序入口LJMP AINT0ORG 0BH ;定时器T0程序入口LJMP AT0ORG 13H ;外部中断1程序入口LJMP AINT1ORG 1BH ;定时器T1程序入口LJMP AT1;********************************ORG 30HSTART:CLR SMBZ ;清扫描标志,为0表示当前不进行键盘扫描,为1表示扫描。
CLR XGWBZ ;清显示位标志,为0表示当前修改的是十位上的数,为1个位CLR MBBZ ;清秒表标志,0表示没有进入秒表。
SETB PT1 ;置T1中断为最高级中断MOV T0JC,#5 ;T0中断计数,当计数5次运行一次中断子程序里面的内容MOV TMOD,#11H ;设置定时器工作方式,T0,T1都为方式1MOV TH0,#03CH ;T0定时50ms初始化MOV TL0,#0AFH ;MOV TH1,#0D8H ;T1定时10ms初始化MOV TL1,#0F0H ;SETB EA ;开总中断SETB EX1 ;开外部中断0SETB ET1 ;开定时器T1中断,还没开始计时SETB EX0 ;开外部中断1MOV DPTR,#SJ ;数据段首地址送DPTRMOV SECOND,#00H ;初始化时间2010年7月4日5时20分00秒星期日MOV SECOND+1,#20H ;MOV SECOND+2,#05H ;MOV SECOND+3,#04H ;MOV SECOND+4,#07H ;MOV SECOND+5,#07H ;MOV SECOND+6,#10H ;LCALL SET1302 ;调用初始化程序,把我们设定的时间(即30H—36H 里面的内容)写入芯片MOV 52H,#40H ;置显示程序里面一杠MOV 55H,#40H ;MOV 5BH,#40H ;MOV 5EH,#40H ;; SETB TR0 ;启动T0计数SETB TR1 ;启动T1计数MOV 65H,#100CLR 30HCLR 31HMOV XSW,#50H ;显示位首地址设置MOV XSW1,#50H ;显示首地址辅助切换位LOOP_1: ;主循环MOV R0,XSW ;取显示首地址,XSW内存59H时显示时分秒,50H 时显示年月日MOV R2,#00H ;默认第一个LED亮JB 30H,LOOP_2DJNZ 65H,LOOP_2MOV 65H,#100LCALL YIWEILOOP_2: ;JNB SMBZ,LOOP_3 ;判断扫描标志(SMBZ),是否进行键盘扫描LCALL SAOMIAO ;键盘扫描程序LOOP_3: ;MOV LED,#00H ;LED灭MOV DUAN,R2 ;送哪个LED亮MOV LED,@R0 ;送显示代码LCALL DELAY ;延时1msINC R0 ;INC R2 ;亮的LED灯右移JB SMBZ,LOOP_5 ;判断扫描标志,是否屏蔽T0键JNB ZT0,LOOP_4 ;LOOP_5: ;CJNE R2,#08H,LOOP_2 ;判断是否已循环8次LJMP LOOP_1 ;跳回主循环LOOP_4: ;LCALL DL20MS ;延时20ms,去抖JB ZT0,LOOP_1 ;JNB ZT0,$ ;T0键一直按着,会卡在这里,是为了确保按下T0键只运行一次下面的程序; MOV A,XSW1 ;以下三行,交换显示首地址; XCH A,XSW ;切换显示年月日,还是时分秒; MOV XSW1,ACPL 30HMOV XSW,#59H ;LJMP LOOP_1 ;YIWEI:JB 31H,YIWEI_0INC XSWMOV A,XSWCJNE A,#5AH,YIWEI_1DEC XSWCPL 31HLJMP YIWEI_1YIWEI_0:DEC XSWMOV A,XSWCJNE A,#4FH,YIWEI_1INC XSWCPL 31HYIWEI_1:RET;******************************************************************************* *********SET1302: ;设置DS1302 初始时间,并启动计时。
CLR ZRST ;CLR ZCLK ;SETB ZRST ;MOV B,#8EH ;控制寄存器LCALL INB ;MOV B,#00H ;写操作前WP=0LCALL INB ;SETB ZCLK ;CLR ZRST ;MOV R0,#SECOND ;MOV R7,#07H ;秒分时日月星期年MOV R1,#80H ;秒写地址S13021: ;CLR ZRST ;CLR ZCLK ;SETB ZRST ;MOV B,R1 ;写秒分时日月星期年地址LCALL INB ;MOV A,@R0 ;写秒数据MOV B,A ;LCALL INB ;INC R0 ;INC R1 ;INC R1 ;SETB ZCLK ;CLR ZRST ;DJNZ R7,S13021 ;循环7次,将年星期月日时分秒写入芯片CLR ZRST ;CLR ZCLK ;SETB ZRST ;MOV B,#8EH ;控制寄存器LCALL INB ;MOV B,#80H ;控制,WP=1,写保护LCALL INB ;SETB ZCLK ;CLR ZRST ;RET ;;******************************************************************************* *GET1302: ;读时间MOV R0,#SECOND; ;功能简述:将芯片中的当前时间读到单片机的30H—36H存储单元MOV R7,#07H ;MOV R1,#81H ;秒地址G13021: ;CLR ZRST ;CLR ZCLK ;SETB ZRST ;MOV B,R1 ;读秒分时日月星期年地址LCALL INB ;LCALL OUTB ;MOV @R0,A ;秒INC R0 ;INC R1 ;INC R1 ;SETB ZCLK ;CLR ZRST ;DJNZ R7,G13021 ;RET ;;************************************************************************INB: ;写1302一字节MOV R4,#08H ;INB1: ;MOV A,B ;RRC A ;MOV B,A ;MOV ZIO,C ;SETB ZCLK ;CLR ZCLK ;DJNZ R4,INB1 ;RET ;;************************************************************************ OUTB: ;读1302一字节MOV R4,#08H ;OUT1: ;MOV C,ZIO ;RRC A ;SETB ZCLK ;CLR ZCLK ;DJNZ R4,OUT1 ;RET ;;************************************************************************XS: ;显示转换子程序MOV R0,#5FH ;功能简述:将30H—36H的时间转换为显示码,存储在50H—60H,MOV R1,#SECOND ;XS_1: ;MOV A,@R1 ;举例:50H存的是年的十位,51H年的个位。
52H 是一杠,53H,54H是月MOV B,#10H ;DIV AB ;MOVC A,@A+DPTR ;MOV @R0,A ;注意:里面存的是显示码,比10年,那么50H存的是#06H,51H存#3FHMOV A,B ;MOVC A,@A+DPTR ;INC R0 ;MOV @R0,A ;DEC R0 ;DEC R0 ;DEC R0 ;DEC R0 ;INC R1 ;CJNE R1,#35H,XS_1 ;MOV A,36H ;MOV B,#10H ;DIV AB ;MOVC A,@A+DPTR ;MOV 50H,A ;MOV A,B ;MOVC A,@A+DPTR ;MOV 51H,A ;RET ;;************************************************************************** SAOMIAO: ;键盘扫描程序,扫描原理详见课本251页CLR TR0 ;CLR ET0 ;PUSH ACC ;PUSH 1 ;MOV KEY,#0FH ;MOV A,KEY ;CJNE A,#0FH,GO1 ;LJMP SMRET_1 ;GO1: ;CALL DL20MS ;延时20ms,去抖MOV A,KEY ;CJNE A,#0FH,GO2 ;LJMP SMRET_1 ;GO2: ;MOV KEY,#0F0H ;MOV B,KEY ;ORL A,B ;PUSH ACC ;MOV LED,#00H ;GO3: ;键按着一直卡在这里MOV KEY,#0FH ;MOV A,KEY ;CJNE A,#0FH,GO3 ;POP ACC ;NE1: ;CJNE A,#0EEH,NE2 ;1键JB XGWBZ,NE1_1 ;判断修改位标志(XGWBZ),决定将1送修改时间的十位还是个位。