MAX6901 RTC与8051微控制器的接口

要:该应用笔记演示了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即将正式商用,这些知识得先了解清楚