要:该应用笔记演示了max6901与8051微控制器的连接方式,并提供了基本的接口程序例程。本文采用的微控制器是ds2250,软件用c语言编写。
max6901引脚配置
概述该应用笔记演示了max6901与8051微控制器的连接方式,并提供了基本的接口程序例程。本文采用的微控制器是ds2250,软件用c语言编写。
工作原理该程序利用微控制器的三个通用端口引脚控制3线总线。微控制器向max6901发送一个命令/地址字节,启动数据传输。随后,微控制器向max6901发送其它字节或提供sclk,根据命令字节发送或接收数据。
电路原理图如图1所示,软件如图2所示。
图1. 子卡原理图(pdf下载)
图2. 代码列表 /***************************************************************************/
/* demo6901.c */
/***************************************************************************/
/* #pragma code symbols debug */
#include /* prototypes for i/o functions */
#include /* register declarations for ds5000 */
/***************************** defines ********************************/
sbit ce = p0^0;
sbit sclk = p0^1;
sbit io = p0^2;
/*********************** function prototypes **************************/
void writebyte();
void initialize();
void disp_clk_regs();
void burstramread();
void burstramwrt();
/************************* global variables ***************************/
uchar cy, yr, mn, dt, dy, hr, min, sec, msec;
void reset_3w() /* ---- reset the 3-wire interface ---- */
{
sclk = 0;
ce = 0;
io = 0; /* program io pin to 0v */
}
void wbyte_3w(uchar w_byte) /* --- write one byte to the dut --- */
{
uchar i;
ce = 1;
for(i = 0; i >= 1;
}
}
uchar rbyte_3w() /* --- read one byte from the dut --- */
{
uchar i;
uchar r_byte = 0;
ce = 1;
io = 1;
for(i=0; i>= 1;
r_byte += 0x80;
}
else
r_byte >>= 1;
}
return r_byte;
}
void writebyte() /* ----- write one byte, prompt for address and data ------ */
{
uchar add;
uchar dat;
/* get address & data */
printf(
enter the write address (h)
address (80,82,84...):);
scanf(%bx, &add);
printf(data (0-ff):);
scanf(%bx, &dat);
reset_3w();
wbyte_3w(add);
wbyte_3w(dat);
reset_3w();
}
void initialize() /* ----- init clock data using user entries ----- */
/* note: no error checking is done on the user entries! */
{
reset_3w();
wbyte_3w(0x0f); /* control register write address */
wbyte_3w(0x00); /* clear write protect */
reset_3w();
printf(
enter 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);
reset_3w();
wbyte_3w(0xbe); /* clock burst write */
wbyte_3w(sec);
wbyte_3w(min);
wbyte_3w(hr);
wbyte_3w(dt);
wbyte_3w(mn);
wbyte_3w(dy);
wbyte_3w(yr);
wbyte_3w(0); /* control */
reset_3w();
wbyte_3w(0x92);
wbyte_3w(0x20); /* century data */
reset_3w();
}
void disp_clk_regs() /* --- loop reading clock, display when secs change --- */
{
uchar mil, pm, prv_sec = 99;
while(!ri) /* read & display clock registers */
{
reset_3w();
wbyte_3w(0xbf); /* clock burst read */
sec = rbyte_3w();
min = rbyte_3w();
hr = rbyte_3w();
dt = rbyte_3w();
mn = rbyte_3w();
dy = rbyte_3w();
yr = rbyte_3w();
cy = rbyte_3w(); /* dummy read of control register */
reset_3w();
wbyte_3w(0x93); /* century byte read address */
cy = rbyte_3w();
reset_3w();
if(hr & 0x80)
mil = 0;
else
mil = 1;
if(sec != prv_sec) /* display every time seconds change */
{
if(mil)
{
printf(
%02bx%02bx/%02bx/%02bx %01bx, cy, yr, mn, dt, dy);
printf( %02bx:%02bx:%02bx, hr, min, sec);
}
else
{
if(hr & 0x20)
pm = 'p';
else
pm = 'a';
hr &= 0x1f; /* strip mode and am/pm bits */
printf(
%02bx%02bx/%02bx/%02bx %02bx, cy, yr, (mn & 0x1f), dt, dy);
printf( %02bx:%02bx:%02bx %cm, hr, min, sec, pm);
}
}
prv_sec = sec;
}
ri = 0; /* swallow keypress to exit loop */
}
void burstramread() /* ------ read ram using burst mode ----- */
{
uchar k;
printf(
max6901 ram contents:
);
reset_3w();
wbyte_3w(0xff); /* ram burst read */
for (k = 0; k < 31; k++)
{
if(!(k % 8) ) printf(
);
printf(%02.bx , rbyte_3w() );
}
reset_3w();
}
void burstramwrt(uchar data) /* ------ write ram using burst mode ------- */
{
uchar j, k;
reset_3w();
wbyte_3w(0xfe); /* ram burst write */
for (k=0; k < 31; ++k)
{
wbyte_3w(data);
}
reset_3w();
}
main (void) /* ----------------------------------------------------- */
{
uchar i, m, m1;
while (1)
{
printf(
max6901 build %s
, __date__);
printf(ci clock init
);
printf(cr clock read cw clock write
);
printf(rr read ram rw ram write
);
printf(enter menu selection: );
m = _getkey();
switch(m)
{
case 'c':
case 'c':
printf(\renter clock routine to run:c);
m1 = _getkey();
switch(m1)
{
case 'i':
case 'i': initialize();
break;
case 'r':
case 'r': disp_clk_regs();
break;
case 'w':
case 'w': writebyte();
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(
enter the data to write: );
scanf(%bx, &i);
burstramwrt(i); break;
}
break;
}
}
}
电磁流量计送检时应注意哪些事项
通信知识科普
Supermicro推出搭载跨多产品系列的EDSFF E3.S和E1.S存储驱动器的All-Flash服务器,进一步扩展密集型I/O工作负载专用
中国科学家发明可用于海上生存或孤岛生存的太阳能海水淡化装置
快速晶闸管在加速器电源系统中的应用
MAX6901 RTC与8051微控制器的接口
奢侈腕表品牌豪雅表将推出豪华的Android智能手表,售价3,500英镑
Llama2的技术细节探讨分析
透过工业4.0了解工业栈与软件栈的不同
可控硅可以控制直流吗
3D打印贴面微透镜可克服光子封装的挑战
人机交互中自由立体显示系统的作用
紫光打造国家级半导体产业舰队
小米MIUI 10系统推出稳定版,获用户称赞
富士康的员工只有66.7万,仅1年时间便减少了约14万员工
基于区块链技术的拜占庭容错共识协议Kadena介绍
变压器绕组的作用
3Giphone、iphone、iphone 3GS故障分析
联想Z5s采用了挖孔屏设计搭配了后置三摄像头和指纹解锁键
5G即将正式商用,这些知识得先了解清楚