打印

ds1307 的程序错在那

[复制链接]
3912|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CHUANDAOXY|  楼主 | 2007-3-10 16:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    /********************************************************************/
#include <REG51.H>         /* Prototypes for I/O functions       */
#include <STDIO.H>        /* Register declarations for DS5000   */
/***************************** Defines *****************************/
#define    ACK    0
#define    NACK    1
#define    ADDRTC    0xd0    /* I2C slave address */
#define    DS1307    /* compile directive, modify as required */
#define uchar unsigned char
/************************* bit definitions *************************/
sbit scl = P0^0;            /* I2C pin definitions */
sbit sda = P0^1;
sbit sqw = P3^2;        /* pin function depends upon device */

/* global variables */
uchar    sec, min, hr, dy, dt, mn, yr;

/* General Notes: Define one device to compile options for that device. */
/* Will not compile correctly if no device is defined.  Not all options */
/* for each device are supported.  There is no error checking for data  */
/* entry.  Defines may not remove all code that is not relevant to the  */
/* device. This example was written for an 8051-type micro, the DS2250/ */
/* DS5000.  The program must be modified to work properly on typical    */
/* 8051 variants (i.e. assign I2C bus to unused port pins).  This       */
/* program is for example only and is not supported by Dallas Maxim     */

void    I2C_start();
void    I2C_stop();
void    I2C_write(unsigned char d);
void    I2C_read(uchar);
void    readbyte();
void    writebyte();
void    initialize();
void    disp_clk_regs(uchar);
void    burstramwrite(uchar);
void    burstramread();
void    alrm_int();
void    alrm_read();
void    tc_setup();

void I2C_start()    /* ----------------------------------------------- */
{
    sda = 1;  scl = 1;    /* Initiate start condition */
    sda = 0;
}



void I2C_stop()        /* ----------------------------------------------- */
{
    sda = 0; sda = 0; sda = 0; sda = 0;    /* Initiate stop condition */
    scl = 1; scl = 1; sda = 1;
}



void I2C_write(uchar d)        /* ----------------------------- */
{
uchar i;

    scl = 0;
    for (i = 1; i <= 8; i++)
    {
        sda = (d >> 7);
        scl = 1;
        d = d << 1;    /* increase scl high time */
        scl = 0;
    }
    sda = 1;    /* Release the sda line */
    scl = 0;
    scl = 1;
    if(sda) printf("Ack bit missing  %02X",(unsigned int)d);
    scl = 0;
}


void I2C_read(uchar b)    /* ----------------------------------- */
{
uchar b, i;

    sda = 1;             /* Let go of sda line */
    scl = 0;
    for (i = 1; i <= 8; i++)    /* read the msb first */
    {
        scl = 1;
        b = b<< 1;
        b = b| (unsigned char)sda;
        scl = 0;
    }
    sda = b;          /* Hold sda low for acknowledge */

    scl = 0;
    scl = 1;
    if(b == NACK)    sda = 1;    /* sda = 1 if next cycle is reset */
    scl = 0;

    sda = 1;          /* Release the sda line */
    return b;
}



void readbyte()    /* -- read one byte of data from the specified address -- */
{
uchar Add;
    printf("ADDRESS: ");    /* Get Address */
    scanf("%bx", &Add);
    I2C_start();
    I2C_write(ADDRTC);
    I2C_write(Add);
    I2C_start();
    I2C_write(ADDRTC | 1);
    printf("%2bx", I2C_read(NACK) );
    I2C_stop();
}
void writebyte()    /* -- write one byte of data to the specified address -- */
{
uchar Add;
uchar Data;
    printf("Address: ");    /* Get Address */
    scanf("%bx", &Add);
    printf("DATA: ");
    scanf("%bx", &Data);    /* and data */
    I2C_start();
    I2C_write(ADDRTC);
    I2C_write(Add);
    I2C_write(Data);
    I2C_stop();
}
void initialize()    /* -- initialize the time and date using entries from stdin -- */
/* Note: NO error checking is done on the user entries! */
{
uchar    yr, mn, dt, dy, hr, min, sec, day;

    I2C_start();        /* The following Enables the Oscillator */
    I2C_write(ADDRTC);    /* address the part to write */
    I2C_write(0x00);    /* position the address pointer to 0 */
    I2C_write(0x00);    /* write 0 to the seconds register, clear the CH bit */
    I2C_stop();

    printf("Enter the year (0-99): ");
    scanf("%bx", &yr);
    printf("Enter the month (1-12): ");
    scanf("%bx", &mn);
    printf("Enter the date (1-31): ");
    scanf("%bx", &dt);
    printf("Enter the day (1-7): ");
    scanf("%bx", &dy);
    printf("Enter the hour (1-23): ");
    scanf("%bx", &hr);
    hr = hr & 0x3f;    /* force clock to 24 hour mode */
    printf("Enter the minute (0-59): ");
    scanf("%bx", &min);
    printf("Enter the second (0-59): ");
    scanf("%bx", &sec);

    I2C_start();
    I2C_write(ADDRTC);    /* write slave address + write */
    I2C_write(0x00);    /* write register address, 1st clock register */
    I2C_write(sec);
    I2C_write(min);
    I2C_write(hr);
    I2C_write(dy);
    I2C_write(dt);
    I2C_write(mn);
    I2C_write(yr);

#if defined DS1307 || defined DS1338
{
    I2C_write(0x10);    /* enable sqwe, 1Hz output */
}
#elif defined DS1337 || defined DS1339
{
    I2C_start();
    I2C_write(ADDRTC);    /* write slave address + write */
    I2C_write(0x0e);    /* write register address, control register */
    I2C_write(0x20);    /* enable osc, bbsqi */
    I2C_write(0);        /* clear OSF, alarm flags */
                /* could enable trickle charger here */
}
#elif defined DS1340
{
    I2C_write(0x10);    /* enable sqwe, 1Hz output */
    I2C_start();        /* address pointer wraps at 7, so point to flag register */
    I2C_write(ADDRTC);    /* write slave address + write */
    I2C_write(0x09);    /* write register address, control register */
    I2C_write(0);        /* clear OSF */
}
#endif

    I2C_stop();

}






void    disp_clk_regs(uchar prv_sec)    /* ----------------------------------------- */
{
uchar Sec, Min, Hrs, Dte, Mon, Day, Yr, mil, pm;

    printf("Yr Mn Dt Dy Hr:Mn:Sc");

    while(!RI)    /* Read & Display Clock Registers */
    {
        I2C_start();
        I2C_write(ADDRTC);    /* write slave address + write */
        I2C_write(0x00);    /* write register address, 1st clock register */
        I2C_start();
        I2C_write(ADDRTC | 1);    /* write slave address + read */
        Sec = I2C_read(ACK);    /* starts w/last address stored in register pointer */
        Min = I2C_read(ACK);
        Hrs = I2C_read(ACK);
        Day = I2C_read(ACK);
        Dte = I2C_read(ACK);
        Mon = I2C_read(ACK);
        Yr  = I2C_read(NACK);
        I2C_stop();
        if(Hrs & 0x40)
            mil = 0;
        else
            mil = 1;

        if(Sec != prv_sec)    /* display every time seconds change */
        {
            if(mil)
            {
                printf("%02bX/%02bX/%02bX %2bX", Yr, Mon, Dte, Day);
                printf(" %02bX:%02bX:%02bX", Hrs, Min, Sec);
            }
            else
            {
                if(Hrs & 0x20)
                    pm = 'A';
                else
                    pm = 'P';
                Hrs &= 0x1f;    /* strip mode and am/pm bits */
                printf("%02bx/%02bx/%02bx %02bx", Yr, (Mon & 0x1f), Dte, Day);
                printf(" %02bx:%02bx:%02bx %cM", Hrs, Min, Sec, pm);
            }
        }
        if(prv_sec == 0xfe)    return;
        prv_sec = Sec;
    }
    RI = 0;  /* Swallow keypress before exiting */
}



void burstramwrite(uchar Data)    /* -------- fill RAM with data -------- */
{
uchar j;

   I2C_start();
    I2C_write(ADDRTC);    /* write slave address + write */
    I2C_write(0x08);    /* write register address, 1st RAM location */
    for (j = 0; j < 56; j++)    /* write until the pointer wraps around */
    {
        I2C_write(Data);
    }
    I2C_stop();
}



void burstramread()        /* ----------------------------------------- */
{
uchar j;

    I2C_start();
    I2C_write(ADDRTC);    /* write slave address + write */
    I2C_write(8);    /* write register address, 1st RAM location -1*/
    I2C_start();
    I2C_write(ADDRTC | 1);    /* write slave address + read */

    for (j = 0; j < 56; j++)
    {
        if(!(j % 16)) printf("%02bX ", j);
        printf("%02bX ", I2C_read(ACK) );
    }
    I2C_read(NACK);
    I2C_stop();
}



void    alrm_int()    /* ----- initialize alarm registers ------ */
{
uchar    M, Sec, Min, Hr, DyDt;

    printf("1-Alarm each second 2-Alarm match=sec 3-Alarm match=sec+min");
    printf("4-Alarm match=sec+min+hr 5-Alarm match=sec+min+hr+date");
    printf("6-Alarm match=sec+min+hr+day Enter selection: ");

    M = _getkey();    /* Note-No error checking is done on entries! */

    switch(M)
    {
        case '1':    M = 0xf;    break;
        case '2':    M = 0xe;    break;
        case '3':    M = 0xc;    break;
        case '4':    M = 8;        break;
        case '5':    M = 0;        break;
        case '6':    M = 0x40;    break;
    }
    if(M & 0x40)
    {
        printf("Enter the day (1-7): ");
        scanf("%bx", &DyDt);
    }
    else
    {
        printf("Enter the date (1-31): ");
        scanf("%bx", &DyDt);
    }
    printf("Enter the hour (1-23): ");
    scanf("%bx", &Hr);
    printf("Enter the minute (0-59): ");
    scanf("%bx", &Min);
    printf("Enter the second (0-59): ");
    scanf("%bx", &Sec);

    if( (M & 1) )    Sec |= 0x80;
    if( ((M >> 1) & 1) )    Min |= 0x80;
    if( ((M >> 2) & 1) )    Hr |= 0x80;
    if( ((M >> 3) & 1) )    DyDt |= 0x80;
    if(M & 0x40)    DyDt |= 0x40;

    I2C_start();
    I2C_write(ADDRTC);    /* write slave address + write */
    I2C_write(7);        /* write register address */
    I2C_write(Sec);
    I2C_write(Min);
    I2C_write(Hr);
    I2C_write(DyDt);
    I2C_start();
    I2C_write(ADDRTC);    /* write slave address + write */
    I2C_write(0x0e);    /* write register address */
    I2C_write(5);        /* enable interrupts, alarm 1 */
    I2C_stop();
}



void    alrm_read()    /* ----- read alarm registers ------ */
{
uchar    Sec, Min, Hr, DyDt;

    I2C_start();
    I2C_write(ADDRTC);    /* write slave address + write */
    I2C_write(7);        /* write register address */
    I2C_start();
    I2C_write(ADDRTC | 1);    /* write slave address + read */
    Sec = I2C_read(ACK);
    Min = I2C_read(ACK);
    Hr = I2C_read(ACK);
    DyDt = I2C_read(NACK);

    printf("Alarm 1: %02bx %02bx %02bx %02bx", Sec, Min, Hr, DyDt);
}




void    tc_setup()    /* ---- trickle charger set up routine ---- */
{
uchar    M, val;

#if defined DS1339
    #define    TC 0x10    /* address for DS1339 trickle charge register */
#else
    #define    TC 0x08    /* address for DS1340 trickle charge register */
#endif

    printf("Enable Trickle Charger (Y/N)? ");
    M = _getkey();

    if(M == 'Y' || M == 'y')
    {
        printf("1-250 ohm res2-2K res=sec 3-4K res");

        M = _getkey();    /* Note-No error checking is done on entries! */

        switch(M)
        {
            case '1':    val = 1;    break;
            case '2':    val = 2;    break;
            case '3':    val = 3;    break;
        }
        printf("1-no diode 2-1 diode");

        M = _getkey();    /* Note-No error checking is done on entries! */

        switch(M)
        {
            case '1':    val += 4;    break;
            case '2':    val += 8;    break;
        }
        I2C_start();
        I2C_write(ADDRTC);        /* write slave address + write */
        I2C_write(TC);        /* write register address */
        I2C_write(val | 0xa0);    /* enable trickle charger per user input */
        I2C_stop();
    }
    else
    {
        I2C_start();
        I2C_write(ADDRTC);        /* write slave address + write */
        I2C_write(TC);        /* write register address */
        I2C_write(0);            /* disable trickle charger */
        I2C_stop();
    }
    I2C_start();
    I2C_write(ADDRTC);        /* write slave address + write */
    I2C_write(TC);        /* write register address */
    I2C_start();
    I2C_write(ADDRTC | 1);    /* write slave address + read */
    printf("Trickle Charger: %02bx", I2C_read(NACK) );
}




main    (void)    /* ----------------------------------------------------- */
{
uchar    M, M1;

    sqw = 1;    /* set up for read, weak pull-up */

    while (1)
    {
        #if defined DS1307
        printf("DEMO1307 build %s", __DATE__);

        #endif

        printf("CI Init RTC    CR Read Clock");
        printf("BR Byte Read   BW Write Byte");

#if defined DS1337 || defined DS1339    /* only print if part has alarms */
        printf("AI Alarm 1 Int AR Alarm Read");
#endif
#if defined DS1340 || defined DS1339    /* parts that have trickle charger */
        printf("Tc Trickle charger");
#endif

#if defined DS1307 || defined DS1338    /* only print if part has RAM */
        printf("RR RAM Read    RW RAM Write");
#endif

        printf("Enter Menu Selection:");

        M = _getkey();

        switch(M)
        {
            case 'A':
            case 'a':
            printf("Init or Read: ");
            M1 = _getkey();

            switch(M1)
            {
                case 'I':
                case 'i':    alrm_int();     break;

                case 'R':
                case 'r':    alrm_read();     break;
            }
            break;

            case 'B':
            case 'b':
            printf("Read or Write: ");
            M1 = _getkey();

            switch(M1)
            {
                case 'R':
                case 'r':    readbyte();     break;

                case 'W':
                case 'w':    writebyte();     break;
            }
            break;

            case 'C':
            case 'c':
            printf("\rEnter Clock Routine to run:C");
            M1 = _getkey();

            switch(M1)
            {
                case 'I':
                case 'i':    initialize();    break;

                case 'R':
                case 'r':    disp_clk_regs(0x99);    break;
            }
            break;

            case 'R':
            case 'r':
            printf("\rEnter Ram Routine to run:R");
            M1 = _getkey();

            switch(M1)
            {
                case 'R':
                case 'r':    burstramread();    break;

                case 'W':
                case 'w':    printf("Enter the data to write: ");
                        scanf("%bx", &M1);
                        burstramwrite(M1);    break;
            }
            break;

            case 'T':
            case 't':    tc_setup();    break;
        }
    }
}

编译以后提示
TEXT1.C(79): error C231: 'b': redefinition
TEXT1.C(113): error C193: 'parameter': bad operand type
TEXT1.C(281): error C193: 'parameter': bad operand type
TEXT1.C(420): error C193: 'parameter': bad operand type

错在那呢?

相关帖子

沙发
caoqing1314| | 2011-8-9 10:49 | 只看该作者
:L

使用特权

评论回复
板凳
VIP4会员| | 2011-8-9 13:02 | 只看该作者
void I2C_read(uchar b)    /* ----------------------------------- */
{
uchar b, i;

使用特权

评论回复
地板
小嘿| | 2011-8-10 09:24 | 只看该作者
:L楼主你千万别说你是做电梯的。。

使用特权

评论回复
5
bbqqbbqqbbq| | 2011-8-10 11:22 | 只看该作者
好长。。。。

使用特权

评论回复
6
相信哥咯| | 2011-8-10 11:44 | 只看该作者
void I2C_read(uchar b)    /* ----------------------------------- */
{
uchar b, i;

使用特权

评论回复
7
jiayongli| | 2011-8-10 14:21 | 只看该作者
void I2C_read(uchar a)    /* ----------------------------------- */
{
uchar b, i;

这样就好啦

使用特权

评论回复
8
jiayongli| | 2011-8-10 14:22 | 只看该作者
:lol

使用特权

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

本版积分规则

855

主题

1044

帖子

4

粉丝