weimas 发表于 2015-9-15 18:25:35

DS1302的分寄存器读写异常求助

代码如下
/*硬件连接方式
sbit DS1302_SCLK        =P2^7;        //时钟
sbit DS1302_IO    =P2^6;//数据
sbit DS1302_CE                =P2^5;         //使能
*/

#define        SECOND_W0x80 //对秒寄存器进行写操作
#define        SECOND_R0x81 //对秒寄存器进行读操作
#define        MINUTE_W0x82 //对分寄存器进行写操作
#define        MINUTE_R        0x83 //对分寄存器进行读操作
#define        HOUR_W        0x84 //对小时寄存器进行写操作
#define        HOUR_R          0x85 //对小时寄存器进行读操作


/**************************************************************************
* 名        称:                void DS1302_write_byte(uchar dat)
* 功        能:                向DS1302写入一个字节数据
* 说        明:   
* 输        入:                dat 要写入的数据
* 输        出:               
**************************************************************************/
void DS1302_write_byte(uchar dat)
{
        uchar        i;
       
        for(i=0;i<8;i++)                        //开始传输8个字节的数据
        {
                DS1302_SCLK=0;                        //初始时钟线置为0
                DS1302_IO=dat&0x01;        //取最低位,注意DS1302的数据和地址都是从最低位开始传输的
                DS1302_SCLK=1;                        //时钟线拉高,制造上升沿,SDA的数据被传输
                dat>>=1;                                                //数据右移一位,准备传输下一位数据
        }
}

/**************************************************************************
* 名        称:                uchar DS1302_read_byte()
* 功        能:                从DS1302读一个字节的数据
* 说        明:   
* 输        入:               
* 输        出:                读出的数据 返回给 dat
**************************************************************************/
uchar DS1302_read_byte()   
{
        uchar i,dat;
for(i=0;i<7;i++)
{
                DS1302_SCLK=0;
    if(DS1302_IO==1)
                {
                        dat=dat|0x80;
                }
    else
    {
                        dat=dat&0x7f;
                }
                DS1302_SCLK=1;             //产生下跳沿
    dat=dat>>1;
   }
   return (dat);
}       

/**************************************************************************
* 名        称:                void DS1302_write(uchar addr,uchar dat)
* 功        能:               
* 说        明:   
* 输        入:                寄存器地址addr,要写入的数据dat
* 输        出:               
**************************************************************************/
void DS1302_write(uchar addr,uchar dat)
{
        DS1302_CE=0;
        DS1302_SCLK=0;
        DS1302_CE=1;                                                //打开使能
        DS1302_write_byte(addr);
        DS1302_write_byte(dat);       
        DS1302_SCLK=1;
        DS1302_CE=0;                                                //关闭使能
}

/**************************************************************************
* 名        称:                uchar DS1302_read(uchar addr)   
* 功        能:                从DS1302读取地址addr数据
* 说        明:   
* 输        入:                uchar addr
* 输        出:                返回的数据        dat
**************************************************************************/
uchar DS1302_read(uchar addr)   
{
        uchar        dat;
        DS1302_CE=0;
        DS1302_SCLK=0;
        DS1302_CE=1;        //打开使能
        DS1302_write_byte(addr);
        dat=DS1302_read_byte();
        DS1302_SCLK=1;
        DS1302_CE=0;        //打开使能
        return dat;       
}       

/**************************************************************************
* 名        称:                void DS1302_init()   
* 功        能:                DS1302初始化
* 说        明:   
* 输        入:               
* 输        出:               
***************************************************************************/
void DS1302_init()   
{
        DS1302_CE=0;
        DS1302_SCLK=0;
       
       
        DS1302_write(0x8e,0x00);                        //对0x8e寄存器操作,去掉写保护,对最高位WP写0
        DS1302_write(0x90,0xab);                        //对0x8e寄存器操作,去掉写保护,对最高位WP写0
       
        //对DS1302写入时间 20:24:22
        DS1302_write(HOUR_W,0x13);                //设置小时,模式24h制,
        DS1302_write(0X82,0x13);                //设置分钟
        DS1302_write(SECOND_W,0x30);        //设置秒并且使DS1302开始走时

        DS1302_write(0x8e,0x80);                        //进行写保护

}

uchar time_buf={0,0,0,0,0,0,0};        //秒 分 时 日 月 星期 年




void read_time()
{
        DS1302_write(0x8e,0x00);                        //对0x8e寄存器操作,去掉写保护,对最高位WP写0

        hour=DS1302_read(HOUR_R);
        minute=DS1302_read(0X83);
        second=DS1302_read(SECOND_R);
       
        //将读取到的16进制数时间转化为10进制
       
        time_buf=second/16*10+second%16;       
        time_buf=minute/16*10+minute%16;
        time_buf=hour/16*10+hour%16;
       
        temp_second_shiwei=time_buf/10;        //秒十位
        temp_second_gewei        =time_buf%10;        //秒个位
       
        temp_minute_shiwei=time_buf/10;        //分十位
        temp_minute_gewei        =time_buf%10;        //分个位
       
        temp_hour_shiwei=time_buf/10;                //时十位
        temp_hour_gewei        =time_buf%10;                //十个位
}

单片机是stc12c5a60s2 12M晶振
时寄存器和秒寄存器的写入和读出都是正常的,就是分寄存器一直显示的是85,不知道是什么原因
注:显示程序肯定是没有问题的
希望高手帮忙解答下
页: [1]
查看完整版本: DS1302的分寄存器读写异常求助