DS1302探讨
admin 于 2013年05月16日 发表在 嵌入式开发笔记

DS1302是美国 DALLAS 公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态 RAM,采用 SPI 三线接口与 CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和 RAM数据。实时时钟可提供秒、分、时日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。

工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。

1. 应用电路图:

2. 详细分析文档:点击下载附件

3. 相关读写寄存器:

4. 基于51单片机的应用举例:点击下载附件

#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit A1=P1^0; //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
sbit A2=P1^4; //定义步进电机连接端口
sbit B2=P1^5;
sbit C2=P1^6;
sbit D2=P1^7;
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
sbit K4=P3^3;
sbit key_up = P2^0;
sbit key_right = P2^1;
sbit key_left = P2^2;
sbit key_down = P2^3;
sbit x2 = P2^4;
sbit x3 = P2^5;
sbit LATCH1=P2^6;
sbit LATCH2=P2^7;
uint up=0;
uint down=0;
uint left=0;
uint right=0;
#define Coil_A1{A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF1 {A1=0;B1=0;C1=0;D1=0;}//全部断电
#define Coil_A2{A2=1;B2=0;C2=0;D2=0;}//A相通电,其他相断电
#define Coil_B2 {A2=0;B2=1;C2=0;D2=0;}//D相通电,其他相断电
#define Coil_C2 {A2=0;B2=0;C2=1;D2=0;}//C相通电,其他相断电
#define Coil_D2 {A2=0;B2=0;C2=0;D2=1;}//D相通电,其他相断电
#define Coil_OFF2 {A2=0;B2=0;C2=0;D2=0;}//全部断电
void Init_Timer0(void);
uchar code Duan_Ma[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code Wei_Ma[]= {0xfe,0xfd,0xfb,0xf7};  //1~4选中数码管
uchar TempData[8];
unsigned FFW[8]= {0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反转
void DelayUs2x(uchar t)
{
    while(--t);
}
/* 1Ms延时 */
void Delay_Ms(uchar t)
{

    while(t--)
    {
        //大致延时1mS
        DelayUs2x(245);
        DelayUs2x(245);
    }
}
void Init_Timer0(void)
{
    TMOD |= 0x01;   //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
    EA=1;           //总中断打开
    ET0=1;           //定时器中断打开
    TR0=1;           //定时器开关打开
    PT0=1;           //优先级打开
}
void Display(unsigned char FirstBit,unsigned char Num)
{
    static uchar i=0;

    P0=0;   //清空数据,防止有交替重影
    LATCH1=1;     //段锁存
    LATCH1=0;
    P0=Wei_Ma[i+FirstBit]; //取位码
    LATCH2=1;     //位锁存
    LATCH2=0;
    P0=TempData[i]; //取显示数据,段码
    LATCH1=1;     //段锁存
    LATCH1=0;

    i++;
    if(i==Num)
        i=0;

}
void turn_up(num)
{
    Coil_A1;//A相通电,其他相断电
    Delay_Ms(num);
    Coil_B1;//B相通电,其他相断电
    Delay_Ms(num);
    Coil_C1;//C相通电,其他相断电
    Delay_Ms(num);
    Coil_D1;//D相通电,其他相断电
    Delay_Ms(num);
    Coil_OFF1;//全部断电
}
void turn_down(num)
{
    Coil_D1;//D相通电,其他相断电
    Delay_Ms(num);
    Coil_C1;//C相通电,其他相断电
    Delay_Ms(num);
    Coil_B1;//B相通电,其他相断电
    Delay_Ms(num);
    Coil_A1;//A相通电,其他相断电
    Delay_Ms(num);
    Coil_OFF1;//全部断电
}
void turn_right(num)
{
    Coil_A2;//A相通电,其他相断电
    Delay_Ms(num);
    Coil_B2;//B相通电,其他相断电
    Delay_Ms(num);
    Coil_C2;//C相通电,其他相断电
    Delay_Ms(num);
    Coil_D2;//D相通电,其他相断电
    Delay_Ms(num);
    Coil_OFF2;//全部断电
}
void turn_left(num)
{
    Coil_D2;//D相通电,其他相断电
    Delay_Ms(num);
    Coil_C2;//C相通电,其他相断电
    Delay_Ms(num);
    Coil_B2;//B相通电,其他相断电
    Delay_Ms(num);
    Coil_A2;//A相通电,其他相断电
    Delay_Ms(num);
    Coil_OFF2;//全部断电
}
void  motorf1()
{
    unsigned char i;
    unsigned int a;
    if(K1==1)
    {
        for (i=0; i<8; i++)       //一个周期转30度
        {   P1 = FFW[i]&0x1f;
            Delay_Ms(8);
        }
    }
    if(K3==1)
    {
        for (i=0; i<8; i++)
        {
            a= FFW[i]&0x1f;
            a = (a>>4 | a<<4);
            P1 = a;
            Delay_Ms(8);
        }
    }
}
//调节转速
void  motorf2()
{
    unsigned char i;
    unsigned int a;

    if(K3==1)
    {
        for (i=0; i<8; i++)       //一个周期转30度
        {   P1 = FFW[8-i]&0x1f;
            Delay_Ms(8);
        }
    }
    if(K4==1)
    {
        for (i=0; i<8; i++)
        {
            a= FFW[8-i]&0x1f;
            a = (a>>4 | a<<4);
            P1=a;
        }
        Delay_Ms(8);                  //调节转速
    }
}

main()
{
    uchar k=0;
    uchar num;
    uchar n=0;
    uint flag=1;
    Init_Timer0();
    Coil_OFF1;
    Coil_OFF2;
    while(1)
    {
        motorf1();
        motorf2();

        if(x2 == 0) {
            num = 60;
        }
        if(x3 == 0) {
            num = 10;
        }
        else {
            num=30;
        }
        /* 上步进电机控制 */
        if(up>down)
        {
            if(key_up == 0)
            {
                Delay_Ms(50);
                if(key_up==0)
                {
                    k++;
                    up++;
                    turn_up(num);
                }
            }
            else if (key_down == 0)
            {
                Delay_Ms(50);
                if(key_down==0)
                {
                    k--;
                    down++;
                    turn_down(num);
                }
            }
        }
        else if(up<down)
        {
            if(key_up == 0)
            {
                Delay_Ms(50);
                if(key_up==0)
                {
                    k--;
                    up++;
                    turn_up(num);
                }
            }
            else if(key_down == 0)
            {
                Delay_Ms(50);
                if(key_down==0)
                {
                    k++;
                    down++;
                    turn_down(num);
                }
            }
        }
        else  if(up==down)
        {
            if(key_up == 0)
            {
                Delay_Ms(50);
                if(key_up==0)
                {
                    k++;
                    up++;
                    turn_up(num);
                }
            }
            else if (key_down == 0)
            {
                Delay_Ms(50);
                if(key_down==0)
                {
                    k++;
                    down++;
                    turn_down(num);
                }
            }
        }

        /* 左右步进电机控制  */
        if(left>right)
        {
            if(key_left == 0)
            {
                Delay_Ms(50);
                if(key_left==0)
                {
                    n++;
                    left++;
                    turn_left(num);
                }
            }
            else if (key_right == 0)
            {
                Delay_Ms(50);
                if(key_right==0)
                {
                    n--;
                    right++;
                    turn_right(num);
                }
            }
        }
        else if(left<right)
        {
            if(key_left == 0)
            {
                Delay_Ms(50);
                if(key_left==0)
                {
                    n--;
                    left++;
                    turn_left(num);
                }
            }
            else if(key_right == 0)
            {
                Delay_Ms(50);
                if(key_right==0)
                {
                    n++;
                    right++;
                    turn_right(num);
                }
            }
        }
        else  if(left==right)
        {
            if(key_left == 0)
            {
                Delay_Ms(50);
                if(key_left==0)
                {
                    n++;
                    left++;
                    turn_left(num);
                }
            }
            else if (key_right == 0)
            {
                Delay_Ms(50);
                if(key_right==0)
                {
                    n++;
                    right++;
                    turn_right(num);
                }
            }
        }
        TempData[0]=Duan_Ma[k/10];//分解显示信息,如要显示68,则68/10=6  68%10=8
        TempData[1]=Duan_Ma[k%10];
        TempData[2]=Duan_Ma[n/10];//分解显示信息,如要显示68,则68/10=6  68%10=8
        TempData[3]=Duan_Ma[n%10];
    }
}
void Timer0_isr(void) interrupt 1
{
    TH0=(65536-1000)/256;    //重新赋值 1ms
    TL0=(65536-1000)%256;
    Display(0,8);
}
注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。 标签:DS1302芯片,keil4,电路开发,MCU使用,MCU探讨