基于at89c51单片机的多功能电子万年历的设计的所有专业(编辑修改稿)内容摘要:

且可以关闭充电功能。 采用普通 晶振。 DS1302 是美国 DALLAS 公司推出的一种高性 能、低功耗、带 RAM 的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为 ~。 采用三线接口与 CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或 RAM 数据。 DS1302 内部有一个 318 的用于临时性存放数据的 RAM 寄存器。 DS1302是 DS1202 的升级产品,与 DS1202 兼容,但增加了主电源 /后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。 本科 毕业设计 (论文 ) 12 DS1302 的引脚排列 ,其中 Vcc1 为后备电源, Vcc2 为主电源。 在主电源关闭的情况 下,也能保持时钟的连续运行。 DS1302 由 Vcc1 或 Vcc2 两者中的较大者供电。 当 Vcc2 大于 Vcc1+ 时, Vcc2 给 DS1302 供电。 当 Vcc2 小于 Vcc1 时, DS1302 由 Vcc1 供电。 X1 和 X2是振荡源,外接 晶振。 RST 是复位 /片选线,通过把 RST 输入驱动置高电平来启动所有的数据传送。 RST 输入有两种功能:首先, RST 接通控制逻辑,允许地址 /命令序列送入移位寄存器;其次, RST 提供终止单字节或多字节数据的传送手段。 当 RST 为高电平时,所有的数据传送被初始化,允许对 DS1302 进行操作。 如果在传送过程中 RST 置为低电平,则会终止此次数据传送, I/O 引脚变为高阻态。 上电运行时,在 Vcc≥ 之前,RST 必须保持低电平。 只有在 SCLK 为低电平时,才能将 RST 置为高电平。 I/O 为串行数据输入输出端 (双向 ),后面有详细说明。 SCLK 始终是输入端。 DS1302 的控制字节的最高有效位 (位 7)必须是逻辑 1,如果它为 0,则不能把数据写入 DS1302中,位 6如果为 0,则表示存取日历时钟数据,为 1表示存取 RAM数据。 位 5 至位 1指示操作单元的地址。 最低有效位 (位 0)如为 0表示要进行写 操作,为 1表示进行读操作,控制字节总是从最低位开始输出。 在控制指令字输入后的下一个 SCLK 时钟的上升沿时,数据被写入 DS1902,数据输入从低位即位 0 开始。 同样,在紧跟 8 位的控制指令字后的下一个 SCLK 脉冲的下降沿读出DS1302 的数据,读出数据时从低位 0位到高位 7。 DS1302 有 12 个寄存器,其中有 7 个寄存器与日历、时钟相关,存放的数据位为 BCD码形式 ,其日历、时间寄存器及其控制字见表 1。 此外, DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与 RAM相关的寄存器等。 时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302 与 RAM 相关的寄存器分为两类:一类是单个 RAM 单元,共 31 个,每个单元组态为一个 8位的字节,其命令控制字为 C0H~ FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的 RAM 寄存器,此方式下可一次性读写所有的 RAM 的 31 个字节, 命令控制字为 FEH(写 )、 FFH(读 )。 DS1302 与 CPU 的连接需要三条线,即 SCLK(7)、 I/O(6)、 RST(5)。 DS1902 与 89C2051的连接图,其中,时钟的 显示用 LED。 DS1302 与 CPU 的连接 , 实际上,在调试程序时可以不加电容器,只加一个 的晶振即可。 只是选择晶振时,不同的晶振,误差也较大。 另外,还可以在上面的电路中加入 DS18B20,同时显示实时温度。 只要占用 CPU 一个口线即可。 LED 还可以换成 LCD,还可以使用北京卫信杰科技发展有限公司生产的 10 位多功能 8 段液晶显示模块 LCM101,内含看门狗 (WDT)/时钟发生器及两种频率的蜂鸣器驱动电路,并有内置显示 RAM,可显示任意字段笔划,具有 3- 4 线串行接口,可与任何单片机、 IC 接口。 功耗低,显示状态时电流为 2μA ( 典型值 ),省电模式时小于 1μA ,工作电压为 ~ ,显示清晰。 DS1302 的实时时间流程。 根据 流程框图,不难采集实时时间。 下面对 DS1302 的基本本科 毕业设计 (论文 ) 13 操作进行编程: 根据本人在调试中遇到的问题,特作如下说明: DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位 MSB(D7)必须为逻辑 1,如果 D7=0,则禁止写 DS1302,即写保护; D6=0,指定时钟数据, D6=1,指定 RAM数据; D5~ D1指定输入或输出的特 定寄存器;最低位 LSB(D0)为逻辑 0,指定写操作 (输入 ), D0=1,指定读操作 (输出 )。 在 DS1302 的时钟日历或 RAM 进行数据传送时, DS1302 必须首先发送命令字节。 若进行单字节传送, 8 位命令字节传送结束之后,在下 2个 SCLK 周期的上升沿输入数据字节,或在下 8个 SCLK 周期的下降沿输出数据字节。 DS1302 与 RAM 相关的寄存器分为两类 :一类是单个 RAM 单元,共 31个,每个单元组态为一个 8位的字节,其命令控制字为 C0H~ FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下 的 RAM 寄存器,在此方式下可一次性读、写所有的 RAM 的 31 个字节。 要特别说明的是备用电源 B1,可以用电池或者超级电容器 ( 以上 )。 虽然 DS1302在主电源掉电后的耗电很小,但是,如果要长时间保证时钟正常,最好选用小型充电电池。 可以用老式电脑主板上的 充电电池。 如果断电时间较短 (几小时或几天 )时,就可以用漏电较小的普通电解电容器代替。 100 μF 就可以保证 1 小时的正常走时。 DS1302在第一次加电后,必须进行初始化操作。 初始化后就可以按正常方法调整时间。 DS1302 存在时 钟精度不高,易受环境影响,出现时钟混乱等缺点。 DS1302 可以用于数据记录,特别是对某些具有特殊意义的数据点的记录,能实现数据与出现该数据的时间同时记录。 这种记录对长时间的连续测控系统结果的分析及对异常数据出现的原因的查找具有重要意义。 传统的数据记录方式是隔时采样或定时采样,没有具体的时间记录,因此,只能记录数据而无法准确记录其出现的时间;若采用单片机计时,一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且,某些测控系统可能不允许。 但是,如果在系统中采用时钟芯片 DS1302,则能很好地解决这个问题。 本科 毕业设计 (论文 ) 14 第四章 系统的软件设计 主程序 主程序 如图 41所示: 图 41 主程序图 开始 读年、月、日 送第一块 LED 显示 读星期、闰、年、日 送第二块 LED 显示 读时、分、秒 送第三块 LED 显示 返回 本科 毕业设计 (论文 ) 15 从 1302 读取 日期和时间 程序 图 42 从 1302读取程序 系统源代码 DELAY. C define DELAY_C include”includes. h” define XTAL 12 void delay_lus(void) { asm(”nop”): } void delay_nus(unsigned int n) { unsigned int i=0; for(i=0; in; i++) delay_lus(); } void delay_ims(void) { unsigned int i; for(i=0: i(unsigned int)(XTAL*1432)。 i++)。 } void delay_nms(unsigned int n) { unsigned int i=0。 for(i=0; in; i++) 读 1302 日期和时间 调整时间和日期 Y N 系统初始化 开 始 需要调整时间吗。 本科 毕业设计 (论文 ) 16 { delay_ims()。 } } DSl302. C include”includes. h” define DSl302_C unsigned char bflag; unsigned char bpm; unsigned char get_hours(void) { unsigned char i; unsigned char R_Byte; unsigned char TmpByte; reset(); write(0x85); ddr_set_io(); R_Byte=0x00; Prt_clear_io(); ddr_clear_io(); for(i: 0; i4; i++) } TmpByte=0。 if((pinpamp。 (1io))) TmpByte=1; TmpByte=7。 R_Byte=1。 R_Byte I=TmpByte; Prt_set_clk(); delay_nus(2); prt_clear_clk(); delay_nus(2); } bflag=0; if((pinpamp。 (1io))) bflag=l。 prt_set_clk(); delay_nus(2); prt_clear_clk(); delay_nus(2); bpm=0。 if((pinpamp。 (1io))) bpm=1; prt_set_clk(); delay_nus(2); prt_clear_clk(); 本科 毕业设计 (论文 ) 17 delay_nus(2); prt_clear_rst(); prt_clear_clk(); R_Byte =4; return R_Byte; } unsigned char readbyte(unsigned char w_byte) { unsigned char temp; reset(); write(w_byte); temp=read(); prt_clear_rst(); prt_clear_clk(); return temp; } void writebyte(unsigned char w_byte, unsigned char w_2_byte) { reset(); write(w_byte)。 write(w_2_byte); prt_clear_rst(); prt_clear_clk(); } void reset(void) { ddr_set_rst(); prt_clear_clk(); prt_clear_rst(); prt_set_rst(); } void write(unsigned char W_Byte) { unsigned char i; DDRC=0xFF。 for(i=0; i8; i++) { Prt_clear_io(); if(W_Byte amp。 0x01) { prt_set_io(); } Prt_set_clk(); delay_nus(1);// delay_nus(2); prt_clear_clk(); delay_nus(1);// delay_nus(2); 本科 毕业设计 (论文 ) 18 W_Byte=1; } } unslgned char read(void) { unsigned char i; unsigned char R_Byte; unsigned char R_Byte2; unsigned char TmpByte; ddr_set_io(); R_Byte=0x00。 R_Byte2=0x00; prt_clear_io(); ddr_clear_io(); for(i=0。 i4; i++)// get t。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。