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

📄 222.c

📁 ds1302温度测试
💻 C
字号:
/**************************************************************
  名称:DS1302_TIME_LED
  说明:向1302写入起始时间"2008.09.06","14:18:58",并在8位数码管上显示
         (分两次显示,第1显示年月日,第2显示当前时间)
  功能:熟练掌握对1302的读写操作。并用其计时
  调用:
  输入值:写入数据"2008.09.06","14:18:58"
  返回值:

****************************************************************/

#include<reg51.h>

#define uint unsigned int
#define uchar unsigned char


/*******************************************************************
分别定义控制,年,月,日,时,分,秒寄存器的写数据地址
*******************************************************************/
#define control_add   0x8e                    		//写保护地址
#define year_add      0x8c                   
#define month_add     0x88                     
#define date_add      0x86                    
#define hour_add      0x84                     
#define min_add       0x82                     
#define second_add    0x80 

/*****************************************************************
定义起始时间的数据"2008.09.06","14:18:58"
******************************************************************/
#define control_unprotect    0x00           //允许写数据
#define year_data            0x08           //"08"年
#define month_data           0x09           //"09"月
#define date_data            0x06           //"06"号
#define hour_data            0x14           //"14"点
#define min_data             0x58           //"58"分
#define second_data          0x58           //"58"秒,同时开始开启时钟

                                        

uchar data_1byte;                               //定义1字节数据
uchar data_1burst;                              //定义数据
uchar data_buffer1[20];                         //定义读取到的年,月,日,时,分,秒数据缓冲区
uchar data_buffer2[14]={2,0,0};                    //定义显示数据缓冲区
uint flag;   
uchar addar;                                    //定义地址
uchar month;
uchar display_buffer[8];                        //定义显示数据缓冲区
uchar code duan_ma[]={0x03,0x9f,0x25,0x0d,0x99,
                     0x49,0x41,0x1f,0x01,0x09};
                                                //段码,对应的数字0-9十个数

sbit  DS1302_SCLK=P1^4;                           //实时时钟控制引脚
sbit  DS1302_IO=P1^5;                             //数据输入、输出引脚
sbit  DS1302_RST=P1^7;
sbit  HC595_RCK=P3^2;                         //定义74HC595的移位脉冲端
sbit  BIT7=ACC^7;



/**************************************************************
us级延时子程序
***************************************************************/
void delay_us(uchar i)
{
  for(i=250;i>0;i--)
        ;
}


/**************************************************************
MS级延时子程序
***************************************************************/
void delay_ms(uchar i)
{
  uchar j;
  for(i;i>0;i--)
  for(j=83;j>0;j--)
        ;
}


/************************************************************
  名称: write_1302_1byte
  说明: 发送1byte数据子程序
  功能: 该指令完成对1302的地址或数据1byte的写操作
  调用:
  输入值:1byte数据
  返回值:无
*************************************************************/
void  write_1302_1byte(uchar j)
{
  uint i;
  for(i=8;i>0;i--)
   {
     if(j&0x01==0x01)
      {DS1302_IO=1;}                   //从A的最低位开始依次发送
     else 
      {DS1302_IO=0;}
         DS1302_SCLK=1;                    //置写移位脉冲有效
     DS1302_SCLK=0;
     j=(j>>1);
   }
}




/***********************************************************
  名称: read_1302_1byte
  说明: 读取1byte数据子程序
  功能: 该指令完成对1302的地址或数据1byte的读操作
  调用:
  输入值:1byte数据
  返回值:ACC
************************************************************/
  read_1302_1byte(void)
{  
    uint i;
        uchar temp;
    for(i=0;i<8;++i)
        {
       temp=temp>>1;                        //把前一次读取的数据右移一位,下次读取的数据保存到第7位
          if(DS1302_IO==1)                    //读取1byte的数据保持到temp中
           {temp|=0x80;}
           else
           {temp&=0x7f;}
            DS1302_SCLK=1;                    //置读移位脉冲有效
        DS1302_SCLK=0;
         }
         return(temp);
}
  


/************************************************************
  名称:write_1302
  说明:先写地址,再写数据
  功能:完成对1302的写操作
  调用:write_1302_1byte()
  输入值:地址,数据
  返回值:无
************************************************************/
void write_1302(unsigned addar,unsigned  data_1burst)
{
  DS1302_RST=0;
  delay_us(1);
  DS1302_SCLK=0;
  DS1302_RST=1;
  write_1302_1byte(addar);                     //向1302发送将要写入数据的地址
  write_1302_1byte(data_1burst);               //向1302发送将要写入的数据
  DS1302_RST=0;
}



/************************************************************
  名称:read_1302
  说明:先写地址,再读取数据
  功能:完成对1302的数据读取操作
  调用:read_1302_1byte()
  输入值:地址
  返回值:data_1burst
*************************************************************/
read_1302(char addar)
{ 
  DS1302_RST=0;
  delay_us(1);
  DS1302_SCLK=0;
  DS1302_RST=1;
  write_1302_1byte(addar|0x01);                          //向1302发送将要读取数据的地址        
  data_buffer1[0]=read_1302_1byte();                      //把从1302读取到的数据保存到数据缓冲区
  DS1302_RST=0;
}




/************************************************************
名称:DS1302_Write_Time
说明:把设定的时间初值写入相应的寄存器中
功能:完成对1302的初始时间设定,并打开写保护
调用:write_1302()
输入值:"2008.09.06","14:18:58"
返回值:无
************************************************************/
       DS1302_Write_Time()
{
  read_1302(0x8e);                                       //读取控制寄存器的当前状态
  if(data_buffer1[0]!=0x80)                              //判断控制寄存器是否写保护
    {                                                    //没有写保护,则开始写数据
          write_1302(control_add,0x00);
      write_1302(year_add,year_data);
      write_1302(month_add,month_data);
      write_1302(date_add,date_data);
      write_1302(hour_add,hour_data);
      write_1302(min_add,min_data);
      write_1302(second_add,second_data);
      write_1302(control_add,0x80);                       //禁止写数据到1302,即开启写保护						  
         }
}




/*************************************************************
名称:DS1302_Read_Time
说明:从1302中读取当前各寄存器的数据
功能:读取当前的时间,并把数据保存以便显示
调用:read_1302
输入值:各寄存器地址
返回值:data_buffer[20]
**************************************************************/
void  DS1302_Read_Time()
{
  uint i;
  month=0x88;
  read_1302 (year_add);                            //依次读取当前的年
  data_buffer1[1]=data_buffer1[0];
  for(i=2;i<7;i++)
  {
    read_1302 (month);                           //依次读取当前的月,日,时,分,秒
        data_buffer1[i]=data_buffer1[0];
    month=(month-2);
   }

}




/******************************************************
名称: Data_processing
说明: 把从1302读取到的数据个,十位分离,以便显示
功能: 读取到的16进制转换成10进制
调用: 
输入值

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -