DS 1302 读写异常

2020-01-16 18:27发布

板子用的是STC 12C5A系列芯片, 用1302模块, 第一个手板,可以通过串口,通过上位机读写1302.

问题:1  第一个手板1302 没有用上拉,可以正常读写,引脚用的是推挽模式,(测试了一个多月了) 第二个板子读不出来,写不进去,加了上拉10K电阻也没有用,后将IO口改为开漏模式,可以读出,但还是写不了!

            1302 用什么IO模式是OK的?  与什么因素有关?两个手板的1302部分是用引线焊接的,会是这里的问题吗?

            
   
     1302 主程序:
//DS1302初始化函数
void ds1302_init(void)
{
        RST=0;                        //RST脚置低
        SCK=0;                        //SCK脚置低
}
//向DS1302写入一字节数据
void ds1302_write_byte(uchar addr, uchar d)
{
        uchar i;
        RST=1;                                        //启动DS1302总线       
        //写入目标地址:addr
        addr = addr & 0xFE;   //最低位置零,寄存器0位为0时写,为1时读
        for (i = 0; i < 8; i ++) {
                if (addr & 0x01) {
                        IO=1;
                        }
                else {
                        IO=0;
                        }
                SCK=1;      //产生时钟
                SCK=0;
                addr = addr >> 1;
                }       
        //写入数据:d
        for (i = 0; i < 8; i ++) {
                if (d & 0x01) {
                        IO=1;
                        }
                else {
                        IO=0;
                        }
                SCK=1;    //产生时钟
                SCK=0;
                d = d >> 1;
                }
        RST=0;                //停止DS1302总线
}

//从DS1302读出一字节数据
uchar ds1302_read_byte(uchar addr) {

        uchar i,temp;       
        RST=1;                                        //启动DS1302总线
        //写入目标地址:addr
        addr = addr | 0x01;    //最低位置高,寄存器0位为0时写,为1时读
        for (i = 0; i < 8; i ++) {
                if (addr & 0x01) {
                        IO=1;
                        }
                else {
                        IO=0;
                        }
                SCK=1;
                SCK=0;
                addr = addr >> 1;
                }       
        //输出数据:temp
        for (i = 0; i < 8; i ++) {
                temp = temp >> 1;
                if (IO) {
                        temp |= 0x80;
                        }
                else {
                        temp &= 0x7F;
                        }
                SCK=1;
                SCK=0;
                }       
        RST=0;                                        //停止DS1302总线
        return temp;
}
//向DS302写入时钟数据
void ds1302_write_time(void)
{
        ds1302_write_byte(ds1302_control_add,0x00);                        //关闭写保护
        ds1302_write_byte(ds1302_sec_add,0x80);                                //暂停时钟
        //ds1302_write_byte(ds1302_charger_add,0xa9);            //涓流充电
        ds1302_write_byte(ds1302_year_add,time_buf[1]);                //年
        ds1302_write_byte(ds1302_month_add,time_buf[2]);        //月
        ds1302_write_byte(ds1302_date_add,time_buf[3]);                //日
        ds1302_write_byte(ds1302_hr_add,time_buf[4]);                //时
        ds1302_write_byte(ds1302_min_add,time_buf[5]);                //分
        ds1302_write_byte(ds1302_sec_add,time_buf[6]);                //秒
        ds1302_write_byte(ds1302_day_add,time_buf[7]);                //周
        ds1302_write_byte(ds1302_control_add,0x80);                        //打开写保护     
}
//从DS302读出时钟数据
void ds1302_read_time(void)  
{
        time_buf[1]=ds1302_read_byte(ds1302_year_add);                //年
        time_buf[2]=ds1302_read_byte(ds1302_month_add);                //月
        time_buf[3]=ds1302_read_byte(ds1302_date_add);                //日
        time_buf[4]=ds1302_read_byte(ds1302_hr_add);                //时
        time_buf[5]=ds1302_read_byte(ds1302_min_add);                //分
        time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;//秒,屏蔽秒的第7位,避免超出59
        time_buf[7]=ds1302_read_byte(ds1302_day_add);                //周        
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
30条回答
liyo2012
1楼-- · 2020-01-19 03:50
Percychiu 发表于 2017-2-4 00:28
你现在找到问题了吗?

换DS芯片试了两台可以!
liyo2012
2楼-- · 2020-01-19 06:12
chen849928055 发表于 2017-2-4 11:22
延时的时间满足了,IO的模式设置对了,一般没有你说的那些问题
另外加上拉10K电阻 ,IO口要设置为开漏模式 ...

初步换了芯片可以! 感觉就是芯片问题!
xiaobendan
3楼-- · 2020-01-19 10:27
要标准模式,加三个10K上拉,供应商要可靠
liyo2012
4楼-- · 2020-01-19 14:32
xiaobendan 发表于 2017-2-8 19:33
要标准模式,加三个10K上拉,供应商要可靠

现在有三种情况:

A: 淘宝上1.8带电池,带模块的,用不了!

B:实体供应商的,说是国产的,有几个日期修改不了,比如,13-15. (这个很鬼)

C:淘宝上,标称进口芯片的,5块一个的,没有什么问题,可以正常操作!
xiaobendan
5楼-- · 2020-01-19 19:45
 精彩回答 2  元偷偷看……
liyo2012
6楼-- · 2020-01-19 21:42
xiaobendan 发表于 2017-2-14 14:55
我只用时间的,淘宝,一次一盘,好像2500片吧,价格好像六毛多吧

能用吗?

一周热门 更多>