当前位置:首页 > > 热搜器件
[导读]DS1302程序分享

注意那个IO口要和电源间接个电阻哦,还有我的外接电源用的手机电池,为这个去买充电电池不划算的
# include <AT89x52.h>
# define LCD_DB        P0
sbit         LCD_RS=P1^0;
sbit         LCD_RW=P1^1;
sbit         LCD_E=P1^2;
sbit         DS1302_SCLK = P3^4;
sbit         DS1302_IO   = P3^3;
sbit         DS1302_RST = P3^5;
//定义待设置的时间:秒、分、时、日、月、星期、年、控制字
char table[]={0x00,0x58,0x12,0x8,0x3,0x06,0x06,0x00};
char table1[]={0x11};
char table2[]={0x22};
unsigned char bdata time_rx ;
sbit     time_rx7 = time_rx^7;
# define uchar unsigned char
# define uint unsigned int

void LCD_init(void);//初始化函数
void LCD_write_command(uchar command);//写指令函数
void LCD_write_data(uchar dat);//写数据函数
void LCD_disp_char(uchar x,uchar y,uchar dat);//在某个屏幕位置上显示一个字符,X(0-16),y(1-2)
void delay_n40us(uint n);//延时函数
//写一个字节数据函数
void time_write_1(unsigned char time_tx)
{
     int j;                             //设置循环变量
     for(j=0;j<8;j++)                   //连续写8bit
       {
         DS1302_IO    = 0;                         //先设置数据为0
         DS1302_SCLK = 0;                        //时钟信号拉低
         if(time_tx&0x01)               //判断待发送的数据位是0或1
         {
             DS1302_IO = 1;                     //待发送数据位是1
         }
         time_tx=time_tx>>1;            //待发送的数据右移1位
         DS1302_SCLK = 1;                        //拉高时钟信号
        }
         DS1302_SCLK = 0;                          //写完一个字节,拉低时钟信号
   }
//---------------------------------------------
//读一个字节函数
unsigned char time_read_1()
{
    int j;                             //设置循环变量
DS1302_IO = 1;        //设置为输入方式
    for(j=0;j<8;j++)                   //连续读取8bit
    {
         DS1302_SCLK = 0;                       //拉低时钟信号
         time_rx=time_rx>>1;           //接收寄存器右移1位
         time_rx7=DS1302_IO;          //把接收到的数据放到接收寄存器的最高位
         DS1302_SCLK = 1;                        //拉高时钟信号
       }
   
     DS1302_SCLK = 0;                           //拉低时钟信号
     return(time_rx);                  //返回读取到的数据
}
//DS1302初始化函数
void ds1302_init()
{
    DS1302_SCLK =   0;                             //拉低时钟信号
    DS1302_RST   =   0;                             //复位DS1302
    DS1302_RST   =   1;                             //使能DS1302
    time_write_1(0x8e);                              //发控制命令
    time_write_1(0);                                  //允许写DS1302

    DS1302_RST   =   0;                              //复位
}
//---------------------------------------------
//---------------------------------------------
//设置时间函数
void set_time()
{
    int i;                              //定义循环变量
    DS1302_RST = 1;                     //使能DS1302
    time_write_1(0xbe);                 //时钟多字节写命令
    for(i=0;i<8;i++)                    //连续写8个字节数据
    {
        time_write_1(table[i]);         //调用写一个字节函数
    }
    DS1302_RST = 0;                              //复位
}
//---------------------------------------------

//---------------------------------------------
//设置是否初始化标志
void set_ytime()
{
 
    DS1302_RST = 1;                              //使能DS1302
    time_write_1(0xc0);                 //时钟多字节写命令
 
    time_write_1(table1[0]);         //调用写一个字节函数
  
    DS1302_RST = 0;                              //复位
}
//读取初始化标志函数
void get_ytime()
{
  
    DS1302_RST = 1;                              //使能DS1302
    time_write_1(0xc1);                 //发送多字节读取命令
  
    table2[0]=time_read_1();       //调用读取1个字节数据的函数
   
    DS1302_RST = 0;                             //复位DS1302
}
//---------------------------------------------
//读取时间函数
void get_time()
{
    int i;                              //设置循环变量
    DS1302_RST = 1;                              //使能DS1302
    time_write_1(0xbf);                 //发送多字节读取命令
    for(i=0;i<7;i++)                    //连续读取7个字节数据
      {
         table[i]=time_read_1();       //调用读取1个字节数据的函数
      }
    DS1302_RST = 0;                             //复位DS1302
}

//*******初始化函数***************
void LCD_init(void)
{
    delay_n40us(10000);
    LCD_write_command(0x38);//设置8位格式,2行,5x7
    LCD_write_command(0x38);//设置8位格式,2行,5x7
    LCD_write_command(0x38);//设置8位格式,2行,5x7
  
LCD_write_command(0x02);//整体显示,关光标,不闪烁
LCD_write_command(0x0C);//清除屏幕显示
    LCD_write_command(0x06);//设定输入方式,增量不移位
}
//********************************
//********写指令函数************
void LCD_write_command(uchar dat)
{
  
    LCD_E = 0;

LCD_RS=0;//指令
    LCD_RW=0;//写入
    LCD_DB=dat;

LCD_E=1;//允许
delay_n40us(10);//实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。
    LCD_E = 0;
}
//*******************************
//********写数据函数*************
void LCD_write_data(uchar dat)
{
     LCD_E = 0;   
LCD_RS=1;//数据
     LCD_RW=0;//写入
     LCD_DB=dat;

LCD_E=1;//允许
     delay_n40us(10);
   
LCD_E = 0;
}
//********************************
//*******显示一个字符函数*********
void LCD_disp_char(uchar x,uchar y,uchar dat)
{
uchar address;
     if(y==1)
              address="0x80"+x;
     else
              address="0xc0"+x;
     LCD_write_command(address);
     LCD_write_data(dat);
}
void delay_n40us(uint n)
{  
       uint i;
      uchar j;          
        for(i=n;i>0;i--)
           for(j=0;j<15;j++)
            ;          //
}                                         //
//*******************************
void disp_time()
{
    LCD_disp_char(3,1,((table[2]&0xf0)>>4)+0x30);

LCD_disp_char(4,1,(table[2]&0x0f)+0x30);

LCD_disp_char(5,1,':');

LCD_disp_char(6,1,((table[1]&0xf0)>>4)+0x30);

LCD_disp_char(7,1,(table[1]&0x0f)+0x30);


LCD_disp_char(8,1,':');
LCD_disp_char(9,1,((table[0]&0xf0)>>4)+0x30);

LCD_disp_char(10,1,(table[0]&0x0f)+0x30);

}
//*********主函数*****************
void main(void)
{     
  
   get_ytime();
     
   if(table2[0]==0x11)
      {
    ;
      }
    else
   {
      ds1302_init();                    //调用DS1302初始化函数
      
         set_time();                       //调用设置时间函数
      set_ytime();                       //调用设置标志函数
   }
  
 
         DS1302_RST   =   1;                             //使能DS1302
        time_write_1(0x90);                 //充电命令
 
        time_write_1(0xa5);         //打开充电二级管 一个二级管串联一个2K电阻
     DS1302_RST   =   0;                             //复位DS1302
     
  
   LCD_init();
        while(1)
   {
     get_time();                  //调用取时间函数
   
     disp_time();
   
   }
      
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

特朗普集团近日取消了其新推出的T1智能手机“将在美国制造”的宣传标语,此举源于外界对这款手机能否以当前定价在美国本土生产的质疑。

关键字: 特朗普 苹果 AI

美国总统特朗普在公开场合表示,他已要求苹果公司CEO蒂姆·库克停止在印度建厂,矛头直指该公司生产多元化的计划。

关键字: 特朗普 苹果 AI

4月10日消息,据媒体报道,美国总统特朗普宣布,美国对部分贸易伙伴暂停90天执行新关税政策,同时对中国的关税提高到125%,该消息公布后苹果股价飙升了15%。这次反弹使苹果市值增加了4000多亿美元,目前苹果市值接近3万...

关键字: 特朗普 AI 人工智能 特斯拉

3月25日消息,据报道,当地时间3月20日,美国总统特朗普在社交媒体平台“真实社交”上发文写道:“那些被抓到破坏特斯拉的人,将有很大可能被判入狱长达20年,这包括资助(破坏特斯拉汽车)者,我们正在寻找你。”

关键字: 特朗普 AI 人工智能 特斯拉

1月22日消息,刚刚,新任美国总统特朗普放出重磅消息,将全力支持美国AI发展。

关键字: 特朗普 AI 人工智能

特朗普先生有两件事一定会载入史册,一个是筑墙,一个是挖坑。在美墨边境筑墙的口号确保边境安全,降低因非法移民引起的犯罪率过高问题;在中美科技产业之间挖坑的口号也是安全,美国企业不得使用对美国国家安全构成威胁的电信设备,总统...

关键字: 特朗普 孤立主义 科技产业

据路透社1月17日消息显示,知情人士透露,特朗普已通知英特尔、铠侠在内的几家华为供应商,将要撤销其对华为的出货的部分许可证,同时将拒绝其他数十个向华为供货的申请。据透露,共有4家公司的8份许可被撤销。另外,相关公司收到撤...

关键字: 华为 芯片 特朗普

曾在2018年时被美国总统特朗普称作“世界第八奇迹”的富士康集团在美国威斯康星州投资建设的LCD显示屏工厂项目,如今却因为富士康将项目大幅缩水并拒绝签订新的合同而陷入了僵局。这也导致富士康无法从当地政府那里获得约40亿美...

关键字: 特朗普 富士康

今年5月,因自己发布的推文被贴上“无确凿依据”标签而与推特发生激烈争执后,美国总统特朗普签署了一项行政令,下令要求重审《通信规范法》第230条。

关键字: 谷歌 facebook 特朗普

众所周知,寄往白宫的所有邮件在到达白宫之前都会在他地进行分类和筛选。9月19日,根据美国相关执法官员的通报,本周早些时候,执法人员截获了一个寄给特朗普总统的包裹,该包裹内包含蓖麻毒蛋白。

关键字: 美国 白宫 特朗普
关闭