当前位置: 代码迷 >> 单片机 >> 增强型的51单片机驱动不了ds1302,普通的却行,求原因,该如何处理
  详细解决方案

增强型的51单片机驱动不了ds1302,普通的却行,求原因,该如何处理

热度:49   发布时间:2016-04-28 15:55:40.0
增强型的51单片机驱动不了ds1302,普通的却行,求原因
代码以下,如果说是时序的问题,那么该在哪里该时序??
C/C++ code
//寄存器宏定义sbit DS1302_SCLK=P0^5;sbit DS1302_IO=P0^6;sbit DS1302_RST=P0^7;//sbit DS1302_SCLK=P3^5;//sbit DS1302_IO=P3^6;//sbit DS1302_RST=P3^7;#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//1.将数据写入DS1302// 名称: v_RTInputByte// 说明:// 功能: 往DS1302 写入1Byte 数据// 调用:// 输入: dat 写入的数据// 返回值: 无void T_delay(){    _nop_();_nop_();}void v_RTInputByte(unsigned char ucdat){    unsigned char i;    unsigned char k;    for(i=8;i>0;i--)    {        DS1302_SCLK = 0;//        for(k=4;k>0;k--)        T_delay();        DS1302_IO = (bit)(ucdat & 0x01); /*相当于汇编中的 RRC */        ucdat >>= 1;        DS1302_SCLK = 1;        for(k=4;k>0;k--)        T_delay();    }}//2.读取DS1302 中的数据// 名称: uchar uc_RTOutputByte// 说明:// 功能: 从DS1302 读取1Byte 数据// 调用:// 输入:// 返回值: datunsigned char uc_RTOutputByte(void){    unsigned char i;    unsigned char k;    unsigned char ucdat=0;    for(i=8;i>0;i--)    {        //DS1302_IO=1;        DS1302_SCLK = 0;        //for(k=4;k>0;k--)        T_delay();        ucdat >>= 1; /*相当于汇编中的 RRC */        if(DS1302_IO) ucdat|=0x80;        DS1302_SCLK = 1;        //for(k=4;k>0;k--)        T_delay();    }    return(ucdat);}//3.往DS1302 写入数据// 名称: v_W1302// 说明: 先写地址,后写命令/数据// 功能: 往DS1302 写入数据// 调用: v_RTInputByte()// 输入: address: DS1302 地址, dat: 要写的数据// 返回值: 无void v_W1302(unsigned char address, unsigned char ucdat){    DS1302_RST = 0;    DS1302_SCLK = 0;    DS1302_RST = 1;    v_RTInputByte(address); /* 地址,命令 */    v_RTInputByte(ucdat); /* 写1Byte 数据*/    //DS1302_SCLK = 1;    _nop_();_nop_();    DS1302_RST =0;}//4.读取DS1302 某地址的数据// 名称: uc_R1302// 说明: 先写地址,后读命令/数据// 功能: 读取DS1302 某地址的数据// 调用: v_RTInputByte() , uc_RTOutputByte()// 输入: ucAddress: DS1302 地址// 返回值: ucData :读取的数据unsigned char uc_R1302(unsigned char address){    unsigned char ucdat;    DS1302_SCLK=0;    DS1302_IO=0;    DS1302_RST=0;    DS1302_RST=1;    v_RTInputByte(address); /* 地址,命令 */    ucdat = uc_RTOutputByte(); /* 读1Byte 数据 */    DS1302_SCLK = 1;    DS1302_RST =0;    return(ucdat);}//5.设置初始时间// 名称: v_Set1302// 说明:// 功能: 设置初始时间// 调用: v_W1302()// 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年// 7Byte (BCD 码) 1B 1B 1B 1B 1B 1B 1B// 返回值: 无void v_Set1302(unsigned char address,unsigned char *p1302,unsigned char n){    unsigned char i;    unsigned char TempData;    v_W1302(WRITE_PROTECT,0x00); /* 控制命令,WP=0,写操作?*/    for(i=0;i<n;i++)    {        TempData=*p1302;        TempData=((TempData/10)<<4)+(TempData%10);        v_W1302(address,TempData); /* 秒 分 时 日 月 星期 年 */        p1302++;        address+=2;    }    v_W1302(WRITE_PROTECT,0x80); /* 控制命令,WP=1,写保护?*/}//6.读取DS1302 当前时间// 名称: v_Get1302// 说明:// 功能: 读取DS1302 当前时间// 调用: uc_R1302()// 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年// 7Byte (BCD 码) 1B 1B 1B 1B 1B 1B 1B// 返回值: 无unsigned char v_Get1302(unsigned char address ,unsigned char *p1302, unsigned char n){    unsigned char i;    unsigned char TempData;    for (i=0;i<n;i++)    {        TempData =uc_R1302(address);/*格式为: 秒 分 时 日 月 星期 年 */        address+= 2;        TempData=(TempData>>4)*10+(TempData&0x0f); //转换        *p1302=TempData;        p1302++;    }    return(*p1302);}


------解决方案--------------------
调时序的话使用工具效率能高一些,去找个示波器或逻辑分析仪抓一抓波形就知道哪的问题了
------解决方案--------------------
在这种情况下 还是用逻辑分析仪看一下波形