摘要: 介绍如何在微处理器存储系统中使用Dallas Phantom RTC产品。
幻影时钟和智能手表插座分别提供电池支持的NV SRAM或NV SRAM控制,并添加计时信息。在不使用任何SRAM数据空间的情况下访问计时数据。对计时数据的访问是通过向控制器写入唯一的64位序列来完成的。然后控制器抑制对SRAM的访问,以便进行接下来的64次读写。在本例中,DS1216C、DS1216E、DS1243Y或DS1244Y连接到DS2250。DS2250微控制器兼容工业标准8051架构。使用银行交换技术可以支持更大的密度。在应用笔记81“高速微控制器系列的内存扩展”中讨论了一些内存扩展技术。
该电路的智能手表/幻影时钟原理图如图1所示。软件显示于DS1216 / DS1244代码.
图1所示 智能手表/幻影时钟电路原理图。
/************************************************************************//* ds1216an.c——访问DS1216或DS1244使用Phantomdemo电路 *//************************************************************************//* SmartWatch / ROM插槽,输入D(输入)连接到A0, * / / * Q(输出)连接到D7(数据位7的数据总线)和* / / * /我们连接到A2。在SmartWatch/RAM插座上,DQ *//*连接到D0, /WE连接到/WR。对于两者,/OE连接到*//* /RD, /CE连接到A15。访问需要使用XBYTE *//*函数。所有其他SRAM/ROM地址和数据引脚都连接到它们各自的处理器引脚上。这个例子旨在展示*//*如何访问时钟。不是所有的内存配置都可以*//*使用这个设置。注意SmartWatch socket必须*//*映射到数据,而不是程序内存空间。程序内存提取将*//*中断访问协议序列。如果/RST连接到一个*//*地址,/RST位必须始终写为1。否则,对时钟的*//*访问将丢失。 这个程序只是例如* / / *不支持达拉斯半导体的格言 *//************************************************************************/# 包括& lt; stdio.h>/* I/O函数的原型*/#包括<DS5000.h>/* DS5000的寄存器声明*/#包括<absac .h>/ *需要定义xdata地址 *//************************* 一些定义 ******************************//***************************** 定义了 **********************************//************************* 全局变量 *****************************/ uchar模式= 0,年= 0 x01 mn = 0 x03 dt = 0 x30, dy = 0 x26, hr = 0 x14,最小值= 0连接,#define RDADDR XBYTE[0x0000]/* I/O在D0上对于SmartWatch/RAM */#define WRADDR XBYTE[0x0000]#define RDADDRROM XBYTE[0x0004] /* /WE在A2上对于SmartWatch/ROM */#define WR1ADDR XBYTE[0x0001] /* D(数据输入)在A0上对于/ROM */#define WR0ADDR XBYTE[0x0000]/***********************函数原型****************************/void ds1216_wr ;void ds1216_rd ; #define WR0ADDR XBYTE[0x0000]/***********************函数原型****************************/void ds1216_close ;void ds1216_open ;void entry ;uchar rbyte ;void wbyte(uchar);void ds1216_open 发送开放协议到RTC在1216 ------- */{uchar a = 0xc5, inc;ds1216_close ;for(inc = 0;公司& lt;4;公司+ +){wbyte(一个);/*发送模式byte */a = a ^ 0xff;/*生成下一个模式字节*/wbyte(a);/*发送模式byte */a = (a >>4) | (a <<4);/*生成下一个模式字节*/}/*重复直到8个字节发送*/}void ds1216_close /* -----确保时钟不在访问模式----- */{uchar i;/*从部分中读取至少64次以确保*/for (i=0;i< 9;{rbyte }}uchar rbyte /* ------从时钟中读取一个字节并返回------- */{uchar savbyte = 0, getbyte;uchar I;for (I = 0;我& lt;8;i++){if(mode) /* ROM: /WE在A2上,并且必须是高电平才能读取*/{getbyte = RDADDRROM &1;/*数据位输出(Q)在D0 */}else /* RAM: /WE on /WR (DS5000) */{getbyte = RDADDR &1;/* DQ = 0 */}getbyte <<= i;/*为数据位腾出空间*/savbyte |= getbyte;/ *并将其保存* /}返回savbyte;}无效wbyte (uchar dat ) /*---------------------------------------------*/{/* 这个例程写八个串行位* / int一部分公司,x;(公司= 0;公司& lt;8;{if(mode) /* ROM: /WE (A2) /CE和/OE拨低至写入*/{if(data &0x01) /*数据位输入(D)在A0 */x = WR1ADDR;/* A0 (D)为高,A2 (WE)和OEare为低*/elsex = WR0ADDR;/* A0 (D)为低电平,A2 (WE)和OE为低电平*/ data >>= 1;}else /* RAM: /WE和/CE为低电平写*/{WRADDR = (data &1);/ *写DQ0 * / dat祝辞祝辞= 1;ds1216_rd}}}空白 /* -------- 1216年读清债信托公司 ---------- */{ int公司;ds1216_close ;/*确保RTC未处于访问模式*/ds1216_open ;/*现在发送协议打开RTC */printf("\n");for(inc = 0;公司& lt;8;公司+ +){printf (" % bx”,rbyte );} printf (" \ n ");} ds1216_wr无效 /* -------- 时间/日期信息写入1216清债信托公司 ------ */{ ds1216_close ;/*确保RTC未处于访问模式*/ds1216_open ;/*现在发送协议打开RTC */wbyte(0);/* 100秒*/wbyte(秒);/* seconds */wbyte(min);/* minutes */wbyte(hr);/* HRS */wbyte(dy);/* day */wbyte(dt);/* date */wbyte(mn);/* month */wbyte(yr);/ *年* /}无效的条目 /* -------- 时间/日期信息加载到时钟 ------- */{ printf(" \今年整体(0 - 99):”);scanf(“% bx和年);printf(" \、月(1 - 12):”);scanf(“% bx和mn); printf(" \、日期(日至31日):”);scanf(“% bx”,和dt); printf(" \、天(1 - 7):“);scanf(“% bx”,及dy); dy = dy | 0 x10;/*确保_RST位高*/printf("\nEnter the hour (1-24): ");scanf("%bx", &hr);/* hr = hr &0 x3f;/*强制时钟到24小时模式*/printf("\nEnter分钟(0-59):");scanf("%bx", &min);printf("\nEnter秒(0-59):");scanf("%bx", &sec);}void test /* -------循环读取和显示每秒一次------- */{int prv_sec = 0x99, inc;while(!RI) /*读取&*/{ds1216_close ;ds1216_open ;/*抛出小数秒*/sec = rbyte ;/*从DS2250t上的RTC获取时间*/min = rbyte ;hr = rbyte ;dy = rbyte ;dt = rbyte ;mn = rbyte ;yr = rbyte ;if(sec != prv_sec) /*显示每次秒的变化*/{printf("\n yr Mon Dte Day hr: mn: sec ");printf("\n %02. 0 ")。bX % 02。bX % 02。bX % 02。" %02.bX:%02.bX:%02. bX", yr, mn, dt, dy);}prv_sec = sec;}RI = 0;/ *吞下键盘按键退出循环* / int主要(空白 ) /*-------------------------------------------------------*/{ uchar M, / *条目,时钟可以开放访问。如果在64位模式匹配完成后立即关闭电源,则可能发生这种情况。在启动时,接下来的64位将被定向到时钟而不是RAM。为了避免向时钟写入垃圾,应该读取前64个RAM访问。 * / ds1216_close ;/*确保我们还没有进入时钟*/while(1){printf("DS1216 Demo build 109 Mode = ");if(Mode)printf("ROM");elseprintf("RAM");printf("\n(T)oggle RAM/ROM Mode (I)nit clock (R) read clock (L)oopread");printf("\n:");M = _getkey ;printf("%c",M);switch(M){case 'I':case 'I': entry ;ds1216_wr ;case 'L':case 'L': test ;case 'R':case 'R': ds1216_rd ;打破;案例“T”:“T”:printf (" \ n1 = ROM, 0 = RAM:”);scanf(“% bx和模式);打破;}}}
上一篇:精密电路监测负电源阈值的技术方案
社群二维码
关注“华强商城“微信公众号
Copyright 2010-2023 hqbuy.com,Inc.All right reserved. 服务热线:400-830-6691 粤ICP备05106676号 经营许可证:粤B2-20210308