请教各位大虾:我在调试一个时钟程序,是ds1302;现在遇到的问题是:我设置到少时间再读出时还是多少时间,也就是时钟没有走动;芯片是刚买的.一直不知道是那里出问题了.请各位帮帮忙.程序如下: /*********************************************************************/ /* 实时时钟模块 时钟芯片型号:DS1302 */ /*/ /*********************************************************************/ #include <reg52.h> //#include <instring.h> #define uchar unsigned char #define uint unsigned int sbit CLK = P0^4; /*实时时钟时钟线引脚 */ sbit IO = P0^5; /*实时时钟数据线引脚 */ sbit RST = P0^6; /*实时时钟复位线引脚 */ sbit ACC0=ACC^0; sbit ACC7=ACC^7; sbit p20=P2^0; sbit p21=P2^1; sbit p22=P2^2; sbit p23=P2^3; sbit p24=P2^4; sbit p25=P2^5; sbit p26=P2^6; sbit p27=P2^7; //---------------------------------------- uchar coding[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar set_time[7]={0x00,0x50,0x08,0x02,0x04,0x05,0x08};
/******************************************************************** * * 名称: write_byte * 说明: * 功能: 往DS1302写入1Byte数据 * 调用: * 输入: ucDa 写入的数据 * 返回值: 无 ***********************************************************************/ void write_byte(uchar ucDa) { uchar i; ACC = ucDa; for(i=8; i>0; i--) { IO = ACC0; /*相当于汇编中的 RRC */ CLK = 1; CLK = 0; ACC = ACC >> 1; } } /******************************************************************** * * 名称: uchar read_byte * 说明: * 功能: 从DS1302读取1Byte数据 * 调用: * 输入: * 返回值: ACC ***********************************************************************/ uchar read_byte(void) { uchar i; for(i=8; i>0; i--) { ACC = ACC >>1; /*相当于汇编中的 RRC */ ACC7 = IO; CLK = 1; CLK = 0; } return(ACC); } /******************************************************************** * * 名称: write_data * 说明: 先写地址,后写命令/数据 * 功能: 往DS1302写入数据 * 调用: write_byte() * 输入: ucAddr: DS1302地址, ucDa: 要写的数据 * 返回值: 无 ***********************************************************************/ void write_data(uchar ucAddr, uchar ucDa) { RST = 0; CLK = 0; RST = 1; write_byte(ucAddr); /* 地址,命令 */ write_byte(ucDa); /* 写1Byte数据*/ CLK = 1; RST =0; } /******************************************************************** * * 名称: read_data * 说明: 先写地址,后读命令/数据 * 功能: 读取DS1302某地址的数据 * 调用: write_byte() , read_byte() * 输入: ucAddr: DS1302地址 * 返回值: ucDa :读取的数据 ***********************************************************************/ uchar read_data(uchar ucAddr) { uchar ucDa; RST = 0; CLK = 0; RST = 1; write_byte(ucAddr); /* 地址,命令 */ ucDa = read_byte(); /* 读1Byte数据 */ CLK = 1; RST =0; return(ucDa); } /******************************************************************** * * 名称: write_data_bytes * 说明: 先写地址,后写数据(时钟多字节方式) * 功能: 往DS1302写入时钟数据(多字节方式) * 调用: write_byte() * 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制 * 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B * 返回值: 无 ***********************************************************************/ void write_data_bytes(uchar *pSecDa) { uchar i; write_data(0x8e,0x00); /* 控制命令,WP=0,写操作?*/ RST = 0; CLK = 0; RST = 1; write_byte(0xbe); /* 0xbe:时钟多字节写命令 */ for (i=8;i>0;i--) /*8Byte = 7Byte 时钟数据 1Byte 控制*/ { write_byte(*pSecDa);/* 写1Byte数据*/ pSecDa++; } CLK = 1; RST =0; } /******************************************************************** * * 名称: read_data_bytes * 说明: 先写地址,后读命令/数据(时钟多字节方式) * 功能: 读取DS1302时钟数据 * 调用: write_byte() , read_byte() * 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B * 返回值: ucDa :读取的数据 ***********************************************************************/ void read_data_bytes(uchar *pSecDa) { uchar i; RST = 0; CLK = 0; RST = 1; write_byte(0xbf); /* 0xbf:时钟多字节读命令 */ for (i=8; i>0; i--) { *pSecDa = read_byte(); /* 读1Byte数据 */ pSecDa++ ; } CLK = 1; RST =0; } /******************************************************************** * * 名称: write_rom_bytes * 说明: 先写地址,后写数据(寄存器多字节方式) * 功能: 往DS1302寄存器数写入数据(多字节方式) * 调用: write_byte() * 输入: pReDa: 寄存器数据地址 * 返回值: 无 ***********************************************************************/ void write_rom_bytes(uchar *pReDa) { uchar i; write_data(0x8e,0x00); /* 控制命令,WP=0,写操作?*/ RST = 0; CLK = 0; RST = 1; write_byte(0xfe); /* 0xfe:ROM多字节写命令 */ for (i=31;i>0;i--) /*31Byte 寄存器数据 */ { write_byte(*pReDa); /* 写1Byte数据*/ pReDa++ ; } CLK = 1; RST =0; } /******************************************************************** * * 名称: read_rom_bytes * 说明: 先写地址,后读命令/数据(寄存器多字节方式) * 功能: 读取DS1302寄存器数据 * 调用: write_byte() , read_byte() * 输入: pReDa: 寄存器数据地址 * 返回值: 无 ***********************************************************************/ void read_rom_bytes(uchar *pReDa) { uchar i; RST = 0; CLK = 0; RST = 1; write_byte(0xff); /* 0xff:ROM多字节读命令 */ for (i=31; i>0; i--) /*31Byte 寄存器数据 */ { *pReDa = read_byte(); /* 读1Byte数据 */ pReDa++ ; } CLK = 1; RST =0; } /******************************************************************** * * 名称: v_Set1302 * 说明: * 功能: 设置初始时间 * 调用: write_data() * 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B * 返回值: 无 ***********************************************************************/ void v_Set1302(uchar *pSecDa) { uchar i; uchar ucAddr = 0x80; write_data(0x8e,0x00); /* 控制命令,WP=0,写操作?*/ for(i =7;i>0;i--) { write_data(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */ pSecDa++; ucAddr+=2; } write_data(0x8e,0x80); /* 控制命令,WP=1,写保护?*/ } /******************************************************************** * * 名称: v_Get1302 * 说明: * 功能: 读取DS1302当前时间 * 调用: read_data() * 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B * 返回值: 无 ***********************************************************************/ void v_Get1302(uchar ucCurtime[]) { uchar i; uchar ucAddr = 0x81; for (i=0;i<7;i++) { ucCurtime = read_data(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */ ucAddr+=2; } }
void delay() {uint i,j; for(i=0;i<1000;i++) { for(j=0;j<40;j++){} } }
// 延时总时间=cnt*16+24us----------------------------------- void delay1(unsigned int cnt) { for(;cnt>0;cnt--); } //----------------------------------------------------------
void main() { uchar get_time[7]; v_Set1302(set_time); write_data(0x8e,0x0);
v_Get1302(get_time); do{ p20=0; P1=coding[get_time][1]&0x0f]; delay1(312); p20=1; p21=0; P1=coding[(get_time][1]>>4)&0x0f]; delay1(312); p21=1; }while(1); } |