找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4075|回复: 1
打印 上一主题 下一主题
收起左侧

DS1302与1602显示时间正常,程序上电第一次初始化能写进数据,但用按键无法重复调...

[复制链接]
跳转到指定楼层
楼主
ID:33544 发表于 2017-6-24 15:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DS1302与1602显示时间正常,程序上电第一次初始化能写进数据,但用按键无法重复调整时间,好像是数据没有存入,找不到问题请教大家了下面代码是DS1302的驱动代码;补充说明一下,单片机用的是stc12c5a60s2,程序用仿真软件运行都很正常,硬件部分DS1302的三个脚上都加上了1K的上拉电阻,上电后无法重复修改,程度逻辑在仿真软件上运行都正常,仿真时重复写入数据也正常,也对写保护进行了重点的注意,        write_ds1302(0x8e,0x00);//去除写保护 write_ds1302(0x8e,0x80);//加入写保护,针对stc12c5a60s2单片机,对DS1302的读写程序也分别加入了延时,程序如下:
/**********************ds1302写一个字节数据*****************************/
void write_ds1302_byte(u8 temp){
        //ds1302写一个字节数据
        u8 i;
        for(i=0;i<8;i++)
                {
                scl=0;//scl为低时准备数据
                io=temp&0x01;//将数据放到IO口上
                temp=temp>>1;
                scl=1;//上升沿写入
                }
}
/**********************向地址add写入数据datds1302*****************************/
void write_ds1302(u8 add,u8 dat){
        //向地址add写入数据dat
        rst=0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        scl=0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        rst=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        write_ds1302_byte(add);
        write_ds1302_byte(dat);
        rst=0;
        io=1;
        scl=1;

}
/**********************ds1302读一个字节数据*****************************/
u8 read_ds1302(u8 add)
        {
        //ds1302读数据
        u8 i,dat;
        rst=0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        scl=0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        rst=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        write_ds1302_byte(add);//首先写入要读的数据处的地址
        for(i=0;i<8;i++)
                {
                        dat=dat>>1;
                        scl=0;
                        if(io)dat=dat|0x80;
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_(); _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_(); _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                  scl=1;
                }

        rst=0;
        _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_();
_nop_();
_nop_();
_nop_();
_nop_(); //以下为DS1302复位的稳定时间
_nop_();
        scl=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
        scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
        io=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
io=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
        return dat;
}
下面是时间调整程序,

/**********************ds1302设定时间*****************************/
void set_time(u8 *pSecDa){
        //设定时间
        u8 i;
        u8 ucAddr = 0x80;
        write_ds1302(0x8e,0x00);//去除写保护       
        for(i =7;i>0;i--){
                write_ds1302(ucAddr,*pSecDa); //秒 分 时 日 月 星期 年
                pSecDa++;
                ucAddr+=2;
        }
        write_ds1302(0x8e,0x80);//加写保护       
}
时间调整程序在主循环中,根据按钮状态调用


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:82765 发表于 2017-6-24 20:45 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表