⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302read_or_write.c

📁 DS1302在读写中的C51程序
💻 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 + -