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

📄 ds1302.c

📁 dallas1302的应用非常详细,还有一个自己作的显示程序可以向我要或者自行编写是lcm1602的
💻 C
字号:
#include <lcm1602.c>

#define uchar unsigned char

//---------------------------定义端口--------------------------------

sbit SCLK=P3^7;        //时钟
sbit IO_DATA=P3^6;     //数据
sbit RESET=P3^5;       //复位

sbit ACC0=ACC^0;       //定义累加器最低位
sbit ACC7=ACC^7;       //定义累加器最高位

//--------------------------定义端口完毕-----------------------------

//---------------------------时序初始化-----------------------------
ds1302_init()
{
 RESET=0;
 SCLK=0;
 RESET=1;
}
//----------------------------时序初始完毕----------------------------

ds1302_end()  //写结束
{
 RESET=0;
 SCLK=1;
}

ds1302_write(uchar position)           //写指令与数据函数
{uchar i;
 ACC=position;
 for(i=1;i<9;i++)    //这里i不能从0开始循环,否则全刷0
   {
     SCLK=0;         //也可以用 IO_DATA=ACC0;
     IO_DATA=ACC0;   //         SCLK=0;       来实现,写指令时换下位置一样
     SCLK=1;         //时钟脉冲上升沿写入数据
     ACC>>=1;        //累加器值右移一位
    }
}

//-------------------------------写指令-------------------------------
ds1302_write_command(uchar position,uchar ds1302_data)
{
 ds1302_init();
 ds1302_write(position);       //先写指令,后写数据;
 ds1302_write(ds1302_data);
 ds1302_end();
}
//------------------------------写指令完毕----------------------------

//---------------------------------读数据-----------------------------
ds1302_read()
{uchar i;
 for(i=1;i<9;i++)  //这里i不能从0开始循环,否则全刷0
 {
  ACC>>=1;         //要先把上次写的地址移走
  SCLK=1;
  SCLK=0;
  ACC7=IO_DATA;    //读数据在下降沿有效
  }
  return(ACC);
}
//--------------------------------读数据完毕--------------------------

//------------------------十六进制至十进制转换----------------------------
ds1302_change_16_10(uchar read_data)
{uchar ten,ge,sum;     //   定义十六进制十位和个位和所合成十进制数
 ten=read_data/16;
 ge=read_data%16;
 sum=ten*10+ge;
 return(sum);
}
//-----------------------------转换完毕-----------------------------

//------------------------------读函数----------------------------
ds1302_read_command(uchar position)
{uchar readdata;      //存放临时读出数据
 ds1302_init();
 ds1302_write(position);   //先写地址
 readdata=ds1302_read();
 readdata=ds1302_change_16_10(readdata);  //进行十六进制至十进制转换
 ds1302_end();
 return(readdata);
}
//------------------------------读完毕----------------------------

//-----------------------------显示函数-----------------------------
ds1302_display(uchar *display)
{
  display_a_string(0,"20");
  display_a_char(0x02,(display[6]/10)|0x30);//year
  display_a_char(0x03,(display[6]%10)|0x30);
  display_a_char(0x04,'-');
  display_a_char(0x05,(display[4]/10)|0x30);//mon
  display_a_char(0x06,(display[4]%10)|0x30);
  display_a_char(0x07,'-');
  display_a_char(0x08,(display[3]/10)|0x30);//date
  display_a_char(0x09,(display[3]%10)|0x30);

  display_a_char(0x0d,(display[5]/10)|0x30);//day
  display_a_char(0x0e,(display[5]%10)|0x30);

  display_a_char(0x10,(display[2]/10)+0x30);//hr
  display_a_char(0x11,(display[2]%10)+0x30);
  display_a_char(0x12,':');
  display_a_char(0x13,(display[1]/10)+0x30);//min
  display_a_char(0x14,(display[1]%10)+0x30);
  display_a_char(0x15,':');
  display_a_char(0x16,(display[0]/10)+0x30);//sec
  display_a_char(0x17,(display[0]%10)+0x30);
}
//-----------------------------显示完毕-----------------------------
main()
 {uchar i,position;
  uchar begin[7]={0x00,0x08,0x08,0x26,0x07,0x02,0x08}; //赋初值
  lcd_init();  //液晶初始化
//ds1302_write_command(0x80,0x80);  //停止时钟震荡器 32.768M
//ds1302_write_command(0x84,0x0*);  //24小时计时制;上午AM选择;
                                    //*号表示和前面一位共5位数构成0-23小时初值
  ds1302_write_command(0x90,0xa4);  //涓流充电打开  TCS=1010;DS=01;RS=00;
  ds1302_write_command(0x8e,0x00);  //关闭写保护
  position=0x80;
  for(i=0;i<7;i++)
    {ds1302_write_command(position,begin[i]);
     position+=2;
     }
  ds1302_write_command(0x8e,0x80);  //打开写保护
  while(1)
      {position=0x81;
       for(i=0;i<7;i++)
         {begin[i]=ds1302_read_command(position);
          position+=2;
          }
       ds1302_display(begin);
       }
}

⌨️ 快捷键说明

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