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);
}
