1,ds1302是什么

时钟芯片
ds1302是美国dallas公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态ram,采用spi三线接口与cpu进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和ram数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5v。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。ds1302的外部引脚分配如图1所示及内部结构如图2所示。ds1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。

ds1302是什么

2,ds1302 说明书

每个字节的传输是有控制字节指定的,控制字节的最高位Bit7必须是1(高位至低位是由右至左),如果是0,写入将被禁止,因此我们如果将这位置一,可以禁止写入。bit6为0则指定对时钟/日历寄存器控制读写操作,为1则为RAM区数据的控制读写操作,bir1~bit5指定相关寄存器待进行输入输出操作,最低位bit0指定是输入还是输出,为0则为输入,相反则输出有效。总体讲起来,这八位具备了控制指令和地址,是用来对寄存器进行写操作的。
从左侧起,第一位R/W是读写命令,A0-A4为地址位,R/C::如果为0,则表示存取日历时钟数据,为1表示存取RAM数据,最后一位恒为1。E文的看不懂没关系,可以下中文的说明书啊。这器件很早就有人翻译了。

ds1302 说明书

3,DS1302单片机

#include<reg52.h>#define uchar unsigned char#define uint unsigned int/******************** IO口定义 *********************/#define KeyBoard P2#define LocationCS P1#define DispSeg P0/******************** 变量定义 *********************/unsigned char code SegCode[] = unsigned char code Location[] = uchar Index = 0; // 显示缓冲区指针uchar Hour = 0; // 小时变量uchar Min = 0; // 分钟变量uchar Sec = 0; // 秒钟变量uint Timer = 0; // 中断次数计数变量uchar DispBuf[] = uchar KeyCode; // 按键码高位uint DelayKey; // 按键延时变量/******************** 函数声明 *********************/void init();void DispBufUpdate();void DisposeKeys();/********************* 主函数 **********************/void main(void) init(); // 初始化 while(1) if(KeyCode != 0) // 如果有按键码就处理按键 DisposeKeys(); KeyCode = 0; // 处理完按键码清零 } }}/*************** 更新显示缓冲区函数 ****************/void DispBufUpdate() DispBuf[0] = SegCode[Sec % 10]; // 秒个位 DispBuf[1] = SegCode[Sec / 10]; // 秒十位 DispBuf[3] = SegCode[Min % 10]; DispBuf[4] = SegCode[Min / 10]; DispBuf[6] = SegCode[Hour % 10]; DispBuf[7] = SegCode[Hour / 10];}/****************** 按键处理函数 *******************/void DisposeKeys() switch(KeyCode) case 0x77: Hour++; if(Hour == 24)Hour = 0; break; case 0x7b: if(Hour == 0) Hour = 24; Hour--; break; case 0xb7: Min++; if(Min == 60) Min = 0; break; case 0xbb: if(Min == 0) Min = 60; Min--; break; default: break; } DelayKey = 300; // 延时变量赋值,300次定时中断后(300/1200 = 0.25秒)如果不松键则会连续产生键值,时间变量会连续加或连续减,直到松键}/******************** 初始化函数 ********************/void init() TMOD = 0x01; // 定义定时器0为16位定时器 TH0 = -3; // 11059200 = 12*256*3*1200,晶振12分频后是:921600机器周期/秒, // 设置定时器每3*256个机器周期中断1次,中断1200次就是一秒钟。 // TL0因初值为0,加到256=0,相当于自动重装了,所以不用定义了,既节约了时间又走时准确。 ET0 = 1; // 允许T0中断 EA = 1; // 开总中断 TR0 = 1; // 启动T0 DispBufUpdate(); // 显示初始值}/**************** 定时3*256秒中断函数 = 多任务分时处理函数 ****************/void IntT0() interrupt 1 TH0 = -3; // 重装定时器初值 /* 任务1:每次中断刷新一个数码管 */ LocationCS = 0xff; // 清位选消隐 DispSeg = DispBuf[Index]; // 输出显示内容 LocationCS = Location[Index++]; // 选择显示位置 Index &= 7; // 等效于if(Index == 8)Index = 0; 循环指向8个显示位置 /* 任务2:按键扫描 */ if(DelayKey == 0) // 上次中断没检测到按键则需扫描按键 KeyBoard = 0x0f; if(KeyBoard != 0x0f) // 若有按键发生,则 KeyBoard 低4位不全为1 DelayKey = 6; // 设置按键消颤延时时间,6/1200 = 5毫秒 } } else DelayKey--; // 延时时间未到,延时变量减一 if(DelayKey == 0) // 按键延时时间到,可以取键值了 KeyBoard = 0x0f; if(KeyBoard != 0x0f) // 若延时后仍检测到按键,则为有效按键 KeyCode = KeyBoard; // 取按键“行”地址 KeyBoard = 0xf0; // 取按键“列”地址 KeyCode |= KeyBoard;// 按键“行”“列”地址相或 = 有效键值 } } } /* 任务3:秒处理 */ Timer++; // 中断次数计数 if(Timer == 1200) // 1200次为1秒 Timer = 0; Sec++; if(Sec == 60) // 时间进位处理 Min++; Sec = 0; if(Min == 60) Hour++; Min = 0; if(Hour == 24) Hour = 0; } } } DispBufUpdate(); }}

DS1302单片机


文章TAG:ds1302有多少个器件地址多少  少个  器件  
下一篇