微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助DS1302时钟程序

求助DS1302时钟程序

时间:10-02 整理:3721RD 点击:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="ME-8051-G clock";
uchar code table1[]="    --:--:--    ";
uchar code table2[]="ALL:00:00:-- ";
uchar code table3[]="    ";
uchar clk_time[3];  //秒,分,时寄存器初始值
sbit T_RST=P1^0;//ds1302-5
sbit T_IO=P1^1;//ds1302-6
sbit T_CLK=P1^2;//ds1302-7
sbit en=P3^4;
sbit rw=P3^6;
sbit rs=P3^5;
sbit led=P2^5;
sbit dula=P2^6;
sbit wela=P2^7;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
//sbit rw=P3^6;
uchar num,clock_ss,clock_sg,clock_fs,clock_fg,clock_ms,clock_mg,b,clock_s,clock_g;
char hour,mie,sei,c,nhour,nmie,shour,smie;
/******************DS1302:写入操作(上升沿)*********************/
void write_byte(uchar da)
{
   uchar i;
   ACC=da;
   for(i=8;i>0;i--)
   {
      T_IO=ACC0;
   T_CLK=0;     
      T_CLK=1;//此时一位数据写进
      ACC=ACC>>1;
   }
}
/******************DS1302:读取操作(下降沿)*****************/
uchar read_byte(void)
{
   uchar i;
   for(i=0;i<8;i++)
   {
      ACC=ACC>>1;
   T_CLK = 1;
   T_CLK = 0;
      ACC7 = T_IO;
   }
   return(ACC);
}
/******************DS1302:写入数据(先送地址,再写数据)***************************/
void write_1302(uchar addr,uchar da)
{
   T_RST=0;    //停止工作
   T_CLK=0;                                 
   T_RST=1;   //重新工作
   write_byte(addr);    //写入地址
   
   write_byte(da);
   T_RST=0;
   T_CLK=1;
}
/******************DS1302:读取数据(先送地址,再读数据)**************************/
uchar read_1302(uchar addr)
{
   uchar temp;
   T_RST=0;                                   //停止工作
   T_CLK=0;  
   T_RST=1;                         //重新工作
   write_byte(addr);   //写入地址
   temp=read_byte();
   T_RST=0;
   T_CLK=1;     //停止工作
   return(temp);
}

/***********************延时程序=a*1ms**************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
//液晶写指令
void write_com(uchar com)
{
   
    rs=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}
//液晶写数据
void write_data(uchar date)
{
    rs=1;
P0=date;
delay(5);
en=1;
delay(5);
en=0;
}
void init()
{   
    b=0;
led=0;
    dula=1;
    P0=0x00;
    dula=0;
wela=1;
    wela=0;//关开发板数码管
nhour=0;
nmie=0;
    rw=0;
en=0;
write_com(0x38);//设置液晶
write_com(0x0c);//设光标等
write_com(0x06);//写一个字符地址指针加1且光标加1
write_com(0x01);//清屏
write_com(0x80);//设置s地址指针
}
//**********************************************************************
//ds1302写时间进去
void DS1302write()
{
     write_1302(0x8e,0x00);             //WP=0 写操作
  write_1302(0x80,0x00);//写秒
  write_1302(0x82,0x46);//写分
  write_1302(0x84,0x15);//写时
  write_1302(0x8e,0x80); //WP=1 写保护
}
//******************************************************
void display(uchar add,date)
{      
   if(b==0)
     {
        clock_ms=clk_time[0]/ 16;  clock_mg=clk_time[0]%16;
        led=0;
        clock_fs=clk_time[1]/ 16;  clock_fg=clk_time[1]%16;
        led=0;
        clock_ss=clk_time[2]/ 16;   clock_sg=clk_time[2]%16;
       write_com(0x80+0x44);
       write_data(0x30+clock_ss);
       write_com(0x80+0x45);
       write_data(0x30+clock_sg);
       write_com(0x80+0x47);
       write_data(0x30+clock_fs);
       write_com(0x80+0x48);
       write_data(0x30+clock_fg);
       write_com(0x80+0x4a);
       write_data(0x30+clock_ms);
       write_com(0x80+0x4b);
       write_data(0x30+clock_mg);
     }
   if(b!=0)
     {
  clock_s=date/ 10;  clock_g=date%10;
        write_com(0x80+0x40+add);
        write_data(0x30+clock_s);
        write_data(0x30+clock_g);   
  }
  
}
void main()
{
   uchar  temp=0x80;         
   uchar i;
   
init();
//DS1302write();
  
for(num=0;num<15;num++)
{
  write_data(table[num]);
  delay(100);
}
write_com(0x80+0x40);
for(num=0;num<15;num++)
{
  write_data(table1[num]);
  
}
// write_1302(0x8e,0x00);  //WP=0 写操作
// write_1302(0x90,0xa4);//开涓流充电
//write_1302(0x8e,0x80);// /WP=1 写保护
   
while(1)
     {
     
    if(b==0)
   { temp=0x81;                    
      for(i=0;i<3;i++)
    {
      clk_time=read_1302(temp);
   temp+=2;
   }
   display(0x4b,0x00);
   }
   
  }
我不明白 clk_time[   ]怎么读出来的,求教各位了。     clock_ms=clk_time[0]/ 16;  clock_mg=clk_time[0]%16;
        led=0;
        clock_fs=clk_time[1]/ 16;  clock_fg=clk_time[1]%16;
        led=0;
        clock_ss=clk_time[2]/ 16;   clock_sg=clk_time[2]%16;

我不明白 clk_time[   ]怎么读出来的,求教各位了。     

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top