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

51单片机DS1302时钟芯片简单程序

时间:10-02 整理:3721RD 点击:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
data_7seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};
uchar hour,min,sec;
sbit shi=P1^0;
sbit fen=P1^1;
sbit miao=P1^2;
sbit rst=P1^4;
sbit sck=P1^5;
sbit io=P1^6;
sbit fm=P1^7;
/*函数声明:*/
  void write_ds1302_byte(uchar dat);
  void write_ds1302(uchar add,uchar dat);
  uchar read_ds1302(uchar add);
  void read_rtc();
  void set_rtc();
  void display();
  void delay(int n);
  void show();
  void fmzz();  
   /*DS1302单字节写入:*/  
void write_ds1302_byte(uchar dat)
   { uchar i;
           //发送地址
     for(i=0;i<8;i++)         //循环8次移位
         {  sck=0;  
         io=dat&0x01;            //每次传输低字节
         dat=dat>>1;                  //右移一位
         sck=1;
         }
        }   
        /*DS1302多字节写入:*/
void write_ds1302(uchar add,uchar dat)
{  
rst=0;//CE引脚为低,数据传送中止
_nop_();
sck=0;            //清零时钟总线
_nop_();
rst=1;           //CE引脚为高,逻辑控制有效
_nop_();  
write_ds1302_byte(add);
write_ds1302_byte(dat);
rst=0;
_nop_();
io=1;
sck=1;
}
/*DS1302读取:*/  
uchar read_ds1302(uchar add)               
{  uchar i,value;
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();  
write_ds1302_byte(add);
for (i=0;i<8;i++)
        {   
        value=value>>1;   
        sck=0;   
        if (io)
        value=value|0x80;        //每次传输低字节
         sck=1;
         }  
rst=0;
_nop_();
sck=0;
_nop_();        
sck=1;
io=1;
return value;
}
/*调整时间:*/
void set_rtc()
{     
if (shi==0)
        delay(100);   
        if (shi==0)   
        {   
        hour=(hour>>4)*10+(hour&0x0f);   
        hour++;   
                if (hour==24)
                hour=0;   
        hour=((hour/10)<<4)+(hour%10);   
        write_ds1302(0x84,hour);   
        }      
if (fen==0)
        delay(100);   
        if (fen==0)   
        {   
        min=(min>>4)*10+(min&0x0f);   
        min++;   
                if (min==60)
                min=0;   
        min=((min/10)<<4)+(min%10);   
        write_ds1302(0x82,min);   
        }      
if (miao==0)
        delay(100);   
        if (miao==0)   
        {
        sec=(sec>>4)*10+(sec&0x0f);   
        sec++;   
                if (sec==60)
                sec=0;   
        sec=((sec/10)<<4)+(sec%10);   
        write_ds1302(0x80,sec);   
        }
}   
/*读取时间:*/
void read_rtc()
{     
hour=read_ds1302(0x85);   
min=read_ds1302(0x83);   
sec=read_ds1302(0x81);
}   
/*显示时间:*/
void display()
{      
unsigned int a=1;  
P2=0x01;P0=data_7seg[hour/16];
delay(a);
P2=0x02;P0=data_7seg[hour%16];
delay(a);
P2=0x04;P0=data_7seg[min/16];
delay(a);
P2=0x08;P0=data_7seg[min%16];
delay(a);
P2=0x10;P0=data_7seg[sec/16];
delay(a);
P2=0x20;P0=data_7seg[sec%16];
delay(a);         
}   
/*蜂鸣:*/  
       
void fmzz()   
{     
uint i;      
for (i=0;i<100;i++)      
        {         
        fm=!fm;        
        delay(2);
        }
}
/*延时程序:*/
void delay(int n)
{  unsigned int i,j;
for(i=0;i<n;i++)
{   
for(j=0;j<121;j++)  
        {;}
}
}
/*显示学号:*/
void show()
{   
unsigned int m;
for(m=0;m<20;m++)
{  uint a=10;  
P2=0x01;P0=data_7seg[7];delay(a);
P2=0x02;P0=data_7seg[2];delay(a);
P2=0x04;P0=data_7seg[4];delay(a);
P2=0x08;P0=data_7seg[1];delay(a);
P2=0x10;P0=data_7seg[1];delay(a);
P2=0x20;P0=data_7seg[8];delay(a);
}  
}
  /*主程序:*/
  void main()
  {      
  show();  
  write_ds1302(0x84,0x12); //初始化
  write_ds1302(0x82,0x00);
  write_ds1302(0x80,0x00);        //秒寄存器(81h、80h)的位7  当该位置为0时,时钟开始运行。
  while (1)
          {   set_rtc();  
                read_rtc();  
                display();  
                if(min==0)
                { if(sec==0)      
                        {
                        fmzz();
                        }  
                }
        }
}

感谢分享经验。

没事,大家一起学习

好牛逼啊                                 

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

网站地图

Top