找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5388|回复: 2
收起左侧

[求助]新手求助DS1302

[复制链接]
ID:25554 发表于 2010-8-12 16:50 | 显示全部楼层 |阅读模式

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char 
sbit lcde_1602=P2^7;
sbit rs_1602=P2^6;
sbit rw_1602=P2^5;
sbit sclk=P3^6;
sbit rst=P3^5;
sbit io=P3^4;
uchar code shu[]="Data:20  -  -  Time:  :  :  ";
uchar code dat[6]={10,11,12,23,59,50};//年月日时分秒
uchar i,j;
///////////////////////////////
void delay(uint);
void write_com_1602(uchar);
void write_dat_1602(uchar);
void init_1602();

void write_byte_1302(uchar);
uchar read_byte_1302();
void write1302(uchar,uchar);
uchar read1302(uchar);
///////////////////////////////
void write_byte_1302(uchar dat)      //dat 为BCD码
{
    uchar i;
//    x=dat/10;
//    y=dat%10;
//    dat=((dat/10)<<4)|(dat%10);
    for(i=0;i<8;i++)
    {
        io=dat&0x01;
        dat>>=1;
        sclk=0;
        delay(5);
        sclk=1;
    }
//    sclk=0;    
}
uchar read_byte_1302()
{
    uchar i,dat=0x00;
    for(i=0;i<8;i++)
    {
        dat>>=1;
        if(io)
        {
        dat=dat|0x80;
        }
        sclk=1;
        delay(5);
        sclk=0;
    }
    return ((dat/16)*10+dat%16); //读出的BCD码转换成DEC输出
}
void write1302(uchar add,uchar dat)     //dat为10进制
{
    rst=0;
    delay(2);
    sclk=0;
    delay(2);
    rst=1;
    delay(2);
    write_byte_1302(add);
    dat=(((dat/10)<<4)|(dat%10)); //dat转换成BCD
    write_byte_1302(dat);
    delay(2);
    rst=0;
}
uchar read1302(uchar add)
{
    uchar temp;
    rst=0;
    delay(2);
    sclk=0;
    delay(2);
    rst=1;
    delay(2);
    write_byte_1302(add);
    temp=read_byte_1302();
    delay(2);
    rst=0;
    return temp;
}                     
//////////////////////////////////////////
void write_com_1602(uchar com)
{
    rs_1602=0;
    rw_1602=0;
    P0=com;
    delay(5);
    lcde_1602=0;
    delay(5);
    lcde_1602=1;        
}
void write_dat_1602(uchar dat)
{
    rs_1602=1;
    rw_1602=0;
    P0=dat;
    delay(5);
    lcde_1602=0;
    delay(5);
    lcde_1602=1;
}
void init_1602()
{
    write_com_1602(0x38);
    write_com_1602(0x38);
    write_com_1602(0x38);
//    write_com_1602(0x01);
    write_com_1602(0x0e);
    write_com_1602(0x06);
}
///////////////////////////////////

///////////////////////////////////
void delay(uint t)
{
    for(;t>0;t--);
}

void main(void)
{    
    init_1602();
    write_com_1602(0x80);
    for(i=0;i<15;i++)
    {
    write_dat_1602(shu);
    }
    write_com_1602(0xc0);
    for(i=15;i<28;i++)
    {
    write_dat_1602(shu);
    }

    write1302(0x8e,0x00);
    write1302(0x8c,dat[0]);    
    write1302(0x88,dat[1]);
    write1302(0x86,dat[2]);
    write1302(0x84,dat[3]);
    write1302(0x82,dat[4]);
    write1302(0x80,dat[5]);
    write1302(0x8e,0x80);
    while(1)
    {
    j=read1302(0x8d);
    write_com_1602(0x87);
    write_dat_1602(j/10+0x30);
    write_dat_1602(j%10+0x30); 
    j=read1302(0x89);
    write_com_1602(0x8a);
    write_dat_1602(j/10+0x30);
    write_dat_1602(j%10+0x30);     
    j=read1302(0x87);
    write_com_1602(0x8d);
    write_dat_1602(j/10+0x30);
    write_dat_1602(j%10+0x30); 
    j=read1302(0x85);
    write_com_1602(0xc5);
    write_dat_1602(j/10+0x30);
    write_dat_1602(j%10+0x30); 
    j=read1302(0x83);
    write_com_1602(0xc8);
    write_dat_1602(j/10+0x30);
    write_dat_1602(j%10+0x30); 
    j=read1302(0x81);
    write_com_1602(0xcb);
    write_dat_1602(j/10+0x30);
    write_dat_1602(j%10+0x30);
    } 
}


请问大虾,输出为什么会不对呢?
谢谢了
回复

使用道具 举报

ID:1 发表于 2010-8-12 17:31 | 显示全部楼层

你输出的是什么?

 

回复

使用道具 举报

ID:25554 发表于 2010-8-12 17:37 | 显示全部楼层
一开始是:
Data:2021-23-27
Time:47:;3::1
然后秒位开始无序跳变
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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