📄 ds1302read_or_write.c
字号:
//Ds1302时钟日历读写源程序
#include <reg51.h>
#include <intrins.h>
// common PreDefinition
#define HIGH 1
#define LOW 0
#define TRUE 1
#define ZERO 0
#define MSB 0x80
#define LSB 0x01
// ds1302 PreDefinition
#define DS1302_WP 0x8E
#define DS1302_RESET RST=LOW;SCL=LOW;RST=HIGH
#define DS1302_WP_ENABLE Write_Ds1302(DS1302_WP,0x00)
#define DS1302_WP_DISENABLE Write_Ds1302(DS1302_WP,0x80)
//
sbit SCL = P1^3;// DS1302时钟信号 7脚
sbit SDA = P1^4;// DS1302数据信号 6脚
sbit RST = P1^5;// DS1302片选 5脚
unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; //共阴数码管 0-9 '-' '熄灭'表
/********************/
sbit seclet_A = P1^0; //管脚定义 74-138 3-8 控制信号线
sbit seclet_B = P1^1;
sbit seclet_C = P1^2;
/********************/ //宏定义
#define SM_1 seclet_C=0;seclet_B=0;seclet_A=0
#define SM_2 seclet_C=0;seclet_B=0;seclet_A=1
#define SM_3 seclet_C=0;seclet_B=1;seclet_A=0
#define SM_4 seclet_C=0;seclet_B=1;seclet_A=1
#define SM_5 seclet_C=1;seclet_B=0;seclet_A=0
#define SM_6 seclet_C=1;seclet_B=0;seclet_A=1
#define SM_7 seclet_C=1;seclet_B=1;seclet_A=0
#define SM_8 seclet_C=1;seclet_B=1;seclet_A=1
#define SM_FF P2=table[11]
/******************************/
void delay(unsigned int d_time); //延时子函时,
void Write_Ds1302_byte(unsigned char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );
void Read_RTC(void);//read RTC
void Set_RTC(void);//set RTC
void Initial(void);//system initize function
/***********************************************************************/
code unsigned char set_rtc_code[7]={0x00,0x30,0x18,0x04,0x10,0x06,0x05}; // <--周五、06年10月4日、18:30:30
code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a};//写时间寄存器 秒 分 时、日 月 年 周(星期)
code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b}; //读时间寄存器 秒 分 时、日 月 年 周(星期)
code unsigned char *day[7]={"Mon","Tue","Wen","Thu","Fri","Sat","Sun"};
unsigned char read_rtc_code[7];
/***********************************************************************/
void dis_delay(void);
void display(unsigned char a,unsigned char b,unsigned char c);
/***********************************************************************/
/***********************************************************************/
bit dif_flag;
void main(void)
{
Initial(); //初始化
while(1)
{
Read_RTC(); //读取 日历信息
switch (read_rtc_code[0]/5) //设计每个5秒 交替显示 年月日 时分秒
{
case 0:
case 2:
case 4:
case 6:
case 8:
case 10:
dif_flag=1;
break;
case 1:
case 3:
case 5:
case 7:
case 9:
case 11:
dif_flag=0;
break;
default:
break;
}
if(dif_flag)
display(read_rtc_code[0],read_rtc_code[1],read_rtc_code[2]);
else
display(read_rtc_code[4],read_rtc_code[5],read_rtc_code[6]);
}
}
/****************************************************************************/
/***************DS1302的初始化函数***********************/
/****************************************************************************/
void Initial(void)
{
DS1302_WP_ENABLE; //开禁止 写入数据
Set_RTC(); //设定
DS1302_WP_DISENABLE; //禁止写入
}
/****************************************************************************/
/*****************向DS1302写一个字节***************************/
/****************************************************************************/
void Write_Ds1302_Byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++) //循环8次 写入数据
{
SCL=LOW;
SDA=temp&LSB; //每次传输低字节
temp>>=1; //右移一位
SCL=HIGH;
}
}
/****************************************************************************/
/*****************向DS1302的指定地址写数据***************************/
/****************************************************************************/
void Write_Ds1302( unsigned char address,unsigned char dat )
{
DS1302_RESET; //启动
Write_Ds1302_Byte(address); //发送地址
Write_Ds1302_Byte(dat); //发送数据
RST=LOW; //恢复
}
/****************************************************************************/
/*****************从DS1302的指定地址读数据***************************/
/****************************************************************************/
unsigned char Read_Ds1302 ( unsigned char address )
{
unsigned char i,temp=0x00,temp_temp;
DS1302_RESET;
Write_Ds1302_Byte(address);
for (i=0;i<8;i++) //循环8次 读取数据
{
if(SDA)
temp|=0x80; //每次传输低字节
SCL=LOW;
temp>>=1; //右移一位
SCL=HIGH;
}
RST=LOW;
temp_temp=temp/16; //数据处理
temp=temp%16;
temp=temp+temp_temp*10;
return (temp); //返回
}
/**************************读取 日历************************************/
void Read_RTC(void)
{
unsigned char i,*p;
p=read_rtc_address; //地址传递
for(i=0;i<7;i++) //分7次读取 年月日时分秒星期
{
read_rtc_code[i]=Read_Ds1302(*p);
p++;
}
}
/**************************设定 日历************************************/
void Set_RTC(void)
{
unsigned char i,*p;
p=write_rtc_address; //传地址
for(i=0;i<7;i++) //7次写入 年月日时分秒星期
{
Write_Ds1302(*p,set_rtc_code[i]);
p++;
}
}
/*******************************/
//延时子函数
//参数范围 0-65536
void delay(unsigned int d_time) //参数 d_time 大小
{ //决定延时时间长短
for(; d_time>0; d_time--);
}
//显示延时 函数
void dis_delay(void)
{
unsigned char i;
for(i=0;i<8;i++);
}
//显示子函数 注意参数传递
void display(unsigned char a,unsigned char b,unsigned char c)
{
SM_FF;
SM_8;
P2=table[a%10];
dis_delay();
SM_FF;
SM_7;
P2=table[a/10];
dis_delay();
SM_FF;
SM_6;
P2=table[10];
dis_delay();
SM_FF;
SM_5;
P2=table[b%10];
dis_delay();
SM_FF;
SM_4;
P2=table[b/10];
dis_delay();
SM_FF;
SM_3;
P2=table[10];
dis_delay();
SM_FF;
SM_2;
P2=table[c%10];
dis_delay();
SM_FF;
SM_1;
P2=table[c/10];
dis_delay();
SM_FF;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -