MAX6900 RTC与8051位控制器的连接

发布者:达文西happy最新更新时间:2023-10-26 来源: elecfans关键字:RTC  位控制器 手机看文章 扫描二维码
随时随地手机看文章

说明

本应用笔迹介绍了MAX6900 I²C兼容RTC (实时时钟)与8051微控制器(µC)之间的连接方式,并提供了用于基本接口的程序代码。本范例中所使用的微控制器是DS2250, 软件用C语言编写。


操作过程

本程序利用作为I²C总线主机的微控制器的两个通用端口进行控制,MAX6900则作为同一总线上的从机器件。

电路原理图如图1所示,程序清单如图2所示。

图1. 子卡原理图
图1. 子卡原理图


图2. 程序清单

/***************************************************************************/

/* DEMO6900.c                                                              */

/***************************************************************************/

/* This program is for example only and is not supported by Dallas Maxim   */

#include /* Prototypes for I/O functions     */

#include /* Register declarations for DS5000 */

#define ACK 0

#define NACK 1

#define ADD6900 0xa0 /* 2-wire addresses */

sbit scl = P0^0;        /* 2-wire pin definitions  */

sbit sda = P0^1;

void I2Cstart();

void I2Cstop();

uchar I2Cwrite(uchar);

unsigned char I2Cread(int);

void writebyte6900();

void Initialize_MAX6900();

void disp_clk_regs();

void burstramread();

void burstramwrt();

/* global variables */


void I2Cstart() /* ----------------------------------------------- */

{

sda = 1; /* Initiate start condition */

scl = 1;

sda = 0;

}

void I2Cstop() /* ----------------------------------------------- */

{

sda = 0; sda = 0; /* Initiate stop condition */

scl = 1; scl = 1;

sda = 1;

}

uchar I2Cwrite(uchar d) /* ----------------------------- */

{

  int i;


  scl = 0;

for (i = 0;i < 8; i++)

{

if (d & 0x80)

sda = 1; /* Send the msbits first */

else

sda = 0;

scl = 0;

scl = 1;

d = d < 1; /* add to scl high time */

scl = 0;

}

sda = 1; /* Release the sda line */

scl = 0;

scl = 1;

i = sda;

scl = 0;

if (i)

{

puts("Ack missing");

}

return(i);

}

uchar I2Cread(int b) /* ----------------------------------- */

{

uchar i, d;


d = 0;

sda = 1; /* Let go of sda line */

for (i=1; i<=8; i++) /* read the msb first */

{

scl = 0;

scl = 1;

d = d << 1;

d = d | (unsigned char)sda;

}

scl = 0;

sda = b;          /* Hold sda low for ACK, high for NACK */


scl = 0; /* toggle clock */

scl = 1;

scl = 0;


sda = 1; /* Release the sda line */

return d;

}

void writebyte6900() /* ----- write a single byte; user enters read address ----- */

{

uchar add;

uchar dat;

/* Get Address & Data */

printf("nEnter the Read AddressnADDRESS (80,82,84...FC): ");

scanf("%bx", &add);

printf("DATA (0-ff):");

scanf("%bx", &dat);


I2Cstart();

I2Cwrite(ADD6900); /* slave address + write */

I2Cwrite(add);

I2Cwrite(dat);

I2Cstop();

}

void Initialize_MAX6900() /* ------- initialize from stdio entries ------- */

/* Note: NO error checking is done on the user entries! */

{

uchar yr, mn, dt, dy, hr, min, sec, day;


I2Cstart();

I2Cwrite(ADD6900); /* slave address + write */

I2Cwrite(0x8e); /* control register write address */

I2Cwrite(0x00); /* clear write protect */

I2Cstop();


printf("nEnter the year (0-99): ");

scanf("%bx", &yr);

printf("Enter the month (1-12): ");

scanf("%bx", &mn);

printf("Enter the date (1-31): ");

scanf("%bx", &dt);

printf("Enter the day (1-7): ");

scanf("%bx", &dy);

printf("Enter the hour (1-23): ");

scanf("%bx", &hr);

hr = hr & 0x3f; /* force clock to 24 hour mode */

printf("Enter the minute (0-59): ");

scanf("%bx", &min);

printf("Enter the second (0-59): ");

scanf("%bx", &sec);


I2Cstart();

I2Cwrite(ADD6900); /* slave address + write */

I2Cwrite(0xbe); /* clock burst write */

I2Cwrite(sec);

I2Cwrite(min);

I2Cwrite(hr);

I2Cwrite(dt);

I2Cwrite(mn);

I2Cwrite(dy);

I2Cwrite(yr);

I2Cwrite(0); /* control */

I2Cstart();

I2Cwrite(ADD6900); /* slave address + write */

I2Cwrite(0x92);

I2Cwrite(0x20); /* century data */

I2Cstop();

}

void disp_clk_regs() /* --------- display using burst mode --------- */

{

uchar Sec, prv_sec = 99, Min, Hrs, Dte, Mon, Day, Yr, cy;


while(!RI) /* Read & Display Clock Registers */

{

I2Cstart();

I2Cwrite(ADD6900); /* slave address + write */

I2Cwrite(0xbf); /* clock burst read */

I2Cstart();

I2Cwrite(ADD6900 + 1); /* slave address + read */

Sec = I2Cread(ACK); /* starts w/last address stored in register pointer */

Min = I2Cread(ACK);

Hrs = I2Cread(ACK);

Dte = I2Cread(ACK);

Mon = I2Cread(ACK);

Day = I2Cread(ACK);

Yr  = I2Cread(ACK);

cy  = I2Cread(NACK); /* dummy read of control register */

I2Cstart();

I2Cwrite(ADD6900); /* slave address + write */

I2Cwrite(0x93); /* century byte read address */

I2Cstart();

I2Cwrite(ADD6900 + 1); /* slave address + read */

cy  = I2Cread(NACK);

I2Cstop();


if(Sec != prv_sec) /* display every time seconds change */

{

printf("n%02bX%02bX/%02bX/%02bX %01bX", cy, Yr, Mon, Dte, Day);

printf(" %02bX:%02bX:%02bX", Hrs, Min, Sec);

}

prv_sec = Sec;

}

   RI = 0;  /* Swallow keypress to exit loop */

}

void burstramread() /* ----------------------------------------- */

{

uchar j, k;


I2Cstart();

I2Cwrite(ADD6900); /* write slave address, write 6900 */

I2Cwrite(0xff); /* ram burst read */

I2Cstart();

I2Cwrite(ADD6900 + 1); /* slave address + read */

printf("nRAM contents");

      for (j=0; j<30; ++j)

{

if(!(j % 8) ) printf("n");

printf("%2.bX ", I2Cread(ACK) );

}

printf("%2bX", I2Cread(NACK) ); /* last byte, NACK */

I2Cstop();

printf("n");

}

void burstramwrt(uchar Data) /* ----------------------------------------- */

{

uchar j, k;


I2Cstart();

I2Cwrite(ADD6900); /* write slave address, write 6900 */

I2Cwrite(0xfe); /* ram burst write */

for (k=0; k < 31; ++k)

{

I2Cwrite(Data);

}

I2Cstop();

}

main (void) /* ----------------------------------------------------- */

{

uchar i, M, M1;


while (1)

printf("nMAX6900 build %sn", __DATE__);

printf("CI Clock Initn");

printf("CR Clock Read BW Byte Writen");

printf("RR RAM Read   RW RAM Writen");

printf("Enter Menu Selection: ");


M = _getkey();


switch(M) 

{

case 'B':

case 'b':

printf("rByte: B");

M1 = _getkey();


switch(M1) 

{

case 'W':

case 'w': writebyte6900(); 

break;

} break;


case 'C':

case 'c':

printf("rEnter Clock Routine to run:C");

M1 = _getkey();


switch(M1) 

{

case 'I':

case 'i': Initialize_MAX6900();

break;


case 'R':

case 'r': disp_clk_regs();

      break;

} break;


case 'R':

case 'r':

printf("rEnter Ram Routine to run:R");

M1 = _getkey();


switch(M1) 

{

case 'R':

case 'r': burstramread();

break;

case 'W':

case 'w': printf("nEnter the data to write: ");

scanf("%bx", &i);

burstramwrt(i); break;

} break;

}

}

}


关键字:RTC  位控制器 引用地址:MAX6900 RTC与8051位控制器的连接

上一篇:8051微控制器架构的简要说明
下一篇:如何使用8051单片机控制双向直流电机

推荐阅读最新更新时间:2024-10-30 17:01

基于C8051F020的实时检测和车辆散热系统参数测试
   1 引言   车辆的系统散热性是衡量其先进性的一个重要标志,因为车辆的各个部件和系统都存在一个最佳的工作温度区间,在此温度范围内零部件的各项性能指标才能得以保证。目前,我国车辆系统的研制已进入自行研制、自主创新的发展阶段,由于缺乏实车试验测试条件,加上车辆工作环境的复杂性,导致有效的实车试验数据严重缺乏,试验周期长,数据可复现性差,无法向工程设计部门提供准确有效的实车试验数据,严重影响车辆总体技术的进一步发展。因此,本文着重于在不改变车辆现有结构和性能的前提下,采用单片机控制系统、传感器技术、数据存储技术、实时时钟技术,研制一套能实时检测和记录车辆散热系统动态参数的电子电路。    2 系统总体构架设计   该散热系统
[单片机]
基于C<font color='red'>8051</font>F020的实时检测和车辆散热系统参数测试
TI推出F2837x系列的最新C2000 Delfino32F2837xD微控制器
近日,德州仪器 (TI) 宣布推出F2837x系列的最新 C2000™ Delfino™ 32 位 F2837xD 微控制器 (MCU),为工业实时控制实现最新创新,并设定了全新性能标准。这些最新 MCU 支持双核 C28x 处理功能与双实时控制加速器(也称为控制律加速器或 CLA),可提供 800 MIPS 浮点性能,从而可帮助设计人员为计算要求严格的控制应用开发低时延系统。此外,设计人员还可通过将多个嵌入式处理器整合在单个 MCU 中以降低复杂性,充分满足高级伺服驱动器、太阳能中央逆变器以及工业不间断电源 (UPS) 等需要实时信号分析的应用需求。 客户可通过采用强大片上集成模拟外设的 Delfino F2837xD MCU 同
[单片机]
18位AD7674与C8051F060之间并口通信的接口电路设计
AD7674能提供3种不同转换速率工作方式,以便对不同的具体应用优化性能。这3种工作模式如下:WARP,允许采样率高达800 kHz。然而在这种模式下只有当转换之间的时间不超过1ms 时,才能保证其转换的精度。如果连续两次转换之间的时间大于1 ms,第一次转换的结果就会被忽略,这种模式适合于要求快速采样率的应用。NORMAL,这种模式的采样率为666 kHz,在这种模式下对采样转换之间的时间没有限制,既可保证高的转换精度又可确保快速的采样速率。IMPULSE,一种低功耗模式,其采样率为570 kHz。 只用1块C8051F060芯片即可完成单片机8051的各种控制,多路A/D 转换和D/A 转换,I2C、SPI 数据总线传输,
[单片机]
18位AD7674与C<font color='red'>8051</font>F060之间并口通信的接口电路设计
基于C8051F和Zigbee无线网络的汽车测试系统设计
要:以C8051F020为核心处理器,设计无线传感器网络数据采集系统。系统采用SZ05-ADV型无线通讯模块组建Zigbee无线网络,结合嵌入式系统的软硬件技术,完成终端节点的8路传感器信号的数据采集。现场8路信号通过前端处理后,分别送入C8051F020的12位A/D转换器进行转换。经过精确处理、存储后的现场数据。通过Zigbee无线网络传送到上位机,系统可达到汽车试验中无线测试的目的。 关键词:Zigbee;无线网络;C8051F020;嵌入式系统 汽车试验是发现汽车设计开发中各种问题的重要手段,依据试验结果能对汽车各种性能做出客观的评价。作为汽车工业的基础工程之一,汽车试验在汽车工业的整体发展中发挥了重要作用。汽车性能测试
[单片机]
基于C<font color='red'>8051</font>F和Zigbee无线网络的汽车测试系统设计
基于C8051F005单片机的小电阻测试仪设计
在电路测试过程中常常会碰到由于忽略某些小电阻的影响引起实验数据与理论值之间存在较大误差,从而影响测试效果。例如电感器、变压器中往往存在铜电阻,地铁铁轨的电阻;由于其数值较小,一般的指针万用表无法测量出来;通常实验室里会用电桥进行测量,但电桥操作手续较烦,又不能直接读出被测电阻阻值。鉴于此,我们采用了单片机,利用单片机的优势设计了该测量仪。该测量仪可直接从LCD显示屏上读出所测得的电阻值,测量范围为10μΩ~2.9999kΩ,同时可以把测试的数据进行储存,然后经串行口送入上位机,通过上位机的强大功能,可以对所测得的数据进行分析、处理。该测试仪的测量精度高达±0.1%,并采用四端测量法,电阻值不受引线长短及接触电阻的影响。不仅测
[单片机]
基于C<font color='red'>8051</font>F005单片机的小电阻测试仪设计
C8051FXXX单片机FLASH程序的自动升级
作者Email: wolfman6353@sina.com 引言: C8051FXXX系列高速SOC单片机是由美国Cygnal公司开发的完全集成的混合信号系统级芯片,具有与8051兼容的微处理器内核,内部集成FLASH程序存储器,具有在系统重新编程能力,以C8051F020为例,内部集成64K的FLASH程序存储器。在系统控制软件的开发调试阶段,可用集成开发环境来下载及测试系统,但当将C8051F020目标系统集成到产品后,则由于操作系统及软硬件接口不一样等等原因,不能在最终产品中用集成开发环境来下载FLASH程序,故产品到了用户处之后,如要再进行FLASH程序的更新,则必须更换相应的集成电路印刷板,造成很多麻烦及不可靠因素。
[应用]
基于C8051F320 USB接口的数据采集存储电路
摘要: 介绍采用C8051F320 SOC与AM45DB321构成数据采集存储系统的设计方案。 关键词: 数据采集;USB接口;存储电路;SOC 在一些特殊的工业场合,有时需要将传感器的信号不断的实时采集和存储起来,并且到一定时间再把数据回放到PC机中进行分析和处理。在工作环境恶劣的情况下采用高性能的单片机和工业级大容量的FLASH存储器的方案恐怕就是最适当的选择了。CYGNAL公司的C8051F320 SOC是一种具有8051内核的高性能单片机,运行速度为普通8051的12倍。该芯片内部528字节随机RAM和2048字节XRAM为数据缓冲和程序运行提供了充足的空间。更受欢迎的是它的串行扩展功能为当前的各种串行芯片和外部设备接
[缓冲存储]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved