打印

关于DS1302判断定时时间到的C程序

[复制链接]
3970|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qianlong30|  楼主 | 2009-12-14 22:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
unsigned char i_dec,j_dec,k_dec,i,j,k;
//先将DS1302的BCD码换为十进制数.
//buf_clocK[2]-------BCD时
//buf_clock[1]-------BCD分
//buf_clock[0]-------BCD秒
    i_dec=((buf_clock[2]&0xf0)>>4)*10 + buf_clock[2]&0x0f;  
    j_dec=((buf_clock[1]&0xf0)>>4)*10 + buf_clock[1]&0x0f;  
    k_dec=((buf_clock[0]&0xf0)>>4)*10 + buf_clock[0]&0x0f;  
//再将十进制化为十六进制
    i=(i_dec/16)<<4+i_dec%16;
    j=(j_dec/16)<<4+j_dec%16;
    k=(k_dec/16)<<4+k_dec%16;

    if((ram_canshu[6]!=0) || (ram_canshu[7]!=0) )  //如定时有效,即不       是"00:00"
    {
        if((ram_canshu[6]==i ) && (ram_canshu[7]==j )  //时间到则标志位置"1"
        flag_ds_ss=0x01;
     }


ram_canshu[6]---设置的时间"时",内存中初始值为0,按一下增键则
                          if(ram_canshu[6]<23)   ram_canshu[6]++;
ram_canshu[7]---设置的时间"分",内存中初始值为0,按一下增键则
                          if(ram_canshu[7]<59)   ram_canshu[7]++;


这其中的数制转换有问题,请赐教哪里错了.

相关帖子

沙发
qianlong30|  楼主 | 2009-12-15 17:56 | 只看该作者
这个问题太难了,难到大家了?查表算了.呵呵.

使用特权

评论回复
板凳
xwj| | 2009-12-15 18:00 | 只看该作者
这有啥难的,是你自己太马大哈哦~

look:
//再将十进制化为十六进制
    i=(i_dec/16)<<4+i_dec%16;
    j=(j_dec/16)<<4+j_dec%16;
    k=(k_dec/16)<<4+k_dec%16;

使用特权

评论回复
地板
aagreen0514| | 2009-12-15 18:30 | 只看该作者
/******************** 时间写入与处理*******************************/
void SetTime(void)
{
wr_ds1302(0x8e,0x00);
wr_ds1302(0x80,0x80);                              //晶振停振
wr_ds1302(0x82,(minute/10)*16+minute%10);//分
wr_ds1302(0x84,(hour/10)*16+hour%10);         //时
wr_ds1302(0x86,(day/10)*16+day%10);                 //日
wr_ds1302(0x88,(month/10)*16+month%10);         //月
wr_ds1302(0x8a,week%10);                             //星期
wr_ds1302(0x8c,(year/10)*16+year%10);         //年
wr_ds1302(0x80,0x00);                         //晶振启振
wr_ds1302(0x8e,0x80);                         //控制写入WP=1       
}
/*********************十六进制转换成十进制*************************/
uchar zhuanghuan16_10(uchar d)
{
return(d>>4)*10+(d&0x0f);  
}

使用特权

评论回复
5
aagreen0514| | 2009-12-15 18:33 | 只看该作者
//再将十进制化为十六进制
    i=(i_dec/10)<<4+i_dec%16;
    j=(j_dec/10)<<4+j_dec%16;
    k=(k_dec/10)<<4+k_dec%16;
好像是这样吧

使用特权

评论回复
6
qianlong30|  楼主 | 2009-12-15 19:23 | 只看该作者
//再将十进制化为十六进制
    i=(i_dec/16)<<4+i_dec%16;
    j=(j_dec/16)<<4+j_dec%16;
    k=(k_dec/16)<<4+k_dec%16;
-------------------------------------------------------------
我感觉没错误啊, 按5楼的改后,  当"时"<10,"分"<10时定时正确,时分是2位数时就不正确了.
---------------------------------------------------------------------------
ram_canshu[6]---设置的时间"时",内存中初始值为0,按一下增键则
                          if(ram_canshu[6]<23)   ram_canshu[6]++;
ram_canshu[7]---设置的时间"分",内存中初始值为0,按一下增键则
                          if(ram_canshu[7]<59)   ram_canshu[7]++;
这样设置的"时"和"分"应该是十六进制吧.

使用特权

评论回复
7
qianlong30|  楼主 | 2009-12-15 21:11 | 只看该作者
应该是
   i=(i_dec/16)*10+i_dec%16;
    j=(j_dec/16)*10+j_dec%16;
    k=(k_dec/16)*10+k_dec%16;

使用特权

评论回复
8
qianlong30|  楼主 | 2009-12-15 21:14 | 只看该作者
但还是有问题,可能就是
ram_canshu[6]---设置的时间"时",内存中初始值为0,按一下增键则
                          if(ram_canshu[6]<23)   ram_canshu[6]++;
ram_canshu[7]---设置的时间"分",内存中初始值为0,按一下增键则
                          if(ram_canshu[7]<59)   ram_canshu[7]++;
ram_canshu[6]和ram_canshu[7]得到的数与转换的数不匹配.

使用特权

评论回复
9
aagreen0514| | 2009-12-20 14:02 | 只看该作者
ds1302的寄存器 里面储存的是BCD码  要吧十进制装化成bcd码  才行

使用特权

评论回复
10
aagreen0514| | 2009-12-20 14:03 | 只看该作者
i=(i_dec/10)<<4+i_dec%10;
    j=(j_dec/10)<<4+j_dec%10;
    k=(k_dec/10)<<4+k_dec%10;
应该是这样的吧

使用特权

评论回复
11
菜鸟学模电| | 2010-8-4 09:03 | 只看该作者
楼上正解,设置时应该转换为BCD码后写入DS1302

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

149

主题

349

帖子

2

粉丝