当前位置:首页 > 毕业设计(论文)-基于AT89S51单片机的教室灯光智能控制系统设计
3.3.1数据输入输出
在对DS1302进行各种操作之前,必须先对其初始化,即需要把复位输入RST端置为高电平,如果RST输入为低电平,那么所有的数据传送中止,且I/O引脚变为高阻抗状态。在数据读/写完后,RST端应置成低电平,以防止外部干扰对DS1302内部时钟的影响。
同时,为了防止复位输入端受到外部的干扰,要求上电时,在主电源引脚Vcc2≥2.5V之前,RST必须为逻辑0。无论是读操作还是写操作,都必须在开头的8个时钟周期内把提供地址和命令信息的8位数据装入到DS1302的移位寄存器中。地址/命令信息用于指明40个寄存器中的哪个进行何种操作。数据在SCLK的上升沿串行输入,在开始的8个时钟周期把命令字装入移位寄存器之后,若跟随的是写命令字节,则在下8个SCLK周期的上升沿输入数据字节,若跟随在读命令字节的8个SCLK周期之后,在下8个SCLK周期的下降沿输出数据字节。程序流程如图3-3所示:
15
图3-3数据输入输出流程图
3.3.2时钟程序设计
驱动程序 //寄存器宏定义
#define WRITE_SECOND 0x80 #define WRITE_MINUTE 0x82 #define WRITE_HOUR 0x84 #define READ_SECOND 0x81 #define READ_MINUTE 0x83 #define READ_HOUR 0x85 #define WRITE_PROTECT 0x8E
16
//位寻址寄存器定义
sbit ACC_7 = ACC^7; //管脚定义
sbit SCLK = P3^5; // DS1302时钟信号 7脚 sbit DIO= P3^6; // DS1302数据信号 6脚 sbit CE = P3^7; // DS1302片选 5脚 //地址、数据发送子程序
void Write1302 ( unsigned char addr,dat ) {
unsigned char i,temp;
CE=0; //CE引脚为低电平,数据传送中止 SCLK=0; //清零时钟总线
CE = 1; //CE引脚为高电平,逻辑控制有效 //发送地址
for ( i=8; i>0; i-- ) //循环8次移位 {
SCLK = 0; temp = addr;
DIO = (bit)(temp&0x01); //每次传输低字节 addr >>= 1; //右移一位 SCLK = 1; } //发送数据
for ( i=8; i>0; i-- ) {
SCLK = 0; temp = dat;
DIO = (bit)(temp&0x01);
17
dat >>= 1; SCLK = 1; } CE = 0; }
//数据读取子程序
unsigned char Read1302 ( unsigned char addr ) {
unsigned char i,temp,dat1,dat2; CE=0; SCLK=0; CE = 1; //发送地址
for ( i=8; i>0; i-- ) //循环8次移位 {
SCLK = 0; temp = addr;
DIO = (bit)(temp&0x01); //每次传输低字节 addr >>= 1; //右移一位 SCLK = 1; }
//读取数据
for ( i=8; i>0; i-- ) {
ACC_7=DIO; SCLK = 1; ACC>>=1;
18
共分享92篇相关文档